From d282675bc643058c4835db499e68d7b34af0e13f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 13 Oct 2019 15:08:50 +0300 Subject: [PATCH 001/135] Improve reply rendering Signed-off-by: Tulir Asokan --- res/css/_components.scss | 1 + res/css/views/elements/_ReplyThread.scss | 11 +- res/css/views/rooms/_ReplyPreview.scss | 7 +- res/css/views/rooms/_ReplyTile.scss | 96 +++++++ src/components/views/elements/ReplyThread.js | 15 +- .../views/messages/MImageReplyBody.js | 33 +++ src/components/views/messages/MessageEvent.js | 9 +- src/components/views/rooms/ReplyPreview.js | 12 +- src/components/views/rooms/ReplyTile.js | 234 ++++++++++++++++++ 9 files changed, 388 insertions(+), 30 deletions(-) create mode 100644 res/css/views/rooms/_ReplyTile.scss create mode 100644 src/components/views/messages/MImageReplyBody.js create mode 100644 src/components/views/rooms/ReplyTile.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 4891fd90c0..2c54c5f37f 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -153,6 +153,7 @@ @import "./views/rooms/_PinnedEventsPanel.scss"; @import "./views/rooms/_PresenceLabel.scss"; @import "./views/rooms/_ReplyPreview.scss"; +@import "./views/rooms/_ReplyTile.scss"; @import "./views/rooms/_RoomBreadcrumbs.scss"; @import "./views/rooms/_RoomDropTarget.scss"; @import "./views/rooms/_RoomHeader.scss"; diff --git a/res/css/views/elements/_ReplyThread.scss b/res/css/views/elements/_ReplyThread.scss index bf44a11728..0d53a6b6f4 100644 --- a/res/css/views/elements/_ReplyThread.scss +++ b/res/css/views/elements/_ReplyThread.scss @@ -18,20 +18,13 @@ limitations under the License. margin-top: 0; } -.mx_ReplyThread .mx_DateSeparator { - font-size: 1em !important; - margin-top: 0; - margin-bottom: 0; - padding-bottom: 1px; - bottom: -5px; -} - .mx_ReplyThread_show { cursor: pointer; } blockquote.mx_ReplyThread { margin-left: 0; + margin-bottom: 8px; padding-left: 10px; - border-left: 4px solid $blockquote-bar-color; + border-left: 4px solid $button-bg-color; } diff --git a/res/css/views/rooms/_ReplyPreview.scss b/res/css/views/rooms/_ReplyPreview.scss index 4dc4cb2c40..08fbd27808 100644 --- a/res/css/views/rooms/_ReplyPreview.scss +++ b/res/css/views/rooms/_ReplyPreview.scss @@ -32,12 +32,16 @@ limitations under the License. } .mx_ReplyPreview_header { - margin: 12px; + margin: 8px; color: $primary-fg-color; font-weight: 400; opacity: 0.4; } +.mx_ReplyPreview_tile { + margin: 0 8px; +} + .mx_ReplyPreview_title { float: left; } @@ -45,6 +49,7 @@ limitations under the License. .mx_ReplyPreview_cancel { float: right; cursor: pointer; + display: flex; } .mx_ReplyPreview_clear { diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss new file mode 100644 index 0000000000..0a055297c6 --- /dev/null +++ b/res/css/views/rooms/_ReplyTile.scss @@ -0,0 +1,96 @@ +/* +Copyright 2019 Tulir Asokan + +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. +*/ + +.mx_ReplyTile { + max-width: 100%; + clear: both; + padding-top: 2px; + padding-bottom: 2px; + font-size: 14px; + position: relative; + line-height: 16px; +} + +.mx_ReplyTile > a { + display: block; + text-decoration: none; + color: $primary-fg-color; +} + +// We do reply size limiting with CSS to avoid duplicating the TextualBody component. +.mx_ReplyTile .mx_EventTile_content { + $reply-lines: 2; + $line-height: 22px; + + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: $reply-lines; + line-height: $line-height; + + .mx_EventTile_body.mx_EventTile_bigEmoji { + line-height: $line-height !important; + // Override the big emoji override + font-size: 14px !important; + } +} + +.mx_ReplyTile.mx_ReplyTile_info { + padding-top: 0px; +} + +.mx_ReplyTile .mx_SenderProfile { + color: $primary-fg-color; + font-size: 14px; + display: inline-block; /* anti-zalgo, with overflow hidden */ + overflow: hidden; + cursor: pointer; + padding-left: 0px; /* left gutter */ + padding-bottom: 0px; + padding-top: 0px; + margin: 0px; + line-height: 17px; + /* the next three lines, along with overflow hidden, truncate long display names */ + white-space: nowrap; + text-overflow: ellipsis; + max-width: calc(100% - 65px); +} + +.mx_ReplyTile_redacted .mx_UnknownBody { + --lozenge-color: $event-redacted-fg-color; + --lozenge-border-color: $event-redacted-border-color; + display: block; + height: 22px; + width: 250px; + border-radius: 11px; + background: + repeating-linear-gradient( + -45deg, + var(--lozenge-color), + var(--lozenge-color) 3px, + transparent 3px, + transparent 6px + ); + box-shadow: 0px 0px 3px var(--lozenge-border-color) inset; +} + +.mx_ReplyTile_sending.mx_ReplyTile_redacted .mx_UnknownBody { + opacity: 0.4; +} + +.mx_ReplyTile_contextual { + opacity: 0.4; +} diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index fac0a71617..1764c008fa 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -304,20 +304,11 @@ export default class ReplyThread extends React.Component { header = ; } - const EventTile = sdk.getComponent('views.rooms.EventTile'); - const DateSeparator = sdk.getComponent('messages.DateSeparator'); + const ReplyTile = sdk.getComponent('views.rooms.ReplyTile'); const evTiles = this.state.events.map((ev) => { - let dateSep = null; - - if (wantsDateSeparator(this.props.parentEv.getDate(), ev.getDate())) { - dateSep = ; - } - return
- { dateSep } - ; }); - return
+ return
{ header }
{ evTiles }
; diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.js new file mode 100644 index 0000000000..bb869919fc --- /dev/null +++ b/src/components/views/messages/MImageReplyBody.js @@ -0,0 +1,33 @@ +/* +Copyright 2019 Tulir Asokan + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import MImageBody from './MImageBody'; + +export default class MImageReplyBody extends MImageBody { + onClick(ev) { + ev.preventDefault(); + } + + wrapImage(contentUrl, children) { + return children; + } + + // Don't show "Download this_file.png ..." + getFileBody() { + return null; + } +} diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index a616dd96ed..28f2a471bb 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -43,6 +43,9 @@ module.exports = createReactClass({ /* the maximum image height to use, if the event is an image */ maxImageHeight: PropTypes.number, + + overrideBodyTypes: PropTypes.object, + overrideEventTypes: PropTypes.object, }, getEventTileOps: function() { @@ -60,9 +63,11 @@ module.exports = createReactClass({ 'm.file': sdk.getComponent('messages.MFileBody'), 'm.audio': sdk.getComponent('messages.MAudioBody'), 'm.video': sdk.getComponent('messages.MVideoBody'), + ...(this.props.overrideBodyTypes || {}), }; const evTypes = { 'm.sticker': sdk.getComponent('messages.MStickerBody'), + ...(this.props.overrideEventTypes || {}), }; const content = this.props.mxEvent.getContent(); @@ -81,7 +86,7 @@ module.exports = createReactClass({ } } - return ; + onHeightChanged={this.props.onHeightChanged} /> : null; }, }); diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index caf8feeea2..a69a286a15 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -68,7 +68,7 @@ export default class ReplyPreview extends React.Component { render() { if (!this.state.event) return null; - const EventTile = sdk.getComponent('rooms.EventTile'); + const ReplyTile = sdk.getComponent('rooms.ReplyTile'); return
@@ -80,11 +80,11 @@ export default class ReplyPreview extends React.Component { onClick={cancelQuoting} />
- +
+ +
; } diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js new file mode 100644 index 0000000000..5a56ba9dc1 --- /dev/null +++ b/src/components/views/rooms/ReplyTile.js @@ -0,0 +1,234 @@ +/* +Copyright 2019 Tulir Asokan + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +const classNames = require("classnames"); +import { _t, _td } from '../../../languageHandler'; + +const sdk = require('../../../index'); + +import dis from '../../../dispatcher'; +import SettingsStore from "../../../settings/SettingsStore"; +import {MatrixClient} from 'matrix-js-sdk'; + +const ObjectUtils = require('../../../ObjectUtils'); + +const eventTileTypes = { + 'm.room.message': 'messages.MessageEvent', + 'm.sticker': 'messages.MessageEvent', + 'm.call.invite': 'messages.TextualEvent', + 'm.call.answer': 'messages.TextualEvent', + 'm.call.hangup': 'messages.TextualEvent', +}; + +const stateEventTileTypes = { + 'm.room.aliases': 'messages.TextualEvent', + // 'm.room.aliases': 'messages.RoomAliasesEvent', // too complex + 'm.room.canonical_alias': 'messages.TextualEvent', + 'm.room.create': 'messages.RoomCreate', + 'm.room.member': 'messages.TextualEvent', + 'm.room.name': 'messages.TextualEvent', + 'm.room.avatar': 'messages.RoomAvatarEvent', + 'm.room.third_party_invite': 'messages.TextualEvent', + 'm.room.history_visibility': 'messages.TextualEvent', + 'm.room.encryption': 'messages.TextualEvent', + 'm.room.topic': 'messages.TextualEvent', + 'm.room.power_levels': 'messages.TextualEvent', + 'm.room.pinned_events': 'messages.TextualEvent', + 'm.room.server_acl': 'messages.TextualEvent', + 'im.vector.modular.widgets': 'messages.TextualEvent', + 'm.room.tombstone': 'messages.TextualEvent', + 'm.room.join_rules': 'messages.TextualEvent', + 'm.room.guest_access': 'messages.TextualEvent', + 'm.room.related_groups': 'messages.TextualEvent', +}; + +function getHandlerTile(ev) { + const type = ev.getType(); + return ev.isState() ? stateEventTileTypes[type] : eventTileTypes[type]; +} + +class ReplyTile extends React.Component { + static contextTypes = { + matrixClient: PropTypes.instanceOf(MatrixClient).isRequired, + } + + static propTypes = { + mxEvent: PropTypes.object.isRequired, + isRedacted: PropTypes.bool, + permalinkCreator: PropTypes.object, + onHeightChanged: PropTypes.func, + } + + static defaultProps = { + onHeightChanged: function() {}, + } + + constructor(props, context) { + super(props, context); + this.state = {}; + this.onClick = this.onClick.bind(this); + } + + componentDidMount() { + this.props.mxEvent.on("Event.decrypted", this._onDecrypted); + } + + shouldComponentUpdate(nextProps, nextState) { + if (!ObjectUtils.shallowEqual(this.state, nextState)) { + return true; + } + + return !this._propsEqual(this.props, nextProps); + } + + componentWillUnmount() { + const client = this.context.matrixClient; + this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); + } + + _onDecrypted() { + this.forceUpdate(); + } + + _propsEqual(objA, objB) { + const keysA = Object.keys(objA); + const keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; + + if (!objB.hasOwnProperty(key)) { + return false; + } + + if (objA[key] !== objB[key]) { + return false; + } + } + return true; + } + + onClick(e) { + // This allows the permalink to be opened in a new tab/window or copied as + // matrix.to, but also for it to enable routing within Riot when clicked. + e.preventDefault(); + dis.dispatch({ + action: 'view_room', + event_id: this.props.mxEvent.getId(), + highlighted: true, + room_id: this.props.mxEvent.getRoomId(), + }); + } + + render() { + const SenderProfile = sdk.getComponent('messages.SenderProfile'); + + const content = this.props.mxEvent.getContent(); + const msgtype = content.msgtype; + const eventType = this.props.mxEvent.getType(); + + // Info messages are basically information about commands processed on a room + let isInfoMessage = ( + eventType !== 'm.room.message' && eventType !== 'm.sticker' && eventType !== 'm.room.create' + ); + + let tileHandler = getHandlerTile(this.props.mxEvent); + // If we're showing hidden events in the timeline, we should use the + // source tile when there's no regular tile for an event and also for + // replace relations (which otherwise would display as a confusing + // duplicate of the thing they are replacing). + const useSource = !tileHandler || this.props.mxEvent.isRelation("m.replace"); + if (useSource && SettingsStore.getValue("showHiddenEventsInTimeline")) { + tileHandler = "messages.ViewSourceEvent"; + // Reuse info message avatar and sender profile styling + isInfoMessage = true; + } + // This shouldn't happen: the caller should check we support this type + // before trying to instantiate us + if (!tileHandler) { + const {mxEvent} = this.props; + console.warn(`Event type not supported: type:${mxEvent.getType()} isState:${mxEvent.isState()}`); + return
+ { _t('This event could not be displayed') } +
; + } + const EventTileType = sdk.getComponent(tileHandler); + + const classes = classNames({ + mx_ReplyTile: true, + mx_ReplyTile_info: isInfoMessage, + mx_ReplyTile_redacted: this.props.isRedacted, + }); + + let permalink = "#"; + if (this.props.permalinkCreator) { + permalink = this.props.permalinkCreator.forEvent(this.props.mxEvent.getId()); + } + + let sender; + let needsSenderProfile = tileHandler !== 'messages.RoomCreate' && !isInfoMessage; + + if (needsSenderProfile) { + let text = null; + if (msgtype === 'm.image') text = _td('%(senderName)s sent an image'); + else if (msgtype === 'm.video') text = _td('%(senderName)s sent a video'); + else if (msgtype === 'm.file') text = _td('%(senderName)s uploaded a file'); + sender = ; + } + + const MImageReplyBody = sdk.getComponent('messages.MImageReplyBody'); + const TextualBody = sdk.getComponent('messages.TextualBody'); + const msgtypeOverrides = { + "m.image": MImageReplyBody, + // We don't want a download link for files, just the file name is enough. + "m.file": TextualBody, + "m.sticker": TextualBody, + "m.audio": TextualBody, + "m.video": TextualBody, + }; + const evOverrides = { + "m.sticker": TextualBody, + }; + + return ( + + ) + } +} + +module.exports = ReplyTile; From 03d36f30ec1093dab132c8c2bbe9414da00cb9b2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 5 Mar 2020 13:44:54 +0200 Subject: [PATCH 002/135] Fix lint errors --- src/components/views/elements/ReplyThread.js | 1 - src/components/views/messages/MImageReplyBody.js | 1 - src/components/views/messages/MessageEvent.js | 2 +- src/components/views/rooms/ReplyPreview.js | 1 - src/components/views/rooms/ReplyTile.js | 7 +++---- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 25b39a2ad4..954c6b49c4 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -20,7 +20,6 @@ import * as sdk from '../../../index'; import {_t} from '../../../languageHandler'; import PropTypes from 'prop-types'; import dis from '../../../dispatcher'; -import {wantsDateSeparator} from '../../../DateUtils'; import {MatrixEvent} from 'matrix-js-sdk'; import {makeUserPermalink, RoomPermalinkCreator} from "../../../utils/permalinks/Permalinks"; import SettingsStore from "../../../settings/SettingsStore"; diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.js index bb869919fc..31b4d1fa82 100644 --- a/src/components/views/messages/MImageReplyBody.js +++ b/src/components/views/messages/MImageReplyBody.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; import MImageBody from './MImageBody'; export default class MImageReplyBody extends MImageBody { diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index 14ab3c8757..3703d3a629 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -123,6 +123,6 @@ export default createReactClass({ editState={this.props.editState} onHeightChanged={this.props.onHeightChanged} onMessageAllowed={this.onTileUpdate} - /> : null + /> : null; }, }); diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index 92e3f123a0..a22a85a2f1 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -19,7 +19,6 @@ import dis from '../../../dispatcher'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import RoomViewStore from '../../../stores/RoomViewStore'; -import SettingsStore from "../../../settings/SettingsStore"; import PropTypes from "prop-types"; import {RoomPermalinkCreator} from "../../../utils/permalinks/Permalinks"; diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index 5a56ba9dc1..36cb07f092 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -97,7 +97,6 @@ class ReplyTile extends React.Component { } componentWillUnmount() { - const client = this.context.matrixClient; this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); } @@ -185,7 +184,7 @@ class ReplyTile extends React.Component { } let sender; - let needsSenderProfile = tileHandler !== 'messages.RoomCreate' && !isInfoMessage; + const needsSenderProfile = tileHandler !== 'messages.RoomCreate' && !isInfoMessage; if (needsSenderProfile) { let text = null; @@ -224,10 +223,10 @@ class ReplyTile extends React.Component { showUrlPreview={false} overrideBodyTypes={msgtypeOverrides} overrideEventTypes={evOverrides} - maxImageHeight={96}/> + maxImageHeight={96} />
- ) + ); } } From 03299a28a4f27e96a5b9b0351945b3b9c3c5218d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 14:23:34 +0300 Subject: [PATCH 003/135] Fix import/export things --- src/components/views/rooms/ReplyTile.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index 36cb07f092..3ad6962f1a 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -1,5 +1,5 @@ /* -Copyright 2019 Tulir Asokan +Copyright 2020 Tulir Asokan Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,16 +16,16 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -const classNames = require("classnames"); +import classNames from 'classnames'; import { _t, _td } from '../../../languageHandler'; -const sdk = require('../../../index'); +import * as sdk from '../../../index'; import dis from '../../../dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; import {MatrixClient} from 'matrix-js-sdk'; -const ObjectUtils = require('../../../ObjectUtils'); +import * as ObjectUtils from '../../../ObjectUtils'; const eventTileTypes = { 'm.room.message': 'messages.MessageEvent', @@ -230,4 +230,4 @@ class ReplyTile extends React.Component { } } -module.exports = ReplyTile; +export default ReplyTile; From e64ff0f099ac6660e596fc640a839c9f76f9f79b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 14:39:16 +0300 Subject: [PATCH 004/135] Change score color to match sender name --- res/css/views/elements/_ReplyThread.scss | 32 ++++++++++++++++++++ src/components/views/elements/ReplyThread.js | 9 ++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/res/css/views/elements/_ReplyThread.scss b/res/css/views/elements/_ReplyThread.scss index 0d53a6b6f4..d5388e4631 100644 --- a/res/css/views/elements/_ReplyThread.scss +++ b/res/css/views/elements/_ReplyThread.scss @@ -27,4 +27,36 @@ blockquote.mx_ReplyThread { margin-bottom: 8px; padding-left: 10px; border-left: 4px solid $button-bg-color; + + &.mx_ReplyThread_color1 { + border-left-color: $username-variant1-color; + } + + &.mx_ReplyThread_color2 { + border-left-color: $username-variant2-color; + } + + &.mx_ReplyThread_color3 { + border-left-color: $username-variant3-color; + } + + &.mx_ReplyThread_color4 { + border-left-color: $username-variant4-color; + } + + &.mx_ReplyThread_color5 { + border-left-color: $username-variant5-color; + } + + &.mx_ReplyThread_color6 { + border-left-color: $username-variant6-color; + } + + &.mx_ReplyThread_color7 { + border-left-color: $username-variant7-color; + } + + &.mx_ReplyThread_color8 { + border-left-color: $username-variant8-color; + } } diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 976b3a8815..92e87ad945 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -25,6 +25,7 @@ import {makeUserPermalink, RoomPermalinkCreator} from "../../../utils/permalinks import SettingsStore from "../../../settings/SettingsStore"; import escapeHtml from "escape-html"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import { getUserNameColorClass } from "../../../utils/FormattingUtils" // This component does no cycle detection, simply because the only way to make such a cycle would be to // craft event_id's, using a homeserver that generates predictable event IDs; even then the impact would @@ -285,6 +286,10 @@ export default class ReplyThread extends React.Component { dis.dispatch({action: 'focus_composer'}); } + getReplyThreadColorClass(ev) { + return getUserNameColorClass(ev.getSender()).replace("Username", "ReplyThread"); + } + render() { let header = null; @@ -299,7 +304,7 @@ export default class ReplyThread extends React.Component { const ev = this.state.loadedEv; const Pill = sdk.getComponent('elements.Pill'); const room = this.context.getRoom(ev.getRoomId()); - header =
+ header =
{ _t('In reply to ', {}, { 'a': (sub) => { sub }, @@ -315,7 +320,7 @@ export default class ReplyThread extends React.Component { const ReplyTile = sdk.getComponent('views.rooms.ReplyTile'); const evTiles = this.state.events.map((ev) => { - return
+ return
Date: Fri, 10 Apr 2020 14:52:24 +0300 Subject: [PATCH 005/135] Add missing semicolon --- src/components/views/elements/ReplyThread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 92e87ad945..770f95f9dc 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -25,7 +25,7 @@ import {makeUserPermalink, RoomPermalinkCreator} from "../../../utils/permalinks import SettingsStore from "../../../settings/SettingsStore"; import escapeHtml from "escape-html"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import { getUserNameColorClass } from "../../../utils/FormattingUtils" +import { getUserNameColorClass } from "../../../utils/FormattingUtils"; // This component does no cycle detection, simply because the only way to make such a cycle would be to // craft event_id's, using a homeserver that generates predictable event IDs; even then the impact would From 25af26323c3ca9048ab7a45d63ed74116e553aa8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 15:45:59 +0300 Subject: [PATCH 006/135] Make image reply rendering even more compact --- res/css/_components.scss | 1 + res/css/views/messages/_MImageReplyBody.scss | 35 +++++++++++++++++++ .../views/messages/MImageReplyBody.js | 31 ++++++++++++++-- src/components/views/rooms/ReplyTile.js | 2 +- 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 res/css/views/messages/_MImageReplyBody.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 607257400b..2d701bb1e1 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -130,6 +130,7 @@ @import "./views/messages/_MEmoteBody.scss"; @import "./views/messages/_MFileBody.scss"; @import "./views/messages/_MImageBody.scss"; +@import "./views/messages/_MImageReplyBody.scss"; @import "./views/messages/_MNoticeBody.scss"; @import "./views/messages/_MStickerBody.scss"; @import "./views/messages/_MTextBody.scss"; diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss new file mode 100644 index 0000000000..8169e027d1 --- /dev/null +++ b/res/css/views/messages/_MImageReplyBody.scss @@ -0,0 +1,35 @@ +/* +Copyright 2020 Tulir Asokan + +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. +*/ + +.mx_MImageReplyBody { + display: grid; + grid-template: "image sender" 20px + "image filename" 20px + / 44px auto; + grid-gap: 4px; +} + +.mx_MImageReplyBody_thumbnail { + grid-area: image; +} + +.mx_MImageReplyBody_sender { + grid-area: sender; +} + +.mx_MImageReplyBody_filename { + grid-area: filename; +} diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.js index 31b4d1fa82..cdc78e46e8 100644 --- a/src/components/views/messages/MImageReplyBody.js +++ b/src/components/views/messages/MImageReplyBody.js @@ -1,5 +1,5 @@ /* -Copyright 2019 Tulir Asokan +Copyright 2020 Tulir Asokan Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ +import React from "react"; +import { _td } from "../../../languageHandler"; +import * as sdk from "../../../index"; import MImageBody from './MImageBody'; +import MFileBody from "./MFileBody"; export default class MImageReplyBody extends MImageBody { onClick(ev) { @@ -27,6 +31,29 @@ export default class MImageReplyBody extends MImageBody { // Don't show "Download this_file.png ..." getFileBody() { - return null; + return MFileBody.prototype.presentableTextForFile.call(this, this.props.mxEvent.getContent()); + } + + render() { + if (this.state.error !== null) { + return super.render(); + } + + const content = this.props.mxEvent.getContent(); + + const contentUrl = this._getContentUrl(); + const thumbnail = this._messageContent(contentUrl, this._getThumbUrl(), content); + const fileBody = this.getFileBody(); + const SenderProfile = sdk.getComponent('messages.SenderProfile'); + const sender = ; + + return
+
{ thumbnail }
+
{ sender }
+
{ fileBody }
+
; } } diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index 3ad6962f1a..ca349baac2 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -184,7 +184,7 @@ class ReplyTile extends React.Component { } let sender; - const needsSenderProfile = tileHandler !== 'messages.RoomCreate' && !isInfoMessage; + const needsSenderProfile = msgtype !== 'm.image' && tileHandler !== 'messages.RoomCreate' && !isInfoMessage; if (needsSenderProfile) { let text = null; From ec7acd1c0fbaf5d96415f380a3b85b54d079aa9f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 15:56:09 +0300 Subject: [PATCH 007/135] Fix rendering reply after event is decrypted --- src/components/views/rooms/ReplyTile.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index ca349baac2..34b2c6ad38 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -82,6 +82,7 @@ class ReplyTile extends React.Component { super(props, context); this.state = {}; this.onClick = this.onClick.bind(this); + this._onDecrypted = this._onDecrypted.bind(this); } componentDidMount() { @@ -102,6 +103,9 @@ class ReplyTile extends React.Component { _onDecrypted() { this.forceUpdate(); + if (this.props.onHeightChanged) { + this.props.onHeightChanged(); + } } _propsEqual(objA, objB) { From da3bd5ebee68dc15f04e15c3b55183f769413ce9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 16:03:27 +0300 Subject: [PATCH 008/135] Disable pointer events inside replies --- res/css/views/rooms/_ReplyTile.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 0a055297c6..a6cff00ff2 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -35,6 +35,8 @@ limitations under the License. $reply-lines: 2; $line-height: 22px; + pointer-events: none; + text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; From 6b96a161087f4cda8ab6dcafd155e2d689a5adff Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2020 16:18:06 +0300 Subject: [PATCH 009/135] Add absolute max height and some improvements for
 replies

---
 res/css/views/rooms/_ReplyTile.scss | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss
index a6cff00ff2..70a383a1cf 100644
--- a/res/css/views/rooms/_ReplyTile.scss
+++ b/res/css/views/rooms/_ReplyTile.scss
@@ -34,6 +34,7 @@ limitations under the License.
 .mx_ReplyTile .mx_EventTile_content {
     $reply-lines: 2;
     $line-height: 22px;
+    $max-height: 66px;
 
     pointer-events: none;
 
@@ -42,12 +43,26 @@ limitations under the License.
     -webkit-box-orient: vertical;
     -webkit-line-clamp: $reply-lines;
     line-height: $line-height;
+    max-height: $max-height;
 
     .mx_EventTile_body.mx_EventTile_bigEmoji {
         line-height: $line-height !important;
         // Override the big emoji override
         font-size: 14px !important;
     }
+
+    // Hack to cut content in 
 tags too
+    .mx_EventTile_pre_container > pre {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        display: -webkit-box;
+        -webkit-box-orient: vertical;
+        -webkit-line-clamp: $reply-lines;
+        padding: 4px;
+    }
+    .markdown-body blockquote, .markdown-body dl, .markdown-body ol, .markdown-body p, .markdown-body pre, .markdown-body table, .markdown-body ul {
+        margin-bottom: 4px;
+    }
 }
 
 .mx_ReplyTile.mx_ReplyTile_info {

From e7ad9b82e0f42e6c7ac5511ade135e71a273e414 Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Fri, 10 Apr 2020 16:27:39 +0300
Subject: [PATCH 010/135] Fix stylelint issue and update header

---
 res/css/views/messages/_MImageReplyBody.scss | 7 ++++---
 res/css/views/rooms/_ReplyTile.scss          | 2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss
index 8169e027d1..9b25b4392a 100644
--- a/res/css/views/messages/_MImageReplyBody.scss
+++ b/res/css/views/messages/_MImageReplyBody.scss
@@ -16,9 +16,10 @@ limitations under the License.
 
 .mx_MImageReplyBody {
     display: grid;
-    grid-template: "image sender"   20px
-                   "image filename" 20px
-                  / 44px  auto;
+    grid-template:
+        "image sender"   20px
+        "image filename" 20px
+        / 44px  auto;
     grid-gap: 4px;
 }
 
diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss
index 70a383a1cf..fd68430157 100644
--- a/res/css/views/rooms/_ReplyTile.scss
+++ b/res/css/views/rooms/_ReplyTile.scss
@@ -1,5 +1,5 @@
 /*
-Copyright 2019 Tulir Asokan 
+Copyright 2020 Tulir Asokan 
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.

From b554d59ed165d68b56a9b08faadeec86d2f7c2b7 Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Fri, 10 Apr 2020 17:05:29 +0300
Subject: [PATCH 011/135] Prevent reply thumbnail image from overflowing

---
 res/css/views/messages/_MImageReplyBody.scss | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss
index 9b25b4392a..8c5cb97478 100644
--- a/res/css/views/messages/_MImageReplyBody.scss
+++ b/res/css/views/messages/_MImageReplyBody.scss
@@ -25,6 +25,10 @@ limitations under the License.
 
 .mx_MImageReplyBody_thumbnail {
     grid-area: image;
+
+    .mx_MImageBody_thumbnail_container {
+        max-height: 44px !important;
+    }
 }
 
 .mx_MImageReplyBody_sender {

From dfe277b78d1e7fe39fe91245646b41d72bb367fc Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Mon, 25 May 2020 19:24:03 +0300
Subject: [PATCH 012/135] Remove unnecessary right margin in reply blockquote

---
 res/css/views/elements/_ReplyThread.scss | 1 +
 1 file changed, 1 insertion(+)

diff --git a/res/css/views/elements/_ReplyThread.scss b/res/css/views/elements/_ReplyThread.scss
index d5388e4631..af8ca956ba 100644
--- a/res/css/views/elements/_ReplyThread.scss
+++ b/res/css/views/elements/_ReplyThread.scss
@@ -24,6 +24,7 @@ limitations under the License.
 
 blockquote.mx_ReplyThread {
     margin-left: 0;
+    margin-right: 0;
     margin-bottom: 8px;
     padding-left: 10px;
     border-left: 4px solid $button-bg-color;

From c60483728fc8526538e43c1a27834c85d8c1984c Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Mon, 25 May 2020 19:33:30 +0300
Subject: [PATCH 013/135] Fix dispatcher import in ReplyTile.js

---
 src/components/views/rooms/ReplyTile.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js
index 34b2c6ad38..f6c4a69def 100644
--- a/src/components/views/rooms/ReplyTile.js
+++ b/src/components/views/rooms/ReplyTile.js
@@ -21,7 +21,7 @@ import { _t, _td } from '../../../languageHandler';
 
 import * as sdk from '../../../index';
 
-import dis from '../../../dispatcher';
+import dis from '../../../dispatcher/dispatcher';
 import SettingsStore from "../../../settings/SettingsStore";
 import {MatrixClient} from 'matrix-js-sdk';
 

From cdf8f09ec256f8bd69e478ffc11ad26ff883c398 Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Sat, 20 Mar 2021 13:38:42 +0200
Subject: [PATCH 014/135] Remove unused import and run yarn i18n

---
 src/components/views/elements/ReplyThread.js | 1 -
 src/i18n/strings/en_EN.json                  | 3 +++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js
index eb29e52496..4129f1d14f 100644
--- a/src/components/views/elements/ReplyThread.js
+++ b/src/components/views/elements/ReplyThread.js
@@ -20,7 +20,6 @@ import * as sdk from '../../../index';
 import {_t} from '../../../languageHandler';
 import PropTypes from 'prop-types';
 import dis from '../../../dispatcher/dispatcher';
-import {wantsDateSeparator} from '../../../DateUtils';
 import {MatrixEvent} from 'matrix-js-sdk/src/models/event';
 import {makeUserPermalink, RoomPermalinkCreator} from "../../../utils/permalinks/Permalinks";
 import SettingsStore from "../../../settings/SettingsStore";
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 63b19831bb..66b1843e64 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -1500,6 +1500,9 @@
     "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
     "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Seen by %(displayName)s (%(userName)s) at %(dateTime)s",
     "Replying": "Replying",
+    "%(senderName)s sent an image": "%(senderName)s sent an image",
+    "%(senderName)s sent a video": "%(senderName)s sent a video",
+    "%(senderName)s uploaded a file": "%(senderName)s uploaded a file",
     "Room %(name)s": "Room %(name)s",
     "Recently visited rooms": "Recently visited rooms",
     "No recently visited rooms": "No recently visited rooms",

From 330f222dd1a9df7aafe4488110be747d03fc5515 Mon Sep 17 00:00:00 2001
From: Tulir Asokan 
Date: Sat, 1 May 2021 16:11:30 +0300
Subject: [PATCH 015/135] Remove redundant code and move presentableTextForFile
 out of MFileBody

Signed-off-by: Tulir Asokan 
---
 src/components/views/messages/MFileBody.js    | 62 +++++++++---------
 .../views/messages/MImageReplyBody.js         | 24 +++----
 src/components/views/rooms/EventTile.tsx      | 37 +----------
 src/components/views/rooms/ReplyPreview.js    |  8 ++-
 src/components/views/rooms/ReplyTile.js       | 64 ++-----------------
 5 files changed, 55 insertions(+), 140 deletions(-)

diff --git a/src/components/views/messages/MFileBody.js b/src/components/views/messages/MFileBody.js
index 8f464e08bd..5be4468a28 100644
--- a/src/components/views/messages/MFileBody.js
+++ b/src/components/views/messages/MFileBody.js
@@ -89,6 +89,35 @@ function computedStyle(element) {
     return cssText;
 }
 
+/**
+ * Extracts a human readable label for the file attachment to use as
+ * link text.
+ *
+ * @param {Object} content The "content" key of the matrix event.
+ * @param {boolean} withSize Whether to include size information. Default true.
+ * @return {string} the human readable link text for the attachment.
+ */
+export function presentableTextForFile(content, withSize = true) {
+    let linkText = _t("Attachment");
+    if (content.body && content.body.length > 0) {
+        // The content body should be the name of the file including a
+        // file extension.
+        linkText = content.body;
+    }
+
+    if (content.info && content.info.size && withSize) {
+        // If we know the size of the file then add it as human readable
+        // string to the end of the link text so that the user knows how
+        // big a file they are downloading.
+        // The content.info also contains a MIME-type but we don't display
+        // it since it is "ugly", users generally aren't aware what it
+        // means and the type of the attachment can usually be inferrered
+        // from the file extension.
+        linkText += ' (' + filesize(content.info.size) + ')';
+    }
+    return linkText;
+}
+
 @replaceableComponent("views.messages.MFileBody")
 export default class MFileBody extends React.Component {
     static propTypes = {
@@ -119,35 +148,6 @@ export default class MFileBody extends React.Component {
         this._dummyLink = createRef();
     }
 
-    /**
-     * Extracts a human readable label for the file attachment to use as
-     * link text.
-     *
-     * @param {Object} content The "content" key of the matrix event.
-     * @param {boolean} withSize Whether to include size information. Default true.
-     * @return {string} the human readable link text for the attachment.
-     */
-    presentableTextForFile(content, withSize = true) {
-        let linkText = _t("Attachment");
-        if (content.body && content.body.length > 0) {
-            // The content body should be the name of the file including a
-            // file extension.
-            linkText = content.body;
-        }
-
-        if (content.info && content.info.size && withSize) {
-            // If we know the size of the file then add it as human readable
-            // string to the end of the link text so that the user knows how
-            // big a file they are downloading.
-            // The content.info also contains a MIME-type but we don't display
-            // it since it is "ugly", users generally aren't aware what it
-            // means and the type of the attachment can usually be inferrered
-            // from the file extension.
-            linkText += ' (' + filesize(content.info.size) + ')';
-        }
-        return linkText;
-    }
-
     _getContentUrl() {
         const media = mediaFromContent(this.props.mxEvent.getContent());
         return media.srcHttp;
@@ -161,7 +161,7 @@ export default class MFileBody extends React.Component {
 
     render() {
         const content = this.props.mxEvent.getContent();
-        const text = this.presentableTextForFile(content);
+        const text = presentableTextForFile(content);
         const isEncrypted = content.file !== undefined;
         const fileName = content.body && content.body.length > 0 ? content.body : _t("Attachment");
         const contentUrl = this._getContentUrl();
@@ -173,7 +173,7 @@ export default class MFileBody extends React.Component {
             placeholder = (
                 
- {this.presentableTextForFile(content, false)} + {presentableTextForFile(content, false)}
); } diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.js index cdc78e46e8..5ace22a560 100644 --- a/src/components/views/messages/MImageReplyBody.js +++ b/src/components/views/messages/MImageReplyBody.js @@ -1,5 +1,5 @@ /* -Copyright 2020 Tulir Asokan +Copyright 2020-2021 Tulir Asokan Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,10 +15,10 @@ limitations under the License. */ import React from "react"; -import { _td } from "../../../languageHandler"; +import {_td} from "../../../languageHandler"; import * as sdk from "../../../index"; import MImageBody from './MImageBody'; -import MFileBody from "./MFileBody"; +import {presentableTextForFile} from "./MFileBody"; export default class MImageReplyBody extends MImageBody { onClick(ev) { @@ -31,7 +31,7 @@ export default class MImageReplyBody extends MImageBody { // Don't show "Download this_file.png ..." getFileBody() { - return MFileBody.prototype.presentableTextForFile.call(this, this.props.mxEvent.getContent()); + return presentableTextForFile(this.props.mxEvent.getContent()); } render() { @@ -45,15 +45,17 @@ export default class MImageReplyBody extends MImageBody { const thumbnail = this._messageContent(contentUrl, this._getThumbUrl(), content); const fileBody = this.getFileBody(); const SenderProfile = sdk.getComponent('messages.SenderProfile'); - const sender = ; + const sender = ; return
-
{ thumbnail }
-
{ sender }
-
{ fileBody }
+
{thumbnail}
+
{sender}
+
{fileBody}
; } } diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 19c5a7acaa..4411f94f02 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -247,7 +247,7 @@ interface IProps { // It could also be done by subclassing EventTile, but that'd be quite // boiilerplatey. So just make the necessary render decisions conditional // for now. - tileShape?: 'notif' | 'file_grid' | 'reply' | 'reply_preview'; + tileShape?: 'notif' | 'file_grid'; // show twelve hour timestamps isTwelveHour?: boolean; @@ -940,7 +940,7 @@ export default class EventTile extends React.Component { } if (needsSenderProfile) { - if (!this.props.tileShape || this.props.tileShape === 'reply' || this.props.tileShape === 'reply_preview') { + if (!this.props.tileShape) { sender = { ); } - case 'reply': - case 'reply_preview': { - let thread; - if (this.props.tileShape === 'reply_preview') { - thread = ReplyThread.makeThread( - this.props.mxEvent, - this.props.onHeightChanged, - this.props.permalinkCreator, - this.replyThread, - ); - } - return ( -
- { ircTimestamp } - { avatar } - { sender } - { ircPadlock } -
- { groupTimestamp } - { groupPadlock } - { thread } - -
-
- ); - } default: { const thread = ReplyThread.makeThread( this.props.mxEvent, diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index 56a6609cc7..222fcea552 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -87,9 +87,11 @@ export default class ReplyPreview extends React.Component {
- +
; diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index 95503493f7..336c5a721b 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -1,5 +1,5 @@ /* -Copyright 2020 Tulir Asokan +Copyright 2020-2021 Tulir Asokan Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25,42 +25,8 @@ import dis from '../../../dispatcher/dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; import {MatrixClient} from 'matrix-js-sdk'; -import { objectHasDiff } from '../../../utils/objects'; - -const eventTileTypes = { - 'm.room.message': 'messages.MessageEvent', - 'm.sticker': 'messages.MessageEvent', - 'm.call.invite': 'messages.TextualEvent', - 'm.call.answer': 'messages.TextualEvent', - 'm.call.hangup': 'messages.TextualEvent', -}; - -const stateEventTileTypes = { - 'm.room.aliases': 'messages.TextualEvent', - // 'm.room.aliases': 'messages.RoomAliasesEvent', // too complex - 'm.room.canonical_alias': 'messages.TextualEvent', - 'm.room.create': 'messages.RoomCreate', - 'm.room.member': 'messages.TextualEvent', - 'm.room.name': 'messages.TextualEvent', - 'm.room.avatar': 'messages.RoomAvatarEvent', - 'm.room.third_party_invite': 'messages.TextualEvent', - 'm.room.history_visibility': 'messages.TextualEvent', - 'm.room.encryption': 'messages.TextualEvent', - 'm.room.topic': 'messages.TextualEvent', - 'm.room.power_levels': 'messages.TextualEvent', - 'm.room.pinned_events': 'messages.TextualEvent', - 'm.room.server_acl': 'messages.TextualEvent', - 'im.vector.modular.widgets': 'messages.TextualEvent', - 'm.room.tombstone': 'messages.TextualEvent', - 'm.room.join_rules': 'messages.TextualEvent', - 'm.room.guest_access': 'messages.TextualEvent', - 'm.room.related_groups': 'messages.TextualEvent', -}; - -function getHandlerTile(ev) { - const type = ev.getType(); - return ev.isState() ? stateEventTileTypes[type] : eventTileTypes[type]; -} +import {objectHasDiff} from '../../../utils/objects'; +import {getHandlerTile} from "./EventTile"; class ReplyTile extends React.Component { static contextTypes = { @@ -94,7 +60,7 @@ class ReplyTile extends React.Component { return true; } - return !this._propsEqual(this.props, nextProps); + return objectHasDiff(this.props, nextProps); } componentWillUnmount() { @@ -108,28 +74,6 @@ class ReplyTile extends React.Component { } } - _propsEqual(objA, objB) { - const keysA = Object.keys(objA); - const keysB = Object.keys(objB); - - if (keysA.length !== keysB.length) { - return false; - } - - for (let i = 0; i < keysA.length; i++) { - const key = keysA[i]; - - if (!objB.hasOwnProperty(key)) { - return false; - } - - if (objA[key] !== objB[key]) { - return false; - } - } - return true; - } - onClick(e) { // This allows the permalink to be opened in a new tab/window or copied as // matrix.to, but also for it to enable routing within Riot when clicked. From 9f66bd0f652f0aeee604471a1509c9f9b6af37fc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 15 Jun 2021 17:48:16 +0300 Subject: [PATCH 016/135] Remove extra space --- src/components/views/rooms/ReplyPreview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index 3cd88902ce..222fcea552 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -89,7 +89,7 @@ export default class ReplyPreview extends React.Component {
From 598689b059196c47e1d1455c823383fd062807c4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 2 Jul 2021 12:56:08 +0300 Subject: [PATCH 017/135] Run eslint --- src/components/views/messages/MImageReplyBody.js | 4 ++-- src/components/views/rooms/ReplyTile.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.js index 5ace22a560..2ed7a637bd 100644 --- a/src/components/views/messages/MImageReplyBody.js +++ b/src/components/views/messages/MImageReplyBody.js @@ -15,10 +15,10 @@ limitations under the License. */ import React from "react"; -import {_td} from "../../../languageHandler"; +import { _td } from "../../../languageHandler"; import * as sdk from "../../../index"; import MImageBody from './MImageBody'; -import {presentableTextForFile} from "./MFileBody"; +import { presentableTextForFile } from "./MFileBody"; export default class MImageReplyBody extends MImageBody { onClick(ev) { diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.js index 336c5a721b..23dcdc21a3 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.js @@ -23,10 +23,10 @@ import * as sdk from '../../../index'; import dis from '../../../dispatcher/dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; -import {MatrixClient} from 'matrix-js-sdk'; +import { MatrixClient } from 'matrix-js-sdk'; -import {objectHasDiff} from '../../../utils/objects'; -import {getHandlerTile} from "./EventTile"; +import { objectHasDiff } from '../../../utils/objects'; +import { getHandlerTile } from "./EventTile"; class ReplyTile extends React.Component { static contextTypes = { @@ -112,7 +112,7 @@ class ReplyTile extends React.Component { // This shouldn't happen: the caller should check we support this type // before trying to instantiate us if (!tileHandler) { - const {mxEvent} = this.props; + const { mxEvent } = this.props; console.warn(`Event type not supported: type:${mxEvent.getType()} isState:${mxEvent.isState()}`); return
{ _t('This event could not be displayed') } From 38710eab88e4fb8a55948d431319982ba9a733df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 13:31:56 +0200 Subject: [PATCH 018/135] Export IProps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ImageView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 2628170f9c..985160019e 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -43,14 +43,14 @@ const ZOOM_COEFFICIENT = 0.0025; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; -interface IProps { +export interface IProps { src: string; // the source of the image being displayed name?: string; // the main title ('name') for the image link?: string; // the link (if any) applied to the name of the image width?: number; // width of the image src in pixels height?: number; // height of the image src in pixels fileSize?: number; // size of the image src in bytes - onFinished(): void; // callback when the lightbox is dismissed + onFinished?(): void; // callback when the lightbox is dismissed // the event (if any) that the Image is displaying. Used for event-specific stuff like // redactions, senders, timestamps etc. Other descriptors are taken from the explicit From 869f31deef3a917b653ce36b4a24efd3d1bc7ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 13:46:42 +0200 Subject: [PATCH 019/135] Convert MImageBody to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{MImageBody.js => MImageBody.tsx} | 178 +++++++++--------- 1 file changed, 92 insertions(+), 86 deletions(-) rename src/components/views/messages/{MImageBody.js => MImageBody.tsx} (80%) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.tsx similarity index 80% rename from src/components/views/messages/MImageBody.js rename to src/components/views/messages/MImageBody.tsx index 5566f5aec0..c2553b51a3 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.tsx @@ -17,8 +17,6 @@ limitations under the License. */ import React, { createRef } from 'react'; -import PropTypes from 'prop-types'; - import MFileBody from './MFileBody'; import Modal from '../../../Modal'; import * as sdk from '../../../index'; @@ -31,36 +29,48 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import { mediaFromContent } from "../../../customisations/Media"; import BlurhashPlaceholder from "../elements/BlurhashPlaceholder"; import { BLURHASH_FIELD } from "../../../ContentMessages"; +import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; +import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; +import { IMediaEventContent } from '../../../customisations/models/IMediaEventContent'; +import { IProps as ImageViewIProps } from "../elements/ImageView"; + +export interface IProps { + /* the MatrixEvent to show */ + mxEvent: MatrixEvent, + /* called when the image has loaded */ + onHeightChanged(): void, + + /* the maximum image height to use */ + maxImageHeight?: number, + + /* the permalinkCreator */ + permalinkCreator?: RoomPermalinkCreator, +} + +interface IState { + decryptedUrl?: string, + decryptedThumbnailUrl?: string, + decryptedBlob?: Blob, + error, + imgError: boolean, + imgLoaded: boolean, + loadedImageDimensions?: { + naturalWidth: number; + naturalHeight: number; + }, + hover: boolean, + showImage: boolean, +} @replaceableComponent("views.messages.MImageBody") -export default class MImageBody extends React.Component { - static propTypes = { - /* the MatrixEvent to show */ - mxEvent: PropTypes.object.isRequired, - - /* called when the image has loaded */ - onHeightChanged: PropTypes.func.isRequired, - - /* the maximum image height to use */ - maxImageHeight: PropTypes.number, - - /* the permalinkCreator */ - permalinkCreator: PropTypes.object, - }; - +export default class MImageBody extends React.Component { static contextType = MatrixClientContext; + private unmounted = true; + private image = createRef(); - constructor(props) { + constructor(props: IProps) { super(props); - this.onImageError = this.onImageError.bind(this); - this.onImageLoad = this.onImageLoad.bind(this); - this.onImageEnter = this.onImageEnter.bind(this); - this.onImageLeave = this.onImageLeave.bind(this); - this.onClientSync = this.onClientSync.bind(this); - this.onClick = this.onClick.bind(this); - this._isGif = this._isGif.bind(this); - this.state = { decryptedUrl: null, decryptedThumbnailUrl: null, @@ -72,12 +82,10 @@ export default class MImageBody extends React.Component { hover: false, showImage: SettingsStore.getValue("showImages"), }; - - this._image = createRef(); } // FIXME: factor this out and apply it to MVideoBody and MAudioBody too! - onClientSync(syncState, prevState) { + private onClientSync = (syncState, prevState): void => { if (this.unmounted) return; // Consider the client reconnected if there is no error with syncing. // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP. @@ -88,15 +96,15 @@ export default class MImageBody extends React.Component { imgError: false, }); } - } + }; - showImage() { + protected showImage(): void { localStorage.setItem("mx_ShowImage_" + this.props.mxEvent.getId(), "true"); this.setState({ showImage: true }); - this._downloadImage(); + this.downloadImage(); } - onClick(ev) { + protected onClick = (ev: React.MouseEvent): void => { if (ev.button === 0 && !ev.metaKey) { ev.preventDefault(); if (!this.state.showImage) { @@ -104,12 +112,12 @@ export default class MImageBody extends React.Component { return; } - const content = this.props.mxEvent.getContent(); - const httpUrl = this._getContentUrl(); + const content = this.props.mxEvent.getContent() as IMediaEventContent; + const httpUrl = this.getContentUrl(); const ImageView = sdk.getComponent("elements.ImageView"); - const params = { + const params: ImageViewIProps = { src: httpUrl, - name: content.body && content.body.length > 0 ? content.body : _t('Attachment'), + name: content.body?.length > 0 ? content.body : _t('Attachment'), mxEvent: this.props.mxEvent, permalinkCreator: this.props.permalinkCreator, }; @@ -122,58 +130,54 @@ export default class MImageBody extends React.Component { Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true); } - } + }; - _isGif() { + private isGif = (): boolean => { const content = this.props.mxEvent.getContent(); - return ( - content && - content.info && - content.info.mimetype === "image/gif" - ); - } + return content?.info?.mimetype === "image/gif"; + }; - onImageEnter(e) { + private onImageEnter = (e: React.MouseEvent): void => { this.setState({ hover: true }); - if (!this.state.showImage || !this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { + if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } - const imgElement = e.target; - imgElement.src = this._getContentUrl(); - } + const imgElement = e.target as HTMLImageElement; + imgElement.src = this.getContentUrl(); + }; - onImageLeave(e) { + private onImageLeave = (e: React.MouseEvent): void => { this.setState({ hover: false }); - if (!this.state.showImage || !this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { + if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } - const imgElement = e.target; - imgElement.src = this._getThumbUrl(); - } + const imgElement = e.target as HTMLImageElement; + imgElement.src = this.getThumbUrl(); + }; - onImageError() { + private onImageError = (): void => { this.setState({ imgError: true, }); - } + }; - onImageLoad() { + private onImageLoad = (): void => { this.props.onHeightChanged(); let loadedImageDimensions; - if (this._image.current) { - const { naturalWidth, naturalHeight } = this._image.current; + if (this.image.current) { + const { naturalWidth, naturalHeight } = this.image.current; // this is only used as a fallback in case content.info.w/h is missing loadedImageDimensions = { naturalWidth, naturalHeight }; } this.setState({ imgLoaded: true, loadedImageDimensions }); - } + }; - _getContentUrl() { + protected getContentUrl(): string { const media = mediaFromContent(this.props.mxEvent.getContent()); if (media.isEncrypted) { return this.state.decryptedUrl; @@ -182,7 +186,7 @@ export default class MImageBody extends React.Component { } } - _getThumbUrl() { + protected getThumbUrl(): string { // FIXME: we let images grow as wide as you like, rather than capped to 800x600. // So either we need to support custom timeline widths here, or reimpose the cap, otherwise the // thumbnail resolution will be unnecessarily reduced. @@ -190,7 +194,7 @@ export default class MImageBody extends React.Component { const thumbWidth = 800; const thumbHeight = 600; - const content = this.props.mxEvent.getContent(); + const content = this.props.mxEvent.getContent() as IMediaEventContent; const media = mediaFromContent(content); if (media.isEncrypted) { @@ -218,7 +222,7 @@ export default class MImageBody extends React.Component { // - If there's no sizing info in the event, default to thumbnail const info = content.info; if ( - this._isGif() || + this.isGif() || window.devicePixelRatio === 1.0 || (!info || !info.w || !info.h || !info.size) ) { @@ -253,7 +257,7 @@ export default class MImageBody extends React.Component { } } - _downloadImage() { + private downloadImage(): void { const content = this.props.mxEvent.getContent(); if (content.file !== undefined && this.state.decryptedUrl === null) { let thumbnailPromise = Promise.resolve(null); @@ -297,7 +301,7 @@ export default class MImageBody extends React.Component { if (showImage) { // Don't download anything becaue we don't want to display anything. - this._downloadImage(); + this.downloadImage(); this.setState({ showImage: true }); } @@ -327,7 +331,7 @@ export default class MImageBody extends React.Component { _afterComponentWillUnmount() { } - _messageContent(contentUrl, thumbUrl, content) { + protected messageContent(contentUrl: string, thumbUrl: string, content: IMediaEventContent): JSX.Element { let infoWidth; let infoHeight; @@ -348,7 +352,7 @@ export default class MImageBody extends React.Component { imageElement = ; } else { imageElement = ( - {content.body}; + img = ; showPlaceholder = false; // because we're hiding the image, so don't show the placeholder. } - if (this._isGif() && !SettingsStore.getValue("autoplayGifsAndVideos") && !this.state.hover) { + if (this.isGif() && !SettingsStore.getValue("autoplayGifsAndVideos") && !this.state.hover) { gifLabel =

GIF

; } @@ -427,14 +431,14 @@ export default class MImageBody extends React.Component { } // Overidden by MStickerBody - wrapImage(contentUrl, children) { + protected wrapImage(contentUrl: string, children: JSX.Element): JSX.Element { return {children} ; } // Overidden by MStickerBody - getPlaceholder(width, height) { + protected getPlaceholder() { const blurhash = this.props.mxEvent.getContent().info[BLURHASH_FIELD]; if (blurhash) return ; return
@@ -443,17 +447,17 @@ export default class MImageBody extends React.Component { } // Overidden by MStickerBody - getTooltip() { + protected getTooltip() { return null; } // Overidden by MStickerBody - getFileBody() { + protected getFileBody(): JSX.Element { return ; } render() { - const content = this.props.mxEvent.getContent(); + const content = this.props.mxEvent.getContent() as IMediaEventContent; if (this.state.error !== null) { return ( @@ -464,15 +468,15 @@ export default class MImageBody extends React.Component { ); } - const contentUrl = this._getContentUrl(); + const contentUrl = this.getContentUrl(); let thumbUrl; - if (this._isGif() && SettingsStore.getValue("autoplayGifsAndVideos")) { + if (this.isGif() && SettingsStore.getValue("autoplayGifsAndVideos")) { thumbUrl = contentUrl; } else { - thumbUrl = this._getThumbUrl(); + thumbUrl = this.getThumbUrl(); } - const thumbnail = this._messageContent(contentUrl, thumbUrl, content); + const thumbnail = this.messageContent(contentUrl, thumbUrl, content); const fileBody = this.getFileBody(); return @@ -482,16 +486,18 @@ export default class MImageBody extends React.Component { } } -export class HiddenImagePlaceholder extends React.PureComponent { - static propTypes = { - hover: PropTypes.bool, - }; +interface PlaceholderIProps { + hover?: boolean; + maxWidth?: number; +} +export class HiddenImagePlaceholder extends React.PureComponent { render() { + const maxWidth = this.props.maxWidth ? this.props.maxWidth + "px" : null; let className = 'mx_HiddenImagePlaceholder'; if (this.props.hover) className += ' mx_HiddenImagePlaceholder_hover'; return ( -
+
{_t("Show image")} From 969be0921023930c91f35827d18df03d68336498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 13:50:34 +0200 Subject: [PATCH 020/135] Add a few things to IMediaEventContent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/customisations/models/IMediaEventContent.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/customisations/models/IMediaEventContent.ts b/src/customisations/models/IMediaEventContent.ts index fb05d76a4d..62dfe4ee19 100644 --- a/src/customisations/models/IMediaEventContent.ts +++ b/src/customisations/models/IMediaEventContent.ts @@ -32,11 +32,16 @@ export interface IEncryptedFile { } export interface IMediaEventContent { + body?: string; url?: string; // required on unencrypted media file?: IEncryptedFile; // required for *encrypted* media info?: { thumbnail_url?: string; // eslint-disable-line camelcase thumbnail_file?: IEncryptedFile; // eslint-disable-line camelcase + mimetype: string; + w?: number; + h?: number; + size?: number; }; } From 5f49b2d374e9da04ab976dbade1e854bc633bac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 13:53:38 +0200 Subject: [PATCH 021/135] Missing args MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index c2553b51a3..c6a4131d1d 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -438,7 +438,7 @@ export default class MImageBody extends React.Component { } // Overidden by MStickerBody - protected getPlaceholder() { + protected getPlaceholder(width: number, height: number) { const blurhash = this.props.mxEvent.getContent().info[BLURHASH_FIELD]; if (blurhash) return ; return
From 5d78eb4a755ec664062f9c81b54a2db3e387bc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 14:01:30 +0200 Subject: [PATCH 022/135] Member delimiter rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index c6a4131d1d..e29c87599f 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -36,30 +36,30 @@ import { IProps as ImageViewIProps } from "../elements/ImageView"; export interface IProps { /* the MatrixEvent to show */ - mxEvent: MatrixEvent, + mxEvent: MatrixEvent; /* called when the image has loaded */ - onHeightChanged(): void, + onHeightChanged(): void; /* the maximum image height to use */ - maxImageHeight?: number, + maxImageHeight?: number; /* the permalinkCreator */ - permalinkCreator?: RoomPermalinkCreator, + permalinkCreator?: RoomPermalinkCreator; } interface IState { - decryptedUrl?: string, - decryptedThumbnailUrl?: string, - decryptedBlob?: Blob, - error, - imgError: boolean, - imgLoaded: boolean, + decryptedUrl?: string; + decryptedThumbnailUrl?: string; + decryptedBlob?: Blob; + error; + imgError: boolean; + imgLoaded: boolean; loadedImageDimensions?: { naturalWidth: number; naturalHeight: number; - }, - hover: boolean, - showImage: boolean, + }; + hover: boolean; + showImage: boolean; } @replaceableComponent("views.messages.MImageBody") From 664503678079c500d970f8dc389981fbead88646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 14:17:40 +0200 Subject: [PATCH 023/135] Convert MImageReplyBody to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...MImageReplyBody.js => MImageReplyBody.tsx} | 27 ++++++++++--------- .../views/messages/SenderProfile.tsx | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) rename src/components/views/messages/{MImageReplyBody.js => MImageReplyBody.tsx} (69%) diff --git a/src/components/views/messages/MImageReplyBody.js b/src/components/views/messages/MImageReplyBody.tsx similarity index 69% rename from src/components/views/messages/MImageReplyBody.js rename to src/components/views/messages/MImageReplyBody.tsx index 2ed7a637bd..da720fc00f 100644 --- a/src/components/views/messages/MImageReplyBody.js +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -15,22 +15,26 @@ limitations under the License. */ import React from "react"; -import { _td } from "../../../languageHandler"; -import * as sdk from "../../../index"; -import MImageBody from './MImageBody'; +import MImageBody, { IProps as MImageBodyIProps } from "./MImageBody"; import { presentableTextForFile } from "./MFileBody"; +import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; +import SenderProfile from "./SenderProfile"; export default class MImageReplyBody extends MImageBody { - onClick(ev) { - ev.preventDefault(); + constructor(props: MImageBodyIProps) { + super(props); } - wrapImage(contentUrl, children) { + public onClick = (ev: React.MouseEvent): void => { + ev.preventDefault(); + }; + + public wrapImage(contentUrl: string, children: JSX.Element): JSX.Element { return children; } // Don't show "Download this_file.png ..." - getFileBody() { + public getFileBody(): JSX.Element { return presentableTextForFile(this.props.mxEvent.getContent()); } @@ -39,17 +43,14 @@ export default class MImageReplyBody extends MImageBody { return super.render(); } - const content = this.props.mxEvent.getContent(); + const content = this.props.mxEvent.getContent() as IMediaEventContent; - const contentUrl = this._getContentUrl(); - const thumbnail = this._messageContent(contentUrl, this._getThumbUrl(), content); + const contentUrl = this.getContentUrl(); + const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content); const fileBody = this.getFileBody(); - const SenderProfile = sdk.getComponent('messages.SenderProfile'); const sender = ; return
diff --git a/src/components/views/messages/SenderProfile.tsx b/src/components/views/messages/SenderProfile.tsx index 11c3ca4e3c..bdae9cec4a 100644 --- a/src/components/views/messages/SenderProfile.tsx +++ b/src/components/views/messages/SenderProfile.tsx @@ -24,7 +24,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; interface IProps { mxEvent: MatrixEvent; - onClick(): void; + onClick?(): void; enableFlair: boolean; } From 0fe10e4502dfa234ef9e8388e91ac8ca481b99ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 14:22:46 +0200 Subject: [PATCH 024/135] Fix replies to deleted messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_RedactedBody.scss | 4 +++- res/css/views/rooms/_ReplyTile.scss | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/res/css/views/messages/_RedactedBody.scss b/res/css/views/messages/_RedactedBody.scss index 600ac0c6b7..767dfef736 100644 --- a/res/css/views/messages/_RedactedBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -20,6 +20,8 @@ limitations under the License. padding-left: 20px; position: relative; + line-height: 2.2rem; + &::before { height: 14px; width: 14px; @@ -30,7 +32,7 @@ limitations under the License. mask-size: contain; content: ''; position: absolute; - top: 1px; + top: 4px; left: 0; } } diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index fd68430157..487b616240 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -25,7 +25,8 @@ limitations under the License. } .mx_ReplyTile > a { - display: block; + display: flex; + flex-direction: column; text-decoration: none; color: $primary-fg-color; } From 9a1b73f86735d12455ec1ac44ffa6de640437dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 14:51:51 +0200 Subject: [PATCH 025/135] Convert ReplyTile to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../rooms/{ReplyTile.js => ReplyTile.tsx} | 84 +++++++------------ 1 file changed, 31 insertions(+), 53 deletions(-) rename src/components/views/rooms/{ReplyTile.js => ReplyTile.tsx} (72%) diff --git a/src/components/views/rooms/ReplyTile.js b/src/components/views/rooms/ReplyTile.tsx similarity index 72% rename from src/components/views/rooms/ReplyTile.js rename to src/components/views/rooms/ReplyTile.tsx index 23dcdc21a3..6a01e8dc97 100644 --- a/src/components/views/rooms/ReplyTile.js +++ b/src/components/views/rooms/ReplyTile.tsx @@ -15,66 +15,52 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; -import { _t, _td } from '../../../languageHandler'; - -import * as sdk from '../../../index'; - +import { _t } from '../../../languageHandler'; import dis from '../../../dispatcher/dispatcher'; import SettingsStore from "../../../settings/SettingsStore"; -import { MatrixClient } from 'matrix-js-sdk'; - -import { objectHasDiff } from '../../../utils/objects'; import { getHandlerTile } from "./EventTile"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; +import SenderProfile from "../messages/SenderProfile"; +import TextualBody from "../messages/TextualBody"; +import MImageReplyBody from "../messages/MImageReplyBody"; +import * as sdk from '../../../index'; -class ReplyTile extends React.Component { - static contextTypes = { - matrixClient: PropTypes.instanceOf(MatrixClient).isRequired, - } - - static propTypes = { - mxEvent: PropTypes.object.isRequired, - isRedacted: PropTypes.bool, - permalinkCreator: PropTypes.object, - onHeightChanged: PropTypes.func, - } +interface IProps { + mxEvent: MatrixEvent; + isRedacted?: boolean; + permalinkCreator?: RoomPermalinkCreator; + highlights?: Array; + highlightLink?: string; + onHeightChanged?(): void; +} +export default class ReplyTile extends React.PureComponent { static defaultProps = { - onHeightChanged: function() {}, - } + onHeightChanged: () => {}, + }; - constructor(props, context) { - super(props, context); - this.state = {}; - this.onClick = this.onClick.bind(this); - this._onDecrypted = this._onDecrypted.bind(this); + constructor(props: IProps) { + super(props); } componentDidMount() { - this.props.mxEvent.on("Event.decrypted", this._onDecrypted); - } - - shouldComponentUpdate(nextProps, nextState) { - if (objectHasDiff(this.state, nextState)) { - return true; - } - - return objectHasDiff(this.props, nextProps); + this.props.mxEvent.on("Event.decrypted", this.onDecrypted); } componentWillUnmount() { - this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); + this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted); } - _onDecrypted() { + private onDecrypted = (): void => { this.forceUpdate(); if (this.props.onHeightChanged) { this.props.onHeightChanged(); } - } + }; - onClick(e) { + private onClick = (e: React.MouseEvent): void => { // This allows the permalink to be opened in a new tab/window or copied as // matrix.to, but also for it to enable routing within Riot when clicked. e.preventDefault(); @@ -84,11 +70,9 @@ class ReplyTile extends React.Component { highlighted: true, room_id: this.props.mxEvent.getRoomId(), }); - } + }; render() { - const SenderProfile = sdk.getComponent('messages.SenderProfile'); - const content = this.props.mxEvent.getContent(); const msgtype = content.msgtype; const eventType = this.props.mxEvent.getType(); @@ -118,6 +102,7 @@ class ReplyTile extends React.Component { { _t('This event could not be displayed') }
; } + const EventTileType = sdk.getComponent(tileHandler); const classes = classNames({ @@ -135,18 +120,12 @@ class ReplyTile extends React.Component { const needsSenderProfile = msgtype !== 'm.image' && tileHandler !== 'messages.RoomCreate' && !isInfoMessage; if (needsSenderProfile) { - let text = null; - if (msgtype === 'm.image') text = _td('%(senderName)s sent an image'); - else if (msgtype === 'm.video') text = _td('%(senderName)s sent a video'); - else if (msgtype === 'm.file') text = _td('%(senderName)s uploaded a file'); - sender = ; + />; } - const MImageReplyBody = sdk.getComponent('messages.MImageReplyBody'); - const TextualBody = sdk.getComponent('messages.TextualBody'); const msgtypeOverrides = { "m.image": MImageReplyBody, // We don't want a download link for files, just the file name is enough. @@ -163,7 +142,8 @@ class ReplyTile extends React.Component {
{ sender } - Date: Fri, 2 Jul 2021 14:57:08 +0200 Subject: [PATCH 026/135] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 908c023b48..618d5763fa 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1563,9 +1563,6 @@ "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Seen by %(displayName)s (%(userName)s) at %(dateTime)s", "Replying": "Replying", - "%(senderName)s sent an image": "%(senderName)s sent an image", - "%(senderName)s sent a video": "%(senderName)s sent a video", - "%(senderName)s uploaded a file": "%(senderName)s uploaded a file", "Room %(name)s": "Room %(name)s", "Recently visited rooms": "Recently visited rooms", "No recently visited rooms": "No recently visited rooms", From e582b1559b1d6a30f64d0c223a26a043f32e5769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 15:09:02 +0200 Subject: [PATCH 027/135] Fix redacted messages (again) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_RedactedBody.scss | 4 +--- res/css/views/rooms/_ReplyTile.scss | 9 +++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/res/css/views/messages/_RedactedBody.scss b/res/css/views/messages/_RedactedBody.scss index 767dfef736..600ac0c6b7 100644 --- a/res/css/views/messages/_RedactedBody.scss +++ b/res/css/views/messages/_RedactedBody.scss @@ -20,8 +20,6 @@ limitations under the License. padding-left: 20px; position: relative; - line-height: 2.2rem; - &::before { height: 14px; width: 14px; @@ -32,7 +30,7 @@ limitations under the License. mask-size: contain; content: ''; position: absolute; - top: 4px; + top: 1px; left: 0; } } diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 487b616240..027b9626a6 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -31,6 +31,15 @@ limitations under the License. color: $primary-fg-color; } +.mx_ReplyTile > .mx_RedactedBody { + padding: 18px; + + &::before { + height: 13px; + width: 13px; + } +} + // We do reply size limiting with CSS to avoid duplicating the TextualBody component. .mx_ReplyTile .mx_EventTile_content { $reply-lines: 2; From 0d8f84c769b9bee61acc299c461f9788547d9ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 15:35:52 +0200 Subject: [PATCH 028/135] Delete lozenge effect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 22 -------------------- src/components/views/elements/ReplyThread.js | 1 - src/components/views/rooms/ReplyPreview.js | 1 - src/components/views/rooms/ReplyTile.tsx | 2 -- 4 files changed, 26 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 027b9626a6..d8184d01be 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -96,28 +96,6 @@ limitations under the License. max-width: calc(100% - 65px); } -.mx_ReplyTile_redacted .mx_UnknownBody { - --lozenge-color: $event-redacted-fg-color; - --lozenge-border-color: $event-redacted-border-color; - display: block; - height: 22px; - width: 250px; - border-radius: 11px; - background: - repeating-linear-gradient( - -45deg, - var(--lozenge-color), - var(--lozenge-color) 3px, - transparent 3px, - transparent 6px - ); - box-shadow: 0px 0px 3px var(--lozenge-border-color) inset; -} - -.mx_ReplyTile_sending.mx_ReplyTile_redacted .mx_UnknownBody { - opacity: 0.4; -} - .mx_ReplyTile_contextual { opacity: 0.4; } diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index f199cd53b5..d309c718dd 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -382,7 +382,6 @@ export default class ReplyThread extends React.Component { mxEvent={ev} onHeightChanged={this.props.onHeightChanged} permalinkCreator={this.props.permalinkCreator} - isRedacted={ev.isRedacted()} isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} layout={this.props.layout} alwaysShowTimestamps={this.props.alwaysShowTimestamps} diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index 1dbec2451a..ca95dbb62f 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -88,7 +88,6 @@ export default class ReplyPreview extends React.Component {
diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 6a01e8dc97..757c273b50 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -29,7 +29,6 @@ import * as sdk from '../../../index'; interface IProps { mxEvent: MatrixEvent; - isRedacted?: boolean; permalinkCreator?: RoomPermalinkCreator; highlights?: Array; highlightLink?: string; @@ -108,7 +107,6 @@ export default class ReplyTile extends React.PureComponent { const classes = classNames({ mx_ReplyTile: true, mx_ReplyTile_info: isInfoMessage, - mx_ReplyTile_redacted: this.props.isRedacted, }); let permalink = "#"; From 259b36c13d5d27b542e4d6bc9a43a682d231b90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 15:38:44 +0200 Subject: [PATCH 029/135] Remove unused code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ReplyThread.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index d309c718dd..585c4bbdc0 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -382,12 +382,6 @@ export default class ReplyThread extends React.Component { mxEvent={ev} onHeightChanged={this.props.onHeightChanged} permalinkCreator={this.props.permalinkCreator} - isTwelveHour={SettingsStore.getValue("showTwelveHourTimestamps")} - layout={this.props.layout} - alwaysShowTimestamps={this.props.alwaysShowTimestamps} - enableFlair={SettingsStore.getValue(UIFeature.Flair)} - replacingEventId={ev.replacingEventId()} - as="div" />
; }); From 090acc4811f2dc3f03089cb5346a7bee44db9033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 2 Jul 2021 15:41:36 +0200 Subject: [PATCH 030/135] Unused import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ReplyThread.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 585c4bbdc0..b6368eb5b3 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -29,7 +29,6 @@ import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; import { Action } from "../../../dispatcher/actions"; import sanitizeHtml from "sanitize-html"; -import { UIFeature } from "../../../settings/UIFeature"; import { PERMITTED_URL_SCHEMES } from "../../../HtmlUtils"; import { replaceableComponent } from "../../../utils/replaceableComponent"; From bd175c6f40e232f56a95070408c75ebd0ba72fdd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 10 Jul 2021 15:43:46 +0100 Subject: [PATCH 031/135] Improve and consolidate typing --- src/ContentMessages.tsx | 24 ++- src/MatrixClientPeg.ts | 18 +-- src/Rooms.ts | 8 +- src/{Searching.js => Searching.ts} | 150 +++++++++++------- src/components/structures/RoomDirectory.tsx | 51 ++---- src/components/structures/RoomView.tsx | 11 +- .../structures/SpaceRoomDirectory.tsx | 31 +--- src/components/views/dialogs/InviteDialog.tsx | 6 +- .../views/directory/NetworkDropdown.tsx | 25 +-- .../views/elements/MiniAvatarUploader.tsx | 2 +- .../room_settings/RoomPublishSetting.tsx | 3 +- .../spaces/SpaceSettingsVisibilityTab.tsx | 2 +- src/indexing/BaseEventIndexManager.ts | 45 +----- src/indexing/EventIndex.ts | 11 +- src/models/IUpload.ts | 4 +- .../handlers/AccountSettingsHandler.ts | 16 +- .../handlers/RoomAccountSettingsHandler.ts | 10 +- src/settings/handlers/RoomSettingsHandler.ts | 7 +- src/stores/SpaceStore.tsx | 7 +- src/utils/WidgetUtils.ts | 8 +- src/verification.ts | 4 +- 21 files changed, 186 insertions(+), 257 deletions(-) rename src/{Searching.js => Searching.ts} (81%) diff --git a/src/ContentMessages.tsx b/src/ContentMessages.tsx index 0ab193081b..b752886b8a 100644 --- a/src/ContentMessages.tsx +++ b/src/ContentMessages.tsx @@ -39,7 +39,7 @@ import { UploadStartedPayload, } from "./dispatcher/payloads/UploadPayload"; import { IUpload } from "./models/IUpload"; -import { IImageInfo } from "matrix-js-sdk/src/@types/partials"; +import { IAbortablePromise, IImageInfo } from "matrix-js-sdk/src/@types/partials"; const MAX_WIDTH = 800; const MAX_HEIGHT = 600; @@ -85,10 +85,6 @@ interface IThumbnail { thumbnail: Blob; } -interface IAbortablePromise extends Promise { - abort(): void; -} - /** * Create a thumbnail for a image DOM element. * The image will be smaller than MAX_WIDTH and MAX_HEIGHT. @@ -333,7 +329,7 @@ export function uploadFile( roomId: string, file: File | Blob, progressHandler?: any, // TODO: Types -): Promise<{url?: string, file?: any}> { // TODO: Types +): IAbortablePromise<{url?: string, file?: any}> { // TODO: Types let canceled = false; if (matrixClient.isRoomEncrypted(roomId)) { // If the room is encrypted then encrypt the file before uploading it. @@ -365,8 +361,8 @@ export function uploadFile( encryptInfo.mimetype = file.type; } return { "file": encryptInfo }; - }); - (prom as IAbortablePromise).abort = () => { + }) as IAbortablePromise<{ file: any }>; + prom.abort = () => { canceled = true; if (uploadPromise) matrixClient.cancelUpload(uploadPromise); }; @@ -379,8 +375,8 @@ export function uploadFile( if (canceled) throw new UploadCanceledError(); // If the attachment isn't encrypted then include the URL directly. return { url }; - }); - (promise1 as any).abort = () => { + }) as IAbortablePromise<{ url: string }>; + promise1.abort = () => { canceled = true; matrixClient.cancelUpload(basePromise); }; @@ -551,10 +547,10 @@ export default class ContentMessages { content.msgtype = 'm.file'; resolve(); } - }); + }) as IAbortablePromise; // create temporary abort handler for before the actual upload gets passed off to js-sdk - (prom as IAbortablePromise).abort = () => { + prom.abort = () => { upload.canceled = true; }; @@ -583,9 +579,7 @@ export default class ContentMessages { // XXX: upload.promise must be the promise that // is returned by uploadFile as it has an abort() // method hacked onto it. - upload.promise = uploadFile( - matrixClient, roomId, file, onProgress, - ); + upload.promise = uploadFile(matrixClient, roomId, file, onProgress); return upload.promise.then(function(result) { content.file = result.file; content.url = result.url; diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index 063c5f4cad..7de62ba075 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -17,8 +17,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { ICreateClientOpts } from 'matrix-js-sdk/src/matrix'; -import { MatrixClient } from 'matrix-js-sdk/src/client'; +import { ICreateClientOpts, PendingEventOrdering } from 'matrix-js-sdk/src/matrix'; +import { IStartClientOpts, MatrixClient } from 'matrix-js-sdk/src/client'; import { MemoryStore } from 'matrix-js-sdk/src/store/memory'; import * as utils from 'matrix-js-sdk/src/utils'; import { EventTimeline } from 'matrix-js-sdk/src/models/event-timeline'; @@ -47,16 +47,8 @@ export interface IMatrixClientCreds { freshLogin?: boolean; } -// TODO: Move this to the js-sdk -export interface IOpts { - initialSyncLimit?: number; - pendingEventOrdering?: "detached" | "chronological"; - lazyLoadMembers?: boolean; - clientWellKnownPollPeriod?: number; -} - export interface IMatrixClientPeg { - opts: IOpts; + opts: IStartClientOpts; /** * Sets the script href passed to the IndexedDB web worker @@ -127,7 +119,7 @@ class _MatrixClientPeg implements IMatrixClientPeg { // client is started in 'start'. These can be altered // at any time up to after the 'will_start_client' // event is finished processing. - public opts: IOpts = { + public opts: IStartClientOpts = { initialSyncLimit: 20, }; @@ -231,7 +223,7 @@ class _MatrixClientPeg implements IMatrixClientPeg { const opts = utils.deepCopy(this.opts); // the react sdk doesn't work without this, so don't allow - opts.pendingEventOrdering = "detached"; + opts.pendingEventOrdering = PendingEventOrdering.Detached; opts.lazyLoadMembers = true; opts.clientWellKnownPollPeriod = 2 * 60 * 60; // 2 hours diff --git a/src/Rooms.ts b/src/Rooms.ts index 4d1682660b..df44699c26 100644 --- a/src/Rooms.ts +++ b/src/Rooms.ts @@ -72,10 +72,8 @@ export function guessAndSetDMRoom(room: Room, isDirect: boolean): Promise this room as a DM room * @returns {object} A promise */ -export function setDMRoom(roomId: string, userId: string): Promise { - if (MatrixClientPeg.get().isGuest()) { - return Promise.resolve(); - } +export async function setDMRoom(roomId: string, userId: string): Promise { + if (MatrixClientPeg.get().isGuest()) return; const mDirectEvent = MatrixClientPeg.get().getAccountData('m.direct'); let dmRoomMap = {}; @@ -104,7 +102,7 @@ export function setDMRoom(roomId: string, userId: string): Promise { dmRoomMap[userId] = roomList; } - return MatrixClientPeg.get().setAccountData('m.direct', dmRoomMap); + await MatrixClientPeg.get().setAccountData('m.direct', dmRoomMap); } /** diff --git a/src/Searching.js b/src/Searching.ts similarity index 81% rename from src/Searching.js rename to src/Searching.ts index d0666b1760..95759d8819 100644 --- a/src/Searching.js +++ b/src/Searching.ts @@ -1,5 +1,5 @@ /* -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019 - 2021 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,26 +14,42 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { + IResultRoomEvents, + ISearchRequestBody, + ISearchResponse, + ISearchResult, + ISearchResults, + SearchOrderBy, +} from "matrix-js-sdk/src/@types/search"; +import { IRoomEventFilter } from "matrix-js-sdk/src/filter"; +import { EventType } from "matrix-js-sdk/src/@types/event"; + +import { ISearchArgs } from "./indexing/BaseEventIndexManager"; import EventIndexPeg from "./indexing/EventIndexPeg"; import { MatrixClientPeg } from "./MatrixClientPeg"; +import { SearchResult } from "matrix-js-sdk/src/models/search-result"; const SEARCH_LIMIT = 10; -async function serverSideSearch(term, roomId = undefined) { +async function serverSideSearch( + term: string, + roomId: string = undefined, +): Promise<{ response: ISearchResponse, query: ISearchRequestBody }> { const client = MatrixClientPeg.get(); - const filter = { + const filter: IRoomEventFilter = { limit: SEARCH_LIMIT, }; if (roomId !== undefined) filter.rooms = [roomId]; - const body = { + const body: ISearchRequestBody = { search_categories: { room_events: { search_term: term, filter: filter, - order_by: "recent", + order_by: SearchOrderBy.Recent, event_context: { before_limit: 1, after_limit: 1, @@ -45,31 +61,26 @@ async function serverSideSearch(term, roomId = undefined) { const response = await client.search({ body: body }); - const result = { - response: response, - query: body, - }; - - return result; + return { response, query: body }; } -async function serverSideSearchProcess(term, roomId = undefined) { +async function serverSideSearchProcess(term: string, roomId: string = undefined): Promise { const client = MatrixClientPeg.get(); const result = await serverSideSearch(term, roomId); // The js-sdk method backPaginateRoomEventsSearch() uses _query internally - // so we're reusing the concept here since we wan't to delegate the + // so we're reusing the concept here since we want to delegate the // pagination back to backPaginateRoomEventsSearch() in some cases. - const searchResult = { + const searchResults: ISearchResults = { _query: result.query, results: [], highlights: [], }; - return client.processRoomEventsSearch(searchResult, result.response); + return client.processRoomEventsSearch(searchResults, result.response); } -function compareEvents(a, b) { +function compareEvents(a: ISearchResult, b: ISearchResult): number { const aEvent = a.result; const bEvent = b.result; @@ -79,7 +90,7 @@ function compareEvents(a, b) { return 0; } -async function combinedSearch(searchTerm) { +async function combinedSearch(searchTerm: string): Promise { const client = MatrixClientPeg.get(); // Create two promises, one for the local search, one for the @@ -111,7 +122,7 @@ async function combinedSearch(searchTerm) { // returns since that one can be either a server-side one, a local one or a // fake one to fetch the remaining cached events. See the docs for // combineEvents() for an explanation why we need to cache events. - const emptyResult = { + const emptyResult: ISeshatSearchResults = { seshatQuery: localQuery, _query: serverQuery, serverSideNextBatch: serverResponse.next_batch, @@ -125,7 +136,7 @@ async function combinedSearch(searchTerm) { const combinedResult = combineResponses(emptyResult, localResponse, serverResponse.search_categories.room_events); // Let the client process the combined result. - const response = { + const response: ISearchResponse = { search_categories: { room_events: combinedResult, }, @@ -139,10 +150,14 @@ async function combinedSearch(searchTerm) { return result; } -async function localSearch(searchTerm, roomId = undefined, processResult = true) { +async function localSearch( + searchTerm: string, + roomId: string = undefined, + processResult = true, +): Promise<{ response: IResultRoomEvents, query: ISearchArgs }> { const eventIndex = EventIndexPeg.get(); - const searchArgs = { + const searchArgs: ISearchArgs = { search_term: searchTerm, before_limit: 1, after_limit: 1, @@ -167,11 +182,18 @@ async function localSearch(searchTerm, roomId = undefined, processResult = true) return result; } -async function localSearchProcess(searchTerm, roomId = undefined) { +export interface ISeshatSearchResults extends ISearchResults { + seshatQuery?: ISearchArgs; + cachedEvents?: ISearchResult[]; + oldestEventFrom?: "local" | "server"; + serverSideNextBatch?: string; +} + +async function localSearchProcess(searchTerm: string, roomId: string = undefined): Promise { const emptyResult = { results: [], highlights: [], - }; + } as ISeshatSearchResults; if (searchTerm === "") return emptyResult; @@ -179,7 +201,7 @@ async function localSearchProcess(searchTerm, roomId = undefined) { emptyResult.seshatQuery = result.query; - const response = { + const response: ISearchResponse = { search_categories: { room_events: result.response, }, @@ -192,7 +214,7 @@ async function localSearchProcess(searchTerm, roomId = undefined) { return processedResult; } -async function localPagination(searchResult) { +async function localPagination(searchResult: ISeshatSearchResults): Promise { const eventIndex = EventIndexPeg.get(); const searchArgs = searchResult.seshatQuery; @@ -221,7 +243,7 @@ async function localPagination(searchResult) { return result; } -function compareOldestEvents(firstResults, secondResults) { +function compareOldestEvents(firstResults: IResultRoomEvents, secondResults: IResultRoomEvents): number { try { const oldestFirstEvent = firstResults.results[firstResults.results.length - 1].result; const oldestSecondEvent = secondResults.results[secondResults.results.length - 1].result; @@ -236,7 +258,12 @@ function compareOldestEvents(firstResults, secondResults) { } } -function combineEventSources(previousSearchResult, response, a, b) { +function combineEventSources( + previousSearchResult: ISeshatSearchResults, + response: IResultRoomEvents, + a: ISearchResult[], + b: ISearchResult[], +): void { // Merge event sources and sort the events. const combinedEvents = a.concat(b).sort(compareEvents); // Put half of the events in the response, and cache the other half. @@ -353,8 +380,12 @@ function combineEventSources(previousSearchResult, response, a, b) { * different event sources. * */ -function combineEvents(previousSearchResult, localEvents = undefined, serverEvents = undefined) { - const response = {}; +function combineEvents( + previousSearchResult: ISeshatSearchResults, + localEvents: IResultRoomEvents = undefined, + serverEvents: IResultRoomEvents = undefined, +): IResultRoomEvents { + const response = {} as IResultRoomEvents; const cachedEvents = previousSearchResult.cachedEvents; let oldestEventFrom = previousSearchResult.oldestEventFrom; @@ -412,7 +443,11 @@ function combineEvents(previousSearchResult, localEvents = undefined, serverEven * @return {object} A response object that combines the events from the * different event sources. */ -function combineResponses(previousSearchResult, localEvents = undefined, serverEvents = undefined) { +function combineResponses( + previousSearchResult: ISeshatSearchResults, + localEvents: IResultRoomEvents = undefined, + serverEvents: IResultRoomEvents = undefined, +): IResultRoomEvents { // Combine our events first. const response = combineEvents(previousSearchResult, localEvents, serverEvents); @@ -454,42 +489,51 @@ function combineResponses(previousSearchResult, localEvents = undefined, serverE return response; } -function restoreEncryptionInfo(searchResultSlice = []) { +interface IEncryptedSeshatEvent { + curve25519Key: string; + ed25519Key: string; + algorithm: string; + forwardingCurve25519KeyChain: string[]; +} + +function restoreEncryptionInfo(searchResultSlice: SearchResult[] = []): void { for (let i = 0; i < searchResultSlice.length; i++) { const timeline = searchResultSlice[i].context.getTimeline(); for (let j = 0; j < timeline.length; j++) { - const ev = timeline[j]; + const mxEv = timeline[j]; + const ev = mxEv.event as IEncryptedSeshatEvent; - if (ev.event.curve25519Key) { - ev.makeEncrypted( - "m.room.encrypted", - { algorithm: ev.event.algorithm }, - ev.event.curve25519Key, - ev.event.ed25519Key, + if (ev.curve25519Key) { + mxEv.makeEncrypted( + EventType.RoomMessageEncrypted, + { algorithm: ev.algorithm }, + ev.curve25519Key, + ev.ed25519Key, ); - ev.forwardingCurve25519KeyChain = ev.event.forwardingCurve25519KeyChain; + // @ts-ignore + mxEv.forwardingCurve25519KeyChain = ev.forwardingCurve25519KeyChain; - delete ev.event.curve25519Key; - delete ev.event.ed25519Key; - delete ev.event.algorithm; - delete ev.event.forwardingCurve25519KeyChain; + delete ev.curve25519Key; + delete ev.ed25519Key; + delete ev.algorithm; + delete ev.forwardingCurve25519KeyChain; } } } } -async function combinedPagination(searchResult) { +async function combinedPagination(searchResult: ISeshatSearchResults): Promise { const eventIndex = EventIndexPeg.get(); const client = MatrixClientPeg.get(); const searchArgs = searchResult.seshatQuery; const oldestEventFrom = searchResult.oldestEventFrom; - let localResult; - let serverSideResult; + let localResult: IResultRoomEvents; + let serverSideResult: ISearchResponse; - // Fetch events from the local index if we have a token for itand if it's + // Fetch events from the local index if we have a token for it and if it's // the local indexes turn or the server has exhausted its results. if (searchArgs.next_batch && (!searchResult.serverSideNextBatch || oldestEventFrom === "server")) { localResult = await eventIndex.search(searchArgs); @@ -502,7 +546,7 @@ async function combinedPagination(searchResult) { serverSideResult = await client.search(body); } - let serverEvents; + let serverEvents: IResultRoomEvents; if (serverSideResult) { serverEvents = serverSideResult.search_categories.room_events; @@ -532,8 +576,8 @@ async function combinedPagination(searchResult) { return result; } -function eventIndexSearch(term, roomId = undefined) { - let searchPromise; +function eventIndexSearch(term: string, roomId: string = undefined): Promise { + let searchPromise: Promise; if (roomId !== undefined) { if (MatrixClientPeg.get().isRoomEncrypted(roomId)) { @@ -554,7 +598,7 @@ function eventIndexSearch(term, roomId = undefined) { return searchPromise; } -function eventIndexSearchPagination(searchResult) { +function eventIndexSearchPagination(searchResult: ISeshatSearchResults): Promise { const client = MatrixClientPeg.get(); const seshatQuery = searchResult.seshatQuery; @@ -580,7 +624,7 @@ function eventIndexSearchPagination(searchResult) { } } -export function searchPagination(searchResult) { +export function searchPagination(searchResult: ISearchResults): Promise { const eventIndex = EventIndexPeg.get(); const client = MatrixClientPeg.get(); @@ -590,7 +634,7 @@ export function searchPagination(searchResult) { else return eventIndexSearchPagination(searchResult); } -export default function eventSearch(term, roomId = undefined) { +export default function eventSearch(term: string, roomId: string = undefined): Promise { const eventIndex = EventIndexPeg.get(); if (eventIndex === null) return serverSideSearchProcess(term, roomId); diff --git a/src/components/structures/RoomDirectory.tsx b/src/components/structures/RoomDirectory.tsx index bd25a764a0..8471c833e4 100644 --- a/src/components/structures/RoomDirectory.tsx +++ b/src/components/structures/RoomDirectory.tsx @@ -16,6 +16,9 @@ limitations under the License. */ import React from "react"; +import { IFieldType, IInstance, IProtocol, IPublicRoomsChunk } from "matrix-js-sdk/src/client"; +import { Visibility } from "matrix-js-sdk/lib/@types/partials"; +import { IRoomDirectoryOptions } from "matrix-js-sdk/src/@types/requests"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import dis from "../../dispatcher/dispatcher"; @@ -25,7 +28,7 @@ import { _t } from '../../languageHandler'; import SdkConfig from '../../SdkConfig'; import { instanceForInstanceId, protocolNameForInstanceId } from '../../utils/DirectoryUtils'; import Analytics from '../../Analytics'; -import { ALL_ROOMS, IFieldType, IInstance, IProtocol, Protocols } from "../views/directory/NetworkDropdown"; +import NetworkDropdown, { ALL_ROOMS, Protocols } from "../views/directory/NetworkDropdown"; import SettingsStore from "../../settings/SettingsStore"; import GroupFilterOrderStore from "../../stores/GroupFilterOrderStore"; import GroupStore from "../../stores/GroupStore"; @@ -40,7 +43,6 @@ import ErrorDialog from "../views/dialogs/ErrorDialog"; import QuestionDialog from "../views/dialogs/QuestionDialog"; import BaseDialog from "../views/dialogs/BaseDialog"; import DirectorySearchBox from "../views/elements/DirectorySearchBox"; -import NetworkDropdown from "../views/directory/NetworkDropdown"; import ScrollPanel from "./ScrollPanel"; import Spinner from "../views/elements/Spinner"; import { ActionPayload } from "../../dispatcher/payloads"; @@ -60,7 +62,7 @@ interface IProps extends IDialogProps { } interface IState { - publicRooms: IRoom[]; + publicRooms: IPublicRoomsChunk[]; loading: boolean; protocolsLoading: boolean; error?: string; @@ -71,29 +73,6 @@ interface IState { communityName?: string; } -/* eslint-disable camelcase */ -interface IRoom { - room_id: string; - name?: string; - avatar_url?: string; - topic?: string; - canonical_alias?: string; - aliases?: string[]; - world_readable: boolean; - guest_can_join: boolean; - num_joined_members: number; -} - -interface IPublicRoomsRequest { - limit?: number; - since?: string; - server?: string; - filter?: object; - include_all_networks?: boolean; - third_party_instance_id?: string; -} -/* eslint-enable camelcase */ - @replaceableComponent("structures.RoomDirectory") export default class RoomDirectory extends React.Component { private readonly startTime: number; @@ -252,7 +231,7 @@ export default class RoomDirectory extends React.Component { // remember the next batch token when we sent the request // too. If it's changed, appending to the list will corrupt it. const nextBatch = this.nextBatch; - const opts: IPublicRoomsRequest = { limit: 20 }; + const opts: IRoomDirectoryOptions = { limit: 20 }; if (roomServer != MatrixClientPeg.getHomeserverName()) { opts.server = roomServer; } @@ -325,7 +304,7 @@ export default class RoomDirectory extends React.Component { * HS admins to do this through the RoomSettings interface, but * this needs SPEC-417. */ - private removeFromDirectory(room: IRoom) { + private removeFromDirectory(room: IPublicRoomsChunk) { const alias = getDisplayAliasForRoom(room); const name = room.name || alias || _t('Unnamed room'); @@ -345,7 +324,7 @@ export default class RoomDirectory extends React.Component { const modal = Modal.createDialog(Spinner); let step = _t('remove %(name)s from the directory.', { name: name }); - MatrixClientPeg.get().setRoomDirectoryVisibility(room.room_id, 'private').then(() => { + MatrixClientPeg.get().setRoomDirectoryVisibility(room.room_id, Visibility.Private).then(() => { if (!alias) return; step = _t('delete the address.'); return MatrixClientPeg.get().deleteAlias(alias); @@ -367,7 +346,7 @@ export default class RoomDirectory extends React.Component { }); } - private onRoomClicked = (room: IRoom, ev: ButtonEvent) => { + private onRoomClicked = (room: IPublicRoomsChunk, ev: ButtonEvent) => { // If room was shift-clicked, remove it from the room directory if (ev.shiftKey && !this.state.selectedCommunityId) { ev.preventDefault(); @@ -480,17 +459,17 @@ export default class RoomDirectory extends React.Component { } }; - private onPreviewClick = (ev: ButtonEvent, room: IRoom) => { + private onPreviewClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { this.showRoom(room, null, false, true); ev.stopPropagation(); }; - private onViewClick = (ev: ButtonEvent, room: IRoom) => { + private onViewClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { this.showRoom(room); ev.stopPropagation(); }; - private onJoinClick = (ev: ButtonEvent, room: IRoom) => { + private onJoinClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { this.showRoom(room, null, true); ev.stopPropagation(); }; @@ -508,7 +487,7 @@ export default class RoomDirectory extends React.Component { this.showRoom(null, alias, autoJoin); } - private showRoom(room: IRoom, roomAlias?: string, autoJoin = false, shouldPeek = false) { + private showRoom(room: IPublicRoomsChunk, roomAlias?: string, autoJoin = false, shouldPeek = false) { this.onFinished(); const payload: ActionPayload = { action: 'view_room', @@ -557,7 +536,7 @@ export default class RoomDirectory extends React.Component { dis.dispatch(payload); } - private createRoomCells(room: IRoom) { + private createRoomCells(room: IPublicRoomsChunk) { const client = MatrixClientPeg.get(); const clientRoom = client.getRoom(room.room_id); const hasJoinedRoom = clientRoom && clientRoom.getMyMembership() === "join"; @@ -853,6 +832,6 @@ export default class RoomDirectory extends React.Component { // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom // but works with the objects we get from the public room list -function getDisplayAliasForRoom(room: IRoom) { +function getDisplayAliasForRoom(room: IPublicRoomsChunk) { return room.canonical_alias || room.aliases?.[0] || ""; } diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 8e0b8a5f4a..2c118149a0 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -25,8 +25,8 @@ import React, { createRef } from 'react'; import classNames from 'classnames'; import { IRecommendedVersion, NotificationCountType, Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { SearchResult } from "matrix-js-sdk/src/models/search-result"; import { EventSubscription } from "fbemitter"; +import { ISearchResults } from 'matrix-js-sdk/src/@types/search'; import shouldHideEvent from '../../shouldHideEvent'; import { _t } from '../../languageHandler'; @@ -133,12 +133,7 @@ export interface IState { searching: boolean; searchTerm?: string; searchScope?: SearchScope; - searchResults?: XOR<{}, { - count: number; - highlights: string[]; - results: SearchResult[]; - next_batch: string; // eslint-disable-line camelcase - }>; + searchResults?: XOR<{}, ISearchResults>; searchHighlights?: string[]; searchInProgress?: boolean; callState?: CallState; @@ -1137,7 +1132,7 @@ export default class RoomView extends React.Component { if (this.state.searchResults.next_batch) { debuglog("requesting more search results"); - const searchPromise = searchPagination(this.state.searchResults); + const searchPromise = searchPagination(this.state.searchResults as ISearchResults); return this.handleSearchResult(searchPromise); } else { debuglog("no more search results"); diff --git a/src/components/structures/SpaceRoomDirectory.tsx b/src/components/structures/SpaceRoomDirectory.tsx index 2ee0327420..90c735dc79 100644 --- a/src/components/structures/SpaceRoomDirectory.tsx +++ b/src/components/structures/SpaceRoomDirectory.tsx @@ -18,6 +18,7 @@ import React, { ReactNode, useMemo, useState } from "react"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixClient } from "matrix-js-sdk/src/client"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; +import { ISpaceSummaryRoom, ISpaceSummaryEvent } from "matrix-js-sdk/src/@types/spaces"; import classNames from "classnames"; import { sortBy } from "lodash"; @@ -51,36 +52,6 @@ interface IHierarchyProps { showRoom(room: ISpaceSummaryRoom, viaServers?: string[], autoJoin?: boolean): void; } -/* eslint-disable camelcase */ -export interface ISpaceSummaryRoom { - canonical_alias?: string; - aliases: string[]; - avatar_url?: string; - guest_can_join: boolean; - name?: string; - num_joined_members: number; - room_id: string; - topic?: string; - world_readable: boolean; - num_refs: number; - room_type: string; -} - -export interface ISpaceSummaryEvent { - room_id: string; - event_id: string; - origin_server_ts: number; - type: string; - state_key: string; - content: { - order?: string; - suggested?: boolean; - auto_join?: boolean; - via?: string[]; - }; -} -/* eslint-enable camelcase */ - interface ITileProps { room: ISpaceSummaryRoom; suggested?: boolean; diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 1df5f35ae9..0edcfd2894 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -109,11 +109,11 @@ export abstract class Member { class DirectoryMember extends Member { private readonly _userId: string; - private readonly displayName: string; - private readonly avatarUrl: string; + private readonly displayName?: string; + private readonly avatarUrl?: string; // eslint-disable-next-line camelcase - constructor(userDirResult: { user_id: string, display_name: string, avatar_url: string }) { + constructor(userDirResult: { user_id: string, display_name?: string, avatar_url?: string }) { super(); this._userId = userDirResult.user_id; this.displayName = userDirResult.display_name; diff --git a/src/components/views/directory/NetworkDropdown.tsx b/src/components/views/directory/NetworkDropdown.tsx index 0492168f36..e4a967fbdc 100644 --- a/src/components/views/directory/NetworkDropdown.tsx +++ b/src/components/views/directory/NetworkDropdown.tsx @@ -17,6 +17,7 @@ limitations under the License. import React, { useEffect, useState } from "react"; import { MatrixError } from "matrix-js-sdk/src/http-api"; +import { IProtocol } from "matrix-js-sdk/src/client"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { instanceForInstanceId } from '../../../utils/DirectoryUtils'; @@ -83,30 +84,6 @@ const validServer = withValidation({ ], }); -/* eslint-disable camelcase */ -export interface IFieldType { - regexp: string; - placeholder: string; -} - -export interface IInstance { - desc: string; - icon?: string; - fields: object; - network_id: string; - // XXX: this is undocumented but we rely on it. - instance_id: string; -} - -export interface IProtocol { - user_fields: string[]; - location_fields: string[]; - icon: string; - field_types: Record; - instances: IInstance[]; -} -/* eslint-enable camelcase */ - export type Protocols = Record; interface IProps { diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 83fc1ebefd..b38e21977c 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -32,7 +32,7 @@ interface IProps { hasAvatar: boolean; noAvatarLabel?: string; hasAvatarLabel?: string; - setAvatarUrl(url: string): Promise; + setAvatarUrl(url: string): Promise; } const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAvatarLabel, setAvatarUrl, children }) => { diff --git a/src/components/views/room_settings/RoomPublishSetting.tsx b/src/components/views/room_settings/RoomPublishSetting.tsx index bc1d6f9e2c..94fc736ef8 100644 --- a/src/components/views/room_settings/RoomPublishSetting.tsx +++ b/src/components/views/room_settings/RoomPublishSetting.tsx @@ -20,6 +20,7 @@ import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; import { _t } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { Visibility } from "matrix-js-sdk/lib/@types/partials"; interface IProps { roomId: string; @@ -49,7 +50,7 @@ export default class RoomPublishSetting extends React.PureComponent { // Roll back the local echo on the change this.setState({ isRoomPublished: valueBefore }); diff --git a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx index f27b73a511..5449e7a261 100644 --- a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx +++ b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx @@ -39,7 +39,7 @@ enum SpaceVisibility { const useLocalEcho = ( currentFactory: () => T, - setterFn: (value: T) => Promise, + setterFn: (value: T) => Promise, errorFn: (error: Error) => void, ): [value: T, handler: (value: T) => void] => { const [value, setValue] = useState(currentFactory); diff --git a/src/indexing/BaseEventIndexManager.ts b/src/indexing/BaseEventIndexManager.ts index 4bae3e7c1d..64576e4412 100644 --- a/src/indexing/BaseEventIndexManager.ts +++ b/src/indexing/BaseEventIndexManager.ts @@ -14,47 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { IMatrixProfile, IEventWithRoomId as IMatrixEvent, IResultRoomEvents } from "matrix-js-sdk/src/@types/search"; +import { Direction } from "matrix-js-sdk/src"; + // The following interfaces take their names and member names from seshat and the spec /* eslint-disable camelcase */ - -export interface IMatrixEvent { - type: string; - sender: string; - content: {}; - event_id: string; - origin_server_ts: number; - unsigned?: {}; - roomId: string; -} - -export interface IMatrixProfile { - avatar_url: string; - displayname: string; -} - export interface ICrawlerCheckpoint { roomId: string; token: string; fullCrawl?: boolean; - direction: string; -} - -export interface IResultContext { - events_before: [IMatrixEvent]; - events_after: [IMatrixEvent]; - profile_info: Map; -} - -export interface IResultsElement { - rank: number; - result: IMatrixEvent; - context: IResultContext; -} - -export interface ISearchResult { - count: number; - results: [IResultsElement]; - highlights: [string]; + direction: Direction; } export interface ISearchArgs { @@ -63,6 +32,8 @@ export interface ISearchArgs { after_limit: number; order_by_recency: boolean; room_id?: string; + limit: number; + next_batch?: string; } export interface IEventAndProfile { @@ -205,10 +176,10 @@ export default abstract class BaseEventIndexManager { * @param {ISearchArgs} searchArgs The search configuration for the search, * sets the search term and determines the search result contents. * - * @return {Promise<[ISearchResult]>} A promise that will resolve to an array + * @return {Promise} A promise that will resolve to an array * of search results once the search is done. */ - async searchEventIndex(searchArgs: ISearchArgs): Promise { + async searchEventIndex(searchArgs: ISearchArgs): Promise { throw new Error("Unimplemented"); } diff --git a/src/indexing/EventIndex.ts b/src/indexing/EventIndex.ts index 76104455f7..a5827fc599 100644 --- a/src/indexing/EventIndex.ts +++ b/src/indexing/EventIndex.ts @@ -23,6 +23,7 @@ import { EventTimelineSet } from 'matrix-js-sdk/src/models/event-timeline-set'; import { RoomState } from 'matrix-js-sdk/src/models/room-state'; import { TimelineWindow } from 'matrix-js-sdk/src/timeline-window'; import { sleep } from "matrix-js-sdk/src/utils"; +import { IResultRoomEvents } from "matrix-js-sdk/src/@types/search"; import PlatformPeg from "../PlatformPeg"; import { MatrixClientPeg } from "../MatrixClientPeg"; @@ -114,14 +115,14 @@ export default class EventIndex extends EventEmitter { const backCheckpoint: ICrawlerCheckpoint = { roomId: room.roomId, token: token, - direction: "b", + direction: Direction.Backward, fullCrawl: true, }; const forwardCheckpoint: ICrawlerCheckpoint = { roomId: room.roomId, token: token, - direction: "f", + direction: Direction.Forward, }; try { @@ -384,7 +385,7 @@ export default class EventIndex extends EventEmitter { roomId: room.roomId, token: token, fullCrawl: fullCrawl, - direction: "b", + direction: Direction.Backward, }; console.log("EventIndex: Adding checkpoint", checkpoint); @@ -671,10 +672,10 @@ export default class EventIndex extends EventEmitter { * @param {ISearchArgs} searchArgs The search configuration for the search, * sets the search term and determines the search result contents. * - * @return {Promise<[SearchResult]>} A promise that will resolve to an array + * @return {Promise} A promise that will resolve to an array * of search results once the search is done. */ - public async search(searchArgs: ISearchArgs) { + public async search(searchArgs: ISearchArgs): Promise { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.searchEventIndex(searchArgs); } diff --git a/src/models/IUpload.ts b/src/models/IUpload.ts index 5b376e9330..1b5a13e394 100644 --- a/src/models/IUpload.ts +++ b/src/models/IUpload.ts @@ -14,11 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { IAbortablePromise } from "matrix-js-sdk/src/@types/partials"; + export interface IUpload { fileName: string; roomId: string; total: number; loaded: number; - promise: Promise; + promise: IAbortablePromise; canceled?: boolean; } diff --git a/src/settings/handlers/AccountSettingsHandler.ts b/src/settings/handlers/AccountSettingsHandler.ts index 60ec849883..9c937ebd88 100644 --- a/src/settings/handlers/AccountSettingsHandler.ts +++ b/src/settings/handlers/AccountSettingsHandler.ts @@ -123,12 +123,13 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa return preferredValue; } - public setValue(settingName: string, roomId: string, newValue: any): Promise { + public async setValue(settingName: string, roomId: string, newValue: any): Promise { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings("org.matrix.preview_urls") || {}; content['disable'] = !newValue; - return MatrixClientPeg.get().setAccountData("org.matrix.preview_urls", content); + await MatrixClientPeg.get().setAccountData("org.matrix.preview_urls", content); + return; } // Special case for breadcrumbs @@ -141,26 +142,29 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa if (!content) content = {}; // If we still don't have content, make some content['recent_rooms'] = newValue; - return MatrixClientPeg.get().setAccountData(BREADCRUMBS_EVENT_TYPE, content); + await MatrixClientPeg.get().setAccountData(BREADCRUMBS_EVENT_TYPE, content); + return; } // Special case recent emoji if (settingName === "recent_emoji") { const content = this.getSettings(RECENT_EMOJI_EVENT_TYPE) || {}; content["recent_emoji"] = newValue; - return MatrixClientPeg.get().setAccountData(RECENT_EMOJI_EVENT_TYPE, content); + await MatrixClientPeg.get().setAccountData(RECENT_EMOJI_EVENT_TYPE, content); + return; } // Special case integration manager provisioning if (settingName === "integrationProvisioning") { const content = this.getSettings(INTEG_PROVISIONING_EVENT_TYPE) || {}; content['enabled'] = newValue; - return MatrixClientPeg.get().setAccountData(INTEG_PROVISIONING_EVENT_TYPE, content); + await MatrixClientPeg.get().setAccountData(INTEG_PROVISIONING_EVENT_TYPE, content); + return; } const content = this.getSettings() || {}; content[settingName] = newValue; - return MatrixClientPeg.get().setAccountData("im.vector.web.settings", content); + await MatrixClientPeg.get().setAccountData("im.vector.web.settings", content); } public canSetValue(settingName: string, roomId: string): boolean { diff --git a/src/settings/handlers/RoomAccountSettingsHandler.ts b/src/settings/handlers/RoomAccountSettingsHandler.ts index e0345fde8c..a5ebfae621 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.ts +++ b/src/settings/handlers/RoomAccountSettingsHandler.ts @@ -86,22 +86,24 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin return settings[settingName]; } - public setValue(settingName: string, roomId: string, newValue: any): Promise { + public async setValue(settingName: string, roomId: string, newValue: any): Promise { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings(roomId, "org.matrix.room.preview_urls") || {}; content['disable'] = !newValue; - return MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.preview_urls", content); + await MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.preview_urls", content); + return; } // Special case allowed widgets if (settingName === "allowedWidgets") { - return MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue); + await MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue); + return; } const content = this.getSettings(roomId) || {}; content[settingName] = newValue; - return MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content); + await MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content); } public canSetValue(settingName: string, roomId: string): boolean { diff --git a/src/settings/handlers/RoomSettingsHandler.ts b/src/settings/handlers/RoomSettingsHandler.ts index 3315e40a65..974f94062c 100644 --- a/src/settings/handlers/RoomSettingsHandler.ts +++ b/src/settings/handlers/RoomSettingsHandler.ts @@ -87,17 +87,18 @@ export default class RoomSettingsHandler extends MatrixClientBackedSettingsHandl return settings[settingName]; } - public setValue(settingName: string, roomId: string, newValue: any): Promise { + public async setValue(settingName: string, roomId: string, newValue: any): Promise { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings(roomId, "org.matrix.room.preview_urls") || {}; content['disable'] = !newValue; - return MatrixClientPeg.get().sendStateEvent(roomId, "org.matrix.room.preview_urls", content); + await MatrixClientPeg.get().sendStateEvent(roomId, "org.matrix.room.preview_urls", content); + return; } const content = this.getSettings(roomId) || {}; content[settingName] = newValue; - return MatrixClientPeg.get().sendStateEvent(roomId, "im.vector.web.settings", content, ""); + await MatrixClientPeg.get().sendStateEvent(roomId, "im.vector.web.settings", content, ""); } public canSetValue(settingName: string, roomId: string): boolean { diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 6300c1a936..99705a7aba 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -18,6 +18,7 @@ import { ListIteratee, Many, sortBy, throttle } from "lodash"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { ISpaceSummaryRoom } from "matrix-js-sdk/src/@types/spaces"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; import defaultDispatcher from "../dispatcher/dispatcher"; @@ -31,7 +32,6 @@ import { RoomNotificationStateStore } from "./notifications/RoomNotificationStat import { DefaultTagID } from "./room-list/models"; import { EnhancedMap, mapDiff } from "../utils/maps"; import { setHasDiff } from "../utils/sets"; -import { ISpaceSummaryEvent, ISpaceSummaryRoom } from "../components/structures/SpaceRoomDirectory"; import RoomViewStore from "./RoomViewStore"; import { Action } from "../dispatcher/actions"; import { arrayHasDiff } from "../utils/arrays"; @@ -184,10 +184,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { public fetchSuggestedRooms = async (space: Room, limit = MAX_SUGGESTED_ROOMS): Promise => { try { - const data: { - rooms: ISpaceSummaryRoom[]; - events: ISpaceSummaryEvent[]; - } = await this.matrixClient.getSpaceSummary(space.roomId, 0, true, false, limit); + const data = await this.matrixClient.getSpaceSummary(space.roomId, 0, true, false, limit); const viaMap = new EnhancedMap>(); data.events.forEach(ev => { diff --git a/src/utils/WidgetUtils.ts b/src/utils/WidgetUtils.ts index 222837511d..e27381b1cf 100644 --- a/src/utils/WidgetUtils.ts +++ b/src/utils/WidgetUtils.ts @@ -386,7 +386,7 @@ export default class WidgetUtils { }); } - static removeIntegrationManagerWidgets(): Promise { + static async removeIntegrationManagerWidgets(): Promise { const client = MatrixClientPeg.get(); if (!client) { throw new Error('User not logged in'); @@ -399,7 +399,7 @@ export default class WidgetUtils { delete userWidgets[key]; } }); - return client.setAccountData('m.widgets', userWidgets); + await client.setAccountData('m.widgets', userWidgets); } static addIntegrationManagerWidget(name: string, uiUrl: string, apiUrl: string): Promise { @@ -416,7 +416,7 @@ export default class WidgetUtils { * Remove all stickerpicker widgets (stickerpickers are user widgets by nature) * @return {Promise} Resolves on account data updated */ - static removeStickerpickerWidgets(): Promise { + static async removeStickerpickerWidgets(): Promise { const client = MatrixClientPeg.get(); if (!client) { throw new Error('User not logged in'); @@ -429,7 +429,7 @@ export default class WidgetUtils { delete userWidgets[key]; } }); - return client.setAccountData('m.widgets', userWidgets); + await client.setAccountData('m.widgets', userWidgets); } static makeAppConfig( diff --git a/src/verification.ts b/src/verification.ts index 719c0ec5b3..98844302df 100644 --- a/src/verification.ts +++ b/src/verification.ts @@ -22,7 +22,7 @@ import Modal from './Modal'; import { RightPanelPhases } from "./stores/RightPanelStorePhases"; import { findDMForUser } from './createRoom'; import { accessSecretStorage } from './SecurityManager'; -import { verificationMethods } from 'matrix-js-sdk/src/crypto'; +import { verificationMethods as VerificationMethods } from 'matrix-js-sdk/src/crypto'; import { Action } from './dispatcher/actions'; import UntrustedDeviceDialog from "./components/views/dialogs/UntrustedDeviceDialog"; import { IDevice } from "./components/views/right_panel/UserInfo"; @@ -63,7 +63,7 @@ export async function verifyDevice(user: User, device: IDevice) { const verificationRequestPromise = cli.legacyDeviceVerification( user.userId, device.deviceId, - verificationMethods.SAS, + VerificationMethods.SAS, ); dis.dispatch({ action: Action.SetRightPanelPhase, From 2634ed949f74fa92616653626abf73ad597870c9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 10 Jul 2021 16:00:04 +0100 Subject: [PATCH 032/135] Fix Searching's mixing of types --- src/Searching.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Searching.ts b/src/Searching.ts index 95759d8819..37f85efa77 100644 --- a/src/Searching.ts +++ b/src/Searching.ts @@ -125,7 +125,7 @@ async function combinedSearch(searchTerm: string): Promise { const emptyResult: ISeshatSearchResults = { seshatQuery: localQuery, _query: serverQuery, - serverSideNextBatch: serverResponse.next_batch, + serverSideNextBatch: serverResponse.search_categories.room_events.next_batch, cachedEvents: [], oldestEventFrom: "server", results: [], @@ -243,10 +243,10 @@ async function localPagination(searchResult: ISeshatSearchResults): Promise Date: Sat, 10 Jul 2021 16:02:43 +0100 Subject: [PATCH 033/135] fix imports --- src/components/structures/RoomDirectory.tsx | 2 +- src/components/views/room_settings/RoomPublishSetting.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomDirectory.tsx b/src/components/structures/RoomDirectory.tsx index 8471c833e4..ac5d113ee6 100644 --- a/src/components/structures/RoomDirectory.tsx +++ b/src/components/structures/RoomDirectory.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import { IFieldType, IInstance, IProtocol, IPublicRoomsChunk } from "matrix-js-sdk/src/client"; -import { Visibility } from "matrix-js-sdk/lib/@types/partials"; +import { Visibility } from "matrix-js-sdk/src/@types/partials"; import { IRoomDirectoryOptions } from "matrix-js-sdk/src/@types/requests"; import { MatrixClientPeg } from "../../MatrixClientPeg"; diff --git a/src/components/views/room_settings/RoomPublishSetting.tsx b/src/components/views/room_settings/RoomPublishSetting.tsx index 94fc736ef8..2dce838de2 100644 --- a/src/components/views/room_settings/RoomPublishSetting.tsx +++ b/src/components/views/room_settings/RoomPublishSetting.tsx @@ -20,7 +20,7 @@ import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; import { _t } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { replaceableComponent } from "../../../utils/replaceableComponent"; -import { Visibility } from "matrix-js-sdk/lib/@types/partials"; +import { Visibility } from "matrix-js-sdk/src/@types/partials"; interface IProps { roomId: string; From a645cebb49465bdef96f1e56684f3d64bcdc6cad Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 12 Jul 2021 09:02:46 +0100 Subject: [PATCH 034/135] Fix setTimeout/setInterval typing --- src/CallHandler.tsx | 2 +- src/CountlyAnalytics.ts | 4 ++-- src/DecryptionFailureTracker.ts | 4 ++-- src/components/structures/MatrixChat.tsx | 2 +- src/components/structures/RoomDirectory.tsx | 2 +- src/components/structures/ScrollPanel.tsx | 2 +- src/components/views/dialogs/InviteDialog.tsx | 2 +- src/components/views/rooms/Autocomplete.tsx | 2 +- .../views/settings/tabs/user/AppearanceUserSettingsTab.tsx | 2 +- src/components/views/toasts/VerificationRequestToast.tsx | 2 +- src/utils/Timer.ts | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index 6e1e6ce83a..a0adee6b8d 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -154,7 +154,7 @@ export default class CallHandler extends EventEmitter { private supportsPstnProtocol = null; private pstnSupportPrefixed = null; // True if the server only support the prefixed pstn protocol private supportsSipNativeVirtual = null; // im.vector.protocol.sip_virtual and im.vector.protocol.sip_native - private pstnSupportCheckTimer: NodeJS.Timeout; // number actually because we're in the browser + private pstnSupportCheckTimer: number; // For rooms we've been invited to, true if they're from virtual user, false if we've checked and they aren't. private invitedRoomsAreVirtual = new Map(); private invitedRoomCheckInProgress = false; diff --git a/src/CountlyAnalytics.ts b/src/CountlyAnalytics.ts index a75c578536..72b0462bcd 100644 --- a/src/CountlyAnalytics.ts +++ b/src/CountlyAnalytics.ts @@ -364,8 +364,8 @@ export default class CountlyAnalytics { private initTime = CountlyAnalytics.getTimestamp(); private firstPage = true; - private heartbeatIntervalId: NodeJS.Timeout; - private activityIntervalId: NodeJS.Timeout; + private heartbeatIntervalId: number; + private activityIntervalId: number; private trackTime = true; private lastBeat: number; private storedDuration = 0; diff --git a/src/DecryptionFailureTracker.ts b/src/DecryptionFailureTracker.ts index d40574a6db..df306a54f5 100644 --- a/src/DecryptionFailureTracker.ts +++ b/src/DecryptionFailureTracker.ts @@ -46,8 +46,8 @@ export class DecryptionFailureTracker { }; // Set to an interval ID when `start` is called - public checkInterval: NodeJS.Timeout = null; - public trackInterval: NodeJS.Timeout = null; + public checkInterval: number = null; + public trackInterval: number = null; // Spread the load on `Analytics` by tracking at a low frequency, `TRACK_INTERVAL_MS`. static TRACK_INTERVAL_MS = 60000; diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index d692b0fa7f..aa31a9faf4 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -251,7 +251,7 @@ export default class MatrixChat extends React.PureComponent { private pageChanging: boolean; private tokenLogin?: boolean; private accountPassword?: string; - private accountPasswordTimer?: NodeJS.Timeout; + private accountPasswordTimer?: number; private focusComposer: boolean; private subTitleStatus: string; private prevWindowWidth: number; diff --git a/src/components/structures/RoomDirectory.tsx b/src/components/structures/RoomDirectory.tsx index ac5d113ee6..ad7a1868de 100644 --- a/src/components/structures/RoomDirectory.tsx +++ b/src/components/structures/RoomDirectory.tsx @@ -78,7 +78,7 @@ export default class RoomDirectory extends React.Component { private readonly startTime: number; private unmounted = false; private nextBatch: string = null; - private filterTimeout: NodeJS.Timeout; + private filterTimeout: number; private protocols: Protocols; constructor(props) { diff --git a/src/components/structures/ScrollPanel.tsx b/src/components/structures/ScrollPanel.tsx index df885575df..1d16755106 100644 --- a/src/components/structures/ScrollPanel.tsx +++ b/src/components/structures/ScrollPanel.tsx @@ -187,7 +187,7 @@ export default class ScrollPanel extends React.Component { private fillRequestWhileRunning: boolean; private scrollState: IScrollState; private preventShrinkingState: IPreventShrinkingState; - private unfillDebouncer: NodeJS.Timeout; + private unfillDebouncer: number; private bottomGrowth: number; private pages: number; private heightUpdateInProgress: boolean; diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 0edcfd2894..c9475d4849 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -370,7 +370,7 @@ export default class InviteDialog extends React.PureComponent void; - private debounceTimer: NodeJS.Timeout = null; // actually number because we're in the browser + private debounceTimer: number = null; // actually number because we're in the browser private editorRef = createRef(); private unmounted = false; diff --git a/src/components/views/rooms/Autocomplete.tsx b/src/components/views/rooms/Autocomplete.tsx index 8fbecbe722..6b5edcf91b 100644 --- a/src/components/views/rooms/Autocomplete.tsx +++ b/src/components/views/rooms/Autocomplete.tsx @@ -55,7 +55,7 @@ interface IState { export default class Autocomplete extends React.PureComponent { autocompleter: Autocompleter; queryRequested: string; - debounceCompletionsRequest: NodeJS.Timeout; + debounceCompletionsRequest: number; private containerRef = createRef(); constructor(props) { diff --git a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx index f04c2f13ae..17aa9e5561 100644 --- a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx @@ -75,7 +75,7 @@ interface IState extends IThemeState { export default class AppearanceUserSettingsTab extends React.Component { private readonly MESSAGE_PREVIEW_TEXT = _t("Hey you. You're the best!"); - private themeTimer: NodeJS.Timeout; + private themeTimer: number; constructor(props: IProps) { super(props); diff --git a/src/components/views/toasts/VerificationRequestToast.tsx b/src/components/views/toasts/VerificationRequestToast.tsx index 75254d7c62..45f1464b0e 100644 --- a/src/components/views/toasts/VerificationRequestToast.tsx +++ b/src/components/views/toasts/VerificationRequestToast.tsx @@ -44,7 +44,7 @@ interface IState { @replaceableComponent("views.toasts.VerificationRequestToast") export default class VerificationRequestToast extends React.PureComponent { - private intervalHandle: NodeJS.Timeout; + private intervalHandle: number; constructor(props) { super(props); diff --git a/src/utils/Timer.ts b/src/utils/Timer.ts index 2317ed934b..38703c1299 100644 --- a/src/utils/Timer.ts +++ b/src/utils/Timer.ts @@ -26,7 +26,7 @@ Once a timer is finished or aborted, it can't be started again a new one through `clone()` or `cloneIfRun()`. */ export default class Timer { - private timerHandle: NodeJS.Timeout; + private timerHandle: number; private startTs: number; private promise: Promise; private resolve: () => void; From 33dca81352006a4c6a69b18a359cba89bfb7b115 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 12 Jul 2021 09:10:27 +0100 Subject: [PATCH 035/135] Update some more --- src/components/structures/RoomDirectory.tsx | 20 +++++++++---------- .../views/elements/MiniAvatarUploader.tsx | 2 +- .../spaces/SpaceSettingsVisibilityTab.tsx | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/structures/RoomDirectory.tsx b/src/components/structures/RoomDirectory.tsx index ad7a1868de..cf6fcb3d0f 100644 --- a/src/components/structures/RoomDirectory.tsx +++ b/src/components/structures/RoomDirectory.tsx @@ -16,7 +16,7 @@ limitations under the License. */ import React from "react"; -import { IFieldType, IInstance, IProtocol, IPublicRoomsChunk } from "matrix-js-sdk/src/client"; +import { IFieldType, IInstance, IProtocol, IPublicRoomsChunkRoom } from "matrix-js-sdk/src/client"; import { Visibility } from "matrix-js-sdk/src/@types/partials"; import { IRoomDirectoryOptions } from "matrix-js-sdk/src/@types/requests"; @@ -62,7 +62,7 @@ interface IProps extends IDialogProps { } interface IState { - publicRooms: IPublicRoomsChunk[]; + publicRooms: IPublicRoomsChunkRoom[]; loading: boolean; protocolsLoading: boolean; error?: string; @@ -304,7 +304,7 @@ export default class RoomDirectory extends React.Component { * HS admins to do this through the RoomSettings interface, but * this needs SPEC-417. */ - private removeFromDirectory(room: IPublicRoomsChunk) { + private removeFromDirectory(room: IPublicRoomsChunkRoom) { const alias = getDisplayAliasForRoom(room); const name = room.name || alias || _t('Unnamed room'); @@ -346,7 +346,7 @@ export default class RoomDirectory extends React.Component { }); } - private onRoomClicked = (room: IPublicRoomsChunk, ev: ButtonEvent) => { + private onRoomClicked = (room: IPublicRoomsChunkRoom, ev: ButtonEvent) => { // If room was shift-clicked, remove it from the room directory if (ev.shiftKey && !this.state.selectedCommunityId) { ev.preventDefault(); @@ -459,17 +459,17 @@ export default class RoomDirectory extends React.Component { } }; - private onPreviewClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { + private onPreviewClick = (ev: ButtonEvent, room: IPublicRoomsChunkRoom) => { this.showRoom(room, null, false, true); ev.stopPropagation(); }; - private onViewClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { + private onViewClick = (ev: ButtonEvent, room: IPublicRoomsChunkRoom) => { this.showRoom(room); ev.stopPropagation(); }; - private onJoinClick = (ev: ButtonEvent, room: IPublicRoomsChunk) => { + private onJoinClick = (ev: ButtonEvent, room: IPublicRoomsChunkRoom) => { this.showRoom(room, null, true); ev.stopPropagation(); }; @@ -487,7 +487,7 @@ export default class RoomDirectory extends React.Component { this.showRoom(null, alias, autoJoin); } - private showRoom(room: IPublicRoomsChunk, roomAlias?: string, autoJoin = false, shouldPeek = false) { + private showRoom(room: IPublicRoomsChunkRoom, roomAlias?: string, autoJoin = false, shouldPeek = false) { this.onFinished(); const payload: ActionPayload = { action: 'view_room', @@ -536,7 +536,7 @@ export default class RoomDirectory extends React.Component { dis.dispatch(payload); } - private createRoomCells(room: IPublicRoomsChunk) { + private createRoomCells(room: IPublicRoomsChunkRoom) { const client = MatrixClientPeg.get(); const clientRoom = client.getRoom(room.room_id); const hasJoinedRoom = clientRoom && clientRoom.getMyMembership() === "join"; @@ -832,6 +832,6 @@ export default class RoomDirectory extends React.Component { // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom // but works with the objects we get from the public room list -function getDisplayAliasForRoom(room: IPublicRoomsChunk) { +function getDisplayAliasForRoom(room: IPublicRoomsChunkRoom) { return room.canonical_alias || room.aliases?.[0] || ""; } diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index b38e21977c..47bcd845ba 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -32,7 +32,7 @@ interface IProps { hasAvatar: boolean; noAvatarLabel?: string; hasAvatarLabel?: string; - setAvatarUrl(url: string): Promise; + setAvatarUrl(url: string): Promise; } const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAvatarLabel, setAvatarUrl, children }) => { diff --git a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx index 5449e7a261..b76d53be41 100644 --- a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx +++ b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx @@ -39,7 +39,7 @@ enum SpaceVisibility { const useLocalEcho = ( currentFactory: () => T, - setterFn: (value: T) => Promise, + setterFn: (value: T) => Promise, errorFn: (error: Error) => void, ): [value: T, handler: (value: T) => void] => { const [value, setValue] = useState(currentFactory); From d737b4e6ab931adf2f12663c847cd6b6a2f4b3d6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 12 Jul 2021 18:43:20 +0100 Subject: [PATCH 036/135] Use webpack worker-loader to load the IndexedDB worker instead of homegrown hack --- src/@types/worker-loader.d.ts | 23 ++++++++++++++++++++ src/MatrixClientPeg.ts | 13 ----------- src/components/views/dialogs/ShareDialog.tsx | 2 +- src/utils/createMatrixClient.ts | 9 ++------ src/workers/indexeddb.worker.ts | 21 ++++++++++++++++++ 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/@types/worker-loader.d.ts create mode 100644 src/workers/indexeddb.worker.ts diff --git a/src/@types/worker-loader.d.ts b/src/@types/worker-loader.d.ts new file mode 100644 index 0000000000..a8f5d8e9a4 --- /dev/null +++ b/src/@types/worker-loader.d.ts @@ -0,0 +1,23 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +declare module "*.worker.ts" { + class WebpackWorker extends Worker { + constructor(); + } + + export default WebpackWorker; +} diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index 7de62ba075..e9364b1b47 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -50,15 +50,6 @@ export interface IMatrixClientCreds { export interface IMatrixClientPeg { opts: IStartClientOpts; - /** - * Sets the script href passed to the IndexedDB web worker - * If set, a separate web worker will be started to run the IndexedDB - * queries on. - * - * @param {string} script href to the script to be passed to the web worker - */ - setIndexedDbWorkerScript(script: string): void; - /** * Return the server name of the user's homeserver * Throws an error if unable to deduce the homeserver name @@ -133,10 +124,6 @@ class _MatrixClientPeg implements IMatrixClientPeg { constructor() { } - public setIndexedDbWorkerScript(script: string): void { - createMatrixClient.indexedDbWorkerScript = script; - } - public get(): MatrixClient { return this.matrixClient; } diff --git a/src/components/views/dialogs/ShareDialog.tsx b/src/components/views/dialogs/ShareDialog.tsx index a3443ada02..85e9c6f192 100644 --- a/src/components/views/dialogs/ShareDialog.tsx +++ b/src/components/views/dialogs/ShareDialog.tsx @@ -35,7 +35,7 @@ import SettingsStore from "../../../settings/SettingsStore"; import { UIFeature } from "../../../settings/UIFeature"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import BaseDialog from "./BaseDialog"; -import GenericTextContextMenu from "../context_menus/GenericTextContextMenu.js"; +import GenericTextContextMenu from "../context_menus/GenericTextContextMenu"; const socials = [ { diff --git a/src/utils/createMatrixClient.ts b/src/utils/createMatrixClient.ts index caaf75616d..da7b8441fc 100644 --- a/src/utils/createMatrixClient.ts +++ b/src/utils/createMatrixClient.ts @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import IndexedDBWorker from "../workers/indexeddb.worker.ts"; // `.ts` is needed here to make TS happy import { createClient, ICreateClientOpts } from "matrix-js-sdk/src/matrix"; import { IndexedDBCryptoStore } from "matrix-js-sdk/src/crypto/store/indexeddb-crypto-store"; import { WebStorageSessionStore } from "matrix-js-sdk/src/store/session/webstorage"; @@ -35,10 +36,6 @@ try { * @param {Object} opts options to pass to Matrix.createClient. This will be * extended with `sessionStore` and `store` members. * - * @property {string} indexedDbWorkerScript Optional URL for a web worker script - * for IndexedDB store operations. By default, indexeddb ops are done on - * the main thread. - * * @returns {MatrixClient} the newly-created MatrixClient */ export default function createMatrixClient(opts: ICreateClientOpts) { @@ -51,7 +48,7 @@ export default function createMatrixClient(opts: ICreateClientOpts) { indexedDB: indexedDB, dbName: "riot-web-sync", localStorage: localStorage, - workerScript: createMatrixClient.indexedDbWorkerScript, + workerFactory: () => new IndexedDBWorker(), }); } @@ -70,5 +67,3 @@ export default function createMatrixClient(opts: ICreateClientOpts) { ...opts, }); } - -createMatrixClient.indexedDbWorkerScript = null; diff --git a/src/workers/indexeddb.worker.ts b/src/workers/indexeddb.worker.ts new file mode 100644 index 0000000000..113bc87d6c --- /dev/null +++ b/src/workers/indexeddb.worker.ts @@ -0,0 +1,21 @@ +/* +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. +*/ + +import { IndexedDBStoreWorker } from "matrix-js-sdk/src/indexeddb-worker"; + +const remoteWorker = new IndexedDBStoreWorker(postMessage as InstanceType["postMessage"]); + +global.onmessage = remoteWorker.onMessage; From 2e295a94ed61abc21ea1e404eaa5d2fda166cbd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:17:51 +0200 Subject: [PATCH 037/135] Don't export IProps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ImageView.tsx | 2 +- src/components/views/messages/MImageBody.tsx | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 9d9559cdd1..91206e67e8 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -43,7 +43,7 @@ const ZOOM_COEFFICIENT = 0.0025; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; -export interface IProps { +interface IProps { src: string; // the source of the image being displayed name?: string; // the main title ('name') for the image link?: string; // the link (if any) applied to the name of the image diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index cd0e259bef..48e5743212 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -16,12 +16,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { createRef } from 'react'; +import React, { ComponentProps, createRef } from 'react'; import { Blurhash } from "react-blurhash"; import MFileBody from './MFileBody'; import Modal from '../../../Modal'; -import * as sdk from '../../../index'; import { decryptFile } from '../../../utils/DecryptFile'; import { _t } from '../../../languageHandler'; import SettingsStore from "../../../settings/SettingsStore"; @@ -33,7 +32,7 @@ import { BLURHASH_FIELD } from "../../../ContentMessages"; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; import { IMediaEventContent } from '../../../customisations/models/IMediaEventContent'; -import { IProps as ImageViewIProps } from "../elements/ImageView"; +import ImageView from '../elements/ImageView'; export interface IProps { /* the MatrixEvent to show */ @@ -115,8 +114,7 @@ export default class MImageBody extends React.Component { const content = this.props.mxEvent.getContent() as IMediaEventContent; const httpUrl = this.getContentUrl(); - const ImageView = sdk.getComponent("elements.ImageView"); - const params: ImageViewIProps = { + const params: ComponentProps = { src: httpUrl, name: content.body?.length > 0 ? content.body : _t('Attachment'), mxEvent: this.props.mxEvent, From 7bd7f704f91cd37dd2dd6b2c54ce073f8b774d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:20:17 +0200 Subject: [PATCH 038/135] Extend IDialogProps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ImageView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 91206e67e8..94f60d29eb 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -33,6 +33,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { normalizeWheelEvent } from "../../../utils/Mouse"; +import { IDialogProps } from '../dialogs/IDialogProps'; // Max scale to keep gaps around the image const MAX_SCALE = 0.95; @@ -43,14 +44,13 @@ const ZOOM_COEFFICIENT = 0.0025; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; -interface IProps { +interface IProps extends IDialogProps { src: string; // the source of the image being displayed name?: string; // the main title ('name') for the image link?: string; // the link (if any) applied to the name of the image width?: number; // width of the image src in pixels height?: number; // height of the image src in pixels fileSize?: number; // size of the image src in bytes - onFinished?(): void; // callback when the lightbox is dismissed // the event (if any) that the Image is displaying. Used for event-specific stuff like // redactions, senders, timestamps etc. Other descriptors are taken from the explicit From cbe94c3c5fbd84b1f24ddf79a94d6e90c0ae37ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:23:01 +0200 Subject: [PATCH 039/135] Kill-off sdk.getComponent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ReplyThread.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index b6368eb5b3..c22225f766 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -16,7 +16,6 @@ See the License for the specific language governing permissions and limitations under the License. */ import React from 'react'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import PropTypes from 'prop-types'; import dis from '../../../dispatcher/dispatcher'; @@ -31,6 +30,9 @@ import { Action } from "../../../dispatcher/actions"; import sanitizeHtml from "sanitize-html"; import { PERMITTED_URL_SCHEMES } from "../../../HtmlUtils"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import Spinner from './Spinner'; +import ReplyTile from "../rooms/ReplyTile"; +import Pill from './Pill'; // This component does no cycle detection, simply because the only way to make such a cycle would be to // craft event_id's, using a homeserver that generates predictable event IDs; even then the impact would @@ -352,7 +354,6 @@ export default class ReplyThread extends React.Component {
; } else if (this.state.loadedEv) { const ev = this.state.loadedEv; - const Pill = sdk.getComponent('elements.Pill'); const room = this.context.getRoom(ev.getRoomId()); header =
{ @@ -370,11 +371,9 @@ export default class ReplyThread extends React.Component { }
; } else if (this.state.loading) { - const Spinner = sdk.getComponent("elements.Spinner"); header = ; } - const ReplyTile = sdk.getComponent('views.rooms.ReplyTile'); const evTiles = this.state.events.map((ev) => { return
Date: Tue, 13 Jul 2021 08:24:18 +0200 Subject: [PATCH 040/135] Nicer formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index d8184d01be..8bf1d168f3 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -70,7 +70,14 @@ limitations under the License. -webkit-line-clamp: $reply-lines; padding: 4px; } - .markdown-body blockquote, .markdown-body dl, .markdown-body ol, .markdown-body p, .markdown-body pre, .markdown-body table, .markdown-body ul { + + .markdown-body blockquote, + .markdown-body dl, + .markdown-body ol, + .markdown-body p, + .markdown-body pre, + .markdown-body table, + .markdown-body ul { margin-bottom: 4px; } } From ae5e10ff0cefa79c22b584d018cea6738eeb833f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:45:36 +0200 Subject: [PATCH 041/135] Burn sdk.getComponent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyPreview.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index ca95dbb62f..2e06cb57bd 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -16,12 +16,12 @@ limitations under the License. import React from 'react'; import dis from '../../../dispatcher/dispatcher'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import RoomViewStore from '../../../stores/RoomViewStore'; import PropTypes from "prop-types"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import ReplyTile from './ReplyTile'; function cancelQuoting() { dis.dispatch({ @@ -69,8 +69,6 @@ export default class ReplyPreview extends React.Component { render() { if (!this.state.event) return null; - const ReplyTile = sdk.getComponent('rooms.ReplyTile'); - return
From 04098dc74cd106eadf58338de6b64d49971aea68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:46:45 +0200 Subject: [PATCH 042/135] Remove unnecessary constructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageReplyBody.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/views/messages/MImageReplyBody.tsx b/src/components/views/messages/MImageReplyBody.tsx index da720fc00f..cf60ef2ed0 100644 --- a/src/components/views/messages/MImageReplyBody.tsx +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -15,16 +15,12 @@ limitations under the License. */ import React from "react"; -import MImageBody, { IProps as MImageBodyIProps } from "./MImageBody"; +import MImageBody from "./MImageBody"; import { presentableTextForFile } from "./MFileBody"; import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; import SenderProfile from "./SenderProfile"; export default class MImageReplyBody extends MImageBody { - constructor(props: MImageBodyIProps) { - super(props); - } - public onClick = (ev: React.MouseEvent): void => { ev.preventDefault(); }; From b5baf404be3124faf64d2a7d5e00f55abb2f798c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:47:37 +0200 Subject: [PATCH 043/135] Don't use as MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageReplyBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageReplyBody.tsx b/src/components/views/messages/MImageReplyBody.tsx index cf60ef2ed0..9a12cd454c 100644 --- a/src/components/views/messages/MImageReplyBody.tsx +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -39,7 +39,7 @@ export default class MImageReplyBody extends MImageBody { return super.render(); } - const content = this.props.mxEvent.getContent() as IMediaEventContent; + const content = this.props.mxEvent.getContent(); const contentUrl = this.getContentUrl(); const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content); From 70e94f9af5d7b18d8855bd13bb0cabfb170a4fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 08:48:43 +0200 Subject: [PATCH 044/135] Formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageReplyBody.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/messages/MImageReplyBody.tsx b/src/components/views/messages/MImageReplyBody.tsx index 9a12cd454c..74cb8ac7a9 100644 --- a/src/components/views/messages/MImageReplyBody.tsx +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -50,9 +50,9 @@ export default class MImageReplyBody extends MImageBody { />; return
-
{thumbnail}
-
{sender}
-
{fileBody}
+
{ thumbnail }
+
{ sender }
+
{ fileBody }
; } } From 8f8377a71ccd5d6345457ad698632d1a2a365ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:16:01 +0200 Subject: [PATCH 045/135] Types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 48e5743212..c56ec2f6c8 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -33,6 +33,7 @@ import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; import { IMediaEventContent } from '../../../customisations/models/IMediaEventContent'; import ImageView from '../elements/ImageView'; +import { SyncState } from 'matrix-js-sdk/src/sync.api'; export interface IProps { /* the MatrixEvent to show */ @@ -85,7 +86,7 @@ export default class MImageBody extends React.Component { } // FIXME: factor this out and apply it to MVideoBody and MAudioBody too! - private onClientSync = (syncState, prevState): void => { + private onClientSync = (syncState: SyncState, prevState: SyncState): void => { if (this.unmounted) return; // Consider the client reconnected if there is no error with syncing. // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP. From 5fc35565df19698fab4528175a3326ef8a472036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:16:53 +0200 Subject: [PATCH 046/135] More TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index c56ec2f6c8..b4cb67e055 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -113,13 +113,14 @@ export default class MImageBody extends React.Component { return; } - const content = this.props.mxEvent.getContent() as IMediaEventContent; + const content = this.props.mxEvent.getContent(); const httpUrl = this.getContentUrl(); const params: ComponentProps = { src: httpUrl, name: content.body?.length > 0 ? content.body : _t('Attachment'), mxEvent: this.props.mxEvent, permalinkCreator: this.props.permalinkCreator, + onFinished: () => {}, }; if (content.info) { From 2a403f6cfef977372af42eac6610822c33fa9b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:17:18 +0200 Subject: [PATCH 047/135] Remove additional ? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index b4cb67e055..a72cfa01d4 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -135,7 +135,7 @@ export default class MImageBody extends React.Component { private isGif = (): boolean => { const content = this.props.mxEvent.getContent(); - return content?.info?.mimetype === "image/gif"; + return content.info?.mimetype === "image/gif"; }; private onImageEnter = (e: React.MouseEvent): void => { From bdbd03c4ff0eb7080faa4171c1de4f56d82056da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:18:05 +0200 Subject: [PATCH 048/135] Types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index a72cfa01d4..f3ef1bf304 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -138,7 +138,7 @@ export default class MImageBody extends React.Component { return content.info?.mimetype === "image/gif"; }; - private onImageEnter = (e: React.MouseEvent): void => { + private onImageEnter = (e: React.MouseEvent): void => { this.setState({ hover: true }); if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { From fa4977c4da0b9e9875bafb567358c75e46a4a71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:18:34 +0200 Subject: [PATCH 049/135] Use current target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index f3ef1bf304..91f1315f7a 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -144,7 +144,7 @@ export default class MImageBody extends React.Component { if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } - const imgElement = e.target as HTMLImageElement; + const imgElement = e.currentTarget; imgElement.src = this.getContentUrl(); }; From 6193bc2a828aab69251e4fb09ef0c0b4731bbf82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:19:19 +0200 Subject: [PATCH 050/135] Types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 91f1315f7a..35975109e7 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -148,7 +148,7 @@ export default class MImageBody extends React.Component { imgElement.src = this.getContentUrl(); }; - private onImageLeave = (e: React.MouseEvent): void => { + private onImageLeave = (e: React.MouseEvent): void => { this.setState({ hover: false }); if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { From 86580f3f20f7bef1937a8416c07a541514ea0c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:19:45 +0200 Subject: [PATCH 051/135] current target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 35975109e7..a669505181 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -154,7 +154,7 @@ export default class MImageBody extends React.Component { if (!this.state.showImage || !this.isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } - const imgElement = e.target as HTMLImageElement; + const imgElement = e.currentTarget; imgElement.src = this.getThumbUrl(); }; From af7769ce935a39c525adede743056963f765d8c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:20:13 +0200 Subject: [PATCH 052/135] Types! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index a669505181..1e9678dbef 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -195,7 +195,7 @@ export default class MImageBody extends React.Component { const thumbWidth = 800; const thumbHeight = 600; - const content = this.props.mxEvent.getContent() as IMediaEventContent; + const content = this.props.mxEvent.getContent(); const media = mediaFromContent(content); if (media.isEncrypted) { From 4cf4ab2266959370f78eea4919cb0237813085ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:20:40 +0200 Subject: [PATCH 053/135] Return type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 1e9678dbef..a4a615fa65 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -439,7 +439,7 @@ export default class MImageBody extends React.Component { } // Overidden by MStickerBody - protected getPlaceholder(width: number, height: number) { + protected getPlaceholder(width: number, height: number): JSX.Element { const blurhash = this.props.mxEvent.getContent().info[BLURHASH_FIELD]; if (blurhash) return ; return
From e4d1859fb70d9ffa9b8e8c7516e793ed56224df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:21:05 +0200 Subject: [PATCH 054/135] Ret type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index a4a615fa65..2062191303 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -448,7 +448,7 @@ export default class MImageBody extends React.Component { } // Overidden by MStickerBody - protected getTooltip() { + protected getTooltip(): JSX.Element { return null; } From ef1a1ebe12c5033cfe01a47f3cf0bb88125c715c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:21:33 +0200 Subject: [PATCH 055/135] TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 2062191303..3f5f27eca8 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -458,7 +458,7 @@ export default class MImageBody extends React.Component { } render() { - const content = this.props.mxEvent.getContent() as IMediaEventContent; + const content = this.props.mxEvent.getContent(); if (this.state.error !== null) { return ( From 931bba747abbf9e2fe7f4974eed55441ff71125d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:22:13 +0200 Subject: [PATCH 056/135] Replaceable component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 757c273b50..227c5b6585 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -35,6 +35,7 @@ interface IProps { onHeightChanged?(): void; } +@replaceableComponent("views.rooms.ReplyTile") export default class ReplyTile extends React.PureComponent { static defaultProps = { onHeightChanged: () => {}, From 63ad95246a0a62bf5e24a207c5a054dd2764c89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:23:57 +0200 Subject: [PATCH 057/135] EventType enum! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 227c5b6585..775091a59f 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -26,6 +26,7 @@ import SenderProfile from "../messages/SenderProfile"; import TextualBody from "../messages/TextualBody"; import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; +import { EventType } from 'matrix-js-sdk/src/@types/event'; interface IProps { mxEvent: MatrixEvent; @@ -78,9 +79,11 @@ export default class ReplyTile extends React.PureComponent { const eventType = this.props.mxEvent.getType(); // Info messages are basically information about commands processed on a room - let isInfoMessage = ( - eventType !== 'm.room.message' && eventType !== 'm.sticker' && eventType !== 'm.room.create' - ); + let isInfoMessage = [ + EventType.RoomMessage, + EventType.Sticker, + EventType.RoomCreate, + ].includes(eventType as EventType); let tileHandler = getHandlerTile(this.props.mxEvent); // If we're showing hidden events in the timeline, we should use the From 22b029d11672186296558f4e570e76f0b851e925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:24:40 +0200 Subject: [PATCH 058/135] Relation type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 775091a59f..8807be680c 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -26,7 +26,7 @@ import SenderProfile from "../messages/SenderProfile"; import TextualBody from "../messages/TextualBody"; import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; -import { EventType } from 'matrix-js-sdk/src/@types/event'; +import { EventType, RelationType } from 'matrix-js-sdk/src/@types/event'; interface IProps { mxEvent: MatrixEvent; @@ -90,7 +90,7 @@ export default class ReplyTile extends React.PureComponent { // source tile when there's no regular tile for an event and also for // replace relations (which otherwise would display as a confusing // duplicate of the thing they are replacing). - const useSource = !tileHandler || this.props.mxEvent.isRelation("m.replace"); + const useSource = !tileHandler || this.props.mxEvent.isRelation(RelationType.Replace); if (useSource && SettingsStore.getValue("showHiddenEventsInTimeline")) { tileHandler = "messages.ViewSourceEvent"; // Reuse info message avatar and sender profile styling From 0bf595d8d494f6bcd2e9d38c2147be1eb39099f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:26:27 +0200 Subject: [PATCH 059/135] Enums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 8807be680c..f6a4bd7a18 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -26,7 +26,7 @@ import SenderProfile from "../messages/SenderProfile"; import TextualBody from "../messages/TextualBody"; import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; -import { EventType, RelationType } from 'matrix-js-sdk/src/@types/event'; +import { EventType, MsgType, RelationType } from 'matrix-js-sdk/src/@types/event'; interface IProps { mxEvent: MatrixEvent; @@ -119,7 +119,7 @@ export default class ReplyTile extends React.PureComponent { } let sender; - const needsSenderProfile = msgtype !== 'm.image' && tileHandler !== 'messages.RoomCreate' && !isInfoMessage; + const needsSenderProfile = msgtype !== MsgType.Image && tileHandler !== EventType.RoomCreate && !isInfoMessage; if (needsSenderProfile) { sender = Date: Tue, 13 Jul 2021 09:27:22 +0200 Subject: [PATCH 060/135] More compact classNames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index f6a4bd7a18..1b9f3e2fac 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -108,8 +108,7 @@ export default class ReplyTile extends React.PureComponent { const EventTileType = sdk.getComponent(tileHandler); - const classes = classNames({ - mx_ReplyTile: true, + const classes = classNames("mx_ReplyTile", { mx_ReplyTile_info: isInfoMessage, }); From c44de3bea817bab53c3bcc74ecad7ef993d97a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:30:52 +0200 Subject: [PATCH 061/135] Enums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 1b9f3e2fac..593ebffedd 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -128,15 +128,15 @@ export default class ReplyTile extends React.PureComponent { } const msgtypeOverrides = { - "m.image": MImageReplyBody, + [MsgType.Image]: MImageReplyBody, // We don't want a download link for files, just the file name is enough. - "m.file": TextualBody, + [MsgType.File]: TextualBody, "m.sticker": TextualBody, - "m.audio": TextualBody, - "m.video": TextualBody, + [MsgType.Audio]: TextualBody, + [MsgType.Video]: TextualBody, }; const evOverrides = { - "m.sticker": TextualBody, + [EventType.Sticker]: TextualBody, }; return ( From 069180b16dda2cf02c97569017cbd27064f534ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:31:28 +0200 Subject: [PATCH 062/135] Remove contructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 593ebffedd..9cc42faca3 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -42,10 +42,6 @@ export default class ReplyTile extends React.PureComponent { onHeightChanged: () => {}, }; - constructor(props: IProps) { - super(props); - } - componentDidMount() { this.props.mxEvent.on("Event.decrypted", this.onDecrypted); } From 43cf7bc6110cdbe6750f5a239224a0813e758ebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:33:45 +0200 Subject: [PATCH 063/135] Remove 0px MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 8bf1d168f3..04dc34092a 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -83,7 +83,7 @@ limitations under the License. } .mx_ReplyTile.mx_ReplyTile_info { - padding-top: 0px; + padding-top: 0; } .mx_ReplyTile .mx_SenderProfile { @@ -92,10 +92,10 @@ limitations under the License. display: inline-block; /* anti-zalgo, with overflow hidden */ overflow: hidden; cursor: pointer; - padding-left: 0px; /* left gutter */ - padding-bottom: 0px; - padding-top: 0px; - margin: 0px; + padding-left: 0; /* left gutter */ + padding-bottom: 0; + padding-top: 0; + margin: 0; line-height: 17px; /* the next three lines, along with overflow hidden, truncate long display names */ white-space: nowrap; From e01d1572ac1521d2b4f845c794bd0a81762fb53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:34:43 +0200 Subject: [PATCH 064/135] Formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MFileBody.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MFileBody.js b/src/components/views/messages/MFileBody.js index f6346e56d9..e95f397e40 100644 --- a/src/components/views/messages/MFileBody.js +++ b/src/components/views/messages/MFileBody.js @@ -173,7 +173,9 @@ export default class MFileBody extends React.Component { placeholder = (
- {presentableTextForFile(content, false)} + + { presentableTextForFile(content, false) } +
); } From 562d43e81c48fae61a51a0561b28f248ff086238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 09:36:31 +0200 Subject: [PATCH 065/135] Font MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 04dc34092a..ff3a0d07d1 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -19,7 +19,7 @@ limitations under the License. clear: both; padding-top: 2px; padding-bottom: 2px; - font-size: 14px; + font-size: $font-14px; position: relative; line-height: 16px; } @@ -43,7 +43,7 @@ limitations under the License. // We do reply size limiting with CSS to avoid duplicating the TextualBody component. .mx_ReplyTile .mx_EventTile_content { $reply-lines: 2; - $line-height: 22px; + $line-height: $font-22px; $max-height: 66px; pointer-events: none; @@ -58,7 +58,7 @@ limitations under the License. .mx_EventTile_body.mx_EventTile_bigEmoji { line-height: $line-height !important; // Override the big emoji override - font-size: 14px !important; + font-size: $font-14px !important; } // Hack to cut content in
 tags too
@@ -88,7 +88,7 @@ limitations under the License.
 
 .mx_ReplyTile .mx_SenderProfile {
     color: $primary-fg-color;
-    font-size: 14px;
+    font-size: $font-14px;
     display: inline-block; /* anti-zalgo, with overflow hidden */
     overflow: hidden;
     cursor: pointer;
@@ -96,7 +96,7 @@ limitations under the License.
     padding-bottom: 0;
     padding-top: 0;
     margin: 0;
-    line-height: 17px;
+    line-height: $font-17px;
     /* the next three lines, along with overflow hidden, truncate long display names */
     white-space: nowrap;
     text-overflow: ellipsis;

From 9455a6d77270595d1b8c07d17c4d00a0a1332293 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0imon=20Brandner?= 
Date: Tue, 13 Jul 2021 09:40:29 +0200
Subject: [PATCH 066/135] Import replaceableComponent
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Šimon Brandner 
---
 src/components/views/rooms/ReplyTile.tsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx
index 9cc42faca3..fdd43e3200 100644
--- a/src/components/views/rooms/ReplyTile.tsx
+++ b/src/components/views/rooms/ReplyTile.tsx
@@ -27,6 +27,7 @@ import TextualBody from "../messages/TextualBody";
 import MImageReplyBody from "../messages/MImageReplyBody";
 import * as sdk from '../../../index';
 import { EventType, MsgType, RelationType } from 'matrix-js-sdk/src/@types/event';
+import { replaceableComponent } from '../../../utils/replaceableComponent';
 
 interface IProps {
     mxEvent: MatrixEvent;

From bc7a8f8406e960772e16932dd4df96daf38ba6b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0imon=20Brandner?= 
Date: Tue, 13 Jul 2021 10:12:24 +0200
Subject: [PATCH 067/135] Handle redaction
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Šimon Brandner 
---
 src/components/views/rooms/ReplyTile.tsx | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx
index fdd43e3200..fd90d2d536 100644
--- a/src/components/views/rooms/ReplyTile.tsx
+++ b/src/components/views/rooms/ReplyTile.tsx
@@ -45,6 +45,7 @@ export default class ReplyTile extends React.PureComponent {
 
     componentDidMount() {
         this.props.mxEvent.on("Event.decrypted", this.onDecrypted);
+        this.props.mxEvent.on("Event.beforeRedaction", this.onBeforeRedaction);
     }
 
     componentWillUnmount() {
@@ -58,6 +59,11 @@ export default class ReplyTile extends React.PureComponent {
         }
     };
 
+    private onBeforeRedaction = (): void => {
+        // When the event gets redacted, update it, so that a different tile handler is used
+        this.forceUpdate();
+    };
+
     private onClick = (e: React.MouseEvent): void => {
         // This allows the permalink to be opened in a new tab/window or copied as
         // matrix.to, but also for it to enable routing within Riot when clicked.

From fca5125c5b1fc47c21d1cee9b856db7fd25f46a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0imon=20Brandner?= 
Date: Tue, 13 Jul 2021 10:36:44 +0200
Subject: [PATCH 068/135] Improve redacted body look
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Šimon Brandner 
---
 res/css/views/rooms/_ReplyTile.scss      | 2 +-
 src/components/views/rooms/ReplyTile.tsx | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss
index ff3a0d07d1..dee68871c2 100644
--- a/res/css/views/rooms/_ReplyTile.scss
+++ b/res/css/views/rooms/_ReplyTile.scss
@@ -21,7 +21,7 @@ limitations under the License.
     padding-bottom: 2px;
     font-size: $font-14px;
     position: relative;
-    line-height: 16px;
+    line-height: $font-16px;
 }
 
 .mx_ReplyTile > a {
diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx
index fd90d2d536..78e630a0a2 100644
--- a/src/components/views/rooms/ReplyTile.tsx
+++ b/src/components/views/rooms/ReplyTile.tsx
@@ -112,7 +112,7 @@ export default class ReplyTile extends React.PureComponent {
         const EventTileType = sdk.getComponent(tileHandler);
 
         const classes = classNames("mx_ReplyTile", {
-            mx_ReplyTile_info: isInfoMessage,
+            mx_ReplyTile_info: isInfoMessage && !this.props.mxEvent.isRedacted(),
         });
 
         let permalink = "#";

From 866a11d7e39b6746689453639018d221f40f94f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0imon=20Brandner?= 
Date: Tue, 13 Jul 2021 11:49:49 +0200
Subject: [PATCH 069/135] Fix image alignment issues
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Šimon Brandner 
---
 res/css/views/messages/_MImageReplyBody.scss      | 14 +++-----------
 src/components/views/messages/MImageBody.tsx      | 13 +++++++++----
 src/components/views/messages/MImageReplyBody.tsx | 10 ++++++----
 3 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss
index 8c5cb97478..f0401d21db 100644
--- a/res/css/views/messages/_MImageReplyBody.scss
+++ b/res/css/views/messages/_MImageReplyBody.scss
@@ -15,19 +15,11 @@ limitations under the License.
 */
 
 .mx_MImageReplyBody {
-    display: grid;
-    grid-template:
-        "image sender"   20px
-        "image filename" 20px
-        / 44px  auto;
-    grid-gap: 4px;
-}
-
-.mx_MImageReplyBody_thumbnail {
-    grid-area: image;
+    display: flex;
 
     .mx_MImageBody_thumbnail_container {
-        max-height: 44px !important;
+        flex: 1;
+        padding-right: 4px;
     }
 }
 
diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx
index 3f5f27eca8..0acdbaf253 100644
--- a/src/components/views/messages/MImageBody.tsx
+++ b/src/components/views/messages/MImageBody.tsx
@@ -332,7 +332,12 @@ export default class MImageBody extends React.Component {
     _afterComponentWillUnmount() {
     }
 
-    protected messageContent(contentUrl: string, thumbUrl: string, content: IMediaEventContent): JSX.Element {
+    protected messageContent(
+        contentUrl: string,
+        thumbUrl: string,
+        content: IMediaEventContent,
+        forcedHeight?: number,
+    ): JSX.Element {
         let infoWidth;
         let infoHeight;
 
@@ -367,7 +372,7 @@ export default class MImageBody extends React.Component {
         }
 
         // The maximum height of the thumbnail as it is rendered as an 
-        const maxHeight = Math.min(this.props.maxImageHeight || 600, infoHeight);
+        const maxHeight = forcedHeight || Math.min((this.props.maxImageHeight || 600), infoHeight);
         // The maximum width of the thumbnail, as dictated by its natural
         // maximum height.
         const maxWidth = infoWidth * maxHeight / infoHeight;
@@ -407,9 +412,9 @@ export default class MImageBody extends React.Component {
         }
 
         const thumbnail = (
-            
+
{ /* Calculate aspect ratio, using %padding will size _container correctly */ } -
+
{ showPlaceholder &&
(); const contentUrl = this.getContentUrl(); - const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content); + const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content, 44); const fileBody = this.getFileBody(); const sender = ; return
-
{ thumbnail }
-
{ sender }
-
{ fileBody }
+ { thumbnail } +
+
{ sender }
+
{ fileBody }
+
; } } From 75e7948ca8eed1ea98925af32cfbe62024f634b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 11:57:40 +0200 Subject: [PATCH 070/135] Handle event edits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 78e630a0a2..e751a8ddc3 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -45,11 +45,14 @@ export default class ReplyTile extends React.PureComponent { componentDidMount() { this.props.mxEvent.on("Event.decrypted", this.onDecrypted); - this.props.mxEvent.on("Event.beforeRedaction", this.onBeforeRedaction); + this.props.mxEvent.on("Event.beforeRedaction", this.onEventRequiresUpdate); + this.props.mxEvent.on("Event.replaced", this.onEventRequiresUpdate); } componentWillUnmount() { this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted); + this.props.mxEvent.removeListener("Event.beforeRedaction", this.onEventRequiresUpdate); + this.props.mxEvent.removeListener("Event.replaced", this.onEventRequiresUpdate); } private onDecrypted = (): void => { @@ -59,8 +62,8 @@ export default class ReplyTile extends React.PureComponent { } }; - private onBeforeRedaction = (): void => { - // When the event gets redacted, update it, so that a different tile handler is used + private onEventRequiresUpdate = (): void => { + // Force update when necessary - redactions and edits this.forceUpdate(); }; @@ -155,6 +158,7 @@ export default class ReplyTile extends React.PureComponent { showUrlPreview={false} overrideBodyTypes={msgtypeOverrides} overrideEventTypes={evOverrides} + replacingEventId={this.props.mxEvent.replacingEventId()} maxImageHeight={96} />
From b4ae54dcce460a6147fed525705c35f7224f62e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 12:15:22 +0200 Subject: [PATCH 071/135] Remove unused CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 6 ------ 1 file changed, 6 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index dee68871c2..d059d553a9 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -15,8 +15,6 @@ limitations under the License. */ .mx_ReplyTile { - max-width: 100%; - clear: both; padding-top: 2px; padding-bottom: 2px; font-size: $font-14px; @@ -102,7 +100,3 @@ limitations under the License. text-overflow: ellipsis; max-width: calc(100% - 65px); } - -.mx_ReplyTile_contextual { - opacity: 0.4; -} From 8fc90e1d5341f1977cf93779897d508f57488389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 12:26:14 +0200 Subject: [PATCH 072/135] Fix isInfoMessage regression MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index e751a8ddc3..19da345579 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -85,7 +85,7 @@ export default class ReplyTile extends React.PureComponent { const eventType = this.props.mxEvent.getType(); // Info messages are basically information about commands processed on a room - let isInfoMessage = [ + let isInfoMessage = ![ EventType.RoomMessage, EventType.Sticker, EventType.RoomCreate, From d149cead5fb0348ba0c6cc8013a2e78beb4675ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 12:27:03 +0200 Subject: [PATCH 073/135] Remove unused CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index d059d553a9..21e5fedea9 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -98,5 +98,4 @@ limitations under the License. /* the next three lines, along with overflow hidden, truncate long display names */ white-space: nowrap; text-overflow: ellipsis; - max-width: calc(100% - 65px); } From 8e456b062ad5909dee2f3f3f009a2d051dedad55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 12:32:17 +0200 Subject: [PATCH 074/135] More unused CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 21e5fedea9..007ed35ecf 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -42,7 +42,6 @@ limitations under the License. .mx_ReplyTile .mx_EventTile_content { $reply-lines: 2; $line-height: $font-22px; - $max-height: 66px; pointer-events: none; @@ -51,7 +50,6 @@ limitations under the License. -webkit-box-orient: vertical; -webkit-line-clamp: $reply-lines; line-height: $line-height; - max-height: $max-height; .mx_EventTile_body.mx_EventTile_bigEmoji { line-height: $line-height !important; From 2660e25d6e932627a0814cd7d3b34a4d26a9865a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 13:04:37 +0200 Subject: [PATCH 075/135] Deduplicate some code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/EventTile.tsx | 31 ++----------------- src/components/views/rooms/ReplyTile.tsx | 24 ++------------- src/utils/EventUtils.ts | 38 ++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 49 deletions(-) diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index bf2438d267..b1e75443a0 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -54,6 +54,7 @@ import TooltipButton from '../elements/TooltipButton'; import ReadReceiptMarker from "./ReadReceiptMarker"; import MessageActionBar from "../messages/MessageActionBar"; import ReactionsRow from '../messages/ReactionsRow'; +import { getEventDisplayInfo } from '../../../utils/EventUtils'; const eventTileTypes = { [EventType.RoomMessage]: 'messages.MessageEvent', @@ -845,35 +846,9 @@ export default class EventTile extends React.Component { }; render() { - //console.info("EventTile showUrlPreview for %s is %s", this.props.mxEvent.getId(), this.props.showUrlPreview); + const msgtype = this.props.mxEvent.getContent().msgtype; + const { tileHandler, isBubbleMessage, isInfoMessage } = getEventDisplayInfo(this.props.mxEvent); - const content = this.props.mxEvent.getContent(); - const msgtype = content.msgtype; - const eventType = this.props.mxEvent.getType(); - - let tileHandler = getHandlerTile(this.props.mxEvent); - - // Info messages are basically information about commands processed on a room - let isBubbleMessage = eventType.startsWith("m.key.verification") || - (eventType === EventType.RoomMessage && msgtype && msgtype.startsWith("m.key.verification")) || - (eventType === EventType.RoomCreate) || - (eventType === EventType.RoomEncryption) || - (tileHandler === "messages.MJitsiWidgetEvent"); - let isInfoMessage = ( - !isBubbleMessage && eventType !== EventType.RoomMessage && - eventType !== EventType.Sticker && eventType !== EventType.RoomCreate - ); - - // If we're showing hidden events in the timeline, we should use the - // source tile when there's no regular tile for an event and also for - // replace relations (which otherwise would display as a confusing - // duplicate of the thing they are replacing). - if (SettingsStore.getValue("showHiddenEventsInTimeline") && !haveTileForEvent(this.props.mxEvent)) { - tileHandler = "messages.ViewSourceEvent"; - isBubbleMessage = false; - // Reuse info message avatar and sender profile styling - isInfoMessage = true; - } // This shouldn't happen: the caller should check we support this type // before trying to instantiate us if (!tileHandler) { diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 19da345579..054a920d64 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -28,6 +28,7 @@ import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; import { EventType, MsgType, RelationType } from 'matrix-js-sdk/src/@types/event'; import { replaceableComponent } from '../../../utils/replaceableComponent'; +import { getEventDisplayInfo } from '../../../utils/EventUtils'; interface IProps { mxEvent: MatrixEvent; @@ -80,28 +81,9 @@ export default class ReplyTile extends React.PureComponent { }; render() { - const content = this.props.mxEvent.getContent(); - const msgtype = content.msgtype; - const eventType = this.props.mxEvent.getType(); + const msgtype = this.props.mxEvent.getContent().msgtype; - // Info messages are basically information about commands processed on a room - let isInfoMessage = ![ - EventType.RoomMessage, - EventType.Sticker, - EventType.RoomCreate, - ].includes(eventType as EventType); - - let tileHandler = getHandlerTile(this.props.mxEvent); - // If we're showing hidden events in the timeline, we should use the - // source tile when there's no regular tile for an event and also for - // replace relations (which otherwise would display as a confusing - // duplicate of the thing they are replacing). - const useSource = !tileHandler || this.props.mxEvent.isRelation(RelationType.Replace); - if (useSource && SettingsStore.getValue("showHiddenEventsInTimeline")) { - tileHandler = "messages.ViewSourceEvent"; - // Reuse info message avatar and sender profile styling - isInfoMessage = true; - } + const { tileHandler, isInfoMessage } = getEventDisplayInfo(this.props.mxEvent); // This shouldn't happen: the caller should check we support this type // before trying to instantiate us if (!tileHandler) { diff --git a/src/utils/EventUtils.ts b/src/utils/EventUtils.ts index 1a467b157f..d69c285e18 100644 --- a/src/utils/EventUtils.ts +++ b/src/utils/EventUtils.ts @@ -19,6 +19,9 @@ import { MatrixEvent, EventStatus } from 'matrix-js-sdk/src/models/event'; import { MatrixClientPeg } from '../MatrixClientPeg'; import shouldHideEvent from "../shouldHideEvent"; +import { getHandlerTile, haveTileForEvent } from "../components/views/rooms/EventTile"; +import SettingsStore from "../settings/SettingsStore"; +import { EventType } from "matrix-js-sdk/src/@types/event"; /** * Returns whether an event should allow actions like reply, reactions, edit, etc. @@ -96,3 +99,38 @@ export function findEditableEvent(room: Room, isForward: boolean, fromEventId: s } } +export function getEventDisplayInfo(mxEvent: MatrixEvent): { + isInfoMessage: boolean; + tileHandler; + isBubbleMessage: boolean; +} { + const content = mxEvent.getContent(); + const msgtype = content.msgtype; + const eventType = mxEvent.getType(); + + let tileHandler = getHandlerTile(mxEvent); + + // Info messages are basically information about commands processed on a room + let isBubbleMessage = eventType.startsWith("m.key.verification") || + (eventType === EventType.RoomMessage && msgtype && msgtype.startsWith("m.key.verification")) || + (eventType === EventType.RoomCreate) || + (eventType === EventType.RoomEncryption) || + (tileHandler === "messages.MJitsiWidgetEvent"); + let isInfoMessage = ( + !isBubbleMessage && eventType !== EventType.RoomMessage && + eventType !== EventType.Sticker && eventType !== EventType.RoomCreate + ); + + // If we're showing hidden events in the timeline, we should use the + // source tile when there's no regular tile for an event and also for + // replace relations (which otherwise would display as a confusing + // duplicate of the thing they are replacing). + if (SettingsStore.getValue("showHiddenEventsInTimeline") && !haveTileForEvent(mxEvent)) { + tileHandler = "messages.ViewSourceEvent"; + isBubbleMessage = false; + // Reuse info message avatar and sender profile styling + isInfoMessage = true; + } + + return { tileHandler, isInfoMessage, isBubbleMessage }; +} From 1ec4ead62d38e63851e55ff3bcb7f51c4e9cbe09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 13:04:59 +0200 Subject: [PATCH 076/135] Unused imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/EventTile.tsx | 1 - src/components/views/rooms/ReplyTile.tsx | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index b1e75443a0..553b7801cc 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -27,7 +27,6 @@ import { _t } from '../../../languageHandler'; import { hasText } from "../../../TextForEvent"; import * as sdk from "../../../index"; import dis from '../../../dispatcher/dispatcher'; -import SettingsStore from "../../../settings/SettingsStore"; import { Layout } from "../../../settings/Layout"; import { formatTime } from "../../../DateUtils"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 054a920d64..c875553a96 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -18,15 +18,13 @@ import React from 'react'; import classNames from 'classnames'; import { _t } from '../../../languageHandler'; import dis from '../../../dispatcher/dispatcher'; -import SettingsStore from "../../../settings/SettingsStore"; -import { getHandlerTile } from "./EventTile"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; import SenderProfile from "../messages/SenderProfile"; import TextualBody from "../messages/TextualBody"; import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; -import { EventType, MsgType, RelationType } from 'matrix-js-sdk/src/@types/event'; +import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; import { replaceableComponent } from '../../../utils/replaceableComponent'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; From 8f831a89f62769e360546dbe5c56cd21a8e7d6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 13:07:47 +0200 Subject: [PATCH 077/135] Remove unused code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ReplyThread.js | 31 -------------------- 1 file changed, 31 deletions(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index c22225f766..434900c8de 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -70,10 +70,7 @@ export default class ReplyThread extends React.Component { }; this.unmounted = false; - this.context.on("Event.replaced", this.onEventReplaced); this.room = this.context.getRoom(this.props.parentEv.getRoomId()); - this.room.on("Room.redaction", this.onRoomRedaction); - this.room.on("Room.redactionCancelled", this.onRoomRedaction); this.onQuoteClick = this.onQuoteClick.bind(this); this.canCollapse = this.canCollapse.bind(this); @@ -239,36 +236,8 @@ export default class ReplyThread extends React.Component { componentWillUnmount() { this.unmounted = true; - this.context.removeListener("Event.replaced", this.onEventReplaced); - if (this.room) { - this.room.removeListener("Room.redaction", this.onRoomRedaction); - this.room.removeListener("Room.redactionCancelled", this.onRoomRedaction); - } } - updateForEventId = (eventId) => { - if (this.state.events.some(event => event.getId() === eventId)) { - this.forceUpdate(); - } - }; - - onEventReplaced = (ev) => { - if (this.unmounted) return; - - // If one of the events we are rendering gets replaced, force a re-render - this.updateForEventId(ev.getId()); - }; - - onRoomRedaction = (ev) => { - if (this.unmounted) return; - - const eventId = ev.getAssociatedId(); - if (!eventId) return; - - // If one of the events we are rendering gets redacted, force a re-render - this.updateForEventId(eventId); - }; - async initialize() { const { parentEv } = this.props; // at time of making this component we checked that props.parentEv has a parentEventId From 1bca5371d1f6f92cff106e78861676390fa79801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 13 Jul 2021 13:18:01 +0200 Subject: [PATCH 078/135] Fix redacted messages for the 100th #*&@*%^ time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 007ed35ecf..517ef79ef0 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -29,12 +29,13 @@ limitations under the License. color: $primary-fg-color; } -.mx_ReplyTile > .mx_RedactedBody { - padding: 18px; +.mx_ReplyTile .mx_RedactedBody { + padding: 4px 0 2px 20px; &::before { height: 13px; width: 13px; + top: 5px; } } From 7a8400e5c70e8327141d03695f5f569ec9dbef18 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Mon, 12 Jul 2021 20:36:28 +0100 Subject: [PATCH 079/135] Standardise spelling and casing of homeserver Signed-off-by: Paulo Pinto --- src/i18n/strings/it.json | 2 +- .../synapse/config-templates/consent/homeserver.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 207ff24d58..3b33c4227c 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -603,7 +603,7 @@ "Incorrect username and/or password.": "Nome utente e/o password sbagliati.", "Please note you are logging into the %(hs)s server, not matrix.org.": "Nota che stai accedendo nel server %(hs)s , non matrix.org.", "The phone number entered looks invalid": "Il numero di telefono inserito sembra non valido", - "This homeserver doesn't offer any login flows which are supported by this client.": "Questo home server non offre alcuna procedura di accesso supportata da questo client.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Questo homeserver non offre alcuna procedura di accesso supportata da questo client.", "Error: Problem communicating with the given homeserver.": "Errore: problema di comunicazione con l'homeserver dato.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or
enable unsafe scripts.": "Impossibile connettersi all'homeserver via HTTP quando c'è un URL HTTPS nella barra del tuo browser. Usa HTTPS o attiva gli script non sicuri.", "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.": "Impossibile connettersi all'homeserver - controlla la tua connessione, assicurati che il certificato SSL dell'homeserver sia fidato e che un'estensione del browser non stia bloccando le richieste.", diff --git a/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml b/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml index deb750666f..61b446babe 100644 --- a/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml +++ b/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml @@ -572,11 +572,11 @@ uploads_path: "{{SYNAPSE_ROOT}}uploads" ## Captcha ## # See docs/CAPTCHA_SETUP for full details of configuring this. -# This Home Server's ReCAPTCHA public key. +# This homeserver's ReCAPTCHA public key. # #recaptcha_public_key: "YOUR_PUBLIC_KEY" -# This Home Server's ReCAPTCHA private key. +# This homeserver's ReCAPTCHA private key. # #recaptcha_private_key: "YOUR_PRIVATE_KEY" @@ -889,7 +889,7 @@ email: smtp_user: "exampleusername" smtp_pass: "examplepassword" require_transport_security: False - notif_from: "Your Friendly %(app)s Home Server " + notif_from: "Your Friendly %(app)s homeserver " app_name: Matrix # if template_dir is unset, uses the example templates that are part of # the Synapse distribution. From 09d08882e3fbb6cec529f35f3367ac9bede3ff5c Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 13 Jul 2021 15:05:27 +0100 Subject: [PATCH 080/135] Standardise casing of identity server Replace instances of 'Identity Server' with 'Identity server', when at start of sentence, or 'identity server' when not. Signed-off-by: Paulo Pinto --- src/IdentityAuthClient.js | 2 +- src/components/views/dialogs/TermsDialog.tsx | 2 +- src/components/views/settings/SetIdServer.tsx | 14 +++++------ .../tabs/user/HelpUserSettingsTab.tsx | 2 +- src/i18n/strings/ar.json | 12 +++++----- src/i18n/strings/az.json | 2 +- src/i18n/strings/bg.json | 14 +++++------ src/i18n/strings/ca.json | 2 +- src/i18n/strings/cs.json | 14 +++++------ src/i18n/strings/de_DE.json | 14 +++++------ src/i18n/strings/el.json | 2 +- src/i18n/strings/en_EN.json | 12 +++++----- src/i18n/strings/en_US.json | 2 +- src/i18n/strings/eo.json | 14 +++++------ src/i18n/strings/es.json | 14 +++++------ src/i18n/strings/et.json | 14 +++++------ src/i18n/strings/eu.json | 14 +++++------ src/i18n/strings/fa.json | 12 +++++----- src/i18n/strings/fi.json | 14 +++++------ src/i18n/strings/fr.json | 14 +++++------ src/i18n/strings/gl.json | 14 +++++------ src/i18n/strings/he.json | 12 +++++----- src/i18n/strings/hi.json | 2 +- src/i18n/strings/hu.json | 14 +++++------ src/i18n/strings/is.json | 2 +- src/i18n/strings/it.json | 24 +++++++++---------- src/i18n/strings/ja.json | 12 +++++----- src/i18n/strings/kab.json | 14 +++++------ src/i18n/strings/ko.json | 14 +++++------ src/i18n/strings/lt.json | 14 +++++------ src/i18n/strings/lv.json | 2 +- src/i18n/strings/nb_NO.json | 8 +++---- src/i18n/strings/nl.json | 14 +++++------ src/i18n/strings/nn.json | 4 ++-- src/i18n/strings/pl.json | 12 +++++----- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 14 +++++------ src/i18n/strings/ru.json | 14 +++++------ src/i18n/strings/sk.json | 14 +++++------ src/i18n/strings/sq.json | 14 +++++------ src/i18n/strings/sr.json | 4 ++-- src/i18n/strings/sv.json | 14 +++++------ src/i18n/strings/th.json | 2 +- src/i18n/strings/tr.json | 14 +++++------ src/i18n/strings/uk.json | 6 ++--- src/i18n/strings/vls.json | 14 +++++------ src/i18n/strings/zh_Hans.json | 14 +++++------ src/i18n/strings/zh_Hant.json | 14 +++++------ src/settings/Settings.tsx | 2 +- 49 files changed, 247 insertions(+), 247 deletions(-) diff --git a/src/IdentityAuthClient.js b/src/IdentityAuthClient.js index 31a5021317..447c5edd30 100644 --- a/src/IdentityAuthClient.js +++ b/src/IdentityAuthClient.js @@ -127,7 +127,7 @@ export default class IdentityAuthClient { await this._matrixClient.getIdentityAccount(token); } catch (e) { if (e.errcode === "M_TERMS_NOT_SIGNED") { - console.log("Identity Server requires new terms to be agreed to"); + console.log("Identity server requires new terms to be agreed to"); await startTermsFlow([new Service( SERVICE_TYPES.IS, identityServerUrl, diff --git a/src/components/views/dialogs/TermsDialog.tsx b/src/components/views/dialogs/TermsDialog.tsx index afa732033f..49a801b8cf 100644 --- a/src/components/views/dialogs/TermsDialog.tsx +++ b/src/components/views/dialogs/TermsDialog.tsx @@ -90,7 +90,7 @@ export default class TermsDialog extends React.PureComponent{_t("Identity Server")}
({host})
; + return
{_t("Identity server")}
({host})
; case SERVICE_TYPES.IM: return
{_t("Integration Manager")}
({host})
; } diff --git a/src/components/views/settings/SetIdServer.tsx b/src/components/views/settings/SetIdServer.tsx index 9180c98101..981daac6c8 100644 --- a/src/components/views/settings/SetIdServer.tsx +++ b/src/components/views/settings/SetIdServer.tsx @@ -44,7 +44,7 @@ const REACHABILITY_TIMEOUT = 10000; // ms async function checkIdentityServerUrl(u) { const parsedUrl = url.parse(u); - if (parsedUrl.protocol !== 'https:') return _t("Identity Server URL must be HTTPS"); + if (parsedUrl.protocol !== 'https:') return _t("Identity server URL must be HTTPS"); // XXX: duplicated logic from js-sdk but it's quite tied up in the validation logic in the // js-sdk so probably as easy to duplicate it than to separate it out so we can reuse it @@ -53,12 +53,12 @@ async function checkIdentityServerUrl(u) { if (response.ok) { return null; } else if (response.status < 200 || response.status >= 300) { - return _t("Not a valid Identity Server (status code %(code)s)", { code: response.status }); + return _t("Not a valid identity server (status code %(code)s)", { code: response.status }); } else { - return _t("Could not connect to Identity Server"); + return _t("Could not connect to identity server"); } } catch (e) { - return _t("Could not connect to Identity Server"); + return _t("Could not connect to identity server"); } } @@ -320,7 +320,7 @@ export default class SetIdServer extends React.Component { message = unboundMessage; } - const { finished } = Modal.createTrackedDialog('Identity Server Bound Warning', '', QuestionDialog, { + const { finished } = Modal.createTrackedDialog('Identity server Bound Warning', '', QuestionDialog, { title, description: message, button, @@ -356,7 +356,7 @@ export default class SetIdServer extends React.Component { let sectionTitle; let bodyText; if (idServerUrl) { - sectionTitle = _t("Identity Server (%(server)s)", { server: abbreviateUrl(idServerUrl) }); + sectionTitle = _t("Identity server (%(server)s)", { server: abbreviateUrl(idServerUrl) }); bodyText = _t( "You are currently using to discover and be discoverable by " + "existing contacts you know. You can change your identity server below.", @@ -371,7 +371,7 @@ export default class SetIdServer extends React.Component { ); } } else { - sectionTitle = _t("Identity Server"); + sectionTitle = _t("Identity server"); bodyText = _t( "You are not currently using an identity server. " + "To discover and be discoverable by existing contacts you know, " + diff --git a/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx b/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx index 608d973992..f2857720a5 100644 --- a/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx @@ -290,7 +290,7 @@ export default class HelpUserSettingsTab extends React.Component {_t("Advanced")}
{_t("Homeserver is")} {MatrixClientPeg.get().getHomeserverUrl()}
- {_t("Identity Server is")} {MatrixClientPeg.get().getIdentityServerUrl()}
+ {_t("Identity server is")} {MatrixClientPeg.get().getIdentityServerUrl()}

{_t("Access Token")}
diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index cc63995e0f..6ff80501fd 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -733,7 +733,7 @@ "Clear cache and reload": "محو مخزن الجيب وإعادة التحميل", "click to reveal": "انقر للكشف", "Access Token:": "رمز الوصول:", - "Identity Server is": "خادم الهوية هو", + "Identity server is": "خادم الهوية هو", "Homeserver is": "الخادم الوسيط هو", "olm version:": "إصدار olm:", "%(brand)s version:": "إصدار %(brand)s:", @@ -793,10 +793,10 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "استخدام خادم الهوية اختياري. إذا اخترت عدم استخدام خادم هوية ، فلن يتمكن المستخدمون الآخرون من اكتشافك ولن تتمكن من دعوة الآخرين عبر البريد الإلكتروني أو الهاتف.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "قطع الاتصال بخادم الهوية الخاص بك يعني أنك لن تكون قابلاً للاكتشاف من قبل المستخدمين الآخرين ولن تتمكن من دعوة الآخرين عبر البريد الإلكتروني أو الهاتف.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "أنت لا تستخدم حاليًا خادم هوية. لاكتشاف جهات الاتصال الحالية التي تعرفها وتكون قابلاً للاكتشاف ، أضف واحداً أدناه.", - "Identity Server": "خادم الهوية", + "Identity server": "خادم الهوية", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "إذا كنت لا تريد استخدام لاكتشاف جهات الاتصال الموجودة التي تعرفها وتكون قابلاً للاكتشاف ، فأدخل خادم هوية آخر أدناه.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "أنت تستخدم حاليًا لاكتشاف جهات الاتصال الحالية التي تعرفها وتجعل نفسك قابلاً للاكتشاف. يمكنك تغيير خادم الهوية الخاص بك أدناه.", - "Identity Server (%(server)s)": "خادمة الهوية (%(server)s)", + "Identity server (%(server)s)": "خادمة الهوية (%(server)s)", "Go back": "ارجع", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "نوصي بإزالة عناوين البريد الإلكتروني وأرقام الهواتف من خادم الهوية قبل قطع الاتصال.", "You are still sharing your personal data on the identity server .": "لا زالت بياناتك الشخصية مشاعة على خادم الهوية .", @@ -814,9 +814,9 @@ "Disconnect from the identity server and connect to instead?": "انفصل عن خادم الهوية واتصل بآخر بدلاً منه؟", "Change identity server": "تغيير خادم الهوية", "Checking server": "فحص خادم", - "Could not connect to Identity Server": "تعذر الاتصال بخادم هوية", - "Not a valid Identity Server (status code %(code)s)": "خادم هوية مردود (رقم الحال %(code)s)", - "Identity Server URL must be HTTPS": "يجب أن يكون رابط (URL) خادم الهوية HTTPS", + "Could not connect to identity server": "تعذر الاتصال بخادم هوية", + "Not a valid identity server (status code %(code)s)": "خادم هوية مردود (رقم الحال %(code)s)", + "Identity server URL must be HTTPS": "يجب أن يكون رابط (URL) خادم الهوية HTTPS", "not ready": "غير جاهز", "ready": "جاهز", "Secret storage:": "التخزين السري:", diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json index 987cef73b2..fccb2b1cc4 100644 --- a/src/i18n/strings/az.json +++ b/src/i18n/strings/az.json @@ -253,7 +253,7 @@ "Access Token:": "Girişin token-i:", "click to reveal": "açılış üçün basın", "Homeserver is": "Ev serveri bu", - "Identity Server is": "Eyniləşdirmənin serveri bu", + "Identity server is": "Eyniləşdirmənin serveri bu", "olm version:": "Olm versiyası:", "Failed to send email": "Email göndərilməsinin səhvi", "A new password must be entered.": "Yeni parolu daxil edin.", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 294d5a4979..77b5d84450 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -585,7 +585,7 @@ "Access Token:": "Тоукън за достъп:", "click to reveal": "натиснете за показване", "Homeserver is": "Home сървър:", - "Identity Server is": "Сървър за самоличност:", + "Identity server is": "Сървър за самоличност:", "%(brand)s version:": "Версия на %(brand)s:", "olm version:": "Версия на olm:", "Failed to send email": "Неуспешно изпращане на имейл", @@ -1068,7 +1068,7 @@ "Confirm": "Потвърди", "Other servers": "Други сървъри", "Homeserver URL": "Адрес на Home сървър", - "Identity Server URL": "Адрес на сървър за самоличност", + "Identity server URL": "Адрес на сървър за самоличност", "Free": "Безплатно", "Join millions for free on the largest public server": "Присъединете се безплатно към милиони други на най-големия публичен сървър", "Premium": "Премиум", @@ -1395,7 +1395,7 @@ "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Не можете да влезете в профила си. Свържете се с администратора на сървъра за повече информация.", "You're signed out": "Излязохте от профила", "Clear personal data": "Изчисти личните данни", - "Identity Server": "Сървър за самоличност", + "Identity server": "Сървър за самоличност", "Find others by phone or email": "Открийте други по телефон или имейл", "Be found by phone or email": "Бъдете открит по телефон или имейл", "Use bots, bridges, widgets and sticker packs": "Използвайте ботове, връзки с други мрежи, приспособления и стикери", @@ -1413,9 +1413,9 @@ "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Позволи ползването на помощен сървър turn.matrix.org когато сървъра не предложи собствен (IP адресът ви ще бъде споделен по време на разговор)", "ID": "Идентификатор", "Public Name": "Публично име", - "Identity Server URL must be HTTPS": "Адресът на сървъра за самоличност трябва да бъде HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Невалиден сървър за самоличност (статус код %(code)s)", - "Could not connect to Identity Server": "Неуспешна връзка със сървъра за самоличност", + "Identity server URL must be HTTPS": "Адресът на сървъра за самоличност трябва да бъде HTTPS", + "Not a valid identity server (status code %(code)s)": "Невалиден сървър за самоличност (статус код %(code)s)", + "Could not connect to identity server": "Неуспешна връзка със сървъра за самоличност", "Checking server": "Проверка на сървъра", "Identity server has no terms of service": "Сървъра за самоличност няма условия за ползване", "The identity server you have chosen does not have any terms of service.": "Избраният от вас сървър за самоличност няма условия за ползване на услугата.", @@ -1423,7 +1423,7 @@ "Terms of service not accepted or the identity server is invalid.": "Условията за ползване не бяха приети или сървъра за самоличност е невалиден.", "Disconnect from the identity server ?": "Прекъсване на връзката със сървър за самоличност ?", "Disconnect": "Прекъсни", - "Identity Server (%(server)s)": "Сървър за самоличност (%(server)s)", + "Identity server (%(server)s)": "Сървър за самоличност (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "В момента използвате за да откривате и да бъдете открити от познати ваши контакти. Може да промените сървъра за самоличност по-долу.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "В момента не използвате сървър за самоличност. За да откривате и да бъдете открити от познати ваши контакти, добавете такъв по-долу.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Прекъсването на връзката със сървъра ви за самоличност означава че няма да можете да бъдете открити от други потребители или да каните хора по имейл или телефонен номер.", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 945b5a10cc..8a6ac461b6 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -575,7 +575,7 @@ "Your homeserver's URL": "L'URL del teu servidor propi", "Analytics": "Analítiques", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.", - "Identity Server is": "El servidor d'identitat és", + "Identity server is": "El servidor d'identitat és", "Submit debug logs": "Enviar logs de depuració", "The platform you're on": "La plataforma a la que et trobes", "Your language of choice": "El teu idioma desitjat", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 27235665aa..f6956ddf99 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -146,7 +146,7 @@ "Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste klepli na odkaz v e-mailové zprávě", "Guests cannot join this room even if explicitly invited.": "Hosté nemohou vstoupit do této místnosti, i když jsou přímo pozváni.", "Homeserver is": "Domovský server je", - "Identity Server is": "Server identity je", + "Identity server is": "Server identity je", "I have verified my email address": "Ověřil(a) jsem svou e-mailovou adresu", "Import": "Importovat", "Import E2E room keys": "Importovat end-to-end klíče místností", @@ -1155,7 +1155,7 @@ "Invalid homeserver discovery response": "Neplatná odpověd při hledání domovského serveru", "Failed to perform homeserver discovery": "Nepovedlo se zjisit adresu domovského serveru", "Registration has been disabled on this homeserver.": "Tento domovský server nepovoluje registraci.", - "Identity Server URL": "URL serveru identity", + "Identity server URL": "URL serveru identity", "Invalid identity server discovery response": "Neplatná odpověď při hledání serveru identity", "Your Modular server": "Váš server Modular", "Server Name": "Název serveru", @@ -1377,9 +1377,9 @@ "Accept to continue:": "Pro pokračování odsouhlaste :", "ID": "ID", "Public Name": "Veřejné jméno", - "Identity Server URL must be HTTPS": "Adresa serveru identit musí být na HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Toto není validní server identit (stavový kód %(code)s)", - "Could not connect to Identity Server": "Nepovedlo se připojení k serveru identit", + "Identity server URL must be HTTPS": "Adresa serveru identit musí být na HTTPS", + "Not a valid identity server (status code %(code)s)": "Toto není validní server identit (stavový kód %(code)s)", + "Could not connect to identity server": "Nepovedlo se připojení k serveru identit", "Checking server": "Kontrolování serveru", "Change identity server": "Změnit server identit", "Disconnect from the identity server and connect to instead?": "Odpojit se ze serveru a připojit na ?", @@ -1393,10 +1393,10 @@ "You are still sharing your personal data on the identity server .": "Pořád sdílíte osobní údaje se serverem identit .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Než se odpojíte, doporučujeme odstranit e-mailovou adresu a telefonní číslo ze serveru identit.", "Disconnect anyway": "Stejně se odpojit", - "Identity Server (%(server)s)": "Server identit (%(server)s)", + "Identity server (%(server)s)": "Server identit (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Pro hledání existujících kontaktů používáte server identit . Níže ho můžete změnit.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Pokud nechcete na hledání existujících kontaktů používat server , zvolte si jiný server.", - "Identity Server": "Server identit", + "Identity server": "Server identit", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Pro hledání existujících kontaktů nepoužíváte žádný server identit . Abyste mohli hledat kontakty, nějaký níže nastavte.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Po odpojení od serveru identit nebude možné vás najít podle e-mailové adresy ani telefonního čísla, a zároveň podle nich ani vy nebudete moci hledat ostatní kontakty.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Použití serveru identit je volitelné. Nemusíte server identit používat, ale nepůjde vás pak najít podle e-mailové adresy ani telefonního čísla a vy také nebudete moci hledat ostatní.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c09b92dcbc..23c362ec00 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -48,7 +48,7 @@ "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", "Homeserver is": "Dein Heimserver ist", - "Identity Server is": "Der Identitätsserver ist", + "Identity server is": "Der Identitätsserver ist", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raumschlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", @@ -1163,7 +1163,7 @@ "Confirm": "Bestätigen", "Other servers": "Andere Server", "Homeserver URL": "Heimserver-Adresse", - "Identity Server URL": "Identitätsserver-URL", + "Identity server URL": "Identitätsserver-URL", "Free": "Frei", "Premium": "Premium", "Premium hosting for organisations Learn more": "Premium-Hosting für Organisationen Lerne mehr", @@ -1300,18 +1300,18 @@ "You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", "Multiple integration managers": "Mehrere Integrationsverwalter", "Public Name": "Öffentlicher Name", - "Identity Server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein", - "Could not connect to Identity Server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", + "Identity server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein", + "Could not connect to identity server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", "Checking server": "Server wird überprüft", "Identity server has no terms of service": "Der Identitätsserver hat keine Nutzungsbedingungen", "Disconnect": "Trennen", - "Identity Server": "Identitätsserver", + "Identity server": "Identitätsserver", "Use an identity server": "Benutze einen Identitätsserver", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standardidentitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.", "ID": "ID", - "Not a valid Identity Server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)", + "Not a valid identity server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)", "Terms of service not accepted or the identity server is invalid.": "Die Nutzungsbedingungen wurden nicht akzeptiert oder der Identitätsserver ist ungültig.", - "Identity Server (%(server)s)": "Identitätsserver (%(server)s)", + "Identity server (%(server)s)": "Identitätsserver (%(server)s)", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Die Verwendung eines Identitätsserver ist optional. Solltest du dich dazu entschließen, keinen Identitätsserver zu verwenden, kannst du von anderen Nutzern nicht gefunden werden und andere nicht per E-Mail oder Telefonnummer einladen.", "Do not use an identity server": "Keinen Identitätsserver verwenden", "Enter a new identity server": "Gib einen neuen Identitätsserver ein", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 8700abbff1..ac132b01f8 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -82,7 +82,7 @@ "Hangup": "Κλείσιμο", "Historical": "Ιστορικό", "Homeserver is": "Ο διακομιστής είναι", - "Identity Server is": "Ο διακομιστής ταυτοποίησης είναι", + "Identity server is": "Ο διακομιστής ταυτοποίησης είναι", "I have verified my email address": "Έχω επαληθεύσει την διεύθυνση ηλ. αλληλογραφίας", "Import": "Εισαγωγή", "Import E2E room keys": "Εισαγωγή κλειδιών E2E", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ced24e2547..545fdb937a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1202,9 +1202,9 @@ "Secret storage:": "Secret storage:", "ready": "ready", "not ready": "not ready", - "Identity Server URL must be HTTPS": "Identity Server URL must be HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Not a valid Identity Server (status code %(code)s)", - "Could not connect to Identity Server": "Could not connect to Identity Server", + "Identity server URL must be HTTPS": "Identity server URL must be HTTPS", + "Not a valid identity server (status code %(code)s)": "Not a valid identity server (status code %(code)s)", + "Could not connect to identity server": "Could not connect to identity server", "Checking server": "Checking server", "Change identity server": "Change identity server", "Disconnect from the identity server and connect to instead?": "Disconnect from the identity server and connect to instead?", @@ -1221,10 +1221,10 @@ "Disconnect anyway": "Disconnect anyway", "You are still sharing your personal data on the identity server .": "You are still sharing your personal data on the identity server .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.", - "Identity Server (%(server)s)": "Identity Server (%(server)s)", + "Identity server (%(server)s)": "Identity server (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.", - "Identity Server": "Identity Server", + "Identity server": "Identity server", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.", @@ -1288,7 +1288,7 @@ "%(brand)s version:": "%(brand)s version:", "olm version:": "olm version:", "Homeserver is": "Homeserver is", - "Identity Server is": "Identity Server is", + "Identity server is": "Identity server is", "Access Token": "Access Token", "Your access token gives full access to your account. Do not share it with anyone.": "Your access token gives full access to your account. Do not share it with anyone.", "Copy": "Copy", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index a5d7756de8..be473bb289 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -108,7 +108,7 @@ "Hangup": "Hangup", "Historical": "Historical", "Homeserver is": "Homeserver is", - "Identity Server is": "Identity Server 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", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 41bb44ed83..d19baf68dc 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -557,7 +557,7 @@ "Access Token:": "Atinga ĵetono:", "click to reveal": "klaku por malkovri", "Homeserver is": "Hejmservilo estas", - "Identity Server is": "Identiga servilo estas", + "Identity server is": "Identiga servilo estas", "%(brand)s version:": "versio de %(brand)s:", "olm version:": "versio de olm:", "Failed to send email": "Malsukcesis sendi retleteron", @@ -969,7 +969,7 @@ "Confirm": "Konfirmi", "Other servers": "Aliaj serviloj", "Homeserver URL": "Hejmservila URL", - "Identity Server URL": "URL de identiga servilo", + "Identity server URL": "URL de identiga servilo", "Free": "Senpaga", "Other": "Alia", "Couldn't load page": "Ne povis enlegi paĝon", @@ -1395,7 +1395,7 @@ "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Enigu la lokon de via Modular-hejmservilo. Ĝi povas uzi vian propran domajnan nomon aŭ esti subdomajno de modular.im.", "Invalid base_url for m.homeserver": "Nevalida base_url por m.homeserver", "Invalid base_url for m.identity_server": "Nevalida base_url por m.identity_server", - "Identity Server": "Identiga servilo", + "Identity server": "Identiga servilo", "Find others by phone or email": "Trovu aliajn per telefonnumero aŭ retpoŝtadreso", "Be found by phone or email": "Troviĝu per telefonnumero aŭ retpoŝtadreso", "Use bots, bridges, widgets and sticker packs": "Uzu robotojn, pontojn, fenestraĵojn, kaj glumarkarojn", @@ -1422,9 +1422,9 @@ "Displays list of commands with usages and descriptions": "Montras liston de komandoj kun priskribo de uzo", "Send read receipts for messages (requires compatible homeserver to disable)": "Sendi legokonfirmojn de mesaĝoj (bezonas akordan hejmservilon por malŝalto)", "Accept to continue:": "Akceptu por daŭrigi:", - "Identity Server URL must be HTTPS": "URL de identiga servilo devas esti HTTPS-a", - "Not a valid Identity Server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)", - "Could not connect to Identity Server": "Ne povis konektiĝi al identiga servilo", + "Identity server URL must be HTTPS": "URL de identiga servilo devas esti HTTPS-a", + "Not a valid identity server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)", + "Could not connect to identity server": "Ne povis konektiĝi al identiga servilo", "Checking server": "Kontrolante servilon", "Change identity server": "Ŝanĝi identigan servilon", "Disconnect from the identity server and connect to instead?": "Ĉu malkonekti de la nuna identiga servilo kaj konekti anstataŭe al ?", @@ -1438,7 +1438,7 @@ "You are still sharing your personal data on the identity server .": "Vi ankoraŭ havigas siajn personajn datumojn je la identiga servilo .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ni rekomendas, ke vi forigu viajn retpoŝtadresojn kaj telefonnumerojn de la identiga servilo, antaŭ ol vi malkonektiĝos.", "Disconnect anyway": "Tamen malkonekti", - "Identity Server (%(server)s)": "Identiga servilo (%(server)s)", + "Identity server (%(server)s)": "Identiga servilo (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Vi nun uzas servilon por trovi kontaktojn, kaj troviĝi de ili. Vi povas ŝanĝi vian identigan servilon sube.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se vi ne volas uzi servilon por trovi kontaktojn kaj troviĝi mem, enigu alian identigan servilon sube.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vi nun ne uzas identigan servilon. Por trovi kontaktojn kaj troviĝi de ili mem, aldonu iun sube.", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index c1fb8e6542..024ae81511 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -88,7 +88,7 @@ "Hangup": "Colgar", "Historical": "Historial", "Homeserver is": "El servidor base es", - "Identity Server is": "El Servidor de Identidad es", + "Identity server is": "El Servidor de Identidad es", "I have verified my email address": "He verificado mi dirección de correo electrónico", "Import E2E room keys": "Importar claves de salas con cifrado de extremo a extremo", "Incorrect verification code": "Verificación de código incorrecta", @@ -1216,10 +1216,10 @@ "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de cifrado end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.", "in memory": "en memoria", "not found": "no encontrado", - "Identity Server (%(server)s)": "Servidor de identidad %(server)s", + "Identity server (%(server)s)": "Servidor de identidad %(server)s", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Estás usando actualmente para descubrir y ser descubierto por contactos existentes que conoces. Puedes cambiar tu servidor de identidad más abajo.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Si no quieres usar para descubrir y ser descubierto por contactos existentes que conoces, introduce otro servidor de identidad más abajo.", - "Identity Server": "Servidor de Identidad", + "Identity server": "Servidor de Identidad", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "No estás usando un servidor de identidad ahora mismo. Para descubrir y ser descubierto por contactos existentes que conoces, introduce uno más abajo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectarte de tu servidor de identidad significa que no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar un servidor de identidad es opcional. Si eliges no usar un servidor de identidad, no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.", @@ -1526,9 +1526,9 @@ "Backup has an invalid signature from verified session ": "La copia de seguridad tiene una firma de no válida de sesión verificada ", "Backup has an invalid signature from unverified session ": "La copia de seguridad tiene una firma de no válida de sesión no verificada ", "Upgrade to your own domain": "Contratar dominio personalizado", - "Identity Server URL must be HTTPS": "La URL del servidor de identidad debe ser tipo HTTPS", - "Not a valid Identity Server (status code %(code)s)": "No es un servidor de identidad válido (código de estado %(code)s)", - "Could not connect to Identity Server": "No se ha podido conectar al servidor de identidad", + "Identity server URL must be HTTPS": "La URL del servidor de identidad debe ser tipo HTTPS", + "Not a valid identity server (status code %(code)s)": "No es un servidor de identidad válido (código de estado %(code)s)", + "Could not connect to identity server": "No se ha podido conectar al servidor de identidad", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Usted debe eliminar sus datos personales del servidor de identidad antes de desconectarse. Desafortunadamente, el servidor de identidad está actualmente desconectado o es imposible comunicarse con él por otra razón.", "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "comprueba los complementos (plugins) de tu navegador para ver si hay algo que pueda bloquear el servidor de identidad (como p.ej. Privacy Badger)", "contact the administrators of identity server ": "contactar con los administradores del servidor de identidad ", @@ -1975,7 +1975,7 @@ "Enter your custom homeserver URL What does this mean?": "Ingrese la URL de su servidor doméstico ¿Qué significa esto?", "Homeserver URL": "URL del servidor doméstico", "Enter your custom identity server URL What does this mean?": "Introduzca la URL de su servidor de identidad personalizada ¿Qué significa esto?", - "Identity Server URL": "URL del servidor de identidad", + "Identity server URL": "URL del servidor de identidad", "Other servers": "Otros servidores", "Free": "Gratis", "Join millions for free on the largest public server": "Únete de forma gratuita a millones de personas en el servidor público más grande", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index a466922bf9..ef7c5f792b 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1242,7 +1242,7 @@ "Enter your custom homeserver URL What does this mean?": "Sisesta oma koduserveri aadress Mida see tähendab?", "Homeserver URL": "Koduserveri aadress", "Enter your custom identity server URL What does this mean?": "Sisesta kohandatud isikutuvastusserver aadress Mida see tähendab?", - "Identity Server URL": "Isikutuvastusserveri aadress", + "Identity server URL": "Isikutuvastusserveri aadress", "Other servers": "Muud serverid", "Free": "Tasuta teenus", "Join millions for free on the largest public server": "Liitu tasuta nende miljonitega, kas kasutavad suurimat avalikku Matrix'i serverit", @@ -1450,9 +1450,9 @@ "Font size": "Fontide suurus", "Enable automatic language detection for syntax highlighting": "Kasuta süntaksi esiletõstmisel automaatset keeletuvastust", "Cross-signing private keys:": "Privaatvõtmed risttunnustamise jaoks:", - "Identity Server URL must be HTTPS": "Isikutuvastusserveri URL peab kasutama HTTPS-protokolli", - "Not a valid Identity Server (status code %(code)s)": "See ei ole sobilik isikutuvastusserver (staatuskood %(code)s)", - "Could not connect to Identity Server": "Ei saanud ühendust isikutuvastusserveriga", + "Identity server URL must be HTTPS": "Isikutuvastusserveri URL peab kasutama HTTPS-protokolli", + "Not a valid identity server (status code %(code)s)": "See ei ole sobilik isikutuvastusserver (staatuskood %(code)s)", + "Could not connect to identity server": "Ei saanud ühendust isikutuvastusserveriga", "Checking server": "Kontrollin serverit", "Change identity server": "Muuda isikutuvastusserverit", "Disconnect from the identity server and connect to instead?": "Kas katkestame ühenduse isikutuvastusserveriga ning selle asemel loome uue ühenduse serveriga ?", @@ -1468,7 +1468,7 @@ "Disconnect anyway": "Ikkagi katkesta ühendus", "You are still sharing your personal data on the identity server .": "Sa jätkuvalt jagad oma isikuandmeid isikutuvastusserveriga .", "Go back": "Mine tagasi", - "Identity Server (%(server)s)": "Isikutuvastusserver %(server)s", + "Identity server (%(server)s)": "Isikutuvastusserver %(server)s", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Sinu serveri haldur on lülitanud läbiva krüptimise omavahelistes jututubades ja otsesõnumites välja.", "This room has been replaced and is no longer active.": "See jututuba on asendatud teise jututoaga ning ei ole enam kasutusel.", "You do not have permission to post to this room": "Sul ei ole õigusi siia jututuppa kirjutamiseks", @@ -1849,7 +1849,7 @@ "%(brand)s version:": "%(brand)s'i versioon:", "olm version:": "olm'i versioon:", "Homeserver is": "Koduserver on", - "Identity Server is": "Isikutuvastusserver on", + "Identity server is": "Isikutuvastusserver on", "Access Token:": "Pääsuluba:", "click to reveal": "kuvamiseks klõpsi siin", "Labs": "Katsed", @@ -2273,7 +2273,7 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Sa võib-olla oled seadistanud nad %(brand)s'ist erinevas kliendis. Sa küll ei saa neid %(brand)s'is muuta, kuid nad kehtivad siiski.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Sa hetkel kasutad serverit, et olla leitav ja ise leida sinule teadaolevaid inimesi. Alljärgnevalt saad sa muuta oma isikutuvastusserverit.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Kui sa ei soovi kasutada serverit, et olla leitav ja ise leida sinule teadaolevaid inimesi, siis sisesta alljärgnevalt mõni teine isikutuvastusserver.", - "Identity Server": "Isikutuvastusserver", + "Identity server": "Isikutuvastusserver", "Do not use an identity server": "Ära kasuta isikutuvastusserverit", "Enter a new identity server": "Sisesta uue isikutuvastusserveri nimi", "Change": "Muuda", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 2740ea2079..3789155349 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -93,7 +93,7 @@ "Guests cannot join this room even if explicitly invited.": "Bisitariak ezin dira gela honetara elkartu ez bazaie zuzenean gonbidatu.", "Hangup": "Eseki", "Homeserver is": "Hasiera zerbitzaria:", - "Identity Server is": "Identitate zerbitzaria:", + "Identity server is": "Identitate zerbitzaria:", "Moderator": "Moderatzailea", "Account": "Kontua", "Access Token:": "Sarbide tokena:", @@ -1062,7 +1062,7 @@ "Confirm": "Berretsi", "Other servers": "Beste zerbitzariak", "Homeserver URL": "Hasiera-zerbitzariaren URLa", - "Identity Server URL": "Identitate zerbitzariaren URLa", + "Identity server URL": "Identitate zerbitzariaren URLa", "Free": "Dohan", "Join millions for free on the largest public server": "Elkartu milioika pertsonekin dohain hasiera zerbitzari publiko handienean", "Other": "Beste bat", @@ -1393,7 +1393,7 @@ "Failed to re-authenticate": "Berriro autentifikatzean huts egin du", "Enter your password to sign in and regain access to your account.": "Sartu zure pasahitza saioa hasteko eta berreskuratu zure kontura sarbidea.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Ezin duzu zure kontuan saioa hasi. Jarri kontaktuan zure hasiera zerbitzariko administratzailearekin informazio gehiagorako.", - "Identity Server": "Identitate zerbitzaria", + "Identity server": "Identitate zerbitzaria", "Find others by phone or email": "Aurkitu besteak telefonoa edo e-maila erabiliz", "Be found by phone or email": "Izan telefonoa edo e-maila erabiliz aurkigarria", "Use bots, bridges, widgets and sticker packs": "Erabili botak, zubiak, trepetak eta eranskailu multzoak", @@ -1408,13 +1408,13 @@ "Actions": "Ekintzak", "Displays list of commands with usages and descriptions": "Aginduen zerrenda bistaratzen du, erabilera eta deskripzioekin", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Baimendu turn.matrix.org deien laguntzarako zerbitzaria erabiltzea zure hasiera-zerbitzariak bat eskaintzen ez duenean (Zure IP helbidea partekatuko da deian zehar)", - "Identity Server URL must be HTTPS": "Identitate zerbitzariaren URL-a HTTPS motakoa izan behar du", - "Not a valid Identity Server (status code %(code)s)": "Ez da identitate zerbitzari baliogarria (egoera-mezua %(code)s)", - "Could not connect to Identity Server": "Ezin izan da identitate-zerbitzarira konektatu", + "Identity server URL must be HTTPS": "Identitate zerbitzariaren URL-a HTTPS motakoa izan behar du", + "Not a valid identity server (status code %(code)s)": "Ez da identitate zerbitzari baliogarria (egoera-mezua %(code)s)", + "Could not connect to identity server": "Ezin izan da identitate-zerbitzarira konektatu", "Checking server": "Zerbitzaria egiaztatzen", "Disconnect from the identity server ?": "Deskonektatu identitate-zerbitzaritik?", "Disconnect": "Deskonektatu", - "Identity Server (%(server)s)": "Identitate-zerbitzaria (%(server)s)", + "Identity server (%(server)s)": "Identitate-zerbitzaria (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": " erabiltzen ari zara kontaktua aurkitzeko eta aurkigarria izateko. Zure identitate-zerbitzaria aldatu dezakezu azpian.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Orain ez duzu identitate-zerbitzaririk erabiltzen. Kontaktuak aurkitzeko eta aurkigarria izateko, gehitu bat azpian.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Zure identitate-zerbitzaritik deskonektatzean ez zara beste erabiltzaileentzat aurkigarria izango eta ezin izango dituzu besteak gonbidatu e-mail helbidea edo telefono zenbakia erabiliz.", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 46dde79945..bb147b5a20 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -1886,10 +1886,10 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "استفاده از سرور هویت‌سنجی اختیاری است. اگر تصمیم بگیرید از سرور هویت‌سنجی استفاده نکنید، شما با استفاده از آدرس ایمیل و شماره تلفن قابل یافته‌شدن و دعوت‌شدن توسط سایر کاربران نخواهید بود.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "قطع ارتباط با سرور هویت‌سنجی به این معناست که شما از طریق ادرس ایمیل و شماره تلفن، بیش از این قابل یافته‌شدن و دعوت‌شدن توسط کاربران دیگر نیستید.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "در حال حاضر از سرور هویت‌سنجی استفاده نمی‌کنید. برای یافتن و یافته‌شدن توسط مخاطبان موجود که شما آن‌ها را می‌شناسید، یک مورد در پایین اضافه کنید.", - "Identity Server": "سرور هویت‌سنجی", + "Identity server": "سرور هویت‌سنجی", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "اگر تمایل به استفاده از برای یافتن و یافته‌شدن توسط مخاطبان خود را ندارید، سرور هویت‌سنجی دیگری را در پایین وارد کنید.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "در حال حاضر شما از برای یافتن و یافته‌شدن توسط مخاطبانی که می‌شناسید، استفاده می‌کنید. می‌توانید سرور هویت‌سنجی خود را در زیر تغییر دهید.", - "Identity Server (%(server)s)": "سرور هویت‌سنجی (%(server)s)", + "Identity server (%(server)s)": "سرور هویت‌سنجی (%(server)s)", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "توصیه می‌کنیم آدرس‌های ایمیل و شماره تلفن‌های خود را پیش از قطع ارتباط با سرور هویت‌سنجی از روی آن پاک کنید.", "You are still sharing your personal data on the identity server .": "شما هم‌چنان داده‌های شخصی خودتان را بر روی سرور هویت‌سنجی به اشتراک می‌گذارید.", "Disconnect anyway": "در هر صورت قطع کن", @@ -1906,9 +1906,9 @@ "Disconnect from the identity server and connect to instead?": "ارتباط با سرور هویت‌سنجی قطع شده و در عوض به متصل شوید؟", "Change identity server": "تغییر سرور هویت‌سنجی", "Checking server": "در حال بررسی سرور", - "Could not connect to Identity Server": "اتصال به سرور هیوت‌سنجی امکان پذیر نیست", - "Not a valid Identity Server (status code %(code)s)": "سرور هویت‌سنجی معتبر نیست (کد وضعیت %(code)s)", - "Identity Server URL must be HTTPS": "پروتکل آدرس سرور هویت‌سنجی باید HTTPS باشد", + "Could not connect to identity server": "اتصال به سرور هیوت‌سنجی امکان پذیر نیست", + "Not a valid identity server (status code %(code)s)": "سرور هویت‌سنجی معتبر نیست (کد وضعیت %(code)s)", + "Identity server URL must be HTTPS": "پروتکل آدرس سرور هویت‌سنجی باید HTTPS باشد", "not ready": "آماده نیست", "ready": "آماده", "Secret storage:": "حافظه نهان:", @@ -2761,7 +2761,7 @@ "Copy": "رونوشت", "Your access token gives full access to your account. Do not share it with anyone.": "توکن دسترسی شما، دسترسی کامل به حساب کاربری شما را میسر می‌سازد. لطفا آن را در اختیار فرد دیگری قرار ندهید.", "Access Token": "توکن دسترسی", - "Identity Server is": "سرور هویت‌سنجی شما عبارت است از", + "Identity server is": "سرور هویت‌سنجی شما عبارت است از", "Homeserver is": "سرور ما عبارت است از", "olm version:": "نسخه‌ی olm:", "Versions": "نسخه‌ها", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 23140846b3..a9a3b80fb8 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -112,7 +112,7 @@ "Forget room": "Unohda huone", "For security, this session has been signed out. Please sign in again.": "Turvallisuussyistä tämä istunto on kirjattu ulos. Ole hyvä ja kirjaudu uudestaan.", "Homeserver is": "Kotipalvelin on", - "Identity Server is": "Identiteettipalvelin on", + "Identity server is": "Identiteettipalvelin on", "I have verified my email address": "Olen varmistanut sähköpostiosoitteeni", "Import": "Tuo", "Import E2E room keys": "Tuo olemassaolevat osapuolten välisen salauksen huoneavaimet", @@ -903,7 +903,7 @@ "Join this community": "Liity tähän yhteisöön", "Leave this community": "Poistu tästä yhteisöstä", "Couldn't load page": "Sivun lataaminen ei onnistunut", - "Identity Server URL": "Identiteettipalvelimen osoite", + "Identity server URL": "Identiteettipalvelimen osoite", "Homeserver URL": "Kotipalvelimen osoite", "Email (optional)": "Sähköposti (valinnainen)", "Phone (optional)": "Puhelin (valinnainen)", @@ -1391,7 +1391,7 @@ "Sign in and regain access to your account.": "Kirjaudu ja pääse takaisin tilillesi.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Et voi kirjautua tilillesi. Ota yhteyttä kotipalvelimesi ylläpitäjään saadaksesi lisätietoja.", "Clear personal data": "Poista henkilökohtaiset tiedot", - "Identity Server": "Identiteettipalvelin", + "Identity server": "Identiteettipalvelin", "Find others by phone or email": "Löydä muita käyttäjiä puhelimen tai sähköpostin perusteella", "Be found by phone or email": "Varmista, että sinut löydetään puhelimen tai sähköpostin perusteella", "Use bots, bridges, widgets and sticker packs": "Käytä botteja, siltoja, sovelmia ja tarrapaketteja", @@ -1407,13 +1407,13 @@ "Share": "Jaa", "Unable to share phone number": "Puhelinnumeroa ei voi jakaa", "No identity server is configured: add one in server settings to reset your password.": "Identiteettipalvelinta ei ole määritetty: lisää se palvelinasetuksissa, jotta voi palauttaa salasanasi.", - "Identity Server URL must be HTTPS": "Identiteettipalvelimen URL-osoitteen täytyy olla HTTPS-alkuinen", - "Not a valid Identity Server (status code %(code)s)": "Ei kelvollinen identiteettipalvelin (tilakoodi %(code)s)", - "Could not connect to Identity Server": "Identiteettipalvelimeen ei saatu yhteyttä", + "Identity server URL must be HTTPS": "Identiteettipalvelimen URL-osoitteen täytyy olla HTTPS-alkuinen", + "Not a valid identity server (status code %(code)s)": "Ei kelvollinen identiteettipalvelin (tilakoodi %(code)s)", + "Could not connect to identity server": "Identiteettipalvelimeen ei saatu yhteyttä", "Checking server": "Tarkistetaan palvelinta", "Disconnect from the identity server ?": "Katkaise yhteys identiteettipalvelimeen ?", "Disconnect": "Katkaise yhteys", - "Identity Server (%(server)s)": "Identiteettipalvelin (%(server)s)", + "Identity server (%(server)s)": "Identiteettipalvelin (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Käytät palvelinta tuntemiesi henkilöiden löytämiseen ja löydetyksi tulemiseen. Voit vaihtaa identiteettipalvelintasi alla.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Et käytä tällä hetkellä identiteettipalvelinta. Lisää identiteettipalvelin alle löytääksesi tuntemiasi henkilöitä ja tullaksesi löydetyksi.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Yhteyden katkaiseminen identiteettipalvelimeesi tarkoittaa, että muut käyttäjät eivät löydä sinua etkä voi kutsua muita sähköpostin tai puhelinnumeron perusteella.", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 16373f0853..9584af113a 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -87,7 +87,7 @@ "Hangup": "Raccrocher", "Historical": "Historique", "Homeserver is": "Le serveur d’accueil est", - "Identity Server is": "Le serveur d’identité est", + "Identity server is": "Le serveur d’identité est", "I have verified my email address": "J’ai vérifié mon adresse e-mail", "Import E2E room keys": "Importer les clés de chiffrement de bout en bout", "Incorrect verification code": "Code de vérification incorrect", @@ -1068,7 +1068,7 @@ "Confirm": "Confirmer", "Other servers": "Autres serveurs", "Homeserver URL": "URL du serveur d'accueil", - "Identity Server URL": "URL du serveur d'identité", + "Identity server URL": "URL du serveur d'identité", "Free": "Gratuit", "Join millions for free on the largest public server": "Rejoignez des millions d’utilisateurs gratuitement sur le plus grand serveur public", "Premium": "Premium", @@ -1395,7 +1395,7 @@ "Sign in and regain access to your account.": "Connectez-vous et ré-accédez à votre compte.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Vous ne pouvez pas vous connecter à votre compte. Contactez l’administrateur de votre serveur d’accueil pour plus d’informations.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Dites-nous ce qui s’est mal passé ou, encore mieux, créez un rapport d’erreur sur GitHub qui décrit le problème.", - "Identity Server": "Serveur d’identité", + "Identity server": "Serveur d’identité", "Find others by phone or email": "Trouver d’autres personnes par téléphone ou e-mail", "Be found by phone or email": "Être trouvé par téléphone ou e-mail", "Use bots, bridges, widgets and sticker packs": "Utiliser des robots, des passerelles, des widgets ou des jeux d’autocollants", @@ -1421,13 +1421,13 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Un SMS a été envoyé à +%(msisdn)s. Saisissez le code de vérification qu’il contient.", "Command Help": "Aide aux commandes", "No identity server is configured: add one in server settings to reset your password.": "Aucun serveur d’identité n’est configuré : ajoutez-en un dans les paramètres du serveur pour réinitialiser votre mot de passe.", - "Identity Server URL must be HTTPS": "L’URL du serveur d’identité doit être en HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Serveur d’identité non valide (code de statut %(code)s)", - "Could not connect to Identity Server": "Impossible de se connecter au serveur d’identité", + "Identity server URL must be HTTPS": "L’URL du serveur d’identité doit être en HTTPS", + "Not a valid identity server (status code %(code)s)": "Serveur d’identité non valide (code de statut %(code)s)", + "Could not connect to identity server": "Impossible de se connecter au serveur d’identité", "Checking server": "Vérification du serveur", "Disconnect from the identity server ?": "Se déconnecter du serveur d’identité  ?", "Disconnect": "Se déconnecter", - "Identity Server (%(server)s)": "Serveur d’identité (%(server)s)", + "Identity server (%(server)s)": "Serveur d’identité (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Vous utilisez actuellement pour découvrir et être découvert par des contacts existants que vous connaissez. Vous pouvez changer votre serveur d’identité ci-dessous.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvert par les contacts existants que vous connaissez, ajoutez-en un ci-dessous.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La déconnexion de votre serveur d’identité signifie que vous ne serez plus découvrable par d’autres utilisateurs et que vous ne pourrez plus faire d’invitation par e-mail ou téléphone.", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index b880c5b548..04ab9013a2 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -569,7 +569,7 @@ "Access Token:": "Testemuño de acceso:", "click to reveal": "Preme para mostrar", "Homeserver is": "O servidor de inicio é", - "Identity Server is": "O servidor de identidade é", + "Identity server is": "O servidor de identidade é", "%(brand)s version:": "versión %(brand)s:", "olm version:": "versión olm:", "Failed to send email": "Fallo ao enviar correo electrónico", @@ -1393,9 +1393,9 @@ "Upgrade to your own domain": "Mellora e usa un dominio propio", "Display Name": "Nome mostrado", "Profile picture": "Imaxe de perfil", - "Identity Server URL must be HTTPS": "O URL do servidor de identidade debe comezar HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Servidor de Identidade non válido (código de estado %(code)s)", - "Could not connect to Identity Server": "Non hai conexión co Servidor de Identidade", + "Identity server URL must be HTTPS": "O URL do servidor de identidade debe comezar HTTPS", + "Not a valid identity server (status code %(code)s)": "Servidor de Identidade non válido (código de estado %(code)s)", + "Could not connect to identity server": "Non hai conexión co Servidor de Identidade", "Checking server": "Comprobando servidor", "Change identity server": "Cambiar de servidor de identidade", "Disconnect from the identity server and connect to instead?": "Desconectar do servidor de identidade e conectar con ?", @@ -1413,10 +1413,10 @@ "You are still sharing your personal data on the identity server .": "Aínda estás compartindo datos personais no servidor de identidade .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Recomendámosche que elimines os teus enderezos de email e números de teléfono do servidor de identidade antes de desconectar del.", "Go back": "Atrás", - "Identity Server (%(server)s)": "Servidor de Identidade (%(server)s)", + "Identity server (%(server)s)": "Servidor de Identidade (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Neste intre usas para atopar e ser atopado polos contactos existentes que coñeces. Aquí abaixo podes cambiar de servidor de identidade.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se non queres usar para atopar e ser atopado polos contactos existentes que coñeces, escribe embaixo outro servidor de identidade.", - "Identity Server": "Servidor de Identidade", + "Identity server": "Servidor de Identidade", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Non estás a usar un servidor de identidade. Para atopar e ser atopado polos contactos existentes que coñeces, engade un embaixo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ao desconectar do teu servidor de identidade non te poderán atopar as outras usuarias e non poderás convidar a outras polo seu email ou teléfono.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar un servidor de identidade é optativo. Se escolles non usar un, non poderás ser atopado por outras usuarias e non poderás convidar a outras polo seu email ou teléfono.", @@ -2072,7 +2072,7 @@ "Enter your custom homeserver URL What does this mean?": "Escribe o URL do servidor personalizado ¿Qué significa esto?", "Homeserver URL": "URL do servidor", "Enter your custom identity server URL What does this mean?": "Escribe o URL do servidor de identidade personalizado ¿Que significa esto?", - "Identity Server URL": "URL do servidor de identidade", + "Identity server URL": "URL do servidor de identidade", "Other servers": "Outros servidores", "Free": "Gratuíto", "Premium": "Premium", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 5baa1d7c67..4f4a83108d 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1948,7 +1948,7 @@ "Clear cache and reload": "נקה מטמון ואתחל", "click to reveal": "לחץ בשביל לחשוף", "Access Token:": "אסימון גישה:", - "Identity Server is": "שרת ההזדהות הינו", + "Identity server is": "שרת ההזדהות הינו", "Homeserver is": "שרת הבית הינו", "olm version:": "גרסת OLM:", "%(brand)s version:": "גרסאת %(brand)s:", @@ -2009,10 +2009,10 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "השימוש בשרת זהות הוא אופציונלי. אם תבחר לא להשתמש בשרת זהות, משתמשים אחרים לא יוכלו לגלות ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ההתנתקות משרת הזהות שלך פירושה שלא תגלה משתמשים אחרים ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "אינך משתמש כרגע בשרת זהות. כדי לגלות ולהיות נגלים על ידי אנשי קשר קיימים שאתה מכיר, הוסף אחד למטה.", - "Identity Server": "שרת הזדהות", + "Identity server": "שרת הזדהות", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "אם אינך רוצה להשתמש ב- כדי לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר, הזן שרת זהות אחר למטה.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "אתה משתמש כרגע ב די לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר. תוכל לשנות את שרת הזהות שלך למטה.", - "Identity Server (%(server)s)": "שרת הזדהות (%(server)s)", + "Identity server (%(server)s)": "שרת הזדהות (%(server)s)", "Go back": "חזרה", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "אנו ממליצים שתסיר את כתובות הדוא\"ל ומספרי הטלפון שלך משרת הזהות לפני שתתנתק.", "You are still sharing your personal data on the identity server .": "אתה עדיין משתף את הנתונים האישיים שלך בשרת הזהות .", @@ -2030,9 +2030,9 @@ "Disconnect from the identity server and connect to instead?": "התנתק משרת זיהוי עכשווי והתחבר אל במקום?", "Change identity server": "שנה כתובת של שרת הזיהוי", "Checking server": "בודק שרת", - "Could not connect to Identity Server": "לא ניתן להתחבר אל שרת הזיהוי", - "Not a valid Identity Server (status code %(code)s)": "שרת זיהוי לא מאושר(קוד סטטוס %(code)s)", - "Identity Server URL must be HTTPS": "הזיהוי של כתובת השרת חייבת להיות מאובטחת ב- HTTPS", + "Could not connect to identity server": "לא ניתן להתחבר אל שרת הזיהוי", + "Not a valid identity server (status code %(code)s)": "שרת זיהוי לא מאושר(קוד סטטוס %(code)s)", + "Identity server URL must be HTTPS": "הזיהוי של כתובת השרת חייבת להיות מאובטחת ב- HTTPS", "not ready": "לא מוכן", "ready": "מוכן", "Secret storage:": "אחסון סודי:", diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json index f71c024342..853b5662f2 100644 --- a/src/i18n/strings/hi.json +++ b/src/i18n/strings/hi.json @@ -534,7 +534,7 @@ "Versions": "संस्करण", "olm version:": "olm संस्करण:", "Homeserver is": "होमेसेर्वेर हैं", - "Identity Server is": "आइडेंटिटी सर्वर हैं", + "Identity server is": "आइडेंटिटी सर्वर हैं", "Access Token:": "एक्सेस टोकन:", "click to reveal": "देखने की लिए क्लिक करें", "Labs": "लैब्स", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index cb749f12a5..cd99b7750a 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -129,7 +129,7 @@ "Historical": "Archív", "Home": "Kezdőlap", "Homeserver is": "Matrix-kiszolgáló:", - "Identity Server is": "Azonosítási kiszolgáló:", + "Identity server is": "Azonosítási kiszolgáló:", "I have verified my email address": "Ellenőriztem az e-mail címemet", "Import": "Betöltés", "Import E2E room keys": "E2E szoba kulcsok betöltése", @@ -1067,7 +1067,7 @@ "Confirm": "Megerősítés", "Other servers": "Más szerverek", "Homeserver URL": "Matrixszerver URL", - "Identity Server URL": "Azonosítási Szerver URL", + "Identity server URL": "Azonosítási Szerver URL", "Free": "Szabad", "Join millions for free on the largest public server": "Csatlakozzon több millió felhasználóhoz ingyen a legnagyobb nyilvános szerveren", "Premium": "Prémium", @@ -1395,7 +1395,7 @@ "You're signed out": "Kijelentkeztél", "Clear personal data": "Személyes adatok törlése", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Kérlek mond el nekünk mi az ami nem működött, vagy még jobb, ha egy GitHub jegyben leírod a problémát.", - "Identity Server": "Azonosítási szerver", + "Identity server": "Azonosítási szerver", "Find others by phone or email": "Keress meg másokat telefonszám vagy e-mail cím alapján", "Be found by phone or email": "Legyél megtalálható telefonszámmal vagy e-mail címmel", "Use bots, bridges, widgets and sticker packs": "Használj botokoat, hidakat, kisalkalmazásokat és matricákat", @@ -1413,9 +1413,9 @@ "Accept to continue:": " elfogadása a továbblépéshez:", "ID": "Azonosító", "Public Name": "Nyilvános név", - "Identity Server URL must be HTTPS": "Az Azonosítási Szerver URL-jének HTTPS-nek kell lennie", - "Not a valid Identity Server (status code %(code)s)": "Az Azonosítási Szerver nem érvényes (státusz kód: %(code)s)", - "Could not connect to Identity Server": "Az Azonosítási Szerverhez nem lehet csatlakozni", + "Identity server URL must be HTTPS": "Az Azonosítási Szerver URL-jének HTTPS-nek kell lennie", + "Not a valid identity server (status code %(code)s)": "Az Azonosítási Szerver nem érvényes (státusz kód: %(code)s)", + "Could not connect to identity server": "Az Azonosítási Szerverhez nem lehet csatlakozni", "Checking server": "Szerver ellenőrzése", "Terms of service not accepted or the identity server is invalid.": "A felhasználási feltételek nincsenek elfogadva vagy az azonosítási szerver nem érvényes.", "Identity server has no terms of service": "Az azonosítási kiszolgálónak nincsenek felhasználási feltételei", @@ -1423,7 +1423,7 @@ "Only continue if you trust the owner of the server.": "Csak akkor lépj tovább, ha megbízol a kiszolgáló tulajdonosában.", "Disconnect from the identity server ?": "Bontod a kapcsolatot ezzel az azonosítási szerverrel: ?", "Disconnect": "Kapcsolat bontása", - "Identity Server (%(server)s)": "Azonosítási kiszolgáló (%(server)s)", + "Identity server (%(server)s)": "Azonosítási kiszolgáló (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "A kapcsolatok kereséséhez és hogy megtalálják az ismerősei, ezt a kiszolgálót használja: . A használt azonosítási kiszolgálót alább tudja megváltoztatni.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Jelenleg nem használsz azonosítási szervert. Ahhoz, hogy e-mail cím, vagy egyéb azonosító alapján megtalálhassanak az ismerőseid, vagy te megtalálhasd őket, be kell állítanod egy azonosítási szervert.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ha az azonosítási szerverrel bontod a kapcsolatot az azt fogja eredményezni, hogy más felhasználók nem találnak rád és nem tudsz másokat meghívni e-mail cím vagy telefonszám alapján.", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index e8718c941a..1546e97aa9 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -335,7 +335,7 @@ "Account": "Notandaaðgangur", "Access Token:": "Aðgangsteikn:", "click to reveal": "smelltu til að birta", - "Identity Server is": "Auðkennisþjónn er", + "Identity server is": "Auðkennisþjónn er", "%(brand)s version:": "Útgáfa %(brand)s:", "olm version:": "Útgáfa olm:", "Failed to send email": "Mistókst að senda tölvupóst", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 3b33c4227c..fe7e53d8c5 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -589,7 +589,7 @@ "Profile": "Profilo", "click to reveal": "clicca per mostrare", "Homeserver is": "L'homeserver è", - "Identity Server is": "Il server di identità è", + "Identity server is": "Il server di identità è", "%(brand)s version:": "versione %(brand)s:", "olm version:": "versione olm:", "Failed to send email": "Invio dell'email fallito", @@ -1202,7 +1202,7 @@ "Confirm": "Conferma", "Other servers": "Altri server", "Homeserver URL": "URL homeserver", - "Identity Server URL": "URL server identità", + "Identity server URL": "URL server identità", "Free": "Gratuito", "Join millions for free on the largest public server": "Unisciti gratis a milioni nel più grande server pubblico", "Premium": "Premium", @@ -1395,7 +1395,7 @@ "Sign in and regain access to your account.": "Accedi ed ottieni l'accesso al tuo account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Non puoi accedere al tuo account. Contatta l'admin del tuo homeserver per maggiori informazioni.", "Clear personal data": "Elimina dati personali", - "Identity Server": "Server identità", + "Identity server": "Server identità", "Find others by phone or email": "Trova altri per telefono o email", "Be found by phone or email": "Trovato per telefono o email", "Use bots, bridges, widgets and sticker packs": "Usa bot, bridge, widget e pacchetti di adesivi", @@ -1410,13 +1410,13 @@ "Actions": "Azioni", "Displays list of commands with usages and descriptions": "Visualizza l'elenco dei comandi con usi e descrizioni", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Consenti al server di assistenza alle chiamate di fallback turn.matrix.org quando il tuo homeserver non ne offre uno (il tuo indirizzo IP verrà condiviso durante una chiamata)", - "Identity Server URL must be HTTPS": "L'URL di Identita' Server deve essere HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Non è un server di identità valido (codice di stato %(code)s)", - "Could not connect to Identity Server": "Impossibile connettersi al server di identità", + "Identity server URL must be HTTPS": "L'URL di Identita' Server deve essere HTTPS", + "Not a valid Identity server (status code %(code)s)": "Non è un server di identità valido (codice di stato %(code)s)", + "Could not connect to identity server": "Impossibile connettersi al server di identità", "Checking server": "Controllo del server", "Disconnect from the identity server ?": "Disconnettere dal server di identità ?", "Disconnect": "Disconnetti", - "Identity Server (%(server)s)": "Server di identità (%(server)s)", + "Identity server (%(server)s)": "Server di identità (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Stai attualmente usando per trovare ed essere trovabile dai contatti esistenti che conosci. Puoi cambiare il tuo server di identità sotto.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Attualmente non stai usando un server di identità. Per trovare ed essere trovabile dai contatti esistenti che conosci, aggiungine uno sotto.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La disconnessione dal tuo server di identità significa che non sarai trovabile da altri utenti e non potrai invitare nessuno per email o telefono.", @@ -1476,11 +1476,11 @@ "This invite to %(roomName)s was sent to %(email)s": "Questo invito per %(roomName)s è stato inviato a %(email)s", "Use an identity server in Settings to receive invites directly in %(brand)s.": "Usa un server di identià nelle impostazioni per ricevere inviti direttamente in %(brand)s.", "Share this email in Settings to receive invites directly in %(brand)s.": "Condividi questa email nelle impostazioni per ricevere inviti direttamente in %(brand)s.", - "Change identity server": "Cambia Identity Server", - "Disconnect from the identity server and connect to instead?": "Disconnettersi dall'Identity Server e connettesi invece a ?", - "Disconnect identity server": "Disconnetti dall'Identity Server", - "You are still sharing your personal data on the identity server .": "Stai ancora fornendo le tue informazioni personali sull'Identity Server .", - "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ti suggeriamo di rimuovere il tuo indirizzo email e numero di telefono dall'Identity Server prima di disconnetterti.", + "Change identity server": "Cambia identity server", + "Disconnect from the identity server and connect to instead?": "Disconnettersi dall'identity server e connettesi invece a ?", + "Disconnect identity server": "Disconnetti dall'identity server", + "You are still sharing your personal data on the identity server .": "Stai ancora fornendo le tue informazioni personali sull'identity server .", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ti suggeriamo di rimuovere il tuo indirizzo email e numero di telefono dall'identity server prima di disconnetterti.", "Disconnect anyway": "Disconnetti comunque", "Error changing power level requirement": "Errore nella modifica del livello dei permessi", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "C'é stato un errore nel cambio di libelli dei permessi. Assicurati di avere i permessi necessari e riprova.", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 180d63f33e..18d97d91c1 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -826,7 +826,7 @@ "Access Token:": "アクセストークン:", "click to reveal": "クリックすると表示されます", "Homeserver is": "ホームサーバー:", - "Identity Server is": "ID サーバー:", + "Identity server is": "ID サーバー:", "%(brand)s version:": "%(brand)s のバージョン:", "olm version:": "olm のバージョン:", "Failed to send email": "メールを送信できませんでした", @@ -1668,10 +1668,10 @@ "Size must be a number": "サイズには数値を指定してください", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "identity サーバーから切断すると、連絡先を使ってユーザを見つけたり見つけられたり招待したりできなくなります。", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "現在 identity サーバーを使用していません。連絡先を使ってユーザを見つけたり見つけられたりするには identity サーバーを以下に追加します。", - "Identity Server": "identity サーバー", + "Identity server": "identity サーバー", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "連絡先の検出に ではなく他の identity サーバーを使いたい場合は以下に指定してください。", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "現在 を使用して、連絡先を検出可能にしています。以下で identity サーバーを変更できます。", - "Identity Server (%(server)s)": "identity サーバー (%(server)s)", + "Identity server (%(server)s)": "identity サーバー (%(server)s)", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "切断する前に、identity サーバーからメールアドレスと電話番号を削除することをお勧めします。", "You are still sharing your personal data on the identity server .": "まだ identity サーバー 個人データを共有しています。", "Disconnect anyway": "とにかく切断します", @@ -1688,9 +1688,9 @@ "Disconnect from the identity server and connect to instead?": "identity サーバー から切断して に接続しますか?", "Change identity server": "identity サーバーを変更する", "Checking server": "サーバーをチェックしています", - "Could not connect to Identity Server": "identity サーバーに接続できませんでした", - "Not a valid Identity Server (status code %(code)s)": "有効な identity サーバーではありません (ステータスコード %(code)s)", - "Identity Server URL must be HTTPS": "identityサーバーのURLは HTTPS スキーマである必要があります", + "Could not connect to identity server": "identity サーバーに接続できませんでした", + "Not a valid identity server (status code %(code)s)": "有効な identity サーバーではありません (ステータスコード %(code)s)", + "Identity server URL must be HTTPS": "identityサーバーのURLは HTTPS スキーマである必要があります", "not ready": "準備ができていない", "ready": "準備ができました", "unexpected type": "unexpected type", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index b6e1b3020f..677fc30b2a 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1608,7 +1608,7 @@ "Discovery": "Tagrut", "Help & About": "Tallalt & Ɣef", "Homeserver is": "Aqeddac agejdan d", - "Identity Server is": "Aqeddac n timagit d", + "Identity server is": "Aqeddac n timagit d", "Access Token:": "Ajuṭu n unekcum:", "click to reveal": "sit i ubeggen", "Labs": "Tinarimin", @@ -1821,8 +1821,8 @@ "Enable inline URL previews by default": "Rmed tiskanin n URL srid s wudem amezwer", "Enable URL previews for this room (only affects you)": "Rmed tiskanin n URL i texxamt-a (i ak·akem-yeɛnan kan)", "Enable widget screenshots on supported widgets": "Rmed tuṭṭfiwin n ugdil n uwiǧit deg yiwiǧiten yettwasferken", - "Identity Server (%(server)s)": "Aqeddac n timagit (%(server)s)", - "Identity Server": "Aqeddac n timagit", + "Identity server (%(server)s)": "Aqeddac n timagit (%(server)s)", + "Identity server": "Aqeddac n timagit", "Enter a new identity server": "Sekcem aqeddac n timagit amaynut", "No update available.": "Ulac lqem i yellan.", "Hey you. You're the best!": "Kečč·kemm. Ulac win i ak·akem-yifen!", @@ -1931,7 +1931,7 @@ "Please review and accept the policies of this homeserver:": "Ttxil-k·m senqed syen qbel tisertiyin n uqeddac-a agejdan:", "An email has been sent to %(emailAddress)s": "Yettwazen yimayl ɣer %(emailAddress)s", "Token incorrect": "Ajuṭu d arameɣtu", - "Identity Server URL": "URL n uqeddac n timagit", + "Identity server URL": "URL n uqeddac n timagit", "Other servers": "Iqeddacen wiya", "Sign in to your Matrix account on %(serverName)s": "Qqen ɣer umiḍan-ik·im n Matrix deg %(serverName)s", "Sorry, your browser is not able to run %(brand)s.": "Suref-aɣ, iminig-ik·im ur yezmir ara ad iseddu %(brand)s.", @@ -1970,9 +1970,9 @@ "There are advanced notifications which are not shown here.": "Llan yilɣa leqqayen ur d-nettwaskan ara da.", "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Ahat tsewleḍ-ten deg yimsaɣ-nniḍen mačči deg %(brand)s. Ur tezmireḍ ara ad ten-tṣeggmeḍ deg %(brand)s maca mazal-iten teddun.", "Show message in desktop notification": "Sken-d iznan deg yilɣa n tnarit", - "Identity Server URL must be HTTPS": "URL n uqeddac n timagit ilaq ad yili d HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Aqeddac n timagit mačči d ameɣtu (status code %(code)s)", - "Could not connect to Identity Server": "Ur izmir ara ad yeqqen ɣer uqeddac n timagit", + "Identity server URL must be HTTPS": "URL n uqeddac n timagit ilaq ad yili d HTTPS", + "Not a valid identity server (status code %(code)s)": "Aqeddac n timagit mačči d ameɣtu (status code %(code)s)", + "Could not connect to identity server": "Ur izmir ara ad yeqqen ɣer uqeddac n timagit", "Disconnect from the identity server and connect to instead?": "Ffeɣ seg tuqqna n uqeddac n timagit syen qqen ɣer deg wadeg-is?", "Terms of service not accepted or the identity server is invalid.": "Tiwtilin n uqeddac ur ttwaqbalent ara neɣ aqeddac n timagit d arameɣtu.", "The identity server you have chosen does not have any terms of service.": "Aqeddac n timagit i tferneḍ ulac akk ɣer-s tiwtilin n uqeddac.", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index f817dbc26b..570d76188a 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -130,7 +130,7 @@ "Historical": "기록", "Home": "홈", "Homeserver is": "홈서버:", - "Identity Server is": "ID 서버:", + "Identity server is": "ID 서버:", "I have verified my email address": "이메일 주소를 인증했습니다", "Import": "가져오기", "Import E2E room keys": "종단간 암호화 방 키 불러오기", @@ -1060,9 +1060,9 @@ "Profile picture": "프로필 사진", "Upgrade to your own domain": "자체 도메인을 업그레이드하기", "Display Name": "표시 이름", - "Identity Server URL must be HTTPS": "ID 서버 URL은 HTTPS이어야 함", - "Not a valid Identity Server (status code %(code)s)": "올바르지 않은 ID 서버 (상태 코드 %(code)s)", - "Could not connect to Identity Server": "ID 서버에 연결할 수 없음", + "Identity server URL must be HTTPS": "ID 서버 URL은 HTTPS이어야 함", + "Not a valid identity server (status code %(code)s)": "올바르지 않은 ID 서버 (상태 코드 %(code)s)", + "Could not connect to identity server": "ID 서버에 연결할 수 없음", "Checking server": "서버 확인 중", "Terms of service not accepted or the identity server is invalid.": "서비스 약관에 동의하지 않거나 ID 서버가 올바르지 않습니다.", "Identity server has no terms of service": "ID 서버에 서비스 약관이 없음", @@ -1070,10 +1070,10 @@ "Only continue if you trust the owner of the server.": "서버의 관리자를 신뢰하는 경우에만 계속하세요.", "Disconnect from the identity server ?": "ID 서버 (으)로부터 연결을 끊겠습니까?", "Disconnect": "연결 끊기", - "Identity Server (%(server)s)": "ID 서버 (%(server)s)", + "Identity server (%(server)s)": "ID 서버 (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "현재 을(를) 사용하여 알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색할 수 있습니다. 아래에서 ID 서버를 변경할 수 있습니다.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색할 수 있는 을(를) 쓰고 싶지 않다면, 아래에 다른 ID 서버를 입력하세요.", - "Identity Server": "ID 서버", + "Identity server": "ID 서버", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "현재 ID 서버를 사용하고 있지 않습니다. 알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색하려면, 아래에 하나를 추가하세요.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID 서버로부터 연결을 끊으면 다른 사용자에게 검색될 수 없고, 이메일과 전화번호로 다른 사람을 초대할 수 없게 됩니다.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID 서버를 사용하는 것은 선택입니다. ID 서버를 사용하지 않는다면, 다른 사용자에게 검색될 수 없고, 이메일과 전화번호로 다른 사람을 초대할 수 없게 됩니다.", @@ -1373,7 +1373,7 @@ "Enter your custom homeserver URL What does this mean?": "맞춤 홈서버 URL을 입력 무엇을 의미하나요?", "Homeserver URL": "홈서버 URL", "Enter your custom identity server URL What does this mean?": "맞춤 ID 서버 URL을 입력 무엇을 의미하나요?", - "Identity Server URL": "ID 서버 URL", + "Identity server URL": "ID 서버 URL", "Other servers": "다른 서버", "Free": "무료", "Join millions for free on the largest public server": "가장 넓은 공개 서버에 수 백 만명이 무료로 등록함", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index e216c2de5a..c4ca9b94d9 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1165,9 +1165,9 @@ "Confirm adding phone number": "Patvirtinkite telefono numerio pridėjimą", "Click the button below to confirm adding this phone number.": "Paspauskite žemiau esantį mygtuką, kad patvirtintumėte šio numerio pridėjimą.", "Match system theme": "Suderinti su sistemos tema", - "Identity Server URL must be HTTPS": "Tapatybės Serverio URL privalo būti HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Netinkamas Tapatybės Serveris (statuso kodas %(code)s)", - "Could not connect to Identity Server": "Nepavyko prisijungti prie Tapatybės Serverio", + "Identity server URL must be HTTPS": "Tapatybės Serverio URL privalo būti HTTPS", + "Not a valid identity server (status code %(code)s)": "Netinkamas Tapatybės Serveris (statuso kodas %(code)s)", + "Could not connect to identity server": "Nepavyko prisijungti prie Tapatybės Serverio", "Disconnect from the identity server and connect to instead?": "Atsijungti nuo tapatybės serverio ir jo vietoje prisijungti prie ?", "Terms of service not accepted or the identity server is invalid.": "Nesutikta su paslaugų teikimo sąlygomis arba tapatybės serveris yra klaidingas.", "The identity server you have chosen does not have any terms of service.": "Jūsų pasirinktas tapatybės serveris neturi jokių paslaugų teikimo sąlygų.", @@ -1177,7 +1177,7 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "patikrinti ar tarp jūsų naršyklės įskiepių nėra nieko kas galėtų blokuoti tapatybės serverį (pavyzdžiui \"Privacy Badger\")", "contact the administrators of identity server ": "susisiekti su tapatybės serverio administratoriais", "You are still sharing your personal data on the identity server .": "Jūs vis dar dalijatės savo asmeniniais duomenimis tapatybės serveryje .", - "Identity Server (%(server)s)": "Tapatybės Serveris (%(server)s)", + "Identity server (%(server)s)": "Tapatybės Serveris (%(server)s)", "Enter a new identity server": "Pridėkite naują tapatybės serverį", "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą (%(serverName)s) botų, valdiklių ir lipdukų pakuočių tvarkymui.", "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą botų, valdiklių ir lipdukų pakuočių tvarkymui.", @@ -1479,12 +1479,12 @@ "Connect this session to Key Backup": "Prijungti šį seansą prie Atsarginės Raktų Kopijos", "Backup key stored: ": "Atsarginės kopijos raktas saugomas: ", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Tam, kad galėtumėte rasti ir tam, kad būtumėte randamas esamų, jums žinomų kontaktų, jūs šiuo metu naudojate tapatybės serverį. Jį pakeisti galite žemiau.", - "Identity Server": "Tapatybės Serveris", + "Identity server": "Tapatybės Serveris", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Šiuo metu jūs nenaudojate tapatybės serverio. Tam, kad galėtumėte rasti ir tam, kad būtumėte randamas esamų, jums žinomų kontaktų, pridėkite jį žemiau.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Atsijungimas nuo tapatybės serverio reikš, kad jūs nebebūsite randamas kitų vartotojų ir jūs nebegalėsite pakviesti kitų, naudodami jų el. paštą arba telefoną.", "Appearance": "Išvaizda", "Deactivate account": "Deaktyvuoti paskyrą", - "Identity Server is": "Tapatybės Serveris yra", + "Identity server is": "Tapatybės Serveris yra", "Timeline": "Laiko juosta", "Key backup": "Atsarginė raktų kopija", "Where you’re logged in": "Kur esate prisijungę", @@ -1494,7 +1494,7 @@ "Unable to validate homeserver/identity server": "Neįmanoma patvirtinti serverio/tapatybės serverio", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nėra sukonfigūruota jokio tapatybės serverio, tad jūs negalite pridėti el. pašto adreso, tam, kad galėtumėte iš naujo nustatyti savo slaptažodį ateityje.", "Enter your custom identity server URL What does this mean?": "Įveskite savo pasirinktinio tapatybės serverio URL Ką tai reiškia?", - "Identity Server URL": "Tapatybės serverio URL", + "Identity server URL": "Tapatybės serverio URL", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Bandyta įkelti konkrečią vietą šio kambario laiko juostoje, bet jūs neturite leidimo peržiūrėti tos žinutės.", "Failed to load timeline position": "Nepavyko įkelti laiko juostos pozicijos", "Your Matrix account on %(serverName)s": "Jūsų Matrix paskyra %(serverName)s serveryje", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index b56599f26e..2fb284d378 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -115,7 +115,7 @@ "Historical": "Bijušie", "Home": "Mājup", "Homeserver is": "Bāzes serveris ir", - "Identity Server is": "Indentifikācijas serveris ir", + "Identity server is": "Indentifikācijas serveris ir", "I have verified my email address": "Mana epasta adrese ir verificēta", "Import": "Importēt", "Import E2E room keys": "Importēt E2E istabas atslēgas", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index d3be9cd2ea..4707cb4479 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -589,7 +589,7 @@ "Checking server": "Sjekker tjeneren", "Change identity server": "Bytt ut identitetstjener", "You should:": "Du burde:", - "Identity Server": "Identitetstjener", + "Identity server": "Identitetstjener", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Å bruke en identitetstjener er valgfritt. Dersom du velger å ikke bruke en identitetstjener, vil du ikke kunne oppdages av andre brukere, og du vil ikke kunne invitere andre ut i fra E-postadresse eller telefonnummer.", "Do not use an identity server": "Ikke bruk en identitetstjener", "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler (%(serverName)s) til å behandle botter, moduler, og klistremerkepakker.", @@ -768,7 +768,7 @@ "Email (optional)": "E-post (valgfritt)", "Phone (optional)": "Telefonnummer (valgfritt)", "Homeserver URL": "Hjemmetjener-URL", - "Identity Server URL": "Identitetstjener-URL", + "Identity server URL": "Identitetstjener-URL", "Other servers": "Andre tjenere", "Add a Room": "Legg til et rom", "Add a User": "Legg til en bruker", @@ -841,7 +841,7 @@ "Back up your keys before signing out to avoid losing them.": "Ta sikkerhetskopi av nøklene dine før du logger av for å unngå å miste dem.", "Start using Key Backup": "Begynn å bruke Nøkkelsikkerhetskopiering", "Add an email address to configure email notifications": "Legg til en E-postadresse for å sette opp E-postvarsler", - "Identity Server (%(server)s)": "Identitetstjener (%(server)s)", + "Identity server (%(server)s)": "Identitetstjener (%(server)s)", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Hvis du ikke ønsker å bruke til å oppdage og bli oppdaget av eksisterende kontakter som du kjenner, skriv inn en annen identitetstjener nedenfor.", "Enter a new identity server": "Skriv inn en ny identitetstjener", "For help with using %(brand)s, click here.": "For å få hjelp til å bruke %(brand)s, klikk her.", @@ -851,7 +851,7 @@ "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "For å rapportere inn et Matrix-relatert sikkerhetsproblem, vennligst less Matrix.org sine Retningslinjer for sikkerhetspublisering.", "Keyboard Shortcuts": "Tastatursnarveier", "Homeserver is": "Hjemmetjeneren er", - "Identity Server is": "Identitetstjeneren er", + "Identity server is": "Identitetstjeneren er", "Access Token:": "Tilgangssjetong:", "Import E2E room keys": "Importer E2E-romnøkler", "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet.", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1818a64e54..050f0f1d7f 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -178,7 +178,7 @@ "Historical": "Historisch", "Home": "Thuis", "Homeserver is": "Homeserver is", - "Identity Server is": "Identiteitsserver is", + "Identity server is": "Identiteitsserver is", "I have verified my email address": "Ik heb mijn e-mailadres geverifieerd", "Import": "Inlezen", "Import E2E room keys": "E2E-gesprekssleutels importeren", @@ -1175,7 +1175,7 @@ "Confirm": "Bevestigen", "Other servers": "Andere servers", "Homeserver URL": "Thuisserver-URL", - "Identity Server URL": "Identiteitsserver-URL", + "Identity server URL": "Identiteitsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Neem deel aan de grootste openbare server met miljoenen anderen", "Premium": "Premium", @@ -1393,7 +1393,7 @@ "You're signed out": "U bent uitgelogd", "Clear personal data": "Persoonlijke gegevens wissen", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Laat ons weten wat er verkeerd is gegaan, of nog beter, maak een foutrapport aan op GitHub, waarin u het probleem beschrijft.", - "Identity Server": "Identiteitsserver", + "Identity server": "Identiteitsserver", "Find others by phone or email": "Vind anderen via telefoonnummer of e-mailadres", "Be found by phone or email": "Wees vindbaar via telefoonnummer of e-mailadres", "Use bots, bridges, widgets and sticker packs": "Gebruik robots, bruggen, widgets en stickerpakketten", @@ -1406,13 +1406,13 @@ "Messages": "Berichten", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toont een lijst van beschikbare opdrachten, met hun gebruiken en beschrijvingen", - "Identity Server URL must be HTTPS": "Identiteitsserver-URL moet HTTPS zijn", - "Not a valid Identity Server (status code %(code)s)": "Geen geldige identiteitsserver (statuscode %(code)s)", - "Could not connect to Identity Server": "Kon geen verbinding maken met de identiteitsserver", + "Identity server URL must be HTTPS": "Identiteitsserver-URL moet HTTPS zijn", + "Not a valid identity server (status code %(code)s)": "Geen geldige identiteitsserver (statuscode %(code)s)", + "Could not connect to identity server": "Kon geen verbinding maken met de identiteitsserver", "Checking server": "Server wordt gecontroleerd", "Disconnect from the identity server ?": "Wilt u de verbinding met de identiteitsserver verbreken?", "Disconnect": "Verbinding verbreken", - "Identity Server (%(server)s)": "Identiteitsserver (%(server)s)", + "Identity server (%(server)s)": "Identiteitsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Om bekenden te kunnen vinden en voor hen vindbaar te zijn gebruikt u momenteel . U kunt die identiteitsserver hieronder wijzigen.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "U gebruikt momenteel geen identiteitsserver. Voeg er hieronder één toe om bekenden te kunnen vinden en voor hen vindbaar te zijn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Als u de verbinding met uw identiteitsserver verbreekt zal u niet door andere personen gevonden kunnen worden, en dat u anderen niet via e-mail of telefoon zal kunnen uitnodigen.", diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index 478f05b5cb..427f55f72a 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -758,7 +758,7 @@ "Account": "Brukar", "click to reveal": "klikk for å visa", "Homeserver is": "Heimtenaren er", - "Identity Server is": "Identitetstenaren er", + "Identity server is": "Identitetstenaren er", "%(brand)s version:": "%(brand)s versjon:", "olm version:": "olm versjon:", "Failed to send email": "Fekk ikkje til å senda eposten", @@ -1373,7 +1373,7 @@ "Explore all public rooms": "Utforsk alle offentlege rom", "Explore public rooms": "Utforsk offentlege rom", "Use Ctrl + F to search": "Bruk Ctrl + F for søk", - "Identity Server": "Identitetstenar", + "Identity server": "Identitetstenar", "Email Address": "E-postadresse", "Go Back": "Gå attende", "Notification settings": "Varslingsinnstillingar" diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 641247e6ee..bd95479909 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -174,7 +174,7 @@ "Hangup": "Rozłącz się", "Home": "Strona startowa", "Homeserver is": "Serwer domowy to", - "Identity Server is": "Serwer tożsamości to", + "Identity server is": "Serwer tożsamości to", "I have verified my email address": "Zweryfikowałem swój adres e-mail", "Import": "Importuj", "Import E2E room keys": "Importuj klucze pokoju E2E", @@ -1139,9 +1139,9 @@ "Start using Key Backup": "Rozpocznij z użyciem klucza kopii zapasowej", "Add an email address to configure email notifications": "Dodaj adres poczty elektronicznej, aby skonfigurować powiadomienia pocztowe", "Profile picture": "Obraz profilowy", - "Identity Server URL must be HTTPS": "URL serwera tożsamości musi być HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Nieprawidłowy serwer tożsamości (kod statusu %(code)s)", - "Could not connect to Identity Server": "Nie można połączyć z Serwerem Tożsamości", + "Identity server URL must be HTTPS": "URL serwera tożsamości musi być HTTPS", + "Not a valid identity server (status code %(code)s)": "Nieprawidłowy serwer tożsamości (kod statusu %(code)s)", + "Could not connect to identity server": "Nie można połączyć z Serwerem Tożsamości", "Checking server": "Sprawdzanie serwera", "Terms of service not accepted or the identity server is invalid.": "Warunki użytkowania nieakceptowane lub serwer tożsamości jest nieprawidłowy.", "Identity server has no terms of service": "Serwer tożsamości nie posiada warunków użytkowania", @@ -1149,9 +1149,9 @@ "Only continue if you trust the owner of the server.": "Kontynuj tylko wtedy, gdy ufasz właścicielowi serwera.", "Disconnect from the identity server ?": "Odłączyć od serwera tożsamości ?", "Disconnect": "Odłącz", - "Identity Server (%(server)s)": "Serwer tożsamości (%(server)s)", + "Identity server (%(server)s)": "Serwer tożsamości (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Używasz , aby odnajdywać i móc być odnajdywanym przez istniejące kontakty, które znasz. Możesz zmienić serwer tożsamości poniżej.", - "Identity Server": "Serwer Tożsamości", + "Identity server": "Serwer Tożsamości", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Nie używasz serwera tożsamości. Aby odkrywać i być odkrywanym przez istniejące kontakty które znasz, dodaj jeden poniżej.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Odłączenie się od serwera tożsamości oznacza, że inni nie będą mogli Cię odnaleźć ani Ty nie będziesz w stanie zaprosić nikogo za pomocą e-maila czy telefonu.", "Enter a new identity server": "Wprowadź nowy serwer tożsamości", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 4047aae760..566de97b3f 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -38,7 +38,7 @@ "Hangup": "Desligar", "Historical": "Histórico", "Homeserver is": "Servidor padrão é", - "Identity Server is": "O servidor de identificação é", + "Identity server is": "O servidor de identificação é", "I have verified my email address": "Eu verifiquei o meu endereço de email", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de email inválido", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index e19febd6ef..feff0f54c5 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -38,7 +38,7 @@ "Hangup": "Desligar", "Historical": "Histórico", "Homeserver is": "Servidor padrão é", - "Identity Server is": "O servidor de identificação é", + "Identity server is": "O servidor de identificação é", "I have verified my email address": "Eu confirmei o meu endereço de e-mail", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de e-mail inválido", @@ -1770,9 +1770,9 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Você pode ter configurado estas opções em um aplicativo que não seja o %(brand)s. Você não pode ajustar essas opções no %(brand)s, mas elas ainda se aplicam.", "Enable audible notifications for this session": "Ativar o som de notificações nesta sessão", "Display Name": "Nome e sobrenome", - "Identity Server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Servidor de Identidade inválido (código de status %(code)s)", - "Could not connect to Identity Server": "Não foi possível conectar-se ao Servidor de Identidade", + "Identity server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", + "Not a valid identity server (status code %(code)s)": "Servidor de Identidade inválido (código de status %(code)s)", + "Could not connect to identity server": "Não foi possível conectar-se ao Servidor de Identidade", "Checking server": "Verificando servidor", "Change identity server": "Alterar o servidor de identidade", "Disconnect from the identity server and connect to instead?": "Desconectar-se do servidor de identidade e conectar-se em em vez disso?", @@ -1789,10 +1789,10 @@ "You are still sharing your personal data on the identity server .": "Você ainda está compartilhando seus dados pessoais no servidor de identidade .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Recomendamos que você remova seus endereços de e-mail e números de telefone do servidor de identidade antes de desconectar.", "Go back": "Voltar", - "Identity Server (%(server)s)": "Servidor de identidade (%(server)s)", + "Identity server (%(server)s)": "Servidor de identidade (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "No momento, você está usando para descobrir e ser descoberto pelos contatos existentes que você conhece. Você pode alterar seu servidor de identidade abaixo.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se você não quiser usar para descobrir e ser detectável pelos contatos existentes, digite outro servidor de identidade abaixo.", - "Identity Server": "Servidor de identidade", + "Identity server": "Servidor de identidade", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectar-se do servidor de identidade significa que você não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou número de celular.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar um servidor de identidade é opcional. Se você optar por não usar um servidor de identidade, não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou por número de celular.", @@ -2100,7 +2100,7 @@ "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Defina um e-mail para poder recuperar a conta. Este e-mail também pode ser usado para encontrar seus contatos.", "Enter your custom homeserver URL What does this mean?": "Digite o endereço de um servidor local O que isso significa?", "Homeserver URL": "Endereço do servidor local", - "Identity Server URL": "Endereço do servidor de identidade", + "Identity server URL": "Endereço do servidor de identidade", "Other servers": "Outros servidores", "Free": "Gratuito", "Find other public servers or use a custom server": "Encontre outros servidores públicos ou use um servidor personalizado", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 91b9919d0a..1aabe0555b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -34,7 +34,7 @@ "Hangup": "Повесить трубку", "Historical": "Архив", "Homeserver is": "Домашний сервер", - "Identity Server is": "Сервер идентификации", + "Identity server is": "Сервер идентификации", "I have verified my email address": "Я подтвердил свой email", "Import E2E room keys": "Импорт ключей шифрования", "Invalid Email Address": "Недопустимый email", @@ -1007,7 +1007,7 @@ "Confirm": "Подтвердить", "Other servers": "Другие серверы", "Homeserver URL": "URL сервера", - "Identity Server URL": "URL сервера идентификации", + "Identity server URL": "URL сервера идентификации", "Free": "Бесплатный", "Premium": "Премиум", "Other": "Другие", @@ -1381,7 +1381,7 @@ "Your homeserver doesn't seem to support this feature.": "Ваш сервер, похоже, не поддерживает эту возможность.", "Message edits": "Правки сообщения", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Модернизация этой комнаты требует закрытие комнаты в текущем состояние и создания новой комнаты вместо неё. Чтобы упростить процесс для участников, будет сделано:", - "Identity Server": "Сервер идентификаций", + "Identity server": "Сервер идентификаций", "Find others by phone or email": "Найти других по номеру телефона или email", "Be found by phone or email": "Будут найдены по номеру телефона или email", "Use bots, bridges, widgets and sticker packs": "Использовать боты, мосты, виджеты и наборы стикеров", @@ -1414,9 +1414,9 @@ "Accept to continue:": "Примите для продолжения:", "ID": "ID", "Public Name": "Публичное имя", - "Identity Server URL must be HTTPS": "URL-адрес сервера идентификации должен быть HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Неправильный Сервер идентификации (код статуса %(code)s)", - "Could not connect to Identity Server": "Не смог подключиться к серверу идентификации", + "Identity server URL must be HTTPS": "URL-адрес сервера идентификации должен быть HTTPS", + "Not a valid identity server (status code %(code)s)": "Неправильный Сервер идентификации (код статуса %(code)s)", + "Could not connect to identity server": "Не смог подключиться к серверу идентификации", "Checking server": "Проверка сервера", "Terms of service not accepted or the identity server is invalid.": "Условия использования не приняты или сервер идентификации недействителен.", "Identity server has no terms of service": "Сервер идентификации не имеет условий предоставления услуг", @@ -1424,7 +1424,7 @@ "Only continue if you trust the owner of the server.": "Продолжайте, только если доверяете владельцу сервера.", "Disconnect from the identity server ?": "Отсоединиться от сервера идентификации ?", "Disconnect": "Отключить", - "Identity Server (%(server)s)": "Сервер идентификации (%(server)s)", + "Identity server (%(server)s)": "Сервер идентификации (%(server)s)", "Do not use an identity server": "Не использовать сервер идентификации", "Enter a new identity server": "Введите новый идентификационный сервер", "Integration Manager": "Менеджер интеграции", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 0ee0c6cbc3..37bd442844 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -533,7 +533,7 @@ "Access Token:": "Prístupový token:", "click to reveal": "Odkryjete kliknutím", "Homeserver is": "Domovský server je", - "Identity Server is": "Server totožností je", + "Identity server is": "Server totožností je", "%(brand)s version:": "Verzia %(brand)s:", "olm version:": "Verzia olm:", "Failed to send email": "Nepodarilo sa odoslať email", @@ -1197,7 +1197,7 @@ "Confirm": "Potvrdiť", "Other servers": "Ostatné servery", "Homeserver URL": "URL adresa domovského servera", - "Identity Server URL": "URL adresa servera totožností", + "Identity server URL": "URL adresa servera totožností", "Free": "Zdarma", "Join millions for free on the largest public server": "Pripojte sa k mnohým používateľom najväčšieho verejného domovského servera zdarma", "Premium": "Premium", @@ -1270,9 +1270,9 @@ "Accept to continue:": "Ak chcete pokračovať, musíte prijať :", "ID": "ID", "Public Name": "Verejný názov", - "Identity Server URL must be HTTPS": "URL adresa servera totožností musí začínať HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Toto nie je funkčný server totožností (kód stavu %(code)s)", - "Could not connect to Identity Server": "Nie je možné sa pripojiť k serveru totožností", + "Identity server URL must be HTTPS": "URL adresa servera totožností musí začínať HTTPS", + "Not a valid identity server (status code %(code)s)": "Toto nie je funkčný server totožností (kód stavu %(code)s)", + "Could not connect to identity server": "Nie je možné sa pripojiť k serveru totožností", "Checking server": "Kontrola servera", "Terms of service not accepted or the identity server is invalid.": "Neprijali ste Podmienky poskytovania služby alebo to nie je správny server.", "Identity server has no terms of service": "Server totožností nemá žiadne podmienky poskytovania služieb", @@ -1354,10 +1354,10 @@ "Disconnect anyway": "Napriek tomu sa odpojiť", "You are still sharing your personal data on the identity server .": "Stále zdielate vaše osobné údaje so serverom totožnosti .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Odporúčame, aby ste ešte pred odpojením sa zo servera totožností odstránili vašu emailovú adresu a telefónne číslo.", - "Identity Server (%(server)s)": "Server totožností (%(server)s)", + "Identity server (%(server)s)": "Server totožností (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Momentálne na vyhľadávanie kontaktov a na možnosť byť nájdení kontaktmi ktorých poznáte používate . Zmeniť server totožností môžete nižšie.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Ak nechcete na vyhľadávanie kontaktov a možnosť byť nájdení používať , zadajte adresu servera totožností nižšie.", - "Identity Server": "Server totožností", + "Identity server": "Server totožností", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Momentálne nepoužívate žiaden server totožností. Ak chcete vyhľadávať kontakty a zároveň umožniť ostatným vašim kontaktom, aby mohli nájsť vás, nastavte si server totožností nižšie.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ak sa odpojíte od servera totožností, vaše kontakty vás nebudú môcť nájsť a ani vy nebudete môcť pozývať používateľov zadaním emailovej adresy a telefónneho čísla.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Používanie servera totožností je voliteľné. Ak sa rozhodnete, že nebudete používať server totožností, nebudú vás vaši známi môcť nájsť a ani vy nebudete môcť pozývať používateľov zadaním emailovej adresy alebo telefónneho čísla.", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index b2101151e1..f894340fb6 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -473,7 +473,7 @@ "Profile": "Profil", "Account": "Llogari", "Access Token:": "Token Hyrjesh:", - "Identity Server is": "Shërbyes Identitetesh është", + "Identity server is": "Shërbyes Identitetesh është", "%(brand)s version:": "Version %(brand)s:", "olm version:": "version olm:", "The email address linked to your account must be entered.": "Duhet dhënë adresa email e lidhur me llogarinë tuaj.", @@ -1061,7 +1061,7 @@ "Confirm": "Ripohojeni", "Other servers": "Shërbyes të tjerë", "Homeserver URL": "URL Shërbyesi Home", - "Identity Server URL": "URL Shërbyesi Identitetesh", + "Identity server URL": "URL Shërbyesi Identitetesh", "Free": "Falas", "Join millions for free on the largest public server": "Bashkojuni milionave, falas, në shërbyesin më të madh publik", "Premium": "Me Pagesë", @@ -1398,7 +1398,7 @@ "Removing…": "Po hiqet…", "Share User": "Ndani Përdorues", "Command Help": "Ndihmë Urdhri", - "Identity Server": "Shërbyes Identitetesh", + "Identity server": "Shërbyes Identitetesh", "Find others by phone or email": "Gjeni të tjerë përmes telefoni ose email-i", "Be found by phone or email": "Bëhuni i gjetshëm përmes telefoni ose email-i", "Use bots, bridges, widgets and sticker packs": "Përdorni robotë, ura, widget-e dhe paketa ngjitësish", @@ -1415,13 +1415,13 @@ "You cannot sign in to your account. Please contact your homeserver admin for more information.": "S’mund të bëni hyrjen në llogarinë tuaj. Ju lutemi, për më tepër hollësi, lidhuni me përgjegjësin e shërbyesit tuaj Home.", "Clear personal data": "Spastro të dhëna personale", "Spanner": "Çelës", - "Identity Server URL must be HTTPS": "URL-ja e Shërbyesit të Identiteteve duhet të jetë HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Shërbyes Identitetesh i pavlefshëm (kod gjendjeje %(code)s)", - "Could not connect to Identity Server": "S’u lidh dot me Shërbyes Identitetesh", + "Identity server URL must be HTTPS": "URL-ja e Shërbyesit të Identiteteve duhet të jetë HTTPS", + "Not a valid identity server (status code %(code)s)": "Shërbyes Identitetesh i pavlefshëm (kod gjendjeje %(code)s)", + "Could not connect to identity server": "S’u lidh dot me Shërbyes Identitetesh", "Checking server": "Po kontrollohet shërbyesi", "Disconnect from the identity server ?": "Të shkëputet prej shërbyesit të identiteteve ?", "Disconnect": "Shkëputu", - "Identity Server (%(server)s)": "Shërbyes Identitetesh (%(server)s)", + "Identity server (%(server)s)": "Shërbyes Identitetesh (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Jeni duke përdorur për të zbuluar dhe për t’u zbuluar nga kontakte ekzistues që njihni. Shërbyesin tuaj të identiteteve mund ta ndryshoni më poshtë.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "S’po përdorni ndonjë shërbyes identitetesh. Që të zbuloni dhe të jeni i zbulueshëm nga kontakte ekzistues që njihni, shtoni një të tillë më poshtë.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Shkëputja prej shërbyesit tuaj të identiteteve do të thotë se s’do të jeni i zbulueshëm nga përdorues të tjerë dhe s’do të jeni në gjendje të ftoni të tjerë përmes email-i apo telefoni.", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 49f87321f7..2c785785ff 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -589,7 +589,7 @@ "Access Token:": "Приступни жетон:", "click to reveal": "кликни за приказ", "Homeserver is": "Домаћи сервер је", - "Identity Server is": "Идентитетски сервер је", + "Identity server is": "Идентитетски сервер је", "%(brand)s version:": "%(brand)s издање:", "olm version:": "olm издање:", "Failed to send email": "Нисам успео да пошаљем мејл", @@ -846,7 +846,7 @@ "Find other public servers or use a custom server": "Пронађите друге јавне сервере или користите прилагођени сервер", "Other servers": "Други сервери", "Homeserver URL": "Адреса кућног сервера", - "Identity Server URL": "Адреса идентитетског сервера", + "Identity server URL": "Адреса идентитетског сервера", "Next": "Следеће", "Sign in instead": "Пријава са постојећим налогом", "Create your account": "Направите ваш налог", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 6033b561bd..71c455a60c 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -115,7 +115,7 @@ "Historical": "Historiska", "Home": "Hem", "Homeserver is": "Hemservern är", - "Identity Server is": "Identitetsservern är", + "Identity server is": "Identitetsservern är", "I have verified my email address": "Jag har verifierat min e-postadress", "Import": "Importera", "Import E2E room keys": "Importera rumskrypteringsnycklar", @@ -1057,7 +1057,7 @@ "Confirm": "Bekräfta", "Other servers": "Andra servrar", "Homeserver URL": "Hemserver-URL", - "Identity Server URL": "Identitetsserver-URL", + "Identity server URL": "Identitetsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Gå med miljontals användare gratis på den största publika servern", "Premium": "Premium", @@ -1242,9 +1242,9 @@ "Accept to continue:": "Acceptera för att fortsätta:", "ID": "ID", "Public Name": "Offentligt namn", - "Identity Server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Inte en giltig identitetsserver (statuskod %(code)s)", - "Could not connect to Identity Server": "Kunde inte ansluta till identitetsservern", + "Identity server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS", + "Not a valid identity server (status code %(code)s)": "Inte en giltig identitetsserver (statuskod %(code)s)", + "Could not connect to identity server": "Kunde inte ansluta till identitetsservern", "Checking server": "Kontrollerar servern", "Change identity server": "Byt identitetsserver", "Disconnect from the identity server and connect to instead?": "Koppla ifrån från identitetsservern och anslut till istället?", @@ -1255,10 +1255,10 @@ "You are still sharing your personal data on the identity server .": "Du delar fortfarande dina personuppgifter på identitetsservern .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Vi rekommenderar att du tar bort dina e-postadresser och telefonnummer från identitetsservern innan du kopplar från.", "Disconnect anyway": "Koppla ifrån ändå", - "Identity Server (%(server)s)": "Identitetsserver (%(server)s)", + "Identity server (%(server)s)": "Identitetsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Du använder för närvarande för att upptäcka och upptäckas av befintliga kontakter som du känner. Du kan byta din identitetsserver nedan.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Om du inte vill använda för att upptäcka och upptäckas av befintliga kontakter som du känner, ange en annan identitetsserver nedan.", - "Identity Server": "Identitetsserver", + "Identity server": "Identitetsserver", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Du använder för närvarande inte en identitetsserver. Lägg till en nedan om du vill upptäcka och bli upptäckbar av befintliga kontakter som du känner.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att koppla ifrån din identitetsserver betyder att du inte kan upptäckas av andra användare och att du inte kommer att kunna bjuda in andra via e-post eller telefon.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att använda en identitetsserver är valfritt. Om du väljer att inte använda en identitetsserver kan du inte upptäckas av andra användare och inte heller bjuda in andra via e-post eller telefon.", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 16a9e521c2..4a1afc1c05 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -106,7 +106,7 @@ "Hangup": "วางสาย", "Historical": "ประวัติแชทเก่า", "Homeserver is": "เซิร์ฟเวอร์บ้านคือ", - "Identity Server is": "เซิร์ฟเวอร์ระบุตัวตนคือ", + "Identity server is": "เซิร์ฟเวอร์ระบุตัวตนคือ", "I have verified my email address": "ฉันยืนยันที่อยู่อีเมลแล้ว", "Import": "นำเข้า", "Incorrect username and/or password.": "ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index c5316ee2df..46f32ef61d 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -115,7 +115,7 @@ "Historical": "Tarihi", "Home": "Ev", "Homeserver is": "Ana Sunucusu", - "Identity Server is": "Kimlik Sunucusu", + "Identity server is": "Kimlik Sunucusu", "I have verified my email address": "E-posta adresimi doğruladım", "Import": "İçe Aktar", "Import E2E room keys": "Uçtan uca Oda Anahtarlarını İçe Aktar", @@ -723,7 +723,7 @@ "Create your Matrix account on %(serverName)s": "%(serverName)s üzerinde Matrix hesabınızı oluşturun", "Create your Matrix account on ": " üzerinde Matrix hesabınızı oluşturun", "Homeserver URL": "Ana sunucu URL", - "Identity Server URL": "Kimlik Sunucu URL", + "Identity server URL": "Kimlik Sunucu URL", "Other servers": "Diğer sunucular", "Couldn't load page": "Sayfa yüklenemiyor", "Add a Room": "Bir Oda Ekle", @@ -885,7 +885,7 @@ "Show message in desktop notification": "Masaüstü bildiriminde mesaj göster", "Display Name": "Ekran Adı", "Profile picture": "Profil resmi", - "Could not connect to Identity Server": "Kimlik Sunucusuna bağlanılamadı", + "Could not connect to identity server": "Kimlik Sunucusuna bağlanılamadı", "Checking server": "Sunucu kontrol ediliyor", "Change identity server": "Kimlik sunucu değiştir", "Sorry, your homeserver is too old to participate in this room.": "Üzgünüm, ana sunucunuz bu odaya katılabilmek için oldukça eski.", @@ -940,8 +940,8 @@ "wait and try again later": "bekle ve tekrar dene", "Disconnect anyway": "Yinede bağlantıyı kes", "Go back": "Geri dön", - "Identity Server (%(server)s)": "(%(server)s) Kimlik Sunucusu", - "Identity Server": "Kimlik Sunucusu", + "Identity server (%(server)s)": "(%(server)s) Kimlik Sunucusu", + "Identity server": "Kimlik Sunucusu", "Do not use an identity server": "Bir kimlik sunucu kullanma", "Enter a new identity server": "Yeni bir kimlik sunucu gir", "Change": "Değiştir", @@ -1046,8 +1046,8 @@ "Backup has a valid signature from this user": "Yedek bu kullanıcıdan geçerli anahtara sahip", "Backup has a invalid signature from this user": "Yedek bu kullanıcıdan geçersiz bir anahtara sahip", "Add an email address to configure email notifications": "E-posta bildirimlerini yapılandırmak için bir e-posta adresi ekleyin", - "Identity Server URL must be HTTPS": "Kimlik Sunucu URL adresi HTTPS olmak zorunda", - "Not a valid Identity Server (status code %(code)s)": "Geçerli bir Kimlik Sunucu değil ( durum kodu %(code)s )", + "Identity server URL must be HTTPS": "Kimlik Sunucu URL adresi HTTPS olmak zorunda", + "Not a valid identity server (status code %(code)s)": "Geçerli bir Kimlik Sunucu değil ( durum kodu %(code)s )", "Terms of service not accepted or the identity server is invalid.": "Hizmet şartları kabuk edilmedi yada kimlik sunucu geçersiz.", "The identity server you have chosen does not have any terms of service.": "Seçtiğiniz kimlik sunucu herhangi bir hizmet şartları sözleşmesine sahip değil.", "Disconnect identity server": "Kimlik sunucu bağlantısını kes", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 92da704837..3500f7869a 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -817,7 +817,7 @@ "Versions": "Версії", "%(brand)s version:": "версія %(brand)s:", "olm version:": "Версія olm:", - "Identity Server is": "Сервер ідентифікації", + "Identity server is": "Сервер ідентифікації", "Labs": "Лабораторія", "Customise your experience with experimental labs features. Learn more.": "Спробуйте експериментальні можливості. Більше.", "Ignored/Blocked": "Ігноровані/Заблоковані", @@ -998,8 +998,8 @@ "Disconnect": "Відключити", "You should:": "Вам варто:", "Disconnect anyway": "Відключити в будь-якому випадку", - "Identity Server (%(server)s)": "Сервер ідентифікації (%(server)s)", - "Identity Server": "Сервер ідентифікації", + "Identity server (%(server)s)": "Сервер ідентифікації (%(server)s)", + "Identity server": "Сервер ідентифікації", "Do not use an identity server": "Не використовувати сервер ідентифікації", "Enter a new identity server": "Введіть новий сервер ідентифікації", "Change": "Змінити", diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index 75ab903ebe..77955ee2a7 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -482,7 +482,7 @@ "%(brand)s version:": "%(brand)s-versie:", "olm version:": "olm-versie:", "Homeserver is": "Thuusserver es", - "Identity Server is": "Identiteitsserver es", + "Identity server is": "Identiteitsserver es", "Access Token:": "Toegangstoken:", "click to reveal": "klikt vo te toogn", "Labs": "Experimenteel", @@ -1129,7 +1129,7 @@ "Create your Matrix account on ": "Mak je Matrix-account an ip ", "Other servers": "Andere servers", "Homeserver URL": "Thuusserver-URL", - "Identity Server URL": "Identiteitsserver-URL", + "Identity server URL": "Identiteitsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Doe mee me miljoenen anderen ip de grotste publieke server", "Premium": "Premium", @@ -1389,7 +1389,7 @@ "Resend removal": "Verwyderienge herverstuurn", "Failed to re-authenticate due to a homeserver problem": "’t Heranmeldn is mislukt omwille van e probleem me de thuusserver", "Failed to re-authenticate": "’t Heranmeldn is mislukt", - "Identity Server": "Identiteitsserver", + "Identity server": "Identiteitsserver", "Find others by phone or email": "Viendt andere menschn via hunder telefongnumero of e-mailadresse", "Be found by phone or email": "Wor gevoundn via je telefongnumero of e-mailadresse", "Use bots, bridges, widgets and sticker packs": "Gebruukt robottn, bruggn, widgets en stickerpakkettn", @@ -1406,13 +1406,13 @@ "Messages": "Berichtn", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toogt e lyste van beschikboare ipdrachtn, met hunder gebruukn en beschryviengn", - "Identity Server URL must be HTTPS": "Den identiteitsserver-URL moet HTTPS zyn", - "Not a valid Identity Server (status code %(code)s)": "Geen geldigen identiteitsserver (statuscode %(code)s)", - "Could not connect to Identity Server": "Kostege geen verbindienge moakn me den identiteitsserver", + "Identity server URL must be HTTPS": "Den identiteitsserver-URL moet HTTPS zyn", + "Not a valid identity server (status code %(code)s)": "Geen geldigen identiteitsserver (statuscode %(code)s)", + "Could not connect to identity server": "Kostege geen verbindienge moakn me den identiteitsserver", "Checking server": "Server wor gecontroleerd", "Disconnect from the identity server ?": "Wil je de verbindienge me den identiteitsserver verbreekn?", "Disconnect": "Verbindienge verbreekn", - "Identity Server (%(server)s)": "Identiteitsserver (%(server)s)", + "Identity server (%(server)s)": "Identiteitsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Je makt vo de moment gebruuk van vo deur je contactn gevoundn te kunn wordn, en von hunder te kunn viendn. Je kut hierounder jen identiteitsserver wyzign.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Je makt vo de moment geen gebruuk van een identiteitsserver. Voegt der hierounder één toe vo deur je contactn gevoundn te kunn wordn en von hunder te kunn viendn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "De verbindienge me jen identiteitsserver verbreekn goat dervoorn zorgn da je nie mi deur andere gebruukers gevoundn goa kunn wordn, en dat andere menschn je nie via e-mail of telefong goan kunn uutnodign.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 7aa0d75539..1dc907653d 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -44,7 +44,7 @@ "Hangup": "挂断", "Historical": "历史", "Homeserver is": "主服务器是", - "Identity Server is": "身份认证服务器是", + "Identity server is": "身份认证服务器是", "I have verified my email address": "我已经验证了我的邮箱地址", "Import E2E room keys": "导入聊天室端到端加密密钥", "Incorrect verification code": "验证码错误", @@ -1154,7 +1154,7 @@ "Confirm": "确认", "Other servers": "其他服务器", "Homeserver URL": "主服务器网址", - "Identity Server URL": "身份服务器网址", + "Identity server URL": "身份服务器网址", "Free": "免费", "Join millions for free on the largest public server": "免费加入最大的公共服务器,成为数百万用户中的一员", "Premium": "高级", @@ -1542,9 +1542,9 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "你可能在非 %(brand)s 的客户端里配置了它们。你在 %(brand)s 里无法修改它们,但它们仍然适用。", "Enable desktop notifications for this session": "为此会话启用桌面通知", "Enable audible notifications for this session": "为此会话启用声音通知", - "Identity Server URL must be HTTPS": "身份服务器连接必须是 HTTPS", - "Not a valid Identity Server (status code %(code)s)": "不是有效的身份服务器(状态码 %(code)s)", - "Could not connect to Identity Server": "无法连接到身份服务器", + "Identity server URL must be HTTPS": "身份服务器连接必须是 HTTPS", + "Not a valid identity server (status code %(code)s)": "不是有效的身份服务器(状态码 %(code)s)", + "Could not connect to identity server": "无法连接到身份服务器", "Checking server": "检查服务器", "Change identity server": "更改身份服务器", "Disconnect from the identity server and connect to instead?": "从 身份服务器断开连接并连接到 吗?", @@ -1560,11 +1560,11 @@ "Disconnect anyway": "仍然断开连接", "You are still sharing your personal data on the identity server .": "你仍然在分享你的个人信息在身份服务器上。", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "我们推荐你在断开连接前从身份服务器上删除你的邮箱地址和电话号码。", - "Identity Server (%(server)s)": "身份服务器(%(server)s)", + "Identity server (%(server)s)": "身份服务器(%(server)s)", "not stored": "未存储", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "你正在使用 以发现你认识的现存联系人并被其发现。你可以在下方更改你的身份服务器。", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "如果你不想使用 以发现你认识的现存联系人并被其发现,请在下方输入另一个身份服务器。", - "Identity Server": "身份服务器", + "Identity server": "身份服务器", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "你现在没有使用身份服务器。若想发现你认识的现存联系人并被其发现,请在下方添加一个身份服务器。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "断开身份服务器连接意味着你将无法被其他用户发现,同时你也将无法使用电子邮件或电话邀请别人。", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "使用身份服务器是可选的。如果你选择不使用身份服务器,你将不能被别的用户发现,也不能用邮箱或电话邀请别人。", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index d9429fc1c3..656009fa3a 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -70,7 +70,7 @@ "Hangup": "掛斷", "Historical": "歷史", "Homeserver is": "主伺服器是", - "Identity Server is": "身分認證伺服器是", + "Identity server is": "身分認證伺服器是", "I have verified my email address": "我已經驗證了我的電子郵件地址", "Import E2E room keys": "導入聊天室端對端加密密鑰", "Incorrect verification code": "驗證碼錯誤", @@ -1066,7 +1066,7 @@ "Confirm": "確認", "Other servers": "其他伺服器", "Homeserver URL": "家伺服器 URL", - "Identity Server URL": "識別伺服器 URL", + "Identity server URL": "識別伺服器 URL", "Free": "免費", "Join millions for free on the largest public server": "在最大的公開伺服器上免費加入數百萬人", "Premium": "專業", @@ -1393,7 +1393,7 @@ "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "請告訴我們發生了什麼錯誤,或更好的是,在 GitHub 上建立描述問題的議題。", "Sign in and regain access to your account.": "登入並取回對您帳號的控制權。", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "您無法登入到您的帳號。請聯絡您的家伺服器管理員以取得更多資訊。", - "Identity Server": "身份識別伺服器", + "Identity server": "身份識別伺服器", "Find others by phone or email": "透過電話或電子郵件尋找其他人", "Be found by phone or email": "透過電話或電子郵件找到", "Use bots, bridges, widgets and sticker packs": "使用機器人、橋接、小工具與貼紙包", @@ -1419,13 +1419,13 @@ "Please enter verification code sent via text.": "請輸入透過文字傳送的驗證碼。", "Discovery options will appear once you have added a phone number above.": "當您在上面加入電話號碼時將會出現探索選項。", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "文字訊息將會被傳送到 +%(msisdn)s。請輸入其中包含的驗證碼。", - "Identity Server URL must be HTTPS": "身份識別伺服器 URL 必須為 HTTPS", - "Not a valid Identity Server (status code %(code)s)": "不是有效的身份識別伺服器(狀態碼 %(code)s)", - "Could not connect to Identity Server": "無法連線至身份識別伺服器", + "Identity server URL must be HTTPS": "身份識別伺服器 URL 必須為 HTTPS", + "Not a valid identity server (status code %(code)s)": "不是有效的身份識別伺服器(狀態碼 %(code)s)", + "Could not connect to identity server": "無法連線至身份識別伺服器", "Checking server": "正在檢查伺服器", "Disconnect from the identity server ?": "從身份識別伺服器 斷開連線?", "Disconnect": "斷開連線", - "Identity Server (%(server)s)": "身份識別伺服器 (%(server)s)", + "Identity server (%(server)s)": "身份識別伺服器 (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "您目前正在使用 來探索以及被您所知既有的聯絡人探索。您可以在下方變更身份識別伺服器。", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "您目前並未使用身份識別伺服器。要探索及被您所知既有的聯絡人探索,請在下方新增一個。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "從您的身份識別伺服器斷開連線代表您不再能被其他使用者探索到,而且您也不能透過電子郵件或電話邀請其他人。", diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 1751eddb2c..830ea9e32e 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -812,7 +812,7 @@ export const SETTINGS: {[setting: string]: ISetting} = { [UIFeature.IdentityServer]: { supportedLevels: LEVELS_UI_FEATURE, default: true, - // Identity Server (Discovery) Settings make no sense if 3PIDs in general are hidden + // Identity server (discovery) settings make no sense if 3PIDs in general are hidden controller: new UIFeatureController(UIFeature.ThirdPartyID), }, [UIFeature.ThirdPartyID]: { From 6884b2aa6dba0e528a364f3794e8bcad4d98b793 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 13 Jul 2021 15:26:38 +0100 Subject: [PATCH 081/135] Standardise spelling of identity server Signed-off-by: Paulo Pinto --- CHANGELOG.md | 12 ++++++------ src/AddThreepid.js | 2 +- src/components/structures/InteractiveAuth.js | 2 +- src/components/structures/MatrixChat.tsx | 2 +- .../views/auth/InteractiveAuthEntryComponents.tsx | 6 +++--- src/components/views/settings/SetIdServer.tsx | 6 +++--- .../settings/tabs/user/GeneralUserSettingsTab.js | 4 ++-- .../synapse/config-templates/consent/homeserver.yaml | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b35b7c59..7f2cb2824e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4933,7 +4933,7 @@ All Changes [\#3869](https://github.com/matrix-org/matrix-react-sdk/pull/3869) * Move feature flag check for new session toast [\#3865](https://github.com/matrix-org/matrix-react-sdk/pull/3865) - * Catch exception in checkTerms if no ID server + * Catch exception in checkTerms if no identity server [\#3863](https://github.com/matrix-org/matrix-react-sdk/pull/3863) * Catch exception if passphrase dialog cancelled [\#3862](https://github.com/matrix-org/matrix-react-sdk/pull/3862) @@ -6049,15 +6049,15 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3320](https://github.com/matrix-org/matrix-react-sdk/pull/3320) * Prompt for terms of service on identity server changes [\#3317](https://github.com/matrix-org/matrix-react-sdk/pull/3317) - * Allow 3pids to be added with no ID server set + * Allow 3pids to be added with no identity server set [\#3323](https://github.com/matrix-org/matrix-react-sdk/pull/3323) * Fix up remove threepid confirmation UX [\#3324](https://github.com/matrix-org/matrix-react-sdk/pull/3324) * Improve Discovery section when no IS set [\#3322](https://github.com/matrix-org/matrix-react-sdk/pull/3322) - * Allow password reset without an ID Server + * Allow password reset without an identity server [\#3319](https://github.com/matrix-org/matrix-react-sdk/pull/3319) - * Allow registering with email if no ID Server + * Allow registering with email if no identity server [\#3318](https://github.com/matrix-org/matrix-react-sdk/pull/3318) * Update from Weblate [\#3321](https://github.com/matrix-org/matrix-react-sdk/pull/3321) @@ -6081,7 +6081,7 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3311](https://github.com/matrix-org/matrix-react-sdk/pull/3311) * Disconnect from IS Button [\#3305](https://github.com/matrix-org/matrix-react-sdk/pull/3305) - * Add UI in settings to change ID Server + * Add UI in settings to change identity server [\#3300](https://github.com/matrix-org/matrix-react-sdk/pull/3300) * Read integration managers from account data (widgets) [\#3302](https://github.com/matrix-org/matrix-react-sdk/pull/3302) @@ -6117,7 +6117,7 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3288](https://github.com/matrix-org/matrix-react-sdk/pull/3288) * Reuse DMs whenever possible instead of asking to reuse them [\#3286](https://github.com/matrix-org/matrix-react-sdk/pull/3286) - * Work with no ID server set + * Work with no identity server set [\#3285](https://github.com/matrix-org/matrix-react-sdk/pull/3285) * Split MessageEditor up in edit-specifics & reusable parts for main composer [\#3282](https://github.com/matrix-org/matrix-react-sdk/pull/3282) diff --git a/src/AddThreepid.js b/src/AddThreepid.js index eb822c6d75..ab291128a7 100644 --- a/src/AddThreepid.js +++ b/src/AddThreepid.js @@ -248,7 +248,7 @@ export default class AddThreepid { /** * Takes a phone number verification code as entered by the user and validates - * it with the ID server, then if successful, adds the phone number. + * it with the identity server, then if successful, adds the phone number. * @param {string} msisdnToken phone number verification code as entered by the user * @return {Promise} Resolves if the phone number was added. Rejects with an object * with a "message" property which contains a human-readable message detailing why diff --git a/src/components/structures/InteractiveAuth.js b/src/components/structures/InteractiveAuth.js index 9ff830f66a..61ae1882df 100644 --- a/src/components/structures/InteractiveAuth.js +++ b/src/components/structures/InteractiveAuth.js @@ -54,7 +54,7 @@ export default class InteractiveAuthComponent extends React.Component { // * emailSid {string} If email auth was performed, the sid of // the auth session. // * clientSecret {string} The client secret used in auth - // sessions with the ID server. + // sessions with the identity server. onAuthFinished: PropTypes.func.isRequired, // Inputs provided by the user to the auth process diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index d692b0fa7f..8ca3e6f213 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -561,7 +561,7 @@ export default class MatrixChat extends React.PureComponent { switch (payload.action) { case 'MatrixActions.accountData': // XXX: This is a collection of several hacks to solve a minor problem. We want to - // update our local state when the ID server changes, but don't want to put that in + // update our local state when the identity server changes, but don't want to put that in // the js-sdk as we'd be then dictating how all consumers need to behave. However, // this component is already bloated and we probably don't want this tiny logic in // here, but there's no better place in the react-sdk for it. Additionally, we're diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 4b1ecec740..d9af2c2b77 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -41,7 +41,7 @@ import CaptchaForm from "./CaptchaForm"; * one HS whilst beign a guest on another). * loginType: the login type of the auth stage being attempted * authSessionId: session id from the server - * clientSecret: The client secret in use for ID server auth sessions + * clientSecret: The client secret in use for identity server auth sessions * stageParams: params from the server for the stage being attempted * errorText: error message from a previous attempt to authenticate * submitAuthDict: a function which will be called with the new auth dict @@ -54,8 +54,8 @@ import CaptchaForm from "./CaptchaForm"; * Defined keys for stages are: * m.login.email.identity: * * emailSid: string representing the sid of the active - * verification session from the ID server, or - * null if no session is active. + * verification session from the identity server, + * or null if no session is active. * fail: a function which should be called with an error object if an * error occurred during the auth stage. This will cause the auth * session to be failed and the process to go back to the start. diff --git a/src/components/views/settings/SetIdServer.tsx b/src/components/views/settings/SetIdServer.tsx index 981daac6c8..7788aa1c07 100644 --- a/src/components/views/settings/SetIdServer.tsx +++ b/src/components/views/settings/SetIdServer.tsx @@ -63,7 +63,7 @@ async function checkIdentityServerUrl(u) { } interface IProps { - // Whether or not the ID server is missing terms. This affects the text + // Whether or not the identity server is missing terms. This affects the text // shown to the user. missingTerms: boolean; } @@ -87,7 +87,7 @@ export default class SetIdServer extends React.Component { let defaultIdServer = ''; if (!MatrixClientPeg.get().getIdentityServerUrl() && getDefaultIdentityServerUrl()) { - // If no ID server is configured but there's one in the config, prepopulate + // If no identity server is configured but there's one in the config, prepopulate // the field to help the user. defaultIdServer = abbreviateUrl(getDefaultIdentityServerUrl()); } @@ -112,7 +112,7 @@ export default class SetIdServer extends React.Component { } private onAction = (payload: ActionPayload) => { - // We react to changes in the ID server in the event the user is staring at this form + // We react to changes in the identity server in the event the user is staring at this form // when changing their identity server on another device. if (payload.action !== "id_server_changed") return; diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 44ddaf08e4..f1b7df3eb5 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -364,7 +364,7 @@ export default class GeneralUserSettingsTab extends React.Component { onFinished={this.state.requiredPolicyInfo.resolve} introElement={intro} /> - { /* has its own heading as it includes the current ID server */ } + { /* has its own heading as it includes the current identity server */ }
); @@ -387,7 +387,7 @@ export default class GeneralUserSettingsTab extends React.Component { return (
{threepidSection} - { /* has its own heading as it includes the current ID server */ } + { /* has its own heading as it includes the current identity server */ }
); diff --git a/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml b/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml index 61b446babe..13aea8d18d 100644 --- a/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml +++ b/test/end-to-end-tests/synapse/config-templates/consent/homeserver.yaml @@ -685,7 +685,7 @@ registration_shared_secret: "{{REGISTRATION_SHARED_SECRET}}" # The list of identity servers trusted to verify third party # identifiers by this server. # -# Also defines the ID server which will be called when an account is +# Also defines the identity server which will be called when an account is # deactivated (one will be picked arbitrarily). # #trusted_third_party_id_servers: From 76157a7b480e562edcbe02872296663ffbd427db Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 13 Jul 2021 16:04:50 +0100 Subject: [PATCH 082/135] Standardise casing of integration manager Replace instances of 'Integration Manager' with 'Integration manager', when at start of sentence, or 'integration manager' when not. Signed-off-by: Paulo Pinto --- CHANGELOG.md | 4 ++-- .../views/dialogs/IntegrationsImpossibleDialog.js | 2 +- src/components/views/dialogs/TermsDialog.tsx | 2 +- src/components/views/elements/AppPermission.js | 2 +- src/components/views/rooms/Stickerpicker.js | 2 +- .../views/settings/SetIntegrationManager.tsx | 6 +++--- src/i18n/strings/ar.json | 8 ++++---- src/i18n/strings/bg.json | 12 ++++++------ src/i18n/strings/ca.json | 2 +- src/i18n/strings/cs.json | 12 ++++++------ src/i18n/strings/de_DE.json | 12 ++++++------ src/i18n/strings/en_EN.json | 12 ++++++------ src/i18n/strings/eo.json | 12 ++++++------ src/i18n/strings/es.json | 12 ++++++------ src/i18n/strings/et.json | 12 ++++++------ src/i18n/strings/eu.json | 12 ++++++------ src/i18n/strings/fa.json | 12 ++++++------ src/i18n/strings/fi.json | 12 ++++++------ src/i18n/strings/fr.json | 12 ++++++------ src/i18n/strings/gl.json | 12 ++++++------ src/i18n/strings/he.json | 12 ++++++------ src/i18n/strings/hu.json | 12 ++++++------ src/i18n/strings/it.json | 12 ++++++------ src/i18n/strings/ja.json | 8 ++++---- src/i18n/strings/kab.json | 12 ++++++------ src/i18n/strings/ko.json | 4 ++-- src/i18n/strings/lt.json | 12 ++++++------ src/i18n/strings/nb_NO.json | 8 ++++---- src/i18n/strings/nl.json | 12 ++++++------ src/i18n/strings/pl.json | 8 ++++---- src/i18n/strings/pt_BR.json | 12 ++++++------ src/i18n/strings/ru.json | 12 ++++++------ src/i18n/strings/sk.json | 6 +++--- src/i18n/strings/sq.json | 12 ++++++------ src/i18n/strings/sr.json | 2 +- src/i18n/strings/sv.json | 12 ++++++------ src/i18n/strings/tr.json | 4 ++-- src/i18n/strings/uk.json | 12 ++++++------ src/i18n/strings/vls.json | 2 +- src/i18n/strings/zh_Hans.json | 12 ++++++------ src/i18n/strings/zh_Hant.json | 12 ++++++------ src/utils/WidgetUtils.ts | 2 +- 42 files changed, 186 insertions(+), 186 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f2cb2824e..9b3606591c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6264,7 +6264,7 @@ Changes in [1.5.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3245](https://github.com/matrix-org/matrix-react-sdk/pull/3245) * Keep widget URL in permission screen to one line [\#3243](https://github.com/matrix-org/matrix-react-sdk/pull/3243) - * Avoid visual glitch when terms appear for Integration Manager + * Avoid visual glitch when terms appear for integration manager [\#3242](https://github.com/matrix-org/matrix-react-sdk/pull/3242) * Show diff for formatted messages in the edit history [\#3244](https://github.com/matrix-org/matrix-react-sdk/pull/3244) @@ -7271,7 +7271,7 @@ Changes in [1.0.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#2783](https://github.com/matrix-org/matrix-react-sdk/pull/2783) * Add versioning to integration manager API /register and /account calls [\#2782](https://github.com/matrix-org/matrix-react-sdk/pull/2782) - * Ensure scalar_token is valid before opening integrations manager + * Ensure scalar_token is valid before opening integration manager [\#2777](https://github.com/matrix-org/matrix-react-sdk/pull/2777) * Switch to `yarn` for dependency management [\#2773](https://github.com/matrix-org/matrix-react-sdk/pull/2773) diff --git a/src/components/views/dialogs/IntegrationsImpossibleDialog.js b/src/components/views/dialogs/IntegrationsImpossibleDialog.js index 2cf9daa7ea..30b6904f27 100644 --- a/src/components/views/dialogs/IntegrationsImpossibleDialog.js +++ b/src/components/views/dialogs/IntegrationsImpossibleDialog.js @@ -46,7 +46,7 @@ export default class IntegrationsImpossibleDialog extends React.Component {

{_t( - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. " + + "Your %(brand)s doesn't allow you to use an integration manager to do this. " + "Please contact an admin.", { brand }, )} diff --git a/src/components/views/dialogs/TermsDialog.tsx b/src/components/views/dialogs/TermsDialog.tsx index 49a801b8cf..58126f77c3 100644 --- a/src/components/views/dialogs/TermsDialog.tsx +++ b/src/components/views/dialogs/TermsDialog.tsx @@ -92,7 +92,7 @@ export default class TermsDialog extends React.PureComponent{_t("Identity server")}
({host})

; case SERVICE_TYPES.IM: - return
{_t("Integration Manager")}
({host})
; + return
{_t("Integration manager")}
({host})
; } } diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index 152d3c6b95..c1f370b626 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -114,7 +114,7 @@ export default class AppPermission extends React.Component { // Due to i18n limitations, we can't dedupe the code for variables in these two messages. const warning = this.state.isWrapped - ? _t("Using this widget may share data with %(widgetDomain)s & your Integration Manager.", + ? _t("Using this widget may share data with %(widgetDomain)s & your integration manager.", { widgetDomain: this.state.widgetDomain }, { helpIcon: () => warningTooltip }) : _t("Using this widget may share data with %(widgetDomain)s.", { widgetDomain: this.state.widgetDomain }, { helpIcon: () => warningTooltip }); diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index a66186d116..c0e6826ba5 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -224,7 +224,7 @@ export default class Stickerpicker extends React.PureComponent { } _getStickerpickerContent() { - // Handle Integration Manager errors + // Handle integration manager errors if (this.state._imError) { return this._errorStickerpickerContent(); } diff --git a/src/components/views/settings/SetIntegrationManager.tsx b/src/components/views/settings/SetIntegrationManager.tsx index ada78e2848..f1922f93ee 100644 --- a/src/components/views/settings/SetIntegrationManager.tsx +++ b/src/components/views/settings/SetIntegrationManager.tsx @@ -65,13 +65,13 @@ export default class SetIntegrationManager extends React.Component(%(serverName)s) to manage bots, widgets, " + + "Use an integration manager (%(serverName)s) to manage bots, widgets, " + "and sticker packs.", { serverName: currentManager.name }, { b: sub => {sub} }, ); } else { - bodyText = _t("Use an Integration Manager to manage bots, widgets, and sticker packs."); + bodyText = _t("Use an integration manager to manage bots, widgets, and sticker packs."); } return ( @@ -86,7 +86,7 @@ export default class SetIntegrationManager extends React.Component
{_t( - "Integration Managers receive configuration data, and can modify widgets, " + + "Integration managers receive configuration data, and can modify widgets, " + "send room invites, and set power levels on your behalf.", )} diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 6ff80501fd..28c2dd914b 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -388,7 +388,7 @@ "Widget added by": "عنصر واجهة أضافه", "Widgets do not use message encryption.": "عناصر الواجهة لا تستخدم تشفير الرسائل.", "Using this widget may share data with %(widgetDomain)s.": "قد يؤدي استخدام هذه الأداة إلى مشاركة البيانات مع%(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "قد يؤدي استخدام عنصر واجهة المستخدم هذا إلى مشاركة البيانات مع %(widgetDomain)s ومدير التكامل الخاص بك.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "قد يؤدي استخدام عنصر واجهة المستخدم هذا إلى مشاركة البيانات مع %(widgetDomain)s ومدير التكامل الخاص بك.", "Widget ID": "معرّف عنصر واجهة", "Room ID": "معرّف الغرفة", "%(brand)s URL": "رابط %(brand)s", @@ -783,10 +783,10 @@ "New version available. Update now.": "ثمة إصدارٌ جديد. حدّث الآن.", "Check for update": "ابحث عن تحديث", "Error encountered (%(errorDetail)s).": "صودِفَ خطأ: (%(errorDetail)s).", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "يتلقى مديرو التكامل بيانات الضبط ، ويمكنهم تعديل عناصر واجهة المستخدم ، وإرسال دعوات الغرف ، وتعيين مستويات القوة نيابة عنك.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "يتلقى مديرو التكامل بيانات الضبط ، ويمكنهم تعديل عناصر واجهة المستخدم ، وإرسال دعوات الغرف ، وتعيين مستويات القوة نيابة عنك.", "Manage integrations": "إدارة التكاملات", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل (%(serverName)s) لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل (%(serverName)s) لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", "Change": "تغيير", "Enter a new identity server": "أدخل خادم هوية جديدًا", "Do not use an identity server": "لا تستخدم خادم هوية", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 77b5d84450..7b830fe22e 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1428,7 +1428,7 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "В момента не използвате сървър за самоличност. За да откривате и да бъдете открити от познати ваши контакти, добавете такъв по-долу.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Прекъсването на връзката със сървъра ви за самоличност означава че няма да можете да бъдете открити от други потребители или да каните хора по имейл или телефонен номер.", "Enter a new identity server": "Въведете нов сървър за самоличност", - "Integration Manager": "Мениджър на интеграции", + "Integration manager": "Мениджър на интеграции", "Discovery": "Откриване", "Deactivate account": "Деактивиране на акаунт", "Always show the window menu bar": "Винаги показвай менютата на прозореца", @@ -1640,10 +1640,10 @@ "Backup has a invalid signature from this user": "Резервното копие има невалиден подпис за този потребител", "Backup has a signature from unknown user with ID %(deviceId)s": "Резервното копие има подпис от непознат потребител с идентификатор %(deviceId)s", "Backup key stored: ": "Резервният ключ е съхранен: ", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции %(serverName)s за управление на ботове, приспособления и стикери.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции за управление на ботове, приспособления и стикери.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции %(serverName)s за управление на ботове, приспособления и стикери.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции за управление на ботове, приспособления и стикери.", "Manage integrations": "Управление на интеграциите", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Мениджърът на интеграции получава конфигурационни данни, може да модифицира приспособления, да изпраща покани за стаи и да настройва нива на достъп от ваше име.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Мениджърът на интеграции получава конфигурационни данни, може да модифицира приспособления, да изпраща покани за стаи и да настройва нива на достъп от ваше име.", "Customise your experience with experimental labs features. Learn more.": "Настройте изживяването си с експериментални функции. Научи повече.", "Ignored/Blocked": "Игнорирани/блокирани", "Error adding ignored user/server": "Грешка при добавяне на игнориран потребител/сървър", @@ -1701,7 +1701,7 @@ "%(brand)s URL": "%(brand)s URL адрес", "Room ID": "Идентификатор на стаята", "Widget ID": "Идентификатор на приспособлението", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s и с мениджъра на интеграции.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s и с мениджъра на интеграции.", "Using this widget may share data with %(widgetDomain)s.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s.", "Widgets do not use message encryption.": "Приспособленията не използваш шифроване на съобщенията.", "Widget added by": "Приспособлението е добавено от", @@ -1711,7 +1711,7 @@ "Integrations are disabled": "Интеграциите са изключени", "Enable 'Manage Integrations' in Settings to do this.": "Включете 'Управление на интеграции' от настройките за направите това.", "Integrations not allowed": "Интеграциите не са разрешени", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Вашият %(brand)s не позволява да използвате мениджъра на интеграции за да направите това. Свържете се с администратор.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Вашият %(brand)s не позволява да използвате мениджъра на интеграции за да направите това. Свържете се с администратор.", "Automatically invite users": "Автоматично кани потребители", "Upgrade private room": "Обнови лична стая", "Upgrade public room": "Обнови публична стая", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 8a6ac461b6..4bc44dfb80 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -842,7 +842,7 @@ "Unexpected error resolving identity server configuration": "Error inesperat resolent la configuració del servidor d'identitat", "Unexpected error resolving homeserver configuration": "Error inesperat resolent la configuració del servidor local", "(an error occurred)": "(s'ha produït un error)", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Els gestors d'integracions reben dades de configuració i poden modificar ginys, enviar invitacions a sales i establir nivells d'autoritat en nom teu.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Els gestors d'integracions reben dades de configuració i poden modificar ginys, enviar invitacions a sales i establir nivells d'autoritat en nom teu.", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "S'ha produït un error en canviar els requisits del nivell d'autoritat de la sala. Assegura't que tens suficients permisos i torna-ho a provar.", "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "S'ha produït un error en canviar el nivell d'autoritat de l'usuari. Assegura't que tens suficients permisos i torna-ho a provar.", "Power level": "Nivell d'autoritat", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index f6956ddf99..60a2ea3e6f 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1402,7 +1402,7 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Použití serveru identit je volitelné. Nemusíte server identit používat, ale nepůjde vás pak najít podle e-mailové adresy ani telefonního čísla a vy také nebudete moci hledat ostatní.", "Do not use an identity server": "Nepoužívat server identit", "Enter a new identity server": "Zadejte nový server identit", - "Integration Manager": "Správce integrací", + "Integration manager": "Správce integrací", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Pro zapsáním do registru e-mailových adres a telefonních čísel odsouhlaste podmínky používání serveru (%(serverName)s).", "Deactivate account": "Deaktivace účtu", "Always show the window menu bar": "Vždy zobrazovat horní lištu okna", @@ -1619,10 +1619,10 @@ "Cannot connect to integration manager": "Nepovedlo se připojení ke správci integrací", "The integration manager is offline or it cannot reach your homeserver.": "Správce integrací neběží nebo se nemůže připojit k vašemu domovskému serveru.", "Clear notifications": "Odstranit oznámení", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a samolepek.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a samolepek.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a samolepek.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a samolepek.", "Manage integrations": "Správa integrací", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Správce integrací dostává konfigurační data a může za vás modifikovat widgety, posílat pozvánky a nastavovat úrovně oprávnění.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Správce integrací dostává konfigurační data a může za vás modifikovat widgety, posílat pozvánky a nastavovat úrovně oprávnění.", "Customise your experience with experimental labs features. Learn more.": "Přizpůsobte si aplikaci s experimentálními funkcemi. Více informací.", "Ignored/Blocked": "Ignorováno/Blokováno", "Error adding ignored user/server": "Chyba při přidávání ignorovaného uživatele/serveru", @@ -1672,7 +1672,7 @@ "%(brand)s URL": "URL %(brand)su", "Room ID": "ID místnosti", "Widget ID": "ID widgetu", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s a vaším správcem integrací.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s a vaším správcem integrací.", "Using this widget may share data with %(widgetDomain)s.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgety nepoužívají šifrování zpráv.", "Widget added by": "Widget přidal", @@ -1681,7 +1681,7 @@ "Integrations are disabled": "Integrace jsou zakázané", "Enable 'Manage Integrations' in Settings to do this.": "Pro provedení této akce povolte v nastavení správu integrací.", "Integrations not allowed": "Integrace nejsou povolené", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Váš %(brand)s neumožňuje použít správce integrací. Kontaktujte prosím správce.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Váš %(brand)s neumožňuje použít správce integrací. Kontaktujte prosím správce.", "Automatically invite users": "Automaticky zvát uživatele", "Upgrade private room": "Upgradovat soukromou místnost", "Upgrade public room": "Upgradovat veřejnou místnost", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 23c362ec00..00530b0457 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1396,8 +1396,8 @@ "You are still sharing your personal data on the identity server .": "Du teilst deine persönlichen Daten immer noch auf dem Identitätsserver .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine E-Mail-Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Zur Zeit benutzt du keinen Identitätsserver. Trage unten einen Server ein, um Kontakte finden und von anderen gefunden zu werden.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.", "Manage integrations": "Integrationen verwalten", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Stimme den Nutzungsbedingungen des Identitätsservers %(serverName)s zu, um dich per E-Mail-Adresse und Telefonnummer auffindbar zu machen.", "Clear cache and reload": "Zwischenspeicher löschen und neu laden", @@ -1594,7 +1594,7 @@ "This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde", "Enable desktop notifications for this session": "Desktopbenachrichtigungen in dieser Sitzung", "Enable audible notifications for this session": "Benachrichtigungstöne in dieser Sitzung", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", "Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)", "Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", "Session key:": "Sitzungsschlüssel:", @@ -1909,7 +1909,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "Raum-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s und deinem Integrationsserver übertragen werden.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s und deinem Integrationsserver übertragen werden.", "Using this widget may share data with %(widgetDomain)s.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s übertragen werden.", "Widgets do not use message encryption.": "Widgets verwenden keine Nachrichtenverschlüsselung.", "Please create a new issue on GitHub so that we can investigate this bug.": "Bitte erstelle ein neues Issue auf GitHub damit wir diesen Fehler untersuchen können.", @@ -1993,7 +1993,7 @@ "You'll upgrade this room from to .": "Du wirst diesen Raum von zu aktualisieren.", "Missing session data": "Fehlende Sitzungsdaten", "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", - "Integration Manager": "Integrationsverwaltung", + "Integration manager": "Integrationsverwaltung", "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", @@ -2072,7 +2072,7 @@ "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein %(brand)s erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Dein %(brand)s erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut.", "We couldn't invite those users. Please check the users you want to invite and try again.": "Wir konnten diese Benutzer nicht einladen. Bitte überprüfe sie und versuche es erneut.", "Start a conversation with someone using their name, username (like ) or email address.": "Starte eine Unterhaltung mit jemandem indem du seinen Namen, Benutzernamen (z.B. ) oder E-Mail-Adresse eingibst.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 545fdb937a..6eb5d37820 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1231,10 +1231,10 @@ "Do not use an identity server": "Do not use an identity server", "Enter a new identity server": "Enter a new identity server", "Change": "Change", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Use an Integration Manager to manage bots, widgets, and sticker packs.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Use an integration manager to manage bots, widgets, and sticker packs.", "Manage integrations": "Manage integrations", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.", "Add": "Add", "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", "Checking for an update...": "Checking for an update...", @@ -1967,7 +1967,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "Room ID", "Widget ID": "Widget ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Using this widget may share data with %(widgetDomain)s & your Integration Manager.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Using this widget may share data with %(widgetDomain)s & your integration manager.", "Using this widget may share data with %(widgetDomain)s.": "Using this widget may share data with %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgets do not use message encryption.", "Widget added by": "Widget added by", @@ -2285,7 +2285,7 @@ "Integrations are disabled": "Integrations are disabled", "Enable 'Manage Integrations' in Settings to do this.": "Enable 'Manage Integrations' in Settings to do this.", "Integrations not allowed": "Integrations not allowed", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.", "To continue, use Single Sign On to prove your identity.": "To continue, use Single Sign On to prove your identity.", "Confirm to continue": "Confirm to continue", "Click the button below to confirm your identity.": "Click the button below to confirm your identity.", @@ -2440,7 +2440,7 @@ "Missing session data": "Missing session data", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.", "Your browser likely removed this data when running low on disk space.": "Your browser likely removed this data when running low on disk space.", - "Integration Manager": "Integration Manager", + "Integration manager": "Integration manager", "Find others by phone or email": "Find others by phone or email", "Be found by phone or email": "Be found by phone or email", "Use bots, bridges, widgets and sticker packs": "Use bots, bridges, widgets and sticker packs", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index d19baf68dc..c8a1218a48 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1491,7 +1491,7 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "kontrolu kromprogramojn de via foliumilo je ĉio, kio povus malhelpi konekton al la identiga servilo (ekzemple « Privacy Badger »)", "contact the administrators of identity server ": "kontaktu la administrantojn de la identiga servilo ", "wait and try again later": "atendu kaj reprovu pli poste", - "Integration Manager": "Kunigilo", + "Integration manager": "Kunigilo", "Clear cache and reload": "Vakigi kaŝmemoron kaj relegi", "Show tray icon and minimize window to it on close": "Montri pletan bildsimbolon kaj tien plejetigi la fenestron je fermo", "Read Marker lifetime (ms)": "Vivodaŭro de legomarko (ms)", @@ -1808,10 +1808,10 @@ "Your keys are not being backed up from this session.": "Viaj ŝlosiloj ne estas savkopiataj el ĉi tiu salutaĵo.", "Enable desktop notifications for this session": "Ŝalti labortablajn sciigojn por ĉi tiu salutaĵo", "Enable audible notifications for this session": "Ŝalti aŭdeblajn sciigojn por ĉi tiu salutaĵo", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Uzu kunigilon (%(serverName)s) por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Uzu kunigilon por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Uzu kunigilon (%(serverName)s) por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Uzu kunigilon por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", "Manage integrations": "Administri kunigojn", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi povnivelojn.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi povnivelojn.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Via pasvorto sukcese ŝanĝiĝis. Vi ne ricevados pasivajn sciigojn en aliaj salutaĵoj, ĝis vi ilin resalutos", "Error downloading theme information.": "Eraris elŝuto de informoj pri haŭto.", "Theme added!": "Haŭto aldoniĝis!", @@ -1895,7 +1895,7 @@ "Declining …": "Rifuzante…", " reacted with %(content)s": " reagis per %(content)s", "Any of the following data may be shared:": "Ĉiu el la jenaj datumoj povas kunhaviĝi:", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s kaj via kunigilo.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s kaj via kunigilo.", "Using this widget may share data with %(widgetDomain)s.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s.", "Language Dropdown": "Lingva falmenuo", "Destroy cross-signing keys?": "Ĉu detrui delege ĉifrajn ŝlosilojn?", @@ -1911,7 +1911,7 @@ "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Kontrolu ĉi tiun aparaton por marki ĝin fidata. Fidado povas pacigi la menson de vi kaj aliaj uzantoj dum uzado de tutvoje ĉifrataj mesaĝoj.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Kontrolo de ĉi tiu aparato markos ĝin fidata, kaj ankaŭ la uzantoj, kiuj interkontrolis kun vi, fidos ĉi tiun aparaton.", "Enable 'Manage Integrations' in Settings to do this.": "Ŝaltu «Administri kunigojn» en Agordoj, por fari ĉi tion.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Via %(brand)so ne permesas al vi uzi kunigilon por tio. Bonvolu kontakti administranton.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Via %(brand)so ne permesas al vi uzi kunigilon por tio. Bonvolu kontakti administranton.", "Failed to invite the following users to chat: %(csvUsers)s": "Malsukcesis inviti la jenajn uzantojn al babilo: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Ni ne povis krei vian rektan ĉambron. Bonvolu kontroli, kiujn uzantojn vi invitas, kaj reprovu.", "Something went wrong trying to invite the users.": "Io eraris dum invito de la uzantoj.", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 024ae81511..aca817a318 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1227,7 +1227,7 @@ "Enter a new identity server": "Introducir un servidor de identidad nuevo", "Change": "Cambiar", "Manage integrations": "Gestionar integraciones", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establecer niveles de poder en tu nombre.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establecer niveles de poder en tu nombre.", "Something went wrong trying to invite the users.": "Algo salió mal al intentar invitar a los usuarios.", "We couldn't invite those users. Please check the users you want to invite and try again.": "No se pudo invitar a esos usuarios. Por favor, revisa los usuarios que quieres invitar e inténtalo de nuevo.", "Failed to find the following users": "No se encontró a los siguientes usuarios", @@ -1537,8 +1537,8 @@ "You are still sharing your personal data on the identity server .": "Usted todavía está compartiendo sus datos personales en el servidor de identidad .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Le recomendamos que elimine sus direcciones de correo electrónico y números de teléfono del servidor de identidad antes de desconectarse.", "Go back": "Atrás", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usar un gestor de integraciones (%(serverName)s) para manejar los bots, widgets y paquetes de pegatinas.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Utiliza un Administrador de Integración para gestionar los bots, los widgets y los paquetes de pegatinas.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usar un gestor de integraciones (%(serverName)s) para manejar los bots, widgets y paquetes de pegatinas.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Utiliza un Administrador de Integración para gestionar los bots, los widgets y los paquetes de pegatinas.", "Invalid theme schema.": "Esquema de tema inválido.", "Error downloading theme information.": "Error al descargar la información del tema.", "Theme added!": "¡Se añadió el tema!", @@ -1666,7 +1666,7 @@ "Integrations are disabled": "Las integraciones están desactivadas", "Enable 'Manage Integrations' in Settings to do this.": "Activa «Gestionar integraciones» en ajustes para hacer esto.", "Integrations not allowed": "Integraciones no están permitidas", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s no utilizar un \"gestor de integración\" para hacer esto. Por favor, contacta con un administrador.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s no utilizar un \"gestor de integración\" para hacer esto. Por favor, contacta con un administrador.", "Failed to invite the following users to chat: %(csvUsers)s": "Error invitando a los siguientes usuarios al chat: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "No se ha podido crear el mensaje directo. Por favor, comprueba los usuarios que quieres invitar e inténtalo de nuevo.", "Start a conversation with someone using their name, username (like ) or email address.": "Iniciar una conversación con alguien usando su nombre, nombre de usuario (como ) o dirección de correo electrónico.", @@ -1868,7 +1868,7 @@ "%(brand)s URL": "URL de %(brand)s", "Room ID": "ID de la sala", "Widget ID": "ID del widget", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s y su administrador de integración.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s y su administrador de integración.", "Using this widget may share data with %(widgetDomain)s.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s.", "Widgets do not use message encryption.": "Los widgets no utilizan el cifrado de mensajes.", "Widget added by": "Widget añadido por", @@ -1894,7 +1894,7 @@ "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Para ayudar a evitar la duplicación de entradas, por favor ver primero los entradas existentes (y añadir un +1) o, si no lo encuentra, crear una nueva entrada .", "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reportar este mensaje enviará su único «event ID al administrador de tu servidor base. Si los mensajes en esta sala están cifrados, el administrador de tu servidor no podrá leer el texto del mensaje ni ver ningún archivo o imagen.", "Command Help": "Ayuda del comando", - "Integration Manager": "Administrador de integración", + "Integration manager": "Administrador de integración", "Verify other session": "Verificar otra sesión", "Verification Request": "Solicitud de verificación", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Un widget localizado en %(widgetUrl)s desea verificar su identidad. Permitiendo esto, el widget podrá verificar su identidad de usuario, pero no realizar acciones como usted.", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index ef7c5f792b..765e5b7282 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -279,7 +279,7 @@ "Missing session data": "Sessiooni andmed on puudu", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Osa sessiooniandmetest, sealhulgas sõnumi krüptovõtmed, on puudu. Vea parandamiseks logi välja ja sisse, vajadusel taasta võtmed varundusest.", "Your browser likely removed this data when running low on disk space.": "On võimalik et sinu brauser kustutas need andmed, sest kõvakettaruumist jäi puudu.", - "Integration Manager": "Lõiminguhaldur", + "Integration manager": "Lõiminguhaldur", "Find others by phone or email": "Leia teisi kasutajaid telefoninumbri või e-posti aadressi alusel", "Be found by phone or email": "Ole leitav telefoninumbri või e-posti aadressi alusel", "Terms of Service": "Kasutustingimused", @@ -1526,7 +1526,7 @@ "Integrations are disabled": "Lõimingud ei ole kasutusel", "Enable 'Manage Integrations' in Settings to do this.": "Selle tegevuse kasutuselevõetuks lülita seadetes sisse „Halda lõiminguid“ valik.", "Integrations not allowed": "Lõimingute kasutamine ei ole lubatud", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Sinu %(brand)s ei võimalda selle tegevuse jaoks kasutada Lõimingute haldurit. Palun küsi lisateavet administraatorilt.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Sinu %(brand)s ei võimalda selle tegevuse jaoks kasutada Lõimingute haldurit. Palun küsi lisateavet administraatorilt.", "Failed to invite the following users to chat: %(csvUsers)s": "Järgnevate kasutajate vestlema kutsumine ei õnnestunud: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Otsevestluse loomine ei õnnestunud. Palun kontrolli, et kasutajanimed oleks õiged ja proovi uuesti.", "a new master key signature": "uus üldvõtme allkiri", @@ -1720,7 +1720,7 @@ "Failed to deactivate user": "Kasutaja deaktiveerimine ei õnnestunud", "This client does not support end-to-end encryption.": "See klient ei toeta läbivat krüptimist.", "Security": "Turvalisus", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s ning sinu vidinahalduriga.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s ning sinu vidinahalduriga.", "Using this widget may share data with %(widgetDomain)s.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s.", "Widgets do not use message encryption.": "Erinevalt sõnumitest vidinad ei kasuta krüptimist.", "Widget added by": "Vidina lisaja", @@ -2277,10 +2277,10 @@ "Do not use an identity server": "Ära kasuta isikutuvastusserverit", "Enter a new identity server": "Sisesta uue isikutuvastusserveri nimi", "Change": "Muuda", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide jaoks kasuta lõiminguhaldurit (%(serverName)s).", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide seadistamiseks kasuta lõiminguhaldurit.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide jaoks kasuta lõiminguhaldurit (%(serverName)s).", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide seadistamiseks kasuta lõiminguhaldurit.", "Manage integrations": "Halda lõiminguid", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Lõiminguhalduritel on laiad volitused - nad võivad sinu nimel lugeda seadistusi, kohandada vidinaid, saata jututubade kutseid ning määrata õigusi.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Lõiminguhalduritel on laiad volitused - nad võivad sinu nimel lugeda seadistusi, kohandada vidinaid, saata jututubade kutseid ning määrata õigusi.", "Define the power level of a user": "Määra kasutaja õigused", "Command failed": "Käsk ei toiminud", "Opens the Developer Tools dialog": "Avab arendusvahendite akna", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 3789155349..667999c04f 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1418,7 +1418,7 @@ "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": " erabiltzen ari zara kontaktua aurkitzeko eta aurkigarria izateko. Zure identitate-zerbitzaria aldatu dezakezu azpian.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Orain ez duzu identitate-zerbitzaririk erabiltzen. Kontaktuak aurkitzeko eta aurkigarria izateko, gehitu bat azpian.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Zure identitate-zerbitzaritik deskonektatzean ez zara beste erabiltzaileentzat aurkigarria izango eta ezin izango dituzu besteak gonbidatu e-mail helbidea edo telefono zenbakia erabiliz.", - "Integration Manager": "Integrazio-kudeatzailea", + "Integration manager": "Integrazio-kudeatzailea", "Discovery": "Aurkitzea", "Deactivate account": "Desaktibatu kontua", "Always show the window menu bar": "Erakutsi beti leihoaren menu barra", @@ -1604,10 +1604,10 @@ "Cannot connect to integration manager": "Ezin da integrazio kudeatzailearekin konektatu", "The integration manager is offline or it cannot reach your homeserver.": "Integrazio kudeatzailea lineaz kanpo dago edo ezin du zure hasiera-zerbitzaria atzitu.", "Clear notifications": "Garbitu jakinarazpenak", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Erabili (%(serverName)s) integrazio kudeatzailea botak, trepetak eta eranskailu multzoak kudeatzeko.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Erabili integrazio kudeatzaile bat botak, trepetak eta eranskailu multzoak kudeatzeko.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Erabili (%(serverName)s) integrazio kudeatzailea botak, trepetak eta eranskailu multzoak kudeatzeko.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Erabili integrazio kudeatzaile bat botak, trepetak eta eranskailu multzoak kudeatzeko.", "Manage integrations": "Kudeatu integrazioak", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrazio kudeatzaileek konfigurazio datuak jasotzen dituzte, eta trepetak aldatu ditzakete, gelara gonbidapenak bidali, eta botere mailak zure izenean ezarri.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrazio kudeatzaileek konfigurazio datuak jasotzen dituzte, eta trepetak aldatu ditzakete, gelara gonbidapenak bidali, eta botere mailak zure izenean ezarri.", "Customise your experience with experimental labs features. Learn more.": "Pertsonalizatu zure esperientzia laborategiko ezaugarri esperimentalekin. Ikasi gehiago.", "Ignored/Blocked": "Ezikusia/Blokeatuta", "Error adding ignored user/server": "Errorea ezikusitako erabiltzaile edo zerbitzaria gehitzean", @@ -1653,7 +1653,7 @@ "%(brand)s URL": "%(brand)s URL-a", "Room ID": "Gelaren ID-a", "Widget ID": "Trepetaren ID-a", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin eta zure integrazio kudeatzailearekin datuak partekatu daitezke.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin eta zure integrazio kudeatzailearekin datuak partekatu daitezke.", "Using this widget may share data with %(widgetDomain)s.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin datuak partekatu daitezke.", "Widgets do not use message encryption.": "Trepetek ez dute mezuen zifratzea erabiltzen.", "Widget added by": "Trepeta honek gehitu du:", @@ -1662,7 +1662,7 @@ "Integrations are disabled": "Integrazioak desgaituta daude", "Enable 'Manage Integrations' in Settings to do this.": "Gaitu 'Kudeatu integrazioak' ezarpenetan hau egiteko.", "Integrations not allowed": "Integrazioak ez daude baimenduta", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Zure %(brand)s aplikazioak ez dizu hau egiteko integrazio kudeatzaile bat erabiltzen uzten. Kontaktatu administratzaileren batekin.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Zure %(brand)s aplikazioak ez dizu hau egiteko integrazio kudeatzaile bat erabiltzen uzten. Kontaktatu administratzaileren batekin.", "Reload": "Birkargatu", "Take picture": "Atera argazkia", "Remove for everyone": "Kendu denentzat", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index bb147b5a20..a5bfb0bddb 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -946,7 +946,7 @@ "Country Dropdown": "لیست کشور", "Verification Request": "درخواست تأیید", "Send report": "ارسال گزارش", - "Integration Manager": "مدیر یکپارچه‌سازی", + "Integration manager": "مدیر یکپارچه‌سازی", "Command Help": "راهنمای دستور", "Message edits": "ویرایش پیام", "Upload all": "بارگذاری همه", @@ -973,7 +973,7 @@ "Click the button below to confirm your identity.": "برای تأیید هویت خود بر روی دکمه زیر کلیک کنید.", "Confirm to continue": "برای ادامه تأیید کنید", "To continue, use Single Sign On to prove your identity.": "برای ادامه از احراز هویت یکپارچه جهت اثبات هویت خود استفاده نمائید.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s شما اجازه استفاده از سیستم مدیریت ادغام را برای این کار نمی دهد. لطفا با ادمین تماس بگیرید.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s شما اجازه استفاده از سیستم مدیریت ادغام را برای این کار نمی دهد. لطفا با ادمین تماس بگیرید.", "Integrations not allowed": "یکپارچه‌سازی‌ها اجازه داده نشده‌اند", "Enable 'Manage Integrations' in Settings to do this.": "برای انجام این کار 'مدیریت پکپارچه‌سازی‌ها' را در تنظیمات فعال نمائید.", "Integrations are disabled": "پکپارچه‌سازی‌ها غیر فعال هستند", @@ -1691,7 +1691,7 @@ "Using this widget may share data with %(widgetDomain)s.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s به اشتراک بگذارد.", "New Recovery Method": "روش بازیابی جدید", "A new Security Phrase and key for Secure Messages have been detected.": "یک عبارت امنیتی و کلید جدید برای پیام‌رسانی امن شناسایی شد.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s و سیستم مدیریت ادغام به اشتراک بگذارد.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s و سیستم مدیریت ادغام به اشتراک بگذارد.", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "اگر روش بازیابی جدیدی را تنظیم نکرده‌اید، ممکن است حمله‌کننده‌ای تلاش کند به حساب کاربری شما دسترسی پیدا کند. لطفا گذرواژه حساب کاربری خود را تغییر داده و فورا یک روش جدیدِ بازیابی در بخش تنظیمات انتخاب کنید.", "Widget ID": "شناسه ابزارک", "Room ID": "شناسه اتاق", @@ -1882,7 +1882,7 @@ "Use between %(min)s pt and %(max)s pt": "از عددی بین %(min)s pt و %(max)s pt استفاده کنید", "Custom font size can only be between %(min)s pt and %(max)s pt": "اندازه فونت دلخواه تنها می‌تواند عددی بین %(min)s pt و %(max)s pt باشد", "New version available. Update now.": "نسخه‌ی جدید موجود است. هم‌اکنون به‌روزرسانی کنید.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی (%(serverName)s) برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر استفاده کنید.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی (%(serverName)s) برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر استفاده کنید.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "استفاده از سرور هویت‌سنجی اختیاری است. اگر تصمیم بگیرید از سرور هویت‌سنجی استفاده نکنید، شما با استفاده از آدرس ایمیل و شماره تلفن قابل یافته‌شدن و دعوت‌شدن توسط سایر کاربران نخواهید بود.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "قطع ارتباط با سرور هویت‌سنجی به این معناست که شما از طریق ادرس ایمیل و شماره تلفن، بیش از این قابل یافته‌شدن و دعوت‌شدن توسط کاربران دیگر نیستید.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "در حال حاضر از سرور هویت‌سنجی استفاده نمی‌کنید. برای یافتن و یافته‌شدن توسط مخاطبان موجود که شما آن‌ها را می‌شناسید، یک مورد در پایین اضافه کنید.", @@ -2864,9 +2864,9 @@ "Size must be a number": "سایز باید یک عدد باشد", "Hey you. You're the best!": "سلام. حال شما خوبه؟", "Check for update": "بررسی برای به‌روزرسانی جدید", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "مدیرهای یکپارچه‌سازی، داده‌های مربوط به پیکربندی را دریافت کرده و امکان تغییر ویجت‌ها، ارسال دعوتنامه برای اتاق و تنظیم سطح دسترسی از طرف شما را دارا هستند.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "مدیرهای یکپارچه‌سازی، داده‌های مربوط به پیکربندی را دریافت کرده و امکان تغییر ویجت‌ها، ارسال دعوتنامه برای اتاق و تنظیم سطح دسترسی از طرف شما را دارا هستند.", "Manage integrations": "مدیریت پکپارچه‌سازی‌ها", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر مورد نظرتان استفاده نمائید.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر مورد نظرتان استفاده نمائید.", "Change": "تغییر بده", "Enter a new identity server": "یک سرور هویت‌سنجی جدید وارد کنید", "Do not use an identity server": "از سرور هویت‌سنجی استفاده نکن", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index a9a3b80fb8..05d52e0e1b 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1597,10 +1597,10 @@ "Connecting to integration manager...": "Yhdistetään integraatioiden lähteeseen...", "Cannot connect to integration manager": "Integraatioiden lähteeseen yhdistäminen epäonnistui", "The integration manager is offline or it cannot reach your homeserver.": "Integraatioiden lähde on poissa verkosta, tai siihen ei voida yhdistää kotipalvelimeltasi.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä (%(serverName)s) bottien, sovelmien ja tarrapakettien hallintaan.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä bottien, sovelmien ja tarrapakettien hallintaan.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä (%(serverName)s) bottien, sovelmien ja tarrapakettien hallintaan.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä bottien, sovelmien ja tarrapakettien hallintaan.", "Manage integrations": "Hallitse integraatioita", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integraatioiden lähteet vastaanottavat asetusdataa ja voivat muokata sovelmia, lähettää kutsuja huoneeseen ja asettaa oikeustasoja puolestasi.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integraatioiden lähteet vastaanottavat asetusdataa ja voivat muokata sovelmia, lähettää kutsuja huoneeseen ja asettaa oikeustasoja puolestasi.", "Discovery": "Käyttäjien etsintä", "Ignored/Blocked": "Sivuutettu/estetty", "Error adding ignored user/server": "Virhe sivuutetun käyttäjän/palvelimen lisäämisessä", @@ -1621,7 +1621,7 @@ "Subscribed lists": "Tilatut listat", "Subscribing to a ban list will cause you to join it!": "Estolistan käyttäminen saa sinut liittymään listalle!", "If this isn't what you want, please use a different tool to ignore users.": "Jos et halua tätä, käytä eri työkalua käyttäjien sivuuttamiseen.", - "Integration Manager": "Integraatioiden lähde", + "Integration manager": "Integraatioiden lähde", "Read Marker lifetime (ms)": "Viestin luetuksi merkkaamisen kesto (ms)", "Click the link in the email you received to verify and then click continue again.": "Klikkaa lähettämässämme sähköpostissa olevaa linkkiä vahvistaaksesi tunnuksesi. Klikkaa sen jälkeen tällä sivulla olevaa painiketta ”Jatka”.", "Complete": "Valmis", @@ -1646,7 +1646,7 @@ "%(name)s cancelled": "%(name)s peruutti", "%(name)s wants to verify": "%(name)s haluaa varmentaa", "You sent a verification request": "Lähetit varmennuspyynnön", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Tämän sovelman käyttäminen saattaa jakaa tietoa osoitteille %(widgetDomain)s ja käyttämällesi integraatioiden lähteelle.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Tämän sovelman käyttäminen saattaa jakaa tietoa osoitteille %(widgetDomain)s ja käyttämällesi integraatioiden lähteelle.", "Widgets do not use message encryption.": "Sovelmat eivät käytä viestien salausta.", "More options": "Lisää asetuksia", "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Käytä identiteettipalvelinta kutsuaksesi henkilöitä sähköpostilla. Käytä oletusta (%(defaultIdentityServerName)s) tai aseta toinen palvelin asetuksissa.", @@ -1654,7 +1654,7 @@ "Integrations are disabled": "Integraatiot ovat pois käytöstä", "Enable 'Manage Integrations' in Settings to do this.": "Ota integraatiot käyttöön asetuksista kohdasta ”Hallitse integraatioita”.", "Integrations not allowed": "Integraatioiden käyttö on kielletty", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-instanssisi ei salli sinun käyttävän integraatioiden lähdettä tämän tekemiseen. Ota yhteys ylläpitäjääsi.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-instanssisi ei salli sinun käyttävän integraatioiden lähdettä tämän tekemiseen. Ota yhteys ylläpitäjääsi.", "Reload": "Lataa uudelleen", "Take picture": "Ota kuva", "Remove for everyone": "Poista kaikilta", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 9584af113a..662576c650 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1431,7 +1431,7 @@ "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Vous utilisez actuellement pour découvrir et être découvert par des contacts existants que vous connaissez. Vous pouvez changer votre serveur d’identité ci-dessous.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvert par les contacts existants que vous connaissez, ajoutez-en un ci-dessous.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La déconnexion de votre serveur d’identité signifie que vous ne serez plus découvrable par d’autres utilisateurs et que vous ne pourrez plus faire d’invitation par e-mail ou téléphone.", - "Integration Manager": "Gestionnaire d’intégration", + "Integration manager": "Gestionnaire d’intégration", "Call failed due to misconfigured server": "L’appel a échoué à cause d’un serveur mal configuré", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Demandez à l’administrateur de votre serveur d’accueil (%(homeserverDomain)s) de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Vous pouvez sinon essayer d’utiliser le serveur public turn.matrix.org, mais ça ne sera pas aussi fiable et votre adresse IP sera partagée avec ce serveur. Vous pouvez aussi gérer ce réglage dans les paramètres.", @@ -1639,23 +1639,23 @@ "%(brand)s URL": "URL de %(brand)s", "Room ID": "Identifiant du salon", "Widget ID": "Identifiant du widget", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s et votre gestionnaire d’intégrations.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s et votre gestionnaire d’intégrations.", "Using this widget may share data with %(widgetDomain)s.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s.", "Widget added by": "Widget ajouté par", "This widget may use cookies.": "Ce widget pourrait utiliser des cookies.", "Connecting to integration manager...": "Connexion au gestionnaire d’intégrations…", "Cannot connect to integration manager": "Impossible de se connecter au gestionnaire d’intégrations", "The integration manager is offline or it cannot reach your homeserver.": "Le gestionnaire d’intégrations est hors ligne ou il ne peut pas joindre votre serveur d’accueil.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations (%(serverName)s) pour gérer les robots, les widgets et les jeux d’autocollants.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations pour gérer les robots, les widgets et les jeux d’autocollants.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Les gestionnaires d’intégrations reçoivent les données de configuration et peuvent modifier les widgets, envoyer des invitations aux salons et définir les rangs à votre place.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations (%(serverName)s) pour gérer les robots, les widgets et les jeux d’autocollants.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations pour gérer les robots, les widgets et les jeux d’autocollants.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Les gestionnaires d’intégrations reçoivent les données de configuration et peuvent modifier les widgets, envoyer des invitations aux salons et définir les rangs à votre place.", "Failed to connect to integration manager": "Échec de la connexion au gestionnaire d’intégrations", "Widgets do not use message encryption.": "Les widgets n’utilisent pas le chiffrement des messages.", "More options": "Plus d’options", "Integrations are disabled": "Les intégrations sont désactivées", "Enable 'Manage Integrations' in Settings to do this.": "Activez « Gérer les intégrations » dans les paramètres pour faire ça.", "Integrations not allowed": "Les intégrations ne sont pas autorisées", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Votre %(brand)s ne vous autorise pas à utiliser un gestionnaire d’intégrations pour faire ça. Contactez un administrateur.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Votre %(brand)s ne vous autorise pas à utiliser un gestionnaire d’intégrations pour faire ça. Contactez un administrateur.", "Reload": "Recharger", "Take picture": "Prendre une photo", "Remove for everyone": "Supprimer pour tout le monde", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 04ab9013a2..5684a9c177 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1423,10 +1423,10 @@ "Do not use an identity server": "Non usar un servidor de identidade", "Enter a new identity server": "Escribe o novo servidor de identidade", "Change": "Cambiar", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integración (%(serverName)s) para xestionar bots, widgets e paquetes de pegatinas.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integracións para xestionar bots, widgets e paquetes de pegatinas.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integración (%(serverName)s) para xestionar bots, widgets e paquetes de pegatinas.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integracións para xestionar bots, widgets e paquetes de pegatinas.", "Manage integrations": "Xestionar integracións", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Os xestores de integracións reciben datos de configuración, e poden modificar os widgets, enviar convites das salas, e establecer roles no teu nome.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Os xestores de integracións reciben datos de configuración, e poden modificar os widgets, enviar convites das salas, e establecer roles no teu nome.", "New version available. Update now.": "Nova versión dispoñible. Actualiza.", "Size must be a number": "O tamaño ten que ser un número", "Custom font size can only be between %(min)s pt and %(max)s pt": "O tamaño da fonte só pode estar entre %(min)s pt e %(max)s pt", @@ -1796,7 +1796,7 @@ "%(brand)s URL": "URL %(brand)s", "Room ID": "ID da sala", "Widget ID": "ID do widget", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s e o teu Xestor de integracións.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s e o teu Xestor de integracións.", "Using this widget may share data with %(widgetDomain)s.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s.", "Widgets do not use message encryption.": "Os Widgets non usan cifrado de mensaxes.", "Widget added by": "Widget engadido por", @@ -1892,7 +1892,7 @@ "Integrations are disabled": "As Integracións están desactivadas", "Enable 'Manage Integrations' in Settings to do this.": "Activa 'Xestionar Integracións' nos Axustes para facer esto.", "Integrations not allowed": "Non se permiten Integracións", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "O teu %(brand)s non permite que uses o Xestor de Integracións, contacta coa administración.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "O teu %(brand)s non permite que uses o Xestor de Integracións, contacta coa administración.", "Confirm to continue": "Confirma para continuar", "Click the button below to confirm your identity.": "Preme no botón inferior para confirmar a túa identidade.", "Failed to invite the following users to chat: %(csvUsers)s": "Fallo ao convidar as seguintes usuarias a conversa: %(csvUsers)s", @@ -1969,7 +1969,7 @@ "Missing session data": "Faltan datos da sesión", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Faltan algúns datos da sesión, incluíndo chaves de mensaxes cifradas. Desconecta e volve a conectar para arranxalo, restaurando as chaves desde a copia.", "Your browser likely removed this data when running low on disk space.": "O navegador probablemente eliminou estos datos ao quedar con pouco espazo de disco.", - "Integration Manager": "Xestor de Integracións", + "Integration manager": "Xestor de Integracións", "Find others by phone or email": "Atopa a outras por teléfono ou email", "Be found by phone or email": "Permite ser atopada polo email ou teléfono", "Use bots, bridges, widgets and sticker packs": "Usa bots, pontes, widgets e paquetes de adhesivos", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 4f4a83108d..fc08c62814 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1790,7 +1790,7 @@ "Widget added by": "ישומון נוסף על ידי", "Widgets do not use message encryption.": "יישומונים אינם משתמשים בהצפנת הודעות.", "Using this widget may share data with %(widgetDomain)s.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s ומנהל האינטגרציה שלך.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s ומנהל האינטגרציה שלך.", "Widget ID": "קוד זהות הישומון", "Room ID": "קוד זהות החדר", "%(brand)s URL": "קישור %(brand)s", @@ -1999,10 +1999,10 @@ "Hey you. You're the best!": "היי, אתם אלופים!", "Check for update": "בדוק עדכונים", "New version available. Update now.": "גרסא חדשה קיימת. שדרגו עכשיו.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", "Manage integrations": "נהל שילובים", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName)s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName)s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", "Change": "שנה", "Enter a new identity server": "הכנס שרת הזדהות חדש", "Do not use an identity server": "אל תשתמש בשרת הזדהות", @@ -2291,7 +2291,7 @@ "Use bots, bridges, widgets and sticker packs": "השתמש בבוטים, גשרים, ווידג'טים וחבילות מדבקות", "Be found by phone or email": "להימצא בטלפון או בדוא\"ל", "Find others by phone or email": "מצא אחרים בטלפון או בדוא\"ל", - "Integration Manager": "מנהל אינטגרציה", + "Integration manager": "מנהל אינטגרציה", "Your browser likely removed this data when running low on disk space.": "סביר להניח שהדפדפן שלך הסיר נתונים אלה כאשר שטח הדיסק שלהם נמוך.", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "חלק מנתוני ההפעלה, כולל מפתחות הודעות מוצפנים, חסרים. צא והיכנס כדי לתקן זאת, ושחזר את המפתחות מהגיבוי.", "Missing session data": "חסרים נתוני הפעלות", @@ -2424,7 +2424,7 @@ "Click the button below to confirm your identity.": "לחץ על הלחצן למטה כדי לאשר את זהותך.", "Confirm to continue": "אשרו בכדי להמשיך", "To continue, use Single Sign On to prove your identity.": "כדי להמשיך, השתמש בכניסה יחידה כדי להוכיח את זהותך.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s שלכם אינו מאפשר לך להשתמש במנהל שילוב לשם כך. אנא צרו קשר עם מנהל מערכת.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s שלכם אינו מאפשר לך להשתמש במנהל שילוב לשם כך. אנא צרו קשר עם מנהל מערכת.", "Integrations not allowed": "שילובים אינם מורשים", "Enable 'Manage Integrations' in Settings to do this.": "אפשר 'ניהול אינטגרציות' בהגדרות כדי לעשות זאת.", "Integrations are disabled": "שילובים מושבתים", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index cd99b7750a..1dca0a1547 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1428,7 +1428,7 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Jelenleg nem használsz azonosítási szervert. Ahhoz, hogy e-mail cím, vagy egyéb azonosító alapján megtalálhassanak az ismerőseid, vagy te megtalálhasd őket, be kell állítanod egy azonosítási szervert.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ha az azonosítási szerverrel bontod a kapcsolatot az azt fogja eredményezni, hogy más felhasználók nem találnak rád és nem tudsz másokat meghívni e-mail cím vagy telefonszám alapján.", "Enter a new identity server": "Új azonosítási szerver hozzáadása", - "Integration Manager": "Integrációs Menedzser", + "Integration manager": "Integrációs Menedzser", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Azonosítási szerver (%(serverName)s) felhasználási feltételeinek elfogadása, ezáltal megtalálhatóvá válsz e-mail cím vagy telefonszám megadásával.", "Discovery": "Felkutatás", "Deactivate account": "Fiók zárolása", @@ -1639,7 +1639,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "Szoba azonosító", "Widget ID": "Kisalkalmazás azonosító", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg a(z) %(widgetDomain)s oldallal és az Integrációkezelővel.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg a(z) %(widgetDomain)s oldallal és az Integrációkezelővel.", "Using this widget may share data with %(widgetDomain)s.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg %(widgetDomain)s domain-nel.", "Widget added by": "A kisalkalmazást hozzáadta", "This widget may use cookies.": "Ez a kisalkalmazás sütiket használhat.", @@ -1651,15 +1651,15 @@ "Connecting to integration manager...": "Kapcsolódás az integrációs menedzserhez...", "Cannot connect to integration manager": "A kapcsolódás az integrációs menedzserhez sikertelen", "The integration manager is offline or it cannot reach your homeserver.": "Az integrációkezelő nem működik, vagy nem éri el a Matrix-kiszolgálóját.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert (%(serverName)s) a botok, kisalkalmazások és matrica csomagok kezeléséhez.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert a botok, kisalkalmazások és matrica csomagok kezeléséhez.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrációs Menedzser megkapja a konfigurációt, módosíthat kisalkalmazásokat, szobához meghívót küldhet és a hozzáférési szintet beállíthatja helyetted.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert (%(serverName)s) a botok, kisalkalmazások és matrica csomagok kezeléséhez.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert a botok, kisalkalmazások és matrica csomagok kezeléséhez.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrációs Menedzser megkapja a konfigurációt, módosíthat kisalkalmazásokat, szobához meghívót küldhet és a hozzáférési szintet beállíthatja helyetted.", "Failed to connect to integration manager": "Az integrációs menedzserhez nem sikerült csatlakozni", "Widgets do not use message encryption.": "A kisalkalmazások nem használnak üzenet titkosítást.", "Integrations are disabled": "Az integrációk le vannak tiltva", "Enable 'Manage Integrations' in Settings to do this.": "Ehhez engedélyezd az „Integrációk Kezelésé”-t a Beállításokban.", "Integrations not allowed": "Az integrációk nem engedélyezettek", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "A %(brand)sod nem használhat ehhez Integrációs Menedzsert. Kérlek vedd fel a kapcsolatot az adminisztrátorral.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "A %(brand)sod nem használhat ehhez Integrációs Menedzsert. Kérlek vedd fel a kapcsolatot az adminisztrátorral.", "Decline (%(counter)s)": "Elutasítás (%(counter)s)", "Manage integrations": "Integrációk kezelése", "Verification Request": "Ellenőrzési kérés", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index fe7e53d8c5..2a54e1f01d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1421,7 +1421,7 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Attualmente non stai usando un server di identità. Per trovare ed essere trovabile dai contatti esistenti che conosci, aggiungine uno sotto.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La disconnessione dal tuo server di identità significa che non sarai trovabile da altri utenti e non potrai invitare nessuno per email o telefono.", "Only continue if you trust the owner of the server.": "Continua solo se ti fidi del proprietario del server.", - "Integration Manager": "Gestore dell'integrazione", + "Integration manager": "Gestore dell'integrazione", "Discovery": "Scopri", "Deactivate account": "Disattiva account", "Always show the window menu bar": "Mostra sempre la barra dei menu della finestra", @@ -1638,23 +1638,23 @@ "%(brand)s URL": "URL di %(brand)s", "Room ID": "ID stanza", "Widget ID": "ID widget", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s e il tuo Gestore di Integrazione.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s e il tuo Gestore di Integrazione.", "Using this widget may share data with %(widgetDomain)s.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s.", "Widget added by": "Widget aggiunto da", "This widget may use cookies.": "Questo widget può usare cookie.", "Connecting to integration manager...": "Connessione al gestore di integrazioni...", "Cannot connect to integration manager": "Impossibile connettere al gestore di integrazioni", "The integration manager is offline or it cannot reach your homeserver.": "Il gestore di integrazioni è offline o non riesce a raggiungere il tuo homeserver.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni (%(serverName)s) per gestire bot, widget e pacchetti di adesivi.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni per gestire bot, widget e pacchetti di adesivi.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "I gestori di integrazione ricevono dati di configurazione e possono modificare widget, inviare inviti alla stanza, assegnare permessi a tuo nome.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni (%(serverName)s) per gestire bot, widget e pacchetti di adesivi.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni per gestire bot, widget e pacchetti di adesivi.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "I gestori di integrazione ricevono dati di configurazione e possono modificare widget, inviare inviti alla stanza, assegnare permessi a tuo nome.", "Failed to connect to integration manager": "Connessione al gestore di integrazioni fallita", "Widgets do not use message encryption.": "I widget non usano la crittografia dei messaggi.", "More options": "Altre opzioni", "Integrations are disabled": "Le integrazioni sono disattivate", "Enable 'Manage Integrations' in Settings to do this.": "Attiva 'Gestisci integrazioni' nelle impostazioni per continuare.", "Integrations not allowed": "Integrazioni non permesse", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Il tuo %(brand)s non ti permette di usare il gestore di integrazioni per questa azione. Contatta un amministratore.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Il tuo %(brand)s non ti permette di usare il gestore di integrazioni per questa azione. Contatta un amministratore.", "Reload": "Ricarica", "Take picture": "Scatta foto", "Remove for everyone": "Rimuovi per tutti", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 18d97d91c1..f969ab9909 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1360,7 +1360,7 @@ "Leave Room": "部屋を退出", "Failed to connect to integration manager": "インテグレーションマネージャへの接続に失敗しました", "Start verification again from their profile.": "プロフィールから再度検証を開始してください。", - "Integration Manager": "インテグレーションマネージャ", + "Integration manager": "インテグレーションマネージャ", "Do not use an identity server": "ID サーバーを使用しない", "Composer": "入力欄", "Sort by": "並び替え", @@ -1490,9 +1490,9 @@ "Mentions & Keywords": "メンションとキーワード", "Security Key": "セキュリティキー", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID サーバーの使用は任意です。ID サーバーを使用しない場合、あなたは他のユーザーから発見されなくなり、メールアドレスや電話番号で他のユーザーを招待することもできません。", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ (%(serverName)s) を使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。", + "Use an integration manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ (%(serverName)s) を使用して、ボット、ウィジェット、ステッカーパックを管理します。", "Integrations not allowed": "インテグレーションは許可されていません", "Integrations are disabled": "インテグレーションが無効になっています", "Manage integrations": "インテグレーションの管理", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 677fc30b2a..2a2e18f8c8 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1293,7 +1293,7 @@ "Your display name": "Isem-ik·im yettwaskanen", "Your avatar URL": "URL n avatar-inek·inem", "%(brand)s URL": "%(brand)s URL", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Aseqdec n uwiǧit-a yezmer ad yebḍu isefka d %(widgetDomain)s & amsefrak-inek·inem n umsidef.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Aseqdec n uwiǧit-a yezmer ad yebḍu isefka d %(widgetDomain)s & amsefrak-inek·inem n umsidef.", "Using this widget may share data with %(widgetDomain)s.": "Aseqdec n uwiǧit-a yezmer ad bḍun yisefka d %(widgetDomain)s.", "Widgets do not use message encryption.": "Iwiǧiten ur seqdacen ara awgelhen n yiznan.", "Widget added by": "Awiǧit yettwarna sɣur", @@ -1790,7 +1790,7 @@ "Link to most recent message": "Aseɣwen n yizen akk aneggaru", "Share Room Message": "Bḍu izen n texxamt", "Command Help": "Tallalt n tiludna", - "Integration Manager": "Amsefrak n umsidef", + "Integration manager": "Amsefrak n umsidef", "Find others by phone or email": "Af-d wiyaḍ s tiliɣri neɣ s yimayl", "Be found by phone or email": "Ad d-yettwaf s tiliɣri neɣ s yimayl", "Upload files (%(current)s of %(total)s)": "Sali-d ifuyla (%(current)s ɣef %(total)s)", @@ -2170,9 +2170,9 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Akka tura ur tesseqdaceḍ ula d yiwen n uqeddac n timagit. I wakken ad d-tafeḍ daɣen ad d-tettwafeḍ sɣur yinermisen yellan i tessneḍ, rnu yiwen ddaw.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Tuffɣa seg tuqqna n uqeddac-ik·im n timaqit anamek-is dayen ur yettuɣal yiwen ad ak·akem-id-yaf, daɣen ur tettizmireḍ ara ad d-necdeḍ wiyaḍ s yimayl neɣ s tiliɣri.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Aseqdec n uqeddac n timagit d afrayan. Ma yella tferneḍ ur tesseqdaceḍ ara aqeddac n timagit, dayen ur tettuɣaleḍ ara ad tettwafeḍ sɣur iseqdac wiyaḍ rnu ur tettizmireḍ ara ad d-necdeḍ s yimayl neɣ s tiliɣri.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef (%(serverName)s) i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Imsefrak n yimsidaf remmsen-d isefka n uswel, syen ad uɣalen zemren ad beddlen iwiǧiten, ad aznen tinubgiwin ɣer texxamin, ad yesbadu daɣen tazmert n yiswiren s yiswiren deg ubdil-ik·im.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef (%(serverName)s) i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Imsefrak n yimsidaf remmsen-d isefka n uswel, syen ad uɣalen zemren ad beddlen iwiǧiten, ad aznen tinubgiwin ɣer texxamin, ad yesbadu daɣen tazmert n yiswiren s yiswiren deg ubdil-ik·im.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Awal-ik·im uffir yettusnifel akken iwata. Ur d-tremmseḍ ara d umatu ilɣa ɣef tɣimiyin-nniḍen alamma tɛaqdeḍ teqqneḍ ɣer-sent", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Qbel tiwtilin n umeẓlu n uqeddac n timagit (%(serverName)s) i wakken ad tsirgeḍ iman-ik·im ad d-tettwafeḍ s yimayl neɣ s wuṭṭun n tiliɣri.", "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Tiririt n yimdanen deg rrif yettwaxdam deg tebdarin n uzgal ideg llan ilugan ɣef yimdanen ara yettwazeglen. Amulteɣ ɣer tebdart n uzgal anamek-is iseqdacen/iqeddacen yettusweḥlen s tebdart-a ad akȧm-ttwaffren.", @@ -2286,7 +2286,7 @@ "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Asenqed n useqdac-a ad yecreḍ ɣef tɣimit-is tettwattkal, yerna ad yecreḍ ula ɣef tɣimit-ik·im tettwattkal i netta·nettat.", "Enable 'Manage Integrations' in Settings to do this.": "Rmed 'imsidaf n usefrek' deg yiɣewwaren i tigin n waya.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", "To continue, use Single Sign On to prove your identity.": "I ukemmel, seqdec n unekcum asuf i ubeggen n timagit-ik·im.", "Click the button below to confirm your identity.": "Sit ɣef tqeffalt ddaw i wakken ad tesnetmeḍ timagit-ik·im.", "We couldn't create your DM. Please check the users you want to invite and try again.": "D awezɣi ad ternuḍ izen-inek·inem uslig. Ttxil-k·m senqed iseqdacen i tebɣiḍ ad d-tnecdeḍ syen ɛreḍ tikkelt-nniḍen.", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 570d76188a..d431fb9173 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -1080,7 +1080,7 @@ "Do not use an identity server": "ID 서버를 사용하지 않기", "Enter a new identity server": "새 ID 서버 입력", "Change": "변경", - "Integration Manager": "통합 관리자", + "Integration manager": "통합 관리자", "Email addresses": "이메일 주소", "Phone numbers": "전화번호", "Set a new account password...": "새 계정 비밀번호를 설정하세요...", @@ -1639,7 +1639,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "방 ID", "Widget ID": "위젯 ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "이 위젯을 사용하면 %(widgetDomain)s & 통합 관리자와 데이터를 공유합니다.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "이 위젯을 사용하면 %(widgetDomain)s & 통합 관리자와 데이터를 공유합니다.", "Using this widget may share data with %(widgetDomain)s.": "이 위젯을 사용하면 %(widgetDomain)s와(과) 데이터를 공유합니다.", "Widget added by": "위젯을 추가했습니다", "This widget may use cookies.": "이 위젯은 쿠키를 사용합니다.", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index c4ca9b94d9..55909a11ed 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1179,10 +1179,10 @@ "You are still sharing your personal data on the identity server .": "Jūs vis dar dalijatės savo asmeniniais duomenimis tapatybės serveryje .", "Identity server (%(server)s)": "Tapatybės Serveris (%(server)s)", "Enter a new identity server": "Pridėkite naują tapatybės serverį", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą (%(serverName)s) botų, valdiklių ir lipdukų pakuočių tvarkymui.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą botų, valdiklių ir lipdukų pakuočių tvarkymui.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą (%(serverName)s) botų, valdiklių ir lipdukų pakuočių tvarkymui.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą botų, valdiklių ir lipdukų pakuočių tvarkymui.", "Manage integrations": "Valdyti integracijas", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.", "Invalid theme schema.": "Klaidinga temos schema.", "Error downloading theme information.": "Klaida atsisiunčiant temos informaciją.", "Theme added!": "Tema pridėta!", @@ -1203,7 +1203,7 @@ "Your theme": "Jūsų tema", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Valdiklio ištrinimas pašalina jį visiems kambaryje esantiems vartotojams. Ar tikrai norite ištrinti šį valdiklį?", "Enable 'Manage Integrations' in Settings to do this.": "Įjunkite 'Valdyti integracijas' Nustatymuose, kad tai atliktumėte.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Jūsų %(brand)s neleidžia jums naudoti integracijų tvarkytuvo tam atlikti. Susisiekite su administratoriumi.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Jūsų %(brand)s neleidžia jums naudoti integracijų tvarkytuvo tam atlikti. Susisiekite su administratoriumi.", "Enter phone number (required on this homeserver)": "Įveskite telefono numerį (privaloma šiame serveryje)", "Doesn't look like a valid phone number": "Tai nepanašu į veikiantį telefono numerį", "Invalid homeserver discovery response": "Klaidingas serverio radimo atsakas", @@ -1574,7 +1574,7 @@ "Learn more about how we use analytics.": "Sužinokite daugiau apie tai, kaip mes naudojame analitiką.", "Reset": "Iš naujo nustatyti", "Failed to connect to integration manager": "Nepavyko prisijungti prie integracijų tvarkytuvo", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Naudojimasis šiuo valdikliu gali pasidalinti duomenimis su %(widgetDomain)s ir jūsų integracijų tvarkytuvu.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Naudojimasis šiuo valdikliu gali pasidalinti duomenimis su %(widgetDomain)s ir jūsų integracijų tvarkytuvu.", "Please create a new issue on GitHub so that we can investigate this bug.": "Prašome sukurti naują problemą GitHub'e, kad mes galėtume ištirti šią klaidą.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Pasakyite mums kas nutiko, arba, dar geriau, sukurkite GitHub problemą su jos apibūdinimu.", "Before submitting logs, you must create a GitHub issue to describe your problem.": "Prieš pateikiant žurnalus jūs turite sukurti GitHub problemą, kad apibūdintumėte savo problemą.", @@ -1582,7 +1582,7 @@ "Notes": "Pastabos", "Integrations are disabled": "Integracijos yra išjungtos", "Integrations not allowed": "Integracijos neleidžiamos", - "Integration Manager": "Integracijų tvarkytuvas", + "Integration manager": "Integracijų tvarkytuvas", "This looks like a valid recovery key!": "Tai panašu į galiojantį atgavimo raktą!", "Not a valid recovery key": "Negaliojantis atgavimo raktas", "Recovery key mismatch": "Atgavimo rakto neatitikimas", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 4707cb4479..f0dda3ca06 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -592,10 +592,10 @@ "Identity server": "Identitetstjener", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Å bruke en identitetstjener er valgfritt. Dersom du velger å ikke bruke en identitetstjener, vil du ikke kunne oppdages av andre brukere, og du vil ikke kunne invitere andre ut i fra E-postadresse eller telefonnummer.", "Do not use an identity server": "Ikke bruk en identitetstjener", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler (%(serverName)s) til å behandle botter, moduler, og klistremerkepakker.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler til å behandle botter, moduler, og klistremerkepakker.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler (%(serverName)s) til å behandle botter, moduler, og klistremerkepakker.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler til å behandle botter, moduler, og klistremerkepakker.", "Manage integrations": "Behandle integreringer", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integreringsbehandlere mottar oppsettsdata, og kan endre på moduler, sende rominvitasjoner, og bestemme styrkenivåer på dine vegne.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integreringsbehandlere mottar oppsettsdata, og kan endre på moduler, sende rominvitasjoner, og bestemme styrkenivåer på dine vegne.", "Flair": "Merkeskilt", "Theme added!": "Temaet er lagt til!", "Set a new account password...": "Velg et nytt kontopassord …", @@ -965,7 +965,7 @@ "Room Settings - %(roomName)s": "Rominnstillinger - %(roomName)s", "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", "Please set a password!": "Vennligst velg et passord!", - "Integration Manager": "Integreringsbehandler", + "Integration manager": "Integreringsbehandler", "To continue you need to accept the terms of this service.": "For å gå videre må du akseptere brukervilkårene til denne tjenesten.", "Private Chat": "Privat chat", "Public Chat": "Offentlig chat", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 050f0f1d7f..2f53b1f8b7 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1416,7 +1416,7 @@ "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Om bekenden te kunnen vinden en voor hen vindbaar te zijn gebruikt u momenteel . U kunt die identiteitsserver hieronder wijzigen.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "U gebruikt momenteel geen identiteitsserver. Voeg er hieronder één toe om bekenden te kunnen vinden en voor hen vindbaar te zijn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Als u de verbinding met uw identiteitsserver verbreekt zal u niet door andere personen gevonden kunnen worden, en dat u anderen niet via e-mail of telefoon zal kunnen uitnodigen.", - "Integration Manager": "Integratiebeheerder", + "Integration manager": "Integratiebeheerder", "Discovery": "Vindbaarheid", "Deactivate account": "Account sluiten", "Always show the window menu bar": "De venstermenubalk altijd tonen", @@ -1687,10 +1687,10 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "uw browserextensies bekijken voor extensies die mogelijk de identiteitsserver blokkeren (zoals Privacy Badger)", "contact the administrators of identity server ": "contact opnemen met de beheerders van de identiteitsserver ", "wait and try again later": "wachten en het later weer proberen", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder (%(serverName)s) om robots, widgets en stickerpakketten te beheren.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder om robots, widgets en stickerpakketten te beheren.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder (%(serverName)s) om robots, widgets en stickerpakketten te beheren.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder om robots, widgets en stickerpakketten te beheren.", "Manage integrations": "Integratiebeheerder", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveau’s namens u aanpassen.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveau’s namens u aanpassen.", "Ban list rules - %(roomName)s": "Banlijstregels - %(roomName)s", "Server rules": "Serverregels", "User rules": "Gebruikersregels", @@ -1864,7 +1864,7 @@ "%(brand)s URL": "%(brand)s-URL", "Room ID": "Gespreks-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s en uw integratiebeheerder.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s en uw integratiebeheerder.", "Using this widget may share data with %(widgetDomain)s.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgets gebruiken geen berichtversleuteling.", "Widget added by": "Widget toegevoegd door", @@ -1886,7 +1886,7 @@ "Integrations are disabled": "Integraties zijn uitgeschakeld", "Enable 'Manage Integrations' in Settings to do this.": "Schakel de ‘Integratiebeheerder’ in in uw Instellingen om dit te doen.", "Integrations not allowed": "Integraties niet toegestaan", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", "Failed to invite the following users to chat: %(csvUsers)s": "Het uitnodigen van volgende gebruikers voor gesprek is mislukt: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Uw direct gesprek kon niet aangemaakt worden. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.", "Something went wrong trying to invite the users.": "Er is een fout opgetreden bij het uitnodigen van de gebruikers.", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index bd95479909..616c091761 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1157,7 +1157,7 @@ "Enter a new identity server": "Wprowadź nowy serwer tożsamości", "Change": "Zmień", "Upgrade to your own domain": "Zaktualizuj do swojej własnej domeny", - "Integration Manager": "Menedżer Integracji", + "Integration manager": "Menedżer Integracji", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Wyrażasz zgodę na warunki użytkowania serwera%(serverName)s aby pozwolić na odkrywanie Ciebie za pomocą adresu e-mail oraz numeru telefonu.", "Discovery": "Odkrywanie", "Deactivate account": "Dezaktywuj konto", @@ -1661,8 +1661,8 @@ "Use custom size": "Użyj niestandardowego rozmiaru", "Appearance Settings only affect this %(brand)s session.": "Ustawienia wyglądu wpływają tylko na tę sesję %(brand)s.", "Customise your appearance": "Dostosuj wygląd", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji aby zarządzać botami, widżetami i pakietami naklejek.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji %(serverName)s aby zarządzać botami, widżetami i pakietami naklejek.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji aby zarządzać botami, widżetami i pakietami naklejek.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji %(serverName)s aby zarządzać botami, widżetami i pakietami naklejek.", "There are two ways you can provide feedback and help us improve %(brand)s.": "Są dwa sposoby na przekazanie informacji zwrotnych i pomoc w usprawnieniu %(brand)s.", "Feedback sent": "Wysłano informacje zwrotne", "Send feedback": "Wyślij informacje zwrotne", @@ -2347,7 +2347,7 @@ "Show line numbers in code blocks": "Pokazuj numery wierszy w blokach kodu", "Expand code blocks by default": "Domyślnie rozwijaj bloki kodu", "Show stickers button": "Pokaż przycisk naklejek", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Zarządcy integracji otrzymują dane konfiguracji, mogą modyfikować widżety, wysyłać zaproszenia do pokoi i ustawiać poziom uprawnień w Twoim imieniu.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Zarządcy integracji otrzymują dane konfiguracji, mogą modyfikować widżety, wysyłać zaproszenia do pokoi i ustawiać poziom uprawnień w Twoim imieniu.", "Converts the DM to a room": "Zmienia wiadomości bezpośrednie w pokój", "Converts the room to a DM": "Zmienia pokój w wiadomość bezpośrednią", "Sends the given message as a spoiler": "Wysyła podaną wiadomość jako spoiler", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index feff0f54c5..03a71c4e9e 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1729,7 +1729,7 @@ "Your avatar URL": "Link da sua foto de perfil", "Your user ID": "Sua ID de usuário", "%(brand)s URL": "Link do %(brand)s", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s & seu Gerenciador de Integrações.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s & seu Gerenciador de Integrações.", "Using this widget may share data with %(widgetDomain)s.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s.", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s não fizeram alterações %(count)s vezes", "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s não fizeram alterações", @@ -1919,9 +1919,9 @@ "Expand room list section": "Mostrar seção da lista de salas", "The person who invited you already left the room.": "A pessoa que convidou você já saiu da sala.", "The person who invited you already left the room, or their server is offline.": "A pessoa que convidou você já saiu da sala, ou o servidor dela está indisponível.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações em (%(serverName)s) para gerenciar bots, widgets e pacotes de figurinhas.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações para gerenciar bots, widgets e pacotes de figurinhas.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "O Gerenciador de Integrações recebe dados de configuração e pode modificar widgets, enviar convites para salas e definir níveis de permissão em seu nome.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações em (%(serverName)s) para gerenciar bots, widgets e pacotes de figurinhas.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações para gerenciar bots, widgets e pacotes de figurinhas.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "O Gerenciador de Integrações recebe dados de configuração e pode modificar widgets, enviar convites para salas e definir níveis de permissão em seu nome.", "Keyboard Shortcuts": "Atalhos do teclado", "Customise your experience with experimental labs features. Learn more.": "Personalize sua experiência com os recursos experimentais. Saiba mais.", "Ignored/Blocked": "Bloqueado", @@ -2034,7 +2034,7 @@ "Destroy cross-signing keys?": "Destruir chaves autoverificadas?", "Waiting for partner to confirm...": "Aguardando seu contato confirmar...", "Enable 'Manage Integrations' in Settings to do this.": "Para fazer isso, ative 'Gerenciar Integrações' nas Configurações.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com o administrador.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com o administrador.", "Confirm to continue": "Confirme para continuar", "Click the button below to confirm your identity.": "Clique no botão abaixo para confirmar sua identidade.", "Failed to invite the following users to chat: %(csvUsers)s": "Falha ao convidar os seguintes usuários para a conversa: %(csvUsers)s", @@ -2058,7 +2058,7 @@ "Command Help": "Ajuda com Comandos", "To help us prevent this in future, please send us logs.": "Para nos ajudar a evitar isso no futuro, envie-nos os relatórios.", "Your browser likely removed this data when running low on disk space.": "O seu navegador provavelmente removeu esses dados quando o espaço de armazenamento ficou insuficiente.", - "Integration Manager": "Gerenciador de Integrações", + "Integration manager": "Gerenciador de Integrações", "Find others by phone or email": "Encontre outras pessoas por telefone ou e-mail", "Use bots, bridges, widgets and sticker packs": "Use bots, integrações, widgets e pacotes de figurinhas", "Terms of Service": "Termos de serviço", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 1aabe0555b..f14e5c5ed3 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1427,7 +1427,7 @@ "Identity server (%(server)s)": "Сервер идентификации (%(server)s)", "Do not use an identity server": "Не использовать сервер идентификации", "Enter a new identity server": "Введите новый идентификационный сервер", - "Integration Manager": "Менеджер интеграции", + "Integration manager": "Менеджер интеграции", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Кроме того, вы можете попытаться использовать общедоступный сервер по адресу turn.matrix.org , но это не будет настолько надежным, и он предоставит ваш IP-адрес этому серверу. Вы также можете управлять этим в настройках.", "Sends a message as plain text, without interpreting it as markdown": "Посылает сообщение в виде простого текста, не интерпретируя его как разметку", "Use an identity server": "Используйте сервер идентификации", @@ -1595,10 +1595,10 @@ "Delete %(count)s sessions|other": "Удалить %(count)s сессий", "Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии", "Enable audible notifications for this session": "Включить звуковые уведомления для этой сессии", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций %(serverName)s для управления ботами, виджетами и стикерами.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций %(serverName)s для управления ботами, виджетами и стикерами.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.", "Manage integrations": "Управление интеграциями", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.", "Direct Messages": "Диалоги", "%(count)s sessions|other": "%(count)s сессий", "Hide sessions": "Скрыть сессии", @@ -2191,7 +2191,7 @@ "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Произошла ошибка при обновлении альтернативных адресов комнаты. Это может быть запрещено сервером или произошел временный сбой.", "There was an error creating that address. It may not be allowed by the server or a temporary failure occurred.": "При создании этого адреса произошла ошибка. Это может быть запрещено сервером или произошел временный сбой.", "There was an error removing that address. It may no longer exist or a temporary error occurred.": "Произошла ошибка при удалении этого адреса. Возможно, он больше не существует или произошла временная ошибка.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s и вашим Менеджером Интеграции.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s и вашим Менеджером Интеграции.", "Using this widget may share data with %(widgetDomain)s.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s.", "Can't find this server or its room list": "Не можем найти этот сервер или его список комнат", "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Удаление ключей кросс-подписи является мгновенным и необратимым действием. Любой, с кем вы прошли проверку, увидит предупреждения безопасности. Вы почти наверняка не захотите этого делать, если только не потеряете все устройства, с которых можно совершать кросс-подпись.", @@ -2206,7 +2206,7 @@ "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Проверка этого устройства пометит его как доверенное, и пользователи, которые проверили его вместе с вами, будут доверять этому устройству.", "Integrations are disabled": "Интеграции отключены", "Integrations not allowed": "Интеграции не разрешены", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Ваш %(brand)s не позволяет вам использовать для этого Менеджер Интеграции. Пожалуйста, свяжитесь с администратором.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Ваш %(brand)s не позволяет вам использовать для этого Менеджер Интеграции. Пожалуйста, свяжитесь с администратором.", "To continue, use Single Sign On to prove your identity.": "Чтобы продолжить, используйте единый вход, чтобы подтвердить свою личность.", "Confirm to continue": "Подтвердите, чтобы продолжить", "Click the button below to confirm your identity.": "Нажмите кнопку ниже, чтобы подтвердить свою личность.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 37bd442844..3b5904fef5 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1363,10 +1363,10 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Používanie servera totožností je voliteľné. Ak sa rozhodnete, že nebudete používať server totožností, nebudú vás vaši známi môcť nájsť a ani vy nebudete môcť pozývať používateľov zadaním emailovej adresy alebo telefónneho čísla.", "Do not use an identity server": "Nepoužívať server totožností", "Enter a new identity server": "Zadať nový server totožností", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použiť integračný server (%(serverName)s) na správu botov, widgetov a balíčkov s nálepkami.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Použiť integračný server na správu botov, widgetov a balíčkov s nálepkami.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použiť integračný server (%(serverName)s) na správu botov, widgetov a balíčkov s nálepkami.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Použiť integračný server na správu botov, widgetov a balíčkov s nálepkami.", "Manage integrations": "Spravovať integrácie", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integračné servery zhromažďujú údaje nastavení, môžu spravovať widgety, odosielať vo vašom mene pozvánky alebo meniť úroveň moci.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integračné servery zhromažďujú údaje nastavení, môžu spravovať widgety, odosielať vo vašom mene pozvánky alebo meniť úroveň moci.", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Súhlaste s podmienkami používania servera totožností (%(serverName)s), aby ste mohli byť nájdení zadaním emailovej adresy alebo telefónneho čísla.", "Discovery": "Objaviť", "Deactivate account": "Deaktivovať účet", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index f894340fb6..c5abe74ad1 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1439,7 +1439,7 @@ "Only continue if you trust the owner of the server.": "Vazhdoni vetëm nëse i besoni të zotit të shërbyesit.", "Terms of service not accepted or the identity server is invalid.": "S’janë pranuar kushtet e shërbimit ose shërbyesi i identiteteve është i pavlefshëm.", "Enter a new identity server": "Jepni një shërbyes të ri identitetesh", - "Integration Manager": "Përgjegjës Integrimesh", + "Integration manager": "Përgjegjës Integrimesh", "Remove %(email)s?": "Të hiqet %(email)s?", "Remove %(phone)s?": "Të hiqet %(phone)s?", "You do not have the required permissions to use this command.": "S’keni lejet e domosdoshme për përdorimin e këtij urdhri.", @@ -1636,7 +1636,7 @@ "%(brand)s URL": "URL %(brand)s-i", "Room ID": "ID dhome", "Widget ID": "ID widget-i", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", "Using this widget may share data with %(widgetDomain)s.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s.", "Widget added by": "Widget i shtuar nga", "This widget may use cookies.": "Ky widget mund të përdorë cookies.", @@ -1644,17 +1644,17 @@ "Connecting to integration manager...": "Po lidhet me përgjegjës integrimesh…", "Cannot connect to integration manager": "S’lidhet dot te përgjegjës integrimesh", "The integration manager is offline or it cannot reach your homeserver.": "Përgjegjësi i integrimeve s’është në linjë ose s’kap dot shërbyesin tuaj Home.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh (%(serverName)s) që të administroni robotë, widget-e dhe paketa ngjitësish.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh që të administroni robotë, widget-e dhe paketa ngjitësish.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh (%(serverName)s) që të administroni robotë, widget-e dhe paketa ngjitësish.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh që të administroni robotë, widget-e dhe paketa ngjitësish.", "Manage integrations": "Administroni integrime", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Përgjegjësit e Integrimeve marrin të dhëna formësimi, dhe mund të ndryshojnë widget-e, të dërgojnë ftesa dhome, dhe të caktojnë shkallë pushteti në emër tuajin.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Përgjegjësit e Integrimeve marrin të dhëna formësimi, dhe mund të ndryshojnë widget-e, të dërgojnë ftesa dhome, dhe të caktojnë shkallë pushteti në emër tuajin.", "Failed to connect to integration manager": "S’u arrit të lidhet te përgjegjës integrimesh", "Widgets do not use message encryption.": "Widget-et s’përdorin fshehtëzim mesazhesh.", "More options": "Më tepër mundësi", "Integrations are disabled": "Integrimet janë të çaktivizuara", "Enable 'Manage Integrations' in Settings to do this.": "Që të bëhet kjo, aktivizoni “Administroni Integrime”, te Rregullimet.", "Integrations not allowed": "Integrimet s’lejohen", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-i juah nuk ju lejon të përdorni një Përgjegjës Integrimesh për të bërë këtë. Ju lutemi, lidhuni me përgjegjësin.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-i juah nuk ju lejon të përdorni një Përgjegjës Integrimesh për të bërë këtë. Ju lutemi, lidhuni me përgjegjësin.", "Reload": "Ringarkoje", "Take picture": "Bëni një foto", "Remove for everyone": "Hiqe për këdo", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 2c785785ff..03bfc42784 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1700,7 +1700,7 @@ "This widget may use cookies.": "Овај виџет може користити колачиће.", "Widget added by": "Додао је виџет", "Using this widget may share data with %(widgetDomain)s.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s и вашим интеграционим менаџером.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s и вашим интеграционим менаџером.", "Widget ID": "ИД виџета", "Room ID": "ИД собе", "%(brand)s URL": "%(brand)s УРЛ", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 71c455a60c..7ff1467d7b 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1264,7 +1264,7 @@ "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att använda en identitetsserver är valfritt. Om du väljer att inte använda en identitetsserver kan du inte upptäckas av andra användare och inte heller bjuda in andra via e-post eller telefon.", "Do not use an identity server": "Använd inte en identitetsserver", "Enter a new identity server": "Ange en ny identitetsserver", - "Integration Manager": "Integrationshanterare", + "Integration manager": "Integrationshanterare", "Discovery": "Upptäckt", "Deactivate account": "Inaktivera konto", "Always show the window menu bar": "Visa alltid fönstermenyn", @@ -1354,10 +1354,10 @@ "Connecting to integration manager...": "Ansluter till integrationshanterare…", "Cannot connect to integration manager": "Kan inte ansluta till integrationshanteraren", "The integration manager is offline or it cannot reach your homeserver.": "Integrationshanteraren är offline eller kan inte nå din hemserver.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare (%(serverName)s) för att hantera bottar, widgets och dekalpaket.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare för att hantera bottar, widgets och dekalpaket.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare (%(serverName)s) för att hantera bottar, widgets och dekalpaket.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare för att hantera bottar, widgets och dekalpaket.", "Manage integrations": "Hantera integrationer", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationshanterare får konfigurationsdata och kan ändra widgetar, skicka rumsinbjudningar och ställa in behörighetsnivåer å dina vägnar.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationshanterare får konfigurationsdata och kan ändra widgetar, skicka rumsinbjudningar och ställa in behörighetsnivåer å dina vägnar.", "Close preview": "Stäng förhandsgranskning", "Room %(name)s": "Rum %(name)s", "Recent rooms": "Senaste rummen", @@ -1410,7 +1410,7 @@ "%(brand)s URL": "%(brand)s-URL", "Room ID": "Rums-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Att använda denna widget kan dela data med %(widgetDomain)s och din integrationshanterare.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Att använda denna widget kan dela data med %(widgetDomain)s och din integrationshanterare.", "Using this widget may share data with %(widgetDomain)s.": "Att använda denna widget kan dela data med %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgets använder inte meddelandekryptering.", "Widget added by": "Widget tillagd av", @@ -1441,7 +1441,7 @@ "Integrations are disabled": "Integrationer är inaktiverade", "Enable 'Manage Integrations' in Settings to do this.": "Aktivera \"Hantera integrationer\" i inställningarna för att göra detta.", "Integrations not allowed": "Integrationer är inte tillåtna", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Din %(brand)s tillåter dig inte att använda en integrationshanterare för att göra detta. Vänligen kontakta en administratör.", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Din %(brand)s tillåter dig inte att använda en integrationshanterare för att göra detta. Vänligen kontakta en administratör.", "Your homeserver doesn't seem to support this feature.": "Din hemserver verkar inte stödja den här funktionen.", "Message edits": "Meddelanderedigeringar", "Preview": "Förhandsgranska", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 46f32ef61d..fcb4c499a1 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -661,7 +661,7 @@ "COPY": "KOPYA", "Command Help": "Komut Yardımı", "Missing session data": "Kayıp oturum verisi", - "Integration Manager": "Bütünleştirme Yöneticisi", + "Integration manager": "Bütünleştirme Yöneticisi", "Find others by phone or email": "Kişileri telefon yada e-posta ile bul", "Be found by phone or email": "Telefon veya e-posta ile bulunun", "Terms of Service": "Hizmet Şartları", @@ -1432,7 +1432,7 @@ "Backup key stored: ": "Yedek anahtarı depolandı: ", "Enable desktop notifications for this session": "Bu oturum için masaüstü bildirimlerini aç", "Upgrade to your own domain": "Kendi etkinlik alanınızı yükseltin", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Botları, görsel bileşenleri ve çıkartma paketlerini yönetmek için bir entegrasyon yöneticisi kullanın.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Botları, görsel bileşenleri ve çıkartma paketlerini yönetmek için bir entegrasyon yöneticisi kullanın.", "Session ID:": "Oturum ID:", "Session key:": "Oturum anahtarı:", "This user has not verified all of their sessions.": "Bu kullanıcı bütün oturumlarında doğrulanmamış.", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 3500f7869a..70b000ad07 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1194,9 +1194,9 @@ "The integration manager is offline or it cannot reach your homeserver.": "Менеджер інтеграцій непід'єднаний або не може досягти вашого домашнього сервера.", "Enable desktop notifications for this session": "Увімкнути стільничні сповіщення для цього сеансу", "Profile picture": "Зображення профілю", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, знадобами та паками наліпок.", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, знадобами та паками наліпок.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", "Show %(count)s more|other": "Показати ще %(count)s", "Show %(count)s more|one": "Показати ще %(count)s", "Failed to connect to integration manager": "Не вдалось з'єднатись з менеджером інтеграцій", @@ -1207,10 +1207,10 @@ "Filter community members": "Відфільтрувати учасників спільноти", "Filter community rooms": "Відфільтрувати кімнати спільноти", "Display your community flair in rooms configured to show it.": "Відбивати ваш спільнотний значок у кімнатах, що налаштовані показувати його.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", "Show advanced": "Показати розширені", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам використовувати для цього менеджер інтеграцій. Зверніться, будь ласка, до адміністратора.", - "Integration Manager": "Менеджер інтеграцій", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам використовувати для цього менеджер інтеграцій. Зверніться, будь ласка, до адміністратора.", + "Integration manager": "Менеджер інтеграцій", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Ваша спільнота не має великого опису (HTML-сторінки, показуваної членам спільноти).
Клацніть тут щоб відкрити налаштування й створити цей опис!", "Review terms and conditions": "Переглянути умови користування", "Old cryptography data detected": "Виявлено старі криптографічні дані", diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index 77955ee2a7..a521ccdc44 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -1416,7 +1416,7 @@ "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Je makt vo de moment gebruuk van vo deur je contactn gevoundn te kunn wordn, en von hunder te kunn viendn. Je kut hierounder jen identiteitsserver wyzign.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Je makt vo de moment geen gebruuk van een identiteitsserver. Voegt der hierounder één toe vo deur je contactn gevoundn te kunn wordn en von hunder te kunn viendn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "De verbindienge me jen identiteitsserver verbreekn goat dervoorn zorgn da je nie mi deur andere gebruukers gevoundn goa kunn wordn, en dat andere menschn je nie via e-mail of telefong goan kunn uutnodign.", - "Integration Manager": "Integroasjebeheerder", + "Integration manager": "Integroasjebeheerder", "Discovery": "Ountdekkienge", "Deactivate account": "Account deactiveern", "Always show the window menu bar": "De veinstermenubalk alsan toogn", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 1dc907653d..27f1f57e43 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1686,10 +1686,10 @@ "Cannot connect to integration manager": "不能连接到集成管理器", "The integration manager is offline or it cannot reach your homeserver.": "此集成管理器为离线状态或者其不能访问你的主服务器。", "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "检查你的浏览器是否安装有可能屏蔽身份服务器的插件(例如 Privacy Badger)", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用集成管理器 (%(serverName)s) 以管理机器人、挂件和贴纸包。", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "使用集成管理器以管理机器人、挂件和贴纸包。", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用集成管理器 (%(serverName)s) 以管理机器人、挂件和贴纸包。", + "Use an integration manager to manage bots, widgets, and sticker packs.": "使用集成管理器以管理机器人、挂件和贴纸包。", "Manage integrations": "集成管理", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "集成管理器接收配置数据,并可以以你的名义修改挂件、发送聊天室邀请及设置权限级别。", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "集成管理器接收配置数据,并可以以你的名义修改挂件、发送聊天室邀请及设置权限级别。", "Use between %(min)s pt and %(max)s pt": "请使用介于 %(min)s pt 和 %(max)s pt 之间的大小", "Deactivate account": "停用账号", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "要报告 Matrix 相关的安全问题,请阅读 Matrix.org 的安全公开策略。", @@ -1924,7 +1924,7 @@ "%(brand)s URL": "%(brand)s 的链接", "Room ID": "聊天室 ID", "Widget ID": "挂件 ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "使用此挂件可能会和 %(widgetDomain)s 及你的集成管理器共享数据 。", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "使用此挂件可能会和 %(widgetDomain)s 及你的集成管理器共享数据 。", "Using this widget may share data with %(widgetDomain)s.": "使用此挂件可能会和 %(widgetDomain)s 共享数据 。", "Widgets do not use message encryption.": "挂件不适用消息加密。", "This widget may use cookies.": "此挂件可能使用 cookie。", @@ -1997,7 +1997,7 @@ "Integrations are disabled": "集成已禁用", "Enable 'Manage Integrations' in Settings to do this.": "在设置中启用「管理管理」以执行此操作。", "Integrations not allowed": "集成未被允许", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "你的 %(brand)s 不允许你使用集成管理器来完成此操作。请联系管理员。", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "你的 %(brand)s 不允许你使用集成管理器来完成此操作。请联系管理员。", "To continue, use Single Sign On to prove your identity.": "要继续,请使用单点登录证明你的身份。", "Confirm to continue": "确认以继续", "Click the button below to confirm your identity.": "点击下方按钮确认你的身份。", @@ -2074,7 +2074,7 @@ "Missing session data": "缺失会话数据", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "一些会话数据,包括加密消息密钥,已缺失。要修复此问题,登出并重新登录,然后从备份恢复密钥。", "Your browser likely removed this data when running low on disk space.": "你的浏览器可能在磁盘空间不足时删除了此数据。", - "Integration Manager": "集成管理器", + "Integration manager": "集成管理器", "Find others by phone or email": "通过电话或邮箱寻找别人", "Be found by phone or email": "通过电话或邮箱被寻找", "Use bots, bridges, widgets and sticker packs": "使用机器人、桥接、挂件和贴纸包", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 656009fa3a..74dbba8d26 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1429,7 +1429,7 @@ "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "您目前正在使用 來探索以及被您所知既有的聯絡人探索。您可以在下方變更身份識別伺服器。", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "您目前並未使用身份識別伺服器。要探索及被您所知既有的聯絡人探索,請在下方新增一個。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "從您的身份識別伺服器斷開連線代表您不再能被其他使用者探索到,而且您也不能透過電子郵件或電話邀請其他人。", - "Integration Manager": "整合管理員", + "Integration manager": "整合管理員", "Call failed due to misconfigured server": "因為伺服器設定錯誤,所以通話失敗", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "請詢問您家伺服器的管理員(%(homeserverDomain)s)以設定 TURN 伺服器讓通話可以正常運作。", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "或是您也可以試著使用公開伺服器 turn.matrix.org,但可能不夠可靠,而且會跟該伺服器分享您的 IP 位置。您也可以在設定中管理這個。", @@ -1638,23 +1638,23 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "聊天室 ID", "Widget ID": "小工具 ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "使用這個小工具可能會與 %(widgetDomain)s 以及您的整合管理員分享資料 。", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "使用這個小工具可能會與 %(widgetDomain)s 以及您的整合管理員分享資料 。", "Using this widget may share data with %(widgetDomain)s.": "使用這個小工具可能會與 %(widgetDomain)s 分享資料 。", "Widget added by": "小工具新增由", "This widget may use cookies.": "這個小工具可能會使用 cookies。", "Connecting to integration manager...": "正在連線到整合管理員……", "Cannot connect to integration manager": "無法連線到整合管理員", "The integration manager is offline or it cannot reach your homeserver.": "整合管理員已離線或無法存取您的家伺服器。", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用整合管理員 (%(serverName)s) 以管理機器人、小工具與貼紙包。", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "使用整合管理員以管理機器人、小工具與貼紙包。", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "整合管理員接收設定資料,並可以修改小工具、傳送聊天室邀請並設定權限等級。", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用整合管理員 (%(serverName)s) 以管理機器人、小工具與貼紙包。", + "Use an integration manager to manage bots, widgets, and sticker packs.": "使用整合管理員以管理機器人、小工具與貼紙包。", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "整合管理員接收設定資料,並可以修改小工具、傳送聊天室邀請並設定權限等級。", "Failed to connect to integration manager": "連線到整合管理員失敗", "Widgets do not use message encryption.": "小工具不使用訊息加密。", "More options": "更多選項", "Integrations are disabled": "整合已停用", "Enable 'Manage Integrations' in Settings to do this.": "在設定中啟用「管理整合」以執行此動作。", "Integrations not allowed": "不允許整合", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "您的 %(brand)s 不允許您使用整合管理員來執行此動作。請聯絡管理員。", + "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "您的 %(brand)s 不允許您使用整合管理員來執行此動作。請聯絡管理員。", "Reload": "重新載入", "Take picture": "拍照", "Remove for everyone": "對所有人移除", diff --git a/src/utils/WidgetUtils.ts b/src/utils/WidgetUtils.ts index 222837511d..7db82e2426 100644 --- a/src/utils/WidgetUtils.ts +++ b/src/utils/WidgetUtils.ts @@ -407,7 +407,7 @@ export default class WidgetUtils { "integration_manager_" + (new Date().getTime()), WidgetType.INTEGRATION_MANAGER, uiUrl, - "Integration Manager: " + name, + "Integration manager: " + name, { "api_url": apiUrl }, ); } From bbd785b1586853d350d6c5373928588b1c8cf599 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 13 Jul 2021 16:57:40 +0100 Subject: [PATCH 083/135] Move blurhashing into a Worker and use OffscreenCanvas where possible for thumbnailing --- src/BlurhashEncoder.ts | 59 +++++++++++++++++++++ src/ContentMessages.tsx | 97 +++++++++++++++++++--------------- src/workers/blurhash.worker.ts | 38 +++++++++++++ 3 files changed, 151 insertions(+), 43 deletions(-) create mode 100644 src/BlurhashEncoder.ts create mode 100644 src/workers/blurhash.worker.ts diff --git a/src/BlurhashEncoder.ts b/src/BlurhashEncoder.ts new file mode 100644 index 0000000000..a42c29dfa7 --- /dev/null +++ b/src/BlurhashEncoder.ts @@ -0,0 +1,59 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { defer, IDeferred } from "matrix-js-sdk/src/utils"; + +import BlurhashWorker from "./workers/blurhash.worker.ts"; + +interface IBlurhashWorkerResponse { + seq: number; + blurhash: string; +} + +export class BlurhashEncoder { + private static internalInstance = new BlurhashEncoder(); + + public static get instance(): BlurhashEncoder { + return BlurhashEncoder.internalInstance; + } + + private readonly worker: Worker; + private seq = 0; + private pendingDeferredMap = new Map>(); + + constructor() { + this.worker = new BlurhashWorker(); + this.worker.onmessage = this.onMessage; + } + + private onMessage = (ev: MessageEvent) => { + const { seq, blurhash } = ev.data; + const deferred = this.pendingDeferredMap.get(seq); + if (deferred) { + this.pendingDeferredMap.delete(seq); + deferred.resolve(blurhash); + } + }; + + public getBlurhash(imageData: ImageData): Promise { + const seq = this.seq++; + const deferred = defer(); + this.pendingDeferredMap.set(seq, deferred); + this.worker.postMessage({ seq, imageData }); + return deferred.promise; + } +} + diff --git a/src/ContentMessages.tsx b/src/ContentMessages.tsx index b752886b8a..335784c65a 100644 --- a/src/ContentMessages.tsx +++ b/src/ContentMessages.tsx @@ -17,7 +17,6 @@ limitations under the License. */ import React from "react"; -import { encode } from "blurhash"; import { MatrixClient } from "matrix-js-sdk/src/client"; import dis from './dispatcher/dispatcher'; @@ -28,7 +27,6 @@ import RoomViewStore from './stores/RoomViewStore'; import encrypt from "browser-encrypt-attachment"; import extractPngChunks from "png-chunks-extract"; import Spinner from "./components/views/elements/Spinner"; - import { Action } from "./dispatcher/actions"; import CountlyAnalytics from "./CountlyAnalytics"; import { @@ -40,6 +38,7 @@ import { } from "./dispatcher/payloads/UploadPayload"; import { IUpload } from "./models/IUpload"; import { IAbortablePromise, IImageInfo } from "matrix-js-sdk/src/@types/partials"; +import { BlurhashEncoder } from "./BlurhashEncoder"; const MAX_WIDTH = 800; const MAX_HEIGHT = 600; @@ -103,55 +102,67 @@ interface IThumbnail { * @return {Promise} A promise that resolves with an object with an info key * and a thumbnail key. */ -function createThumbnail( +async function createThumbnail( element: ThumbnailableElement, inputWidth: number, inputHeight: number, mimeType: string, ): Promise { - return new Promise((resolve) => { - let targetWidth = inputWidth; - let targetHeight = inputHeight; - if (targetHeight > MAX_HEIGHT) { - targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight)); - targetHeight = MAX_HEIGHT; - } - if (targetWidth > MAX_WIDTH) { - targetHeight = Math.floor(targetHeight * (MAX_WIDTH / targetWidth)); - targetWidth = MAX_WIDTH; - } + let targetWidth = inputWidth; + let targetHeight = inputHeight; + if (targetHeight > MAX_HEIGHT) { + targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight)); + targetHeight = MAX_HEIGHT; + } + if (targetWidth > MAX_WIDTH) { + targetHeight = Math.floor(targetHeight * (MAX_WIDTH / targetWidth)); + targetWidth = MAX_WIDTH; + } - const canvas = document.createElement("canvas"); + let canvas: HTMLCanvasElement | OffscreenCanvas; + if (window.OffscreenCanvas) { + canvas = new window.OffscreenCanvas(targetWidth, targetHeight); + } else { + canvas = document.createElement("canvas"); canvas.width = targetWidth; canvas.height = targetHeight; - const context = canvas.getContext("2d"); - context.drawImage(element, 0, 0, targetWidth, targetHeight); - const imageData = context.getImageData(0, 0, targetWidth, targetHeight); - const blurhash = encode( - imageData.data, - imageData.width, - imageData.height, - // use 4 components on the longer dimension, if square then both - imageData.width >= imageData.height ? 4 : 3, - imageData.height >= imageData.width ? 4 : 3, - ); - canvas.toBlob(function(thumbnail) { - resolve({ - info: { - thumbnail_info: { - w: targetWidth, - h: targetHeight, - mimetype: thumbnail.type, - size: thumbnail.size, - }, - w: inputWidth, - h: inputHeight, - [BLURHASH_FIELD]: blurhash, - }, - thumbnail, - }); - }, mimeType); - }); + } + + const context = canvas.getContext("2d"); + context.drawImage(element, 0, 0, targetWidth, targetHeight); + + let thumbnailPromise: Promise; + + if (window.OffscreenCanvas) { + thumbnailPromise = (canvas as OffscreenCanvas).convertToBlob({ type: mimeType }); + } else { + thumbnailPromise = new Promise(resolve => (canvas as HTMLCanvasElement).toBlob(resolve, mimeType)); + } + + const imageData = context.getImageData(0, 0, targetWidth, targetHeight); + + const [ + thumbnail, + blurhash, + ] = await Promise.all([ + thumbnailPromise, + BlurhashEncoder.instance.getBlurhash(imageData), + ]); + + return { + info: { + thumbnail_info: { + w: targetWidth, + h: targetHeight, + mimetype: thumbnail.type, + size: thumbnail.size, + }, + w: inputWidth, + h: inputHeight, + [BLURHASH_FIELD]: blurhash, + }, + thumbnail, + }; } /** diff --git a/src/workers/blurhash.worker.ts b/src/workers/blurhash.worker.ts new file mode 100644 index 0000000000..031cc67c90 --- /dev/null +++ b/src/workers/blurhash.worker.ts @@ -0,0 +1,38 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { encode } from "blurhash"; + +const ctx: Worker = self as any; + +interface IBlurhashWorkerRequest { + seq: number; + imageData: ImageData; +} + +ctx.addEventListener("message", (event: MessageEvent): void => { + const { seq, imageData } = event.data; + const blurhash = encode( + imageData.data, + imageData.width, + imageData.height, + // use 4 components on the longer dimension, if square then both + imageData.width >= imageData.height ? 4 : 3, + imageData.height >= imageData.width ? 4 : 3, + ); + + ctx.postMessage({ seq, blurhash }); +}); From 59a1df71c834f7380ff4e19ecf4deca057c7a389 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 13 Jul 2021 17:05:57 +0100 Subject: [PATCH 084/135] remove redundant Promise.all --- src/ContentMessages.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/ContentMessages.tsx b/src/ContentMessages.tsx index 335784c65a..0c65a7bd35 100644 --- a/src/ContentMessages.tsx +++ b/src/ContentMessages.tsx @@ -140,14 +140,9 @@ async function createThumbnail( } const imageData = context.getImageData(0, 0, targetWidth, targetHeight); - - const [ - thumbnail, - blurhash, - ] = await Promise.all([ - thumbnailPromise, - BlurhashEncoder.instance.getBlurhash(imageData), - ]); + // thumbnailPromise and blurhash promise are being awaited concurrently + const blurhash = await BlurhashEncoder.instance.getBlurhash(imageData); + const thumbnail = await thumbnailPromise; return { info: { From d7feaf55c23f1d0fd635fe26a9f9cf93debd23a5 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 13 Jul 2021 16:55:41 +0100 Subject: [PATCH 085/135] Undo changes to the CHANGELOG Signed-off-by: Paulo Pinto --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b3606591c..22b35b7c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4933,7 +4933,7 @@ All Changes [\#3869](https://github.com/matrix-org/matrix-react-sdk/pull/3869) * Move feature flag check for new session toast [\#3865](https://github.com/matrix-org/matrix-react-sdk/pull/3865) - * Catch exception in checkTerms if no identity server + * Catch exception in checkTerms if no ID server [\#3863](https://github.com/matrix-org/matrix-react-sdk/pull/3863) * Catch exception if passphrase dialog cancelled [\#3862](https://github.com/matrix-org/matrix-react-sdk/pull/3862) @@ -6049,15 +6049,15 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3320](https://github.com/matrix-org/matrix-react-sdk/pull/3320) * Prompt for terms of service on identity server changes [\#3317](https://github.com/matrix-org/matrix-react-sdk/pull/3317) - * Allow 3pids to be added with no identity server set + * Allow 3pids to be added with no ID server set [\#3323](https://github.com/matrix-org/matrix-react-sdk/pull/3323) * Fix up remove threepid confirmation UX [\#3324](https://github.com/matrix-org/matrix-react-sdk/pull/3324) * Improve Discovery section when no IS set [\#3322](https://github.com/matrix-org/matrix-react-sdk/pull/3322) - * Allow password reset without an identity server + * Allow password reset without an ID Server [\#3319](https://github.com/matrix-org/matrix-react-sdk/pull/3319) - * Allow registering with email if no identity server + * Allow registering with email if no ID Server [\#3318](https://github.com/matrix-org/matrix-react-sdk/pull/3318) * Update from Weblate [\#3321](https://github.com/matrix-org/matrix-react-sdk/pull/3321) @@ -6081,7 +6081,7 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3311](https://github.com/matrix-org/matrix-react-sdk/pull/3311) * Disconnect from IS Button [\#3305](https://github.com/matrix-org/matrix-react-sdk/pull/3305) - * Add UI in settings to change identity server + * Add UI in settings to change ID Server [\#3300](https://github.com/matrix-org/matrix-react-sdk/pull/3300) * Read integration managers from account data (widgets) [\#3302](https://github.com/matrix-org/matrix-react-sdk/pull/3302) @@ -6117,7 +6117,7 @@ Changes in [1.6.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3288](https://github.com/matrix-org/matrix-react-sdk/pull/3288) * Reuse DMs whenever possible instead of asking to reuse them [\#3286](https://github.com/matrix-org/matrix-react-sdk/pull/3286) - * Work with no identity server set + * Work with no ID server set [\#3285](https://github.com/matrix-org/matrix-react-sdk/pull/3285) * Split MessageEditor up in edit-specifics & reusable parts for main composer [\#3282](https://github.com/matrix-org/matrix-react-sdk/pull/3282) @@ -6264,7 +6264,7 @@ Changes in [1.5.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#3245](https://github.com/matrix-org/matrix-react-sdk/pull/3245) * Keep widget URL in permission screen to one line [\#3243](https://github.com/matrix-org/matrix-react-sdk/pull/3243) - * Avoid visual glitch when terms appear for integration manager + * Avoid visual glitch when terms appear for Integration Manager [\#3242](https://github.com/matrix-org/matrix-react-sdk/pull/3242) * Show diff for formatted messages in the edit history [\#3244](https://github.com/matrix-org/matrix-react-sdk/pull/3244) @@ -7271,7 +7271,7 @@ Changes in [1.0.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/ [\#2783](https://github.com/matrix-org/matrix-react-sdk/pull/2783) * Add versioning to integration manager API /register and /account calls [\#2782](https://github.com/matrix-org/matrix-react-sdk/pull/2782) - * Ensure scalar_token is valid before opening integration manager + * Ensure scalar_token is valid before opening integrations manager [\#2777](https://github.com/matrix-org/matrix-react-sdk/pull/2777) * Switch to `yarn` for dependency management [\#2773](https://github.com/matrix-org/matrix-react-sdk/pull/2773) From 45a265a59a6ed2c6fbc38a3a79143d8a37367aba Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 13 Jul 2021 18:10:34 +0100 Subject: [PATCH 086/135] Undo changes to translation files other than en_EN Signed-off-by: Paulo Pinto --- src/i18n/strings/ar.json | 20 +++++++++--------- src/i18n/strings/az.json | 2 +- src/i18n/strings/bg.json | 26 ++++++++++++------------ src/i18n/strings/ca.json | 4 ++-- src/i18n/strings/cs.json | 26 ++++++++++++------------ src/i18n/strings/de_DE.json | 26 ++++++++++++------------ src/i18n/strings/el.json | 2 +- src/i18n/strings/en_US.json | 2 +- src/i18n/strings/eo.json | 26 ++++++++++++------------ src/i18n/strings/es.json | 26 ++++++++++++------------ src/i18n/strings/et.json | 26 ++++++++++++------------ src/i18n/strings/eu.json | 26 ++++++++++++------------ src/i18n/strings/fa.json | 24 +++++++++++----------- src/i18n/strings/fi.json | 26 ++++++++++++------------ src/i18n/strings/fr.json | 26 ++++++++++++------------ src/i18n/strings/gl.json | 26 ++++++++++++------------ src/i18n/strings/he.json | 24 +++++++++++----------- src/i18n/strings/hi.json | 2 +- src/i18n/strings/hu.json | 26 ++++++++++++------------ src/i18n/strings/is.json | 2 +- src/i18n/strings/it.json | 38 +++++++++++++++++------------------ src/i18n/strings/ja.json | 20 +++++++++--------- src/i18n/strings/kab.json | 26 ++++++++++++------------ src/i18n/strings/ko.json | 18 ++++++++--------- src/i18n/strings/lt.json | 26 ++++++++++++------------ src/i18n/strings/lv.json | 2 +- src/i18n/strings/nb_NO.json | 16 +++++++-------- src/i18n/strings/nl.json | 26 ++++++++++++------------ src/i18n/strings/nn.json | 4 ++-- src/i18n/strings/pl.json | 20 +++++++++--------- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 26 ++++++++++++------------ src/i18n/strings/ru.json | 26 ++++++++++++------------ src/i18n/strings/sk.json | 20 +++++++++--------- src/i18n/strings/sq.json | 26 ++++++++++++------------ src/i18n/strings/sr.json | 6 +++--- src/i18n/strings/sv.json | 26 ++++++++++++------------ src/i18n/strings/th.json | 2 +- src/i18n/strings/tr.json | 18 ++++++++--------- src/i18n/strings/uk.json | 18 ++++++++--------- src/i18n/strings/vls.json | 16 +++++++-------- src/i18n/strings/zh_Hans.json | 26 ++++++++++++------------ src/i18n/strings/zh_Hant.json | 26 ++++++++++++------------ 43 files changed, 401 insertions(+), 401 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 28c2dd914b..cc63995e0f 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -388,7 +388,7 @@ "Widget added by": "عنصر واجهة أضافه", "Widgets do not use message encryption.": "عناصر الواجهة لا تستخدم تشفير الرسائل.", "Using this widget may share data with %(widgetDomain)s.": "قد يؤدي استخدام هذه الأداة إلى مشاركة البيانات مع%(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "قد يؤدي استخدام عنصر واجهة المستخدم هذا إلى مشاركة البيانات مع %(widgetDomain)s ومدير التكامل الخاص بك.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "قد يؤدي استخدام عنصر واجهة المستخدم هذا إلى مشاركة البيانات مع %(widgetDomain)s ومدير التكامل الخاص بك.", "Widget ID": "معرّف عنصر واجهة", "Room ID": "معرّف الغرفة", "%(brand)s URL": "رابط %(brand)s", @@ -733,7 +733,7 @@ "Clear cache and reload": "محو مخزن الجيب وإعادة التحميل", "click to reveal": "انقر للكشف", "Access Token:": "رمز الوصول:", - "Identity server is": "خادم الهوية هو", + "Identity Server is": "خادم الهوية هو", "Homeserver is": "الخادم الوسيط هو", "olm version:": "إصدار olm:", "%(brand)s version:": "إصدار %(brand)s:", @@ -783,20 +783,20 @@ "New version available. Update now.": "ثمة إصدارٌ جديد. حدّث الآن.", "Check for update": "ابحث عن تحديث", "Error encountered (%(errorDetail)s).": "صودِفَ خطأ: (%(errorDetail)s).", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "يتلقى مديرو التكامل بيانات الضبط ، ويمكنهم تعديل عناصر واجهة المستخدم ، وإرسال دعوات الغرف ، وتعيين مستويات القوة نيابة عنك.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "يتلقى مديرو التكامل بيانات الضبط ، ويمكنهم تعديل عناصر واجهة المستخدم ، وإرسال دعوات الغرف ، وتعيين مستويات القوة نيابة عنك.", "Manage integrations": "إدارة التكاملات", - "Use an integration manager to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل (%(serverName)s) لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل (%(serverName)s) لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", "Change": "تغيير", "Enter a new identity server": "أدخل خادم هوية جديدًا", "Do not use an identity server": "لا تستخدم خادم هوية", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "استخدام خادم الهوية اختياري. إذا اخترت عدم استخدام خادم هوية ، فلن يتمكن المستخدمون الآخرون من اكتشافك ولن تتمكن من دعوة الآخرين عبر البريد الإلكتروني أو الهاتف.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "قطع الاتصال بخادم الهوية الخاص بك يعني أنك لن تكون قابلاً للاكتشاف من قبل المستخدمين الآخرين ولن تتمكن من دعوة الآخرين عبر البريد الإلكتروني أو الهاتف.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "أنت لا تستخدم حاليًا خادم هوية. لاكتشاف جهات الاتصال الحالية التي تعرفها وتكون قابلاً للاكتشاف ، أضف واحداً أدناه.", - "Identity server": "خادم الهوية", + "Identity Server": "خادم الهوية", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "إذا كنت لا تريد استخدام لاكتشاف جهات الاتصال الموجودة التي تعرفها وتكون قابلاً للاكتشاف ، فأدخل خادم هوية آخر أدناه.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "أنت تستخدم حاليًا لاكتشاف جهات الاتصال الحالية التي تعرفها وتجعل نفسك قابلاً للاكتشاف. يمكنك تغيير خادم الهوية الخاص بك أدناه.", - "Identity server (%(server)s)": "خادمة الهوية (%(server)s)", + "Identity Server (%(server)s)": "خادمة الهوية (%(server)s)", "Go back": "ارجع", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "نوصي بإزالة عناوين البريد الإلكتروني وأرقام الهواتف من خادم الهوية قبل قطع الاتصال.", "You are still sharing your personal data on the identity server .": "لا زالت بياناتك الشخصية مشاعة على خادم الهوية .", @@ -814,9 +814,9 @@ "Disconnect from the identity server and connect to instead?": "انفصل عن خادم الهوية واتصل بآخر بدلاً منه؟", "Change identity server": "تغيير خادم الهوية", "Checking server": "فحص خادم", - "Could not connect to identity server": "تعذر الاتصال بخادم هوية", - "Not a valid identity server (status code %(code)s)": "خادم هوية مردود (رقم الحال %(code)s)", - "Identity server URL must be HTTPS": "يجب أن يكون رابط (URL) خادم الهوية HTTPS", + "Could not connect to Identity Server": "تعذر الاتصال بخادم هوية", + "Not a valid Identity Server (status code %(code)s)": "خادم هوية مردود (رقم الحال %(code)s)", + "Identity Server URL must be HTTPS": "يجب أن يكون رابط (URL) خادم الهوية HTTPS", "not ready": "غير جاهز", "ready": "جاهز", "Secret storage:": "التخزين السري:", diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json index fccb2b1cc4..987cef73b2 100644 --- a/src/i18n/strings/az.json +++ b/src/i18n/strings/az.json @@ -253,7 +253,7 @@ "Access Token:": "Girişin token-i:", "click to reveal": "açılış üçün basın", "Homeserver is": "Ev serveri bu", - "Identity server is": "Eyniləşdirmənin serveri bu", + "Identity Server is": "Eyniləşdirmənin serveri bu", "olm version:": "Olm versiyası:", "Failed to send email": "Email göndərilməsinin səhvi", "A new password must be entered.": "Yeni parolu daxil edin.", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 7b830fe22e..294d5a4979 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -585,7 +585,7 @@ "Access Token:": "Тоукън за достъп:", "click to reveal": "натиснете за показване", "Homeserver is": "Home сървър:", - "Identity server is": "Сървър за самоличност:", + "Identity Server is": "Сървър за самоличност:", "%(brand)s version:": "Версия на %(brand)s:", "olm version:": "Версия на olm:", "Failed to send email": "Неуспешно изпращане на имейл", @@ -1068,7 +1068,7 @@ "Confirm": "Потвърди", "Other servers": "Други сървъри", "Homeserver URL": "Адрес на Home сървър", - "Identity server URL": "Адрес на сървър за самоличност", + "Identity Server URL": "Адрес на сървър за самоличност", "Free": "Безплатно", "Join millions for free on the largest public server": "Присъединете се безплатно към милиони други на най-големия публичен сървър", "Premium": "Премиум", @@ -1395,7 +1395,7 @@ "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Не можете да влезете в профила си. Свържете се с администратора на сървъра за повече информация.", "You're signed out": "Излязохте от профила", "Clear personal data": "Изчисти личните данни", - "Identity server": "Сървър за самоличност", + "Identity Server": "Сървър за самоличност", "Find others by phone or email": "Открийте други по телефон или имейл", "Be found by phone or email": "Бъдете открит по телефон или имейл", "Use bots, bridges, widgets and sticker packs": "Използвайте ботове, връзки с други мрежи, приспособления и стикери", @@ -1413,9 +1413,9 @@ "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Позволи ползването на помощен сървър turn.matrix.org когато сървъра не предложи собствен (IP адресът ви ще бъде споделен по време на разговор)", "ID": "Идентификатор", "Public Name": "Публично име", - "Identity server URL must be HTTPS": "Адресът на сървъра за самоличност трябва да бъде HTTPS", - "Not a valid identity server (status code %(code)s)": "Невалиден сървър за самоличност (статус код %(code)s)", - "Could not connect to identity server": "Неуспешна връзка със сървъра за самоличност", + "Identity Server URL must be HTTPS": "Адресът на сървъра за самоличност трябва да бъде HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Невалиден сървър за самоличност (статус код %(code)s)", + "Could not connect to Identity Server": "Неуспешна връзка със сървъра за самоличност", "Checking server": "Проверка на сървъра", "Identity server has no terms of service": "Сървъра за самоличност няма условия за ползване", "The identity server you have chosen does not have any terms of service.": "Избраният от вас сървър за самоличност няма условия за ползване на услугата.", @@ -1423,12 +1423,12 @@ "Terms of service not accepted or the identity server is invalid.": "Условията за ползване не бяха приети или сървъра за самоличност е невалиден.", "Disconnect from the identity server ?": "Прекъсване на връзката със сървър за самоличност ?", "Disconnect": "Прекъсни", - "Identity server (%(server)s)": "Сървър за самоличност (%(server)s)", + "Identity Server (%(server)s)": "Сървър за самоличност (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "В момента използвате за да откривате и да бъдете открити от познати ваши контакти. Може да промените сървъра за самоличност по-долу.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "В момента не използвате сървър за самоличност. За да откривате и да бъдете открити от познати ваши контакти, добавете такъв по-долу.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Прекъсването на връзката със сървъра ви за самоличност означава че няма да можете да бъдете открити от други потребители или да каните хора по имейл или телефонен номер.", "Enter a new identity server": "Въведете нов сървър за самоличност", - "Integration manager": "Мениджър на интеграции", + "Integration Manager": "Мениджър на интеграции", "Discovery": "Откриване", "Deactivate account": "Деактивиране на акаунт", "Always show the window menu bar": "Винаги показвай менютата на прозореца", @@ -1640,10 +1640,10 @@ "Backup has a invalid signature from this user": "Резервното копие има невалиден подпис за този потребител", "Backup has a signature from unknown user with ID %(deviceId)s": "Резервното копие има подпис от непознат потребител с идентификатор %(deviceId)s", "Backup key stored: ": "Резервният ключ е съхранен: ", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции %(serverName)s за управление на ботове, приспособления и стикери.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции за управление на ботове, приспособления и стикери.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции %(serverName)s за управление на ботове, приспособления и стикери.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции за управление на ботове, приспособления и стикери.", "Manage integrations": "Управление на интеграциите", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Мениджърът на интеграции получава конфигурационни данни, може да модифицира приспособления, да изпраща покани за стаи и да настройва нива на достъп от ваше име.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Мениджърът на интеграции получава конфигурационни данни, може да модифицира приспособления, да изпраща покани за стаи и да настройва нива на достъп от ваше име.", "Customise your experience with experimental labs features. Learn more.": "Настройте изживяването си с експериментални функции. Научи повече.", "Ignored/Blocked": "Игнорирани/блокирани", "Error adding ignored user/server": "Грешка при добавяне на игнориран потребител/сървър", @@ -1701,7 +1701,7 @@ "%(brand)s URL": "%(brand)s URL адрес", "Room ID": "Идентификатор на стаята", "Widget ID": "Идентификатор на приспособлението", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s и с мениджъра на интеграции.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s и с мениджъра на интеграции.", "Using this widget may share data with %(widgetDomain)s.": "Използването на това приспособление може да сподели данни с %(widgetDomain)s.", "Widgets do not use message encryption.": "Приспособленията не използваш шифроване на съобщенията.", "Widget added by": "Приспособлението е добавено от", @@ -1711,7 +1711,7 @@ "Integrations are disabled": "Интеграциите са изключени", "Enable 'Manage Integrations' in Settings to do this.": "Включете 'Управление на интеграции' от настройките за направите това.", "Integrations not allowed": "Интеграциите не са разрешени", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Вашият %(brand)s не позволява да използвате мениджъра на интеграции за да направите това. Свържете се с администратор.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Вашият %(brand)s не позволява да използвате мениджъра на интеграции за да направите това. Свържете се с администратор.", "Automatically invite users": "Автоматично кани потребители", "Upgrade private room": "Обнови лична стая", "Upgrade public room": "Обнови публична стая", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 4bc44dfb80..945b5a10cc 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -575,7 +575,7 @@ "Your homeserver's URL": "L'URL del teu servidor propi", "Analytics": "Analítiques", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.", - "Identity server is": "El servidor d'identitat és", + "Identity Server is": "El servidor d'identitat és", "Submit debug logs": "Enviar logs de depuració", "The platform you're on": "La plataforma a la que et trobes", "Your language of choice": "El teu idioma desitjat", @@ -842,7 +842,7 @@ "Unexpected error resolving identity server configuration": "Error inesperat resolent la configuració del servidor d'identitat", "Unexpected error resolving homeserver configuration": "Error inesperat resolent la configuració del servidor local", "(an error occurred)": "(s'ha produït un error)", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Els gestors d'integracions reben dades de configuració i poden modificar ginys, enviar invitacions a sales i establir nivells d'autoritat en nom teu.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Els gestors d'integracions reben dades de configuració i poden modificar ginys, enviar invitacions a sales i establir nivells d'autoritat en nom teu.", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "S'ha produït un error en canviar els requisits del nivell d'autoritat de la sala. Assegura't que tens suficients permisos i torna-ho a provar.", "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "S'ha produït un error en canviar el nivell d'autoritat de l'usuari. Assegura't que tens suficients permisos i torna-ho a provar.", "Power level": "Nivell d'autoritat", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 60a2ea3e6f..27235665aa 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -146,7 +146,7 @@ "Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste klepli na odkaz v e-mailové zprávě", "Guests cannot join this room even if explicitly invited.": "Hosté nemohou vstoupit do této místnosti, i když jsou přímo pozváni.", "Homeserver is": "Domovský server je", - "Identity server is": "Server identity je", + "Identity Server is": "Server identity je", "I have verified my email address": "Ověřil(a) jsem svou e-mailovou adresu", "Import": "Importovat", "Import E2E room keys": "Importovat end-to-end klíče místností", @@ -1155,7 +1155,7 @@ "Invalid homeserver discovery response": "Neplatná odpověd při hledání domovského serveru", "Failed to perform homeserver discovery": "Nepovedlo se zjisit adresu domovského serveru", "Registration has been disabled on this homeserver.": "Tento domovský server nepovoluje registraci.", - "Identity server URL": "URL serveru identity", + "Identity Server URL": "URL serveru identity", "Invalid identity server discovery response": "Neplatná odpověď při hledání serveru identity", "Your Modular server": "Váš server Modular", "Server Name": "Název serveru", @@ -1377,9 +1377,9 @@ "Accept to continue:": "Pro pokračování odsouhlaste :", "ID": "ID", "Public Name": "Veřejné jméno", - "Identity server URL must be HTTPS": "Adresa serveru identit musí být na HTTPS", - "Not a valid identity server (status code %(code)s)": "Toto není validní server identit (stavový kód %(code)s)", - "Could not connect to identity server": "Nepovedlo se připojení k serveru identit", + "Identity Server URL must be HTTPS": "Adresa serveru identit musí být na HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Toto není validní server identit (stavový kód %(code)s)", + "Could not connect to Identity Server": "Nepovedlo se připojení k serveru identit", "Checking server": "Kontrolování serveru", "Change identity server": "Změnit server identit", "Disconnect from the identity server and connect to instead?": "Odpojit se ze serveru a připojit na ?", @@ -1393,16 +1393,16 @@ "You are still sharing your personal data on the identity server .": "Pořád sdílíte osobní údaje se serverem identit .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Než se odpojíte, doporučujeme odstranit e-mailovou adresu a telefonní číslo ze serveru identit.", "Disconnect anyway": "Stejně se odpojit", - "Identity server (%(server)s)": "Server identit (%(server)s)", + "Identity Server (%(server)s)": "Server identit (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Pro hledání existujících kontaktů používáte server identit . Níže ho můžete změnit.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Pokud nechcete na hledání existujících kontaktů používat server , zvolte si jiný server.", - "Identity server": "Server identit", + "Identity Server": "Server identit", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Pro hledání existujících kontaktů nepoužíváte žádný server identit . Abyste mohli hledat kontakty, nějaký níže nastavte.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Po odpojení od serveru identit nebude možné vás najít podle e-mailové adresy ani telefonního čísla, a zároveň podle nich ani vy nebudete moci hledat ostatní kontakty.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Použití serveru identit je volitelné. Nemusíte server identit používat, ale nepůjde vás pak najít podle e-mailové adresy ani telefonního čísla a vy také nebudete moci hledat ostatní.", "Do not use an identity server": "Nepoužívat server identit", "Enter a new identity server": "Zadejte nový server identit", - "Integration manager": "Správce integrací", + "Integration Manager": "Správce integrací", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Pro zapsáním do registru e-mailových adres a telefonních čísel odsouhlaste podmínky používání serveru (%(serverName)s).", "Deactivate account": "Deaktivace účtu", "Always show the window menu bar": "Vždy zobrazovat horní lištu okna", @@ -1619,10 +1619,10 @@ "Cannot connect to integration manager": "Nepovedlo se připojení ke správci integrací", "The integration manager is offline or it cannot reach your homeserver.": "Správce integrací neběží nebo se nemůže připojit k vašemu domovskému serveru.", "Clear notifications": "Odstranit oznámení", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a samolepek.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a samolepek.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a samolepek.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a samolepek.", "Manage integrations": "Správa integrací", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Správce integrací dostává konfigurační data a může za vás modifikovat widgety, posílat pozvánky a nastavovat úrovně oprávnění.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Správce integrací dostává konfigurační data a může za vás modifikovat widgety, posílat pozvánky a nastavovat úrovně oprávnění.", "Customise your experience with experimental labs features. Learn more.": "Přizpůsobte si aplikaci s experimentálními funkcemi. Více informací.", "Ignored/Blocked": "Ignorováno/Blokováno", "Error adding ignored user/server": "Chyba při přidávání ignorovaného uživatele/serveru", @@ -1672,7 +1672,7 @@ "%(brand)s URL": "URL %(brand)su", "Room ID": "ID místnosti", "Widget ID": "ID widgetu", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s a vaším správcem integrací.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s a vaším správcem integrací.", "Using this widget may share data with %(widgetDomain)s.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgety nepoužívají šifrování zpráv.", "Widget added by": "Widget přidal", @@ -1681,7 +1681,7 @@ "Integrations are disabled": "Integrace jsou zakázané", "Enable 'Manage Integrations' in Settings to do this.": "Pro provedení této akce povolte v nastavení správu integrací.", "Integrations not allowed": "Integrace nejsou povolené", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Váš %(brand)s neumožňuje použít správce integrací. Kontaktujte prosím správce.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Váš %(brand)s neumožňuje použít správce integrací. Kontaktujte prosím správce.", "Automatically invite users": "Automaticky zvát uživatele", "Upgrade private room": "Upgradovat soukromou místnost", "Upgrade public room": "Upgradovat veřejnou místnost", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 00530b0457..c09b92dcbc 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -48,7 +48,7 @@ "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", "Homeserver is": "Dein Heimserver ist", - "Identity server is": "Der Identitätsserver ist", + "Identity Server is": "Der Identitätsserver ist", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raumschlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", @@ -1163,7 +1163,7 @@ "Confirm": "Bestätigen", "Other servers": "Andere Server", "Homeserver URL": "Heimserver-Adresse", - "Identity server URL": "Identitätsserver-URL", + "Identity Server URL": "Identitätsserver-URL", "Free": "Frei", "Premium": "Premium", "Premium hosting for organisations Learn more": "Premium-Hosting für Organisationen Lerne mehr", @@ -1300,18 +1300,18 @@ "You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", "Multiple integration managers": "Mehrere Integrationsverwalter", "Public Name": "Öffentlicher Name", - "Identity server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein", - "Could not connect to identity server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", + "Identity Server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein", + "Could not connect to Identity Server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", "Checking server": "Server wird überprüft", "Identity server has no terms of service": "Der Identitätsserver hat keine Nutzungsbedingungen", "Disconnect": "Trennen", - "Identity server": "Identitätsserver", + "Identity Server": "Identitätsserver", "Use an identity server": "Benutze einen Identitätsserver", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standardidentitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.", "ID": "ID", - "Not a valid identity server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)", + "Not a valid Identity Server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)", "Terms of service not accepted or the identity server is invalid.": "Die Nutzungsbedingungen wurden nicht akzeptiert oder der Identitätsserver ist ungültig.", - "Identity server (%(server)s)": "Identitätsserver (%(server)s)", + "Identity Server (%(server)s)": "Identitätsserver (%(server)s)", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Die Verwendung eines Identitätsserver ist optional. Solltest du dich dazu entschließen, keinen Identitätsserver zu verwenden, kannst du von anderen Nutzern nicht gefunden werden und andere nicht per E-Mail oder Telefonnummer einladen.", "Do not use an identity server": "Keinen Identitätsserver verwenden", "Enter a new identity server": "Gib einen neuen Identitätsserver ein", @@ -1396,8 +1396,8 @@ "You are still sharing your personal data on the identity server .": "Du teilst deine persönlichen Daten immer noch auf dem Identitätsserver .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine E-Mail-Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Zur Zeit benutzt du keinen Identitätsserver. Trage unten einen Server ein, um Kontakte finden und von anderen gefunden zu werden.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.", "Manage integrations": "Integrationen verwalten", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Stimme den Nutzungsbedingungen des Identitätsservers %(serverName)s zu, um dich per E-Mail-Adresse und Telefonnummer auffindbar zu machen.", "Clear cache and reload": "Zwischenspeicher löschen und neu laden", @@ -1594,7 +1594,7 @@ "This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde", "Enable desktop notifications for this session": "Desktopbenachrichtigungen in dieser Sitzung", "Enable audible notifications for this session": "Benachrichtigungstöne in dieser Sitzung", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", "Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)", "Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", "Session key:": "Sitzungsschlüssel:", @@ -1909,7 +1909,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "Raum-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s und deinem Integrationsserver übertragen werden.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s und deinem Integrationsserver übertragen werden.", "Using this widget may share data with %(widgetDomain)s.": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s übertragen werden.", "Widgets do not use message encryption.": "Widgets verwenden keine Nachrichtenverschlüsselung.", "Please create a new issue on GitHub so that we can investigate this bug.": "Bitte erstelle ein neues Issue auf GitHub damit wir diesen Fehler untersuchen können.", @@ -1993,7 +1993,7 @@ "You'll upgrade this room from to .": "Du wirst diesen Raum von zu aktualisieren.", "Missing session data": "Fehlende Sitzungsdaten", "Your browser likely removed this data when running low on disk space.": "Dein Browser hat diese Daten wahrscheinlich entfernt als der Festplattenspeicher knapp wurde.", - "Integration manager": "Integrationsverwaltung", + "Integration Manager": "Integrationsverwaltung", "Find others by phone or email": "Finde Andere per Telefon oder E-Mail", "Be found by phone or email": "Sei per Telefon oder E-Mail auffindbar", "Upload files (%(current)s of %(total)s)": "Dateien hochladen (%(current)s von %(total)s)", @@ -2072,7 +2072,7 @@ "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifiziere dieses Gerät, um es als vertrauenswürdig zu markieren. Das Vertrauen in dieses Gerät gibt dir und anderen Benutzern zusätzliche Sicherheit, wenn ihr Ende-zu-Ende verschlüsselte Nachrichten verwendet.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifiziere dieses Gerät und es wird es als vertrauenswürdig markiert. Benutzer, die sich bei dir verifiziert haben, werden diesem Gerät auch vertrauen.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Dein %(brand)s erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Dein %(brand)s erlaubt dir nicht, eine Integrationsverwaltung zu verwenden, um dies zu tun. Bitte kontaktiere einen Administrator.", "We couldn't create your DM. Please check the users you want to invite and try again.": "Wir konnten deine Direktnachricht nicht erstellen. Bitte überprüfe den Benutzer, den du einladen möchtest, und versuche es erneut.", "We couldn't invite those users. Please check the users you want to invite and try again.": "Wir konnten diese Benutzer nicht einladen. Bitte überprüfe sie und versuche es erneut.", "Start a conversation with someone using their name, username (like ) or email address.": "Starte eine Unterhaltung mit jemandem indem du seinen Namen, Benutzernamen (z.B. ) oder E-Mail-Adresse eingibst.", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index ac132b01f8..8700abbff1 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -82,7 +82,7 @@ "Hangup": "Κλείσιμο", "Historical": "Ιστορικό", "Homeserver is": "Ο διακομιστής είναι", - "Identity server is": "Ο διακομιστής ταυτοποίησης είναι", + "Identity Server is": "Ο διακομιστής ταυτοποίησης είναι", "I have verified my email address": "Έχω επαληθεύσει την διεύθυνση ηλ. αλληλογραφίας", "Import": "Εισαγωγή", "Import E2E room keys": "Εισαγωγή κλειδιών E2E", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index be473bb289..a5d7756de8 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -108,7 +108,7 @@ "Hangup": "Hangup", "Historical": "Historical", "Homeserver is": "Homeserver is", - "Identity server is": "Identity server 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", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index c8a1218a48..41bb44ed83 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -557,7 +557,7 @@ "Access Token:": "Atinga ĵetono:", "click to reveal": "klaku por malkovri", "Homeserver is": "Hejmservilo estas", - "Identity server is": "Identiga servilo estas", + "Identity Server is": "Identiga servilo estas", "%(brand)s version:": "versio de %(brand)s:", "olm version:": "versio de olm:", "Failed to send email": "Malsukcesis sendi retleteron", @@ -969,7 +969,7 @@ "Confirm": "Konfirmi", "Other servers": "Aliaj serviloj", "Homeserver URL": "Hejmservila URL", - "Identity server URL": "URL de identiga servilo", + "Identity Server URL": "URL de identiga servilo", "Free": "Senpaga", "Other": "Alia", "Couldn't load page": "Ne povis enlegi paĝon", @@ -1395,7 +1395,7 @@ "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Enigu la lokon de via Modular-hejmservilo. Ĝi povas uzi vian propran domajnan nomon aŭ esti subdomajno de modular.im.", "Invalid base_url for m.homeserver": "Nevalida base_url por m.homeserver", "Invalid base_url for m.identity_server": "Nevalida base_url por m.identity_server", - "Identity server": "Identiga servilo", + "Identity Server": "Identiga servilo", "Find others by phone or email": "Trovu aliajn per telefonnumero aŭ retpoŝtadreso", "Be found by phone or email": "Troviĝu per telefonnumero aŭ retpoŝtadreso", "Use bots, bridges, widgets and sticker packs": "Uzu robotojn, pontojn, fenestraĵojn, kaj glumarkarojn", @@ -1422,9 +1422,9 @@ "Displays list of commands with usages and descriptions": "Montras liston de komandoj kun priskribo de uzo", "Send read receipts for messages (requires compatible homeserver to disable)": "Sendi legokonfirmojn de mesaĝoj (bezonas akordan hejmservilon por malŝalto)", "Accept to continue:": "Akceptu por daŭrigi:", - "Identity server URL must be HTTPS": "URL de identiga servilo devas esti HTTPS-a", - "Not a valid identity server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)", - "Could not connect to identity server": "Ne povis konektiĝi al identiga servilo", + "Identity Server URL must be HTTPS": "URL de identiga servilo devas esti HTTPS-a", + "Not a valid Identity Server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)", + "Could not connect to Identity Server": "Ne povis konektiĝi al identiga servilo", "Checking server": "Kontrolante servilon", "Change identity server": "Ŝanĝi identigan servilon", "Disconnect from the identity server and connect to instead?": "Ĉu malkonekti de la nuna identiga servilo kaj konekti anstataŭe al ?", @@ -1438,7 +1438,7 @@ "You are still sharing your personal data on the identity server .": "Vi ankoraŭ havigas siajn personajn datumojn je la identiga servilo .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ni rekomendas, ke vi forigu viajn retpoŝtadresojn kaj telefonnumerojn de la identiga servilo, antaŭ ol vi malkonektiĝos.", "Disconnect anyway": "Tamen malkonekti", - "Identity server (%(server)s)": "Identiga servilo (%(server)s)", + "Identity Server (%(server)s)": "Identiga servilo (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Vi nun uzas servilon por trovi kontaktojn, kaj troviĝi de ili. Vi povas ŝanĝi vian identigan servilon sube.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se vi ne volas uzi servilon por trovi kontaktojn kaj troviĝi mem, enigu alian identigan servilon sube.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vi nun ne uzas identigan servilon. Por trovi kontaktojn kaj troviĝi de ili mem, aldonu iun sube.", @@ -1491,7 +1491,7 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "kontrolu kromprogramojn de via foliumilo je ĉio, kio povus malhelpi konekton al la identiga servilo (ekzemple « Privacy Badger »)", "contact the administrators of identity server ": "kontaktu la administrantojn de la identiga servilo ", "wait and try again later": "atendu kaj reprovu pli poste", - "Integration manager": "Kunigilo", + "Integration Manager": "Kunigilo", "Clear cache and reload": "Vakigi kaŝmemoron kaj relegi", "Show tray icon and minimize window to it on close": "Montri pletan bildsimbolon kaj tien plejetigi la fenestron je fermo", "Read Marker lifetime (ms)": "Vivodaŭro de legomarko (ms)", @@ -1808,10 +1808,10 @@ "Your keys are not being backed up from this session.": "Viaj ŝlosiloj ne estas savkopiataj el ĉi tiu salutaĵo.", "Enable desktop notifications for this session": "Ŝalti labortablajn sciigojn por ĉi tiu salutaĵo", "Enable audible notifications for this session": "Ŝalti aŭdeblajn sciigojn por ĉi tiu salutaĵo", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Uzu kunigilon (%(serverName)s) por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Uzu kunigilon por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Uzu kunigilon (%(serverName)s) por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Uzu kunigilon por administrado de robotoj, fenestraĵoj, kaj glumarkaroj.", "Manage integrations": "Administri kunigojn", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi povnivelojn.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Kunigiloj ricevas agordajn datumojn, kaj povas modifi fenestraĵojn, sendi invitojn al ĉambroj, kaj vianome agordi povnivelojn.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Via pasvorto sukcese ŝanĝiĝis. Vi ne ricevados pasivajn sciigojn en aliaj salutaĵoj, ĝis vi ilin resalutos", "Error downloading theme information.": "Eraris elŝuto de informoj pri haŭto.", "Theme added!": "Haŭto aldoniĝis!", @@ -1895,7 +1895,7 @@ "Declining …": "Rifuzante…", " reacted with %(content)s": " reagis per %(content)s", "Any of the following data may be shared:": "Ĉiu el la jenaj datumoj povas kunhaviĝi:", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s kaj via kunigilo.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s kaj via kunigilo.", "Using this widget may share data with %(widgetDomain)s.": "Uzo de tiu ĉi fenestraĵo eble havigos datumojn kun %(widgetDomain)s.", "Language Dropdown": "Lingva falmenuo", "Destroy cross-signing keys?": "Ĉu detrui delege ĉifrajn ŝlosilojn?", @@ -1911,7 +1911,7 @@ "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Kontrolu ĉi tiun aparaton por marki ĝin fidata. Fidado povas pacigi la menson de vi kaj aliaj uzantoj dum uzado de tutvoje ĉifrataj mesaĝoj.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Kontrolo de ĉi tiu aparato markos ĝin fidata, kaj ankaŭ la uzantoj, kiuj interkontrolis kun vi, fidos ĉi tiun aparaton.", "Enable 'Manage Integrations' in Settings to do this.": "Ŝaltu «Administri kunigojn» en Agordoj, por fari ĉi tion.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Via %(brand)so ne permesas al vi uzi kunigilon por tio. Bonvolu kontakti administranton.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Via %(brand)so ne permesas al vi uzi kunigilon por tio. Bonvolu kontakti administranton.", "Failed to invite the following users to chat: %(csvUsers)s": "Malsukcesis inviti la jenajn uzantojn al babilo: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Ni ne povis krei vian rektan ĉambron. Bonvolu kontroli, kiujn uzantojn vi invitas, kaj reprovu.", "Something went wrong trying to invite the users.": "Io eraris dum invito de la uzantoj.", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index aca817a318..c1fb8e6542 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -88,7 +88,7 @@ "Hangup": "Colgar", "Historical": "Historial", "Homeserver is": "El servidor base es", - "Identity server is": "El Servidor de Identidad es", + "Identity Server is": "El Servidor de Identidad es", "I have verified my email address": "He verificado mi dirección de correo electrónico", "Import E2E room keys": "Importar claves de salas con cifrado de extremo a extremo", "Incorrect verification code": "Verificación de código incorrecta", @@ -1216,10 +1216,10 @@ "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de cifrado end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.", "in memory": "en memoria", "not found": "no encontrado", - "Identity server (%(server)s)": "Servidor de identidad %(server)s", + "Identity Server (%(server)s)": "Servidor de identidad %(server)s", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Estás usando actualmente para descubrir y ser descubierto por contactos existentes que conoces. Puedes cambiar tu servidor de identidad más abajo.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Si no quieres usar para descubrir y ser descubierto por contactos existentes que conoces, introduce otro servidor de identidad más abajo.", - "Identity server": "Servidor de Identidad", + "Identity Server": "Servidor de Identidad", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "No estás usando un servidor de identidad ahora mismo. Para descubrir y ser descubierto por contactos existentes que conoces, introduce uno más abajo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectarte de tu servidor de identidad significa que no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar un servidor de identidad es opcional. Si eliges no usar un servidor de identidad, no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.", @@ -1227,7 +1227,7 @@ "Enter a new identity server": "Introducir un servidor de identidad nuevo", "Change": "Cambiar", "Manage integrations": "Gestionar integraciones", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establecer niveles de poder en tu nombre.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establecer niveles de poder en tu nombre.", "Something went wrong trying to invite the users.": "Algo salió mal al intentar invitar a los usuarios.", "We couldn't invite those users. Please check the users you want to invite and try again.": "No se pudo invitar a esos usuarios. Por favor, revisa los usuarios que quieres invitar e inténtalo de nuevo.", "Failed to find the following users": "No se encontró a los siguientes usuarios", @@ -1526,9 +1526,9 @@ "Backup has an invalid signature from verified session ": "La copia de seguridad tiene una firma de no válida de sesión verificada ", "Backup has an invalid signature from unverified session ": "La copia de seguridad tiene una firma de no válida de sesión no verificada ", "Upgrade to your own domain": "Contratar dominio personalizado", - "Identity server URL must be HTTPS": "La URL del servidor de identidad debe ser tipo HTTPS", - "Not a valid identity server (status code %(code)s)": "No es un servidor de identidad válido (código de estado %(code)s)", - "Could not connect to identity server": "No se ha podido conectar al servidor de identidad", + "Identity Server URL must be HTTPS": "La URL del servidor de identidad debe ser tipo HTTPS", + "Not a valid Identity Server (status code %(code)s)": "No es un servidor de identidad válido (código de estado %(code)s)", + "Could not connect to Identity Server": "No se ha podido conectar al servidor de identidad", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Usted debe eliminar sus datos personales del servidor de identidad antes de desconectarse. Desafortunadamente, el servidor de identidad está actualmente desconectado o es imposible comunicarse con él por otra razón.", "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "comprueba los complementos (plugins) de tu navegador para ver si hay algo que pueda bloquear el servidor de identidad (como p.ej. Privacy Badger)", "contact the administrators of identity server ": "contactar con los administradores del servidor de identidad ", @@ -1537,8 +1537,8 @@ "You are still sharing your personal data on the identity server .": "Usted todavía está compartiendo sus datos personales en el servidor de identidad .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Le recomendamos que elimine sus direcciones de correo electrónico y números de teléfono del servidor de identidad antes de desconectarse.", "Go back": "Atrás", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usar un gestor de integraciones (%(serverName)s) para manejar los bots, widgets y paquetes de pegatinas.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Utiliza un Administrador de Integración para gestionar los bots, los widgets y los paquetes de pegatinas.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usar un gestor de integraciones (%(serverName)s) para manejar los bots, widgets y paquetes de pegatinas.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Utiliza un Administrador de Integración para gestionar los bots, los widgets y los paquetes de pegatinas.", "Invalid theme schema.": "Esquema de tema inválido.", "Error downloading theme information.": "Error al descargar la información del tema.", "Theme added!": "¡Se añadió el tema!", @@ -1666,7 +1666,7 @@ "Integrations are disabled": "Las integraciones están desactivadas", "Enable 'Manage Integrations' in Settings to do this.": "Activa «Gestionar integraciones» en ajustes para hacer esto.", "Integrations not allowed": "Integraciones no están permitidas", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s no utilizar un \"gestor de integración\" para hacer esto. Por favor, contacta con un administrador.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s no utilizar un \"gestor de integración\" para hacer esto. Por favor, contacta con un administrador.", "Failed to invite the following users to chat: %(csvUsers)s": "Error invitando a los siguientes usuarios al chat: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "No se ha podido crear el mensaje directo. Por favor, comprueba los usuarios que quieres invitar e inténtalo de nuevo.", "Start a conversation with someone using their name, username (like ) or email address.": "Iniciar una conversación con alguien usando su nombre, nombre de usuario (como ) o dirección de correo electrónico.", @@ -1868,7 +1868,7 @@ "%(brand)s URL": "URL de %(brand)s", "Room ID": "ID de la sala", "Widget ID": "ID del widget", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s y su administrador de integración.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s y su administrador de integración.", "Using this widget may share data with %(widgetDomain)s.": "Usar este widget puede resultar en que se compartan datos con %(widgetDomain)s.", "Widgets do not use message encryption.": "Los widgets no utilizan el cifrado de mensajes.", "Widget added by": "Widget añadido por", @@ -1894,7 +1894,7 @@ "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Para ayudar a evitar la duplicación de entradas, por favor ver primero los entradas existentes (y añadir un +1) o, si no lo encuentra, crear una nueva entrada .", "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reportar este mensaje enviará su único «event ID al administrador de tu servidor base. Si los mensajes en esta sala están cifrados, el administrador de tu servidor no podrá leer el texto del mensaje ni ver ningún archivo o imagen.", "Command Help": "Ayuda del comando", - "Integration manager": "Administrador de integración", + "Integration Manager": "Administrador de integración", "Verify other session": "Verificar otra sesión", "Verification Request": "Solicitud de verificación", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Un widget localizado en %(widgetUrl)s desea verificar su identidad. Permitiendo esto, el widget podrá verificar su identidad de usuario, pero no realizar acciones como usted.", @@ -1975,7 +1975,7 @@ "Enter your custom homeserver URL What does this mean?": "Ingrese la URL de su servidor doméstico ¿Qué significa esto?", "Homeserver URL": "URL del servidor doméstico", "Enter your custom identity server URL What does this mean?": "Introduzca la URL de su servidor de identidad personalizada ¿Qué significa esto?", - "Identity server URL": "URL del servidor de identidad", + "Identity Server URL": "URL del servidor de identidad", "Other servers": "Otros servidores", "Free": "Gratis", "Join millions for free on the largest public server": "Únete de forma gratuita a millones de personas en el servidor público más grande", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 765e5b7282..a466922bf9 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -279,7 +279,7 @@ "Missing session data": "Sessiooni andmed on puudu", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Osa sessiooniandmetest, sealhulgas sõnumi krüptovõtmed, on puudu. Vea parandamiseks logi välja ja sisse, vajadusel taasta võtmed varundusest.", "Your browser likely removed this data when running low on disk space.": "On võimalik et sinu brauser kustutas need andmed, sest kõvakettaruumist jäi puudu.", - "Integration manager": "Lõiminguhaldur", + "Integration Manager": "Lõiminguhaldur", "Find others by phone or email": "Leia teisi kasutajaid telefoninumbri või e-posti aadressi alusel", "Be found by phone or email": "Ole leitav telefoninumbri või e-posti aadressi alusel", "Terms of Service": "Kasutustingimused", @@ -1242,7 +1242,7 @@ "Enter your custom homeserver URL What does this mean?": "Sisesta oma koduserveri aadress Mida see tähendab?", "Homeserver URL": "Koduserveri aadress", "Enter your custom identity server URL What does this mean?": "Sisesta kohandatud isikutuvastusserver aadress Mida see tähendab?", - "Identity server URL": "Isikutuvastusserveri aadress", + "Identity Server URL": "Isikutuvastusserveri aadress", "Other servers": "Muud serverid", "Free": "Tasuta teenus", "Join millions for free on the largest public server": "Liitu tasuta nende miljonitega, kas kasutavad suurimat avalikku Matrix'i serverit", @@ -1450,9 +1450,9 @@ "Font size": "Fontide suurus", "Enable automatic language detection for syntax highlighting": "Kasuta süntaksi esiletõstmisel automaatset keeletuvastust", "Cross-signing private keys:": "Privaatvõtmed risttunnustamise jaoks:", - "Identity server URL must be HTTPS": "Isikutuvastusserveri URL peab kasutama HTTPS-protokolli", - "Not a valid identity server (status code %(code)s)": "See ei ole sobilik isikutuvastusserver (staatuskood %(code)s)", - "Could not connect to identity server": "Ei saanud ühendust isikutuvastusserveriga", + "Identity Server URL must be HTTPS": "Isikutuvastusserveri URL peab kasutama HTTPS-protokolli", + "Not a valid Identity Server (status code %(code)s)": "See ei ole sobilik isikutuvastusserver (staatuskood %(code)s)", + "Could not connect to Identity Server": "Ei saanud ühendust isikutuvastusserveriga", "Checking server": "Kontrollin serverit", "Change identity server": "Muuda isikutuvastusserverit", "Disconnect from the identity server and connect to instead?": "Kas katkestame ühenduse isikutuvastusserveriga ning selle asemel loome uue ühenduse serveriga ?", @@ -1468,7 +1468,7 @@ "Disconnect anyway": "Ikkagi katkesta ühendus", "You are still sharing your personal data on the identity server .": "Sa jätkuvalt jagad oma isikuandmeid isikutuvastusserveriga .", "Go back": "Mine tagasi", - "Identity server (%(server)s)": "Isikutuvastusserver %(server)s", + "Identity Server (%(server)s)": "Isikutuvastusserver %(server)s", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Sinu serveri haldur on lülitanud läbiva krüptimise omavahelistes jututubades ja otsesõnumites välja.", "This room has been replaced and is no longer active.": "See jututuba on asendatud teise jututoaga ning ei ole enam kasutusel.", "You do not have permission to post to this room": "Sul ei ole õigusi siia jututuppa kirjutamiseks", @@ -1526,7 +1526,7 @@ "Integrations are disabled": "Lõimingud ei ole kasutusel", "Enable 'Manage Integrations' in Settings to do this.": "Selle tegevuse kasutuselevõetuks lülita seadetes sisse „Halda lõiminguid“ valik.", "Integrations not allowed": "Lõimingute kasutamine ei ole lubatud", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Sinu %(brand)s ei võimalda selle tegevuse jaoks kasutada Lõimingute haldurit. Palun küsi lisateavet administraatorilt.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Sinu %(brand)s ei võimalda selle tegevuse jaoks kasutada Lõimingute haldurit. Palun küsi lisateavet administraatorilt.", "Failed to invite the following users to chat: %(csvUsers)s": "Järgnevate kasutajate vestlema kutsumine ei õnnestunud: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Otsevestluse loomine ei õnnestunud. Palun kontrolli, et kasutajanimed oleks õiged ja proovi uuesti.", "a new master key signature": "uus üldvõtme allkiri", @@ -1720,7 +1720,7 @@ "Failed to deactivate user": "Kasutaja deaktiveerimine ei õnnestunud", "This client does not support end-to-end encryption.": "See klient ei toeta läbivat krüptimist.", "Security": "Turvalisus", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s ning sinu vidinahalduriga.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s ning sinu vidinahalduriga.", "Using this widget may share data with %(widgetDomain)s.": "Selle vidina kasutamisel võidakse jagada andmeid saitidega %(widgetDomain)s.", "Widgets do not use message encryption.": "Erinevalt sõnumitest vidinad ei kasuta krüptimist.", "Widget added by": "Vidina lisaja", @@ -1849,7 +1849,7 @@ "%(brand)s version:": "%(brand)s'i versioon:", "olm version:": "olm'i versioon:", "Homeserver is": "Koduserver on", - "Identity server is": "Isikutuvastusserver on", + "Identity Server is": "Isikutuvastusserver on", "Access Token:": "Pääsuluba:", "click to reveal": "kuvamiseks klõpsi siin", "Labs": "Katsed", @@ -2273,14 +2273,14 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Sa võib-olla oled seadistanud nad %(brand)s'ist erinevas kliendis. Sa küll ei saa neid %(brand)s'is muuta, kuid nad kehtivad siiski.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Sa hetkel kasutad serverit, et olla leitav ja ise leida sinule teadaolevaid inimesi. Alljärgnevalt saad sa muuta oma isikutuvastusserverit.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Kui sa ei soovi kasutada serverit, et olla leitav ja ise leida sinule teadaolevaid inimesi, siis sisesta alljärgnevalt mõni teine isikutuvastusserver.", - "Identity server": "Isikutuvastusserver", + "Identity Server": "Isikutuvastusserver", "Do not use an identity server": "Ära kasuta isikutuvastusserverit", "Enter a new identity server": "Sisesta uue isikutuvastusserveri nimi", "Change": "Muuda", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide jaoks kasuta lõiminguhaldurit (%(serverName)s).", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide seadistamiseks kasuta lõiminguhaldurit.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide jaoks kasuta lõiminguhaldurit (%(serverName)s).", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Robotite, vidinate ja kleepsupakkide seadistamiseks kasuta lõiminguhaldurit.", "Manage integrations": "Halda lõiminguid", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Lõiminguhalduritel on laiad volitused - nad võivad sinu nimel lugeda seadistusi, kohandada vidinaid, saata jututubade kutseid ning määrata õigusi.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Lõiminguhalduritel on laiad volitused - nad võivad sinu nimel lugeda seadistusi, kohandada vidinaid, saata jututubade kutseid ning määrata õigusi.", "Define the power level of a user": "Määra kasutaja õigused", "Command failed": "Käsk ei toiminud", "Opens the Developer Tools dialog": "Avab arendusvahendite akna", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 667999c04f..2740ea2079 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -93,7 +93,7 @@ "Guests cannot join this room even if explicitly invited.": "Bisitariak ezin dira gela honetara elkartu ez bazaie zuzenean gonbidatu.", "Hangup": "Eseki", "Homeserver is": "Hasiera zerbitzaria:", - "Identity server is": "Identitate zerbitzaria:", + "Identity Server is": "Identitate zerbitzaria:", "Moderator": "Moderatzailea", "Account": "Kontua", "Access Token:": "Sarbide tokena:", @@ -1062,7 +1062,7 @@ "Confirm": "Berretsi", "Other servers": "Beste zerbitzariak", "Homeserver URL": "Hasiera-zerbitzariaren URLa", - "Identity server URL": "Identitate zerbitzariaren URLa", + "Identity Server URL": "Identitate zerbitzariaren URLa", "Free": "Dohan", "Join millions for free on the largest public server": "Elkartu milioika pertsonekin dohain hasiera zerbitzari publiko handienean", "Other": "Beste bat", @@ -1393,7 +1393,7 @@ "Failed to re-authenticate": "Berriro autentifikatzean huts egin du", "Enter your password to sign in and regain access to your account.": "Sartu zure pasahitza saioa hasteko eta berreskuratu zure kontura sarbidea.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Ezin duzu zure kontuan saioa hasi. Jarri kontaktuan zure hasiera zerbitzariko administratzailearekin informazio gehiagorako.", - "Identity server": "Identitate zerbitzaria", + "Identity Server": "Identitate zerbitzaria", "Find others by phone or email": "Aurkitu besteak telefonoa edo e-maila erabiliz", "Be found by phone or email": "Izan telefonoa edo e-maila erabiliz aurkigarria", "Use bots, bridges, widgets and sticker packs": "Erabili botak, zubiak, trepetak eta eranskailu multzoak", @@ -1408,17 +1408,17 @@ "Actions": "Ekintzak", "Displays list of commands with usages and descriptions": "Aginduen zerrenda bistaratzen du, erabilera eta deskripzioekin", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Baimendu turn.matrix.org deien laguntzarako zerbitzaria erabiltzea zure hasiera-zerbitzariak bat eskaintzen ez duenean (Zure IP helbidea partekatuko da deian zehar)", - "Identity server URL must be HTTPS": "Identitate zerbitzariaren URL-a HTTPS motakoa izan behar du", - "Not a valid identity server (status code %(code)s)": "Ez da identitate zerbitzari baliogarria (egoera-mezua %(code)s)", - "Could not connect to identity server": "Ezin izan da identitate-zerbitzarira konektatu", + "Identity Server URL must be HTTPS": "Identitate zerbitzariaren URL-a HTTPS motakoa izan behar du", + "Not a valid Identity Server (status code %(code)s)": "Ez da identitate zerbitzari baliogarria (egoera-mezua %(code)s)", + "Could not connect to Identity Server": "Ezin izan da identitate-zerbitzarira konektatu", "Checking server": "Zerbitzaria egiaztatzen", "Disconnect from the identity server ?": "Deskonektatu identitate-zerbitzaritik?", "Disconnect": "Deskonektatu", - "Identity server (%(server)s)": "Identitate-zerbitzaria (%(server)s)", + "Identity Server (%(server)s)": "Identitate-zerbitzaria (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": " erabiltzen ari zara kontaktua aurkitzeko eta aurkigarria izateko. Zure identitate-zerbitzaria aldatu dezakezu azpian.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Orain ez duzu identitate-zerbitzaririk erabiltzen. Kontaktuak aurkitzeko eta aurkigarria izateko, gehitu bat azpian.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Zure identitate-zerbitzaritik deskonektatzean ez zara beste erabiltzaileentzat aurkigarria izango eta ezin izango dituzu besteak gonbidatu e-mail helbidea edo telefono zenbakia erabiliz.", - "Integration manager": "Integrazio-kudeatzailea", + "Integration Manager": "Integrazio-kudeatzailea", "Discovery": "Aurkitzea", "Deactivate account": "Desaktibatu kontua", "Always show the window menu bar": "Erakutsi beti leihoaren menu barra", @@ -1604,10 +1604,10 @@ "Cannot connect to integration manager": "Ezin da integrazio kudeatzailearekin konektatu", "The integration manager is offline or it cannot reach your homeserver.": "Integrazio kudeatzailea lineaz kanpo dago edo ezin du zure hasiera-zerbitzaria atzitu.", "Clear notifications": "Garbitu jakinarazpenak", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Erabili (%(serverName)s) integrazio kudeatzailea botak, trepetak eta eranskailu multzoak kudeatzeko.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Erabili integrazio kudeatzaile bat botak, trepetak eta eranskailu multzoak kudeatzeko.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Erabili (%(serverName)s) integrazio kudeatzailea botak, trepetak eta eranskailu multzoak kudeatzeko.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Erabili integrazio kudeatzaile bat botak, trepetak eta eranskailu multzoak kudeatzeko.", "Manage integrations": "Kudeatu integrazioak", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrazio kudeatzaileek konfigurazio datuak jasotzen dituzte, eta trepetak aldatu ditzakete, gelara gonbidapenak bidali, eta botere mailak zure izenean ezarri.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrazio kudeatzaileek konfigurazio datuak jasotzen dituzte, eta trepetak aldatu ditzakete, gelara gonbidapenak bidali, eta botere mailak zure izenean ezarri.", "Customise your experience with experimental labs features. Learn more.": "Pertsonalizatu zure esperientzia laborategiko ezaugarri esperimentalekin. Ikasi gehiago.", "Ignored/Blocked": "Ezikusia/Blokeatuta", "Error adding ignored user/server": "Errorea ezikusitako erabiltzaile edo zerbitzaria gehitzean", @@ -1653,7 +1653,7 @@ "%(brand)s URL": "%(brand)s URL-a", "Room ID": "Gelaren ID-a", "Widget ID": "Trepetaren ID-a", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin eta zure integrazio kudeatzailearekin datuak partekatu daitezke.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin eta zure integrazio kudeatzailearekin datuak partekatu daitezke.", "Using this widget may share data with %(widgetDomain)s.": "Trepeta hau erabiltzean %(widgetDomain)s domeinuarekin datuak partekatu daitezke.", "Widgets do not use message encryption.": "Trepetek ez dute mezuen zifratzea erabiltzen.", "Widget added by": "Trepeta honek gehitu du:", @@ -1662,7 +1662,7 @@ "Integrations are disabled": "Integrazioak desgaituta daude", "Enable 'Manage Integrations' in Settings to do this.": "Gaitu 'Kudeatu integrazioak' ezarpenetan hau egiteko.", "Integrations not allowed": "Integrazioak ez daude baimenduta", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Zure %(brand)s aplikazioak ez dizu hau egiteko integrazio kudeatzaile bat erabiltzen uzten. Kontaktatu administratzaileren batekin.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Zure %(brand)s aplikazioak ez dizu hau egiteko integrazio kudeatzaile bat erabiltzen uzten. Kontaktatu administratzaileren batekin.", "Reload": "Birkargatu", "Take picture": "Atera argazkia", "Remove for everyone": "Kendu denentzat", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index a5bfb0bddb..46dde79945 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -946,7 +946,7 @@ "Country Dropdown": "لیست کشور", "Verification Request": "درخواست تأیید", "Send report": "ارسال گزارش", - "Integration manager": "مدیر یکپارچه‌سازی", + "Integration Manager": "مدیر یکپارچه‌سازی", "Command Help": "راهنمای دستور", "Message edits": "ویرایش پیام", "Upload all": "بارگذاری همه", @@ -973,7 +973,7 @@ "Click the button below to confirm your identity.": "برای تأیید هویت خود بر روی دکمه زیر کلیک کنید.", "Confirm to continue": "برای ادامه تأیید کنید", "To continue, use Single Sign On to prove your identity.": "برای ادامه از احراز هویت یکپارچه جهت اثبات هویت خود استفاده نمائید.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s شما اجازه استفاده از سیستم مدیریت ادغام را برای این کار نمی دهد. لطفا با ادمین تماس بگیرید.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s شما اجازه استفاده از سیستم مدیریت ادغام را برای این کار نمی دهد. لطفا با ادمین تماس بگیرید.", "Integrations not allowed": "یکپارچه‌سازی‌ها اجازه داده نشده‌اند", "Enable 'Manage Integrations' in Settings to do this.": "برای انجام این کار 'مدیریت پکپارچه‌سازی‌ها' را در تنظیمات فعال نمائید.", "Integrations are disabled": "پکپارچه‌سازی‌ها غیر فعال هستند", @@ -1691,7 +1691,7 @@ "Using this widget may share data with %(widgetDomain)s.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s به اشتراک بگذارد.", "New Recovery Method": "روش بازیابی جدید", "A new Security Phrase and key for Secure Messages have been detected.": "یک عبارت امنیتی و کلید جدید برای پیام‌رسانی امن شناسایی شد.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s و سیستم مدیریت ادغام به اشتراک بگذارد.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "استفاده از این ابزارک ممکن است داده‌هایی را با %(widgetDomain)s و سیستم مدیریت ادغام به اشتراک بگذارد.", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "اگر روش بازیابی جدیدی را تنظیم نکرده‌اید، ممکن است حمله‌کننده‌ای تلاش کند به حساب کاربری شما دسترسی پیدا کند. لطفا گذرواژه حساب کاربری خود را تغییر داده و فورا یک روش جدیدِ بازیابی در بخش تنظیمات انتخاب کنید.", "Widget ID": "شناسه ابزارک", "Room ID": "شناسه اتاق", @@ -1882,14 +1882,14 @@ "Use between %(min)s pt and %(max)s pt": "از عددی بین %(min)s pt و %(max)s pt استفاده کنید", "Custom font size can only be between %(min)s pt and %(max)s pt": "اندازه فونت دلخواه تنها می‌تواند عددی بین %(min)s pt و %(max)s pt باشد", "New version available. Update now.": "نسخه‌ی جدید موجود است. هم‌اکنون به‌روزرسانی کنید.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی (%(serverName)s) برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر استفاده کنید.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی (%(serverName)s) برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر استفاده کنید.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "استفاده از سرور هویت‌سنجی اختیاری است. اگر تصمیم بگیرید از سرور هویت‌سنجی استفاده نکنید، شما با استفاده از آدرس ایمیل و شماره تلفن قابل یافته‌شدن و دعوت‌شدن توسط سایر کاربران نخواهید بود.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "قطع ارتباط با سرور هویت‌سنجی به این معناست که شما از طریق ادرس ایمیل و شماره تلفن، بیش از این قابل یافته‌شدن و دعوت‌شدن توسط کاربران دیگر نیستید.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "در حال حاضر از سرور هویت‌سنجی استفاده نمی‌کنید. برای یافتن و یافته‌شدن توسط مخاطبان موجود که شما آن‌ها را می‌شناسید، یک مورد در پایین اضافه کنید.", - "Identity server": "سرور هویت‌سنجی", + "Identity Server": "سرور هویت‌سنجی", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "اگر تمایل به استفاده از برای یافتن و یافته‌شدن توسط مخاطبان خود را ندارید، سرور هویت‌سنجی دیگری را در پایین وارد کنید.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "در حال حاضر شما از برای یافتن و یافته‌شدن توسط مخاطبانی که می‌شناسید، استفاده می‌کنید. می‌توانید سرور هویت‌سنجی خود را در زیر تغییر دهید.", - "Identity server (%(server)s)": "سرور هویت‌سنجی (%(server)s)", + "Identity Server (%(server)s)": "سرور هویت‌سنجی (%(server)s)", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "توصیه می‌کنیم آدرس‌های ایمیل و شماره تلفن‌های خود را پیش از قطع ارتباط با سرور هویت‌سنجی از روی آن پاک کنید.", "You are still sharing your personal data on the identity server .": "شما هم‌چنان داده‌های شخصی خودتان را بر روی سرور هویت‌سنجی به اشتراک می‌گذارید.", "Disconnect anyway": "در هر صورت قطع کن", @@ -1906,9 +1906,9 @@ "Disconnect from the identity server and connect to instead?": "ارتباط با سرور هویت‌سنجی قطع شده و در عوض به متصل شوید؟", "Change identity server": "تغییر سرور هویت‌سنجی", "Checking server": "در حال بررسی سرور", - "Could not connect to identity server": "اتصال به سرور هیوت‌سنجی امکان پذیر نیست", - "Not a valid identity server (status code %(code)s)": "سرور هویت‌سنجی معتبر نیست (کد وضعیت %(code)s)", - "Identity server URL must be HTTPS": "پروتکل آدرس سرور هویت‌سنجی باید HTTPS باشد", + "Could not connect to Identity Server": "اتصال به سرور هیوت‌سنجی امکان پذیر نیست", + "Not a valid Identity Server (status code %(code)s)": "سرور هویت‌سنجی معتبر نیست (کد وضعیت %(code)s)", + "Identity Server URL must be HTTPS": "پروتکل آدرس سرور هویت‌سنجی باید HTTPS باشد", "not ready": "آماده نیست", "ready": "آماده", "Secret storage:": "حافظه نهان:", @@ -2761,7 +2761,7 @@ "Copy": "رونوشت", "Your access token gives full access to your account. Do not share it with anyone.": "توکن دسترسی شما، دسترسی کامل به حساب کاربری شما را میسر می‌سازد. لطفا آن را در اختیار فرد دیگری قرار ندهید.", "Access Token": "توکن دسترسی", - "Identity server is": "سرور هویت‌سنجی شما عبارت است از", + "Identity Server is": "سرور هویت‌سنجی شما عبارت است از", "Homeserver is": "سرور ما عبارت است از", "olm version:": "نسخه‌ی olm:", "Versions": "نسخه‌ها", @@ -2864,9 +2864,9 @@ "Size must be a number": "سایز باید یک عدد باشد", "Hey you. You're the best!": "سلام. حال شما خوبه؟", "Check for update": "بررسی برای به‌روزرسانی جدید", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "مدیرهای یکپارچه‌سازی، داده‌های مربوط به پیکربندی را دریافت کرده و امکان تغییر ویجت‌ها، ارسال دعوتنامه برای اتاق و تنظیم سطح دسترسی از طرف شما را دارا هستند.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "مدیرهای یکپارچه‌سازی، داده‌های مربوط به پیکربندی را دریافت کرده و امکان تغییر ویجت‌ها، ارسال دعوتنامه برای اتاق و تنظیم سطح دسترسی از طرف شما را دارا هستند.", "Manage integrations": "مدیریت پکپارچه‌سازی‌ها", - "Use an integration manager to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر مورد نظرتان استفاده نمائید.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "از یک مدیر پکپارچه‌سازی برای مدیریت بات‌ها، ویجت‌ها و پک‌های استیکر مورد نظرتان استفاده نمائید.", "Change": "تغییر بده", "Enter a new identity server": "یک سرور هویت‌سنجی جدید وارد کنید", "Do not use an identity server": "از سرور هویت‌سنجی استفاده نکن", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 05d52e0e1b..23140846b3 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -112,7 +112,7 @@ "Forget room": "Unohda huone", "For security, this session has been signed out. Please sign in again.": "Turvallisuussyistä tämä istunto on kirjattu ulos. Ole hyvä ja kirjaudu uudestaan.", "Homeserver is": "Kotipalvelin on", - "Identity server is": "Identiteettipalvelin on", + "Identity Server is": "Identiteettipalvelin on", "I have verified my email address": "Olen varmistanut sähköpostiosoitteeni", "Import": "Tuo", "Import E2E room keys": "Tuo olemassaolevat osapuolten välisen salauksen huoneavaimet", @@ -903,7 +903,7 @@ "Join this community": "Liity tähän yhteisöön", "Leave this community": "Poistu tästä yhteisöstä", "Couldn't load page": "Sivun lataaminen ei onnistunut", - "Identity server URL": "Identiteettipalvelimen osoite", + "Identity Server URL": "Identiteettipalvelimen osoite", "Homeserver URL": "Kotipalvelimen osoite", "Email (optional)": "Sähköposti (valinnainen)", "Phone (optional)": "Puhelin (valinnainen)", @@ -1391,7 +1391,7 @@ "Sign in and regain access to your account.": "Kirjaudu ja pääse takaisin tilillesi.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Et voi kirjautua tilillesi. Ota yhteyttä kotipalvelimesi ylläpitäjään saadaksesi lisätietoja.", "Clear personal data": "Poista henkilökohtaiset tiedot", - "Identity server": "Identiteettipalvelin", + "Identity Server": "Identiteettipalvelin", "Find others by phone or email": "Löydä muita käyttäjiä puhelimen tai sähköpostin perusteella", "Be found by phone or email": "Varmista, että sinut löydetään puhelimen tai sähköpostin perusteella", "Use bots, bridges, widgets and sticker packs": "Käytä botteja, siltoja, sovelmia ja tarrapaketteja", @@ -1407,13 +1407,13 @@ "Share": "Jaa", "Unable to share phone number": "Puhelinnumeroa ei voi jakaa", "No identity server is configured: add one in server settings to reset your password.": "Identiteettipalvelinta ei ole määritetty: lisää se palvelinasetuksissa, jotta voi palauttaa salasanasi.", - "Identity server URL must be HTTPS": "Identiteettipalvelimen URL-osoitteen täytyy olla HTTPS-alkuinen", - "Not a valid identity server (status code %(code)s)": "Ei kelvollinen identiteettipalvelin (tilakoodi %(code)s)", - "Could not connect to identity server": "Identiteettipalvelimeen ei saatu yhteyttä", + "Identity Server URL must be HTTPS": "Identiteettipalvelimen URL-osoitteen täytyy olla HTTPS-alkuinen", + "Not a valid Identity Server (status code %(code)s)": "Ei kelvollinen identiteettipalvelin (tilakoodi %(code)s)", + "Could not connect to Identity Server": "Identiteettipalvelimeen ei saatu yhteyttä", "Checking server": "Tarkistetaan palvelinta", "Disconnect from the identity server ?": "Katkaise yhteys identiteettipalvelimeen ?", "Disconnect": "Katkaise yhteys", - "Identity server (%(server)s)": "Identiteettipalvelin (%(server)s)", + "Identity Server (%(server)s)": "Identiteettipalvelin (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Käytät palvelinta tuntemiesi henkilöiden löytämiseen ja löydetyksi tulemiseen. Voit vaihtaa identiteettipalvelintasi alla.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Et käytä tällä hetkellä identiteettipalvelinta. Lisää identiteettipalvelin alle löytääksesi tuntemiasi henkilöitä ja tullaksesi löydetyksi.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Yhteyden katkaiseminen identiteettipalvelimeesi tarkoittaa, että muut käyttäjät eivät löydä sinua etkä voi kutsua muita sähköpostin tai puhelinnumeron perusteella.", @@ -1597,10 +1597,10 @@ "Connecting to integration manager...": "Yhdistetään integraatioiden lähteeseen...", "Cannot connect to integration manager": "Integraatioiden lähteeseen yhdistäminen epäonnistui", "The integration manager is offline or it cannot reach your homeserver.": "Integraatioiden lähde on poissa verkosta, tai siihen ei voida yhdistää kotipalvelimeltasi.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä (%(serverName)s) bottien, sovelmien ja tarrapakettien hallintaan.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä bottien, sovelmien ja tarrapakettien hallintaan.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä (%(serverName)s) bottien, sovelmien ja tarrapakettien hallintaan.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Käytä integraatioiden lähdettä bottien, sovelmien ja tarrapakettien hallintaan.", "Manage integrations": "Hallitse integraatioita", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integraatioiden lähteet vastaanottavat asetusdataa ja voivat muokata sovelmia, lähettää kutsuja huoneeseen ja asettaa oikeustasoja puolestasi.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integraatioiden lähteet vastaanottavat asetusdataa ja voivat muokata sovelmia, lähettää kutsuja huoneeseen ja asettaa oikeustasoja puolestasi.", "Discovery": "Käyttäjien etsintä", "Ignored/Blocked": "Sivuutettu/estetty", "Error adding ignored user/server": "Virhe sivuutetun käyttäjän/palvelimen lisäämisessä", @@ -1621,7 +1621,7 @@ "Subscribed lists": "Tilatut listat", "Subscribing to a ban list will cause you to join it!": "Estolistan käyttäminen saa sinut liittymään listalle!", "If this isn't what you want, please use a different tool to ignore users.": "Jos et halua tätä, käytä eri työkalua käyttäjien sivuuttamiseen.", - "Integration manager": "Integraatioiden lähde", + "Integration Manager": "Integraatioiden lähde", "Read Marker lifetime (ms)": "Viestin luetuksi merkkaamisen kesto (ms)", "Click the link in the email you received to verify and then click continue again.": "Klikkaa lähettämässämme sähköpostissa olevaa linkkiä vahvistaaksesi tunnuksesi. Klikkaa sen jälkeen tällä sivulla olevaa painiketta ”Jatka”.", "Complete": "Valmis", @@ -1646,7 +1646,7 @@ "%(name)s cancelled": "%(name)s peruutti", "%(name)s wants to verify": "%(name)s haluaa varmentaa", "You sent a verification request": "Lähetit varmennuspyynnön", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Tämän sovelman käyttäminen saattaa jakaa tietoa osoitteille %(widgetDomain)s ja käyttämällesi integraatioiden lähteelle.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Tämän sovelman käyttäminen saattaa jakaa tietoa osoitteille %(widgetDomain)s ja käyttämällesi integraatioiden lähteelle.", "Widgets do not use message encryption.": "Sovelmat eivät käytä viestien salausta.", "More options": "Lisää asetuksia", "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Käytä identiteettipalvelinta kutsuaksesi henkilöitä sähköpostilla. Käytä oletusta (%(defaultIdentityServerName)s) tai aseta toinen palvelin asetuksissa.", @@ -1654,7 +1654,7 @@ "Integrations are disabled": "Integraatiot ovat pois käytöstä", "Enable 'Manage Integrations' in Settings to do this.": "Ota integraatiot käyttöön asetuksista kohdasta ”Hallitse integraatioita”.", "Integrations not allowed": "Integraatioiden käyttö on kielletty", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-instanssisi ei salli sinun käyttävän integraatioiden lähdettä tämän tekemiseen. Ota yhteys ylläpitäjääsi.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-instanssisi ei salli sinun käyttävän integraatioiden lähdettä tämän tekemiseen. Ota yhteys ylläpitäjääsi.", "Reload": "Lataa uudelleen", "Take picture": "Ota kuva", "Remove for everyone": "Poista kaikilta", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 662576c650..16373f0853 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -87,7 +87,7 @@ "Hangup": "Raccrocher", "Historical": "Historique", "Homeserver is": "Le serveur d’accueil est", - "Identity server is": "Le serveur d’identité est", + "Identity Server is": "Le serveur d’identité est", "I have verified my email address": "J’ai vérifié mon adresse e-mail", "Import E2E room keys": "Importer les clés de chiffrement de bout en bout", "Incorrect verification code": "Code de vérification incorrect", @@ -1068,7 +1068,7 @@ "Confirm": "Confirmer", "Other servers": "Autres serveurs", "Homeserver URL": "URL du serveur d'accueil", - "Identity server URL": "URL du serveur d'identité", + "Identity Server URL": "URL du serveur d'identité", "Free": "Gratuit", "Join millions for free on the largest public server": "Rejoignez des millions d’utilisateurs gratuitement sur le plus grand serveur public", "Premium": "Premium", @@ -1395,7 +1395,7 @@ "Sign in and regain access to your account.": "Connectez-vous et ré-accédez à votre compte.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Vous ne pouvez pas vous connecter à votre compte. Contactez l’administrateur de votre serveur d’accueil pour plus d’informations.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Dites-nous ce qui s’est mal passé ou, encore mieux, créez un rapport d’erreur sur GitHub qui décrit le problème.", - "Identity server": "Serveur d’identité", + "Identity Server": "Serveur d’identité", "Find others by phone or email": "Trouver d’autres personnes par téléphone ou e-mail", "Be found by phone or email": "Être trouvé par téléphone ou e-mail", "Use bots, bridges, widgets and sticker packs": "Utiliser des robots, des passerelles, des widgets ou des jeux d’autocollants", @@ -1421,17 +1421,17 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Un SMS a été envoyé à +%(msisdn)s. Saisissez le code de vérification qu’il contient.", "Command Help": "Aide aux commandes", "No identity server is configured: add one in server settings to reset your password.": "Aucun serveur d’identité n’est configuré : ajoutez-en un dans les paramètres du serveur pour réinitialiser votre mot de passe.", - "Identity server URL must be HTTPS": "L’URL du serveur d’identité doit être en HTTPS", - "Not a valid identity server (status code %(code)s)": "Serveur d’identité non valide (code de statut %(code)s)", - "Could not connect to identity server": "Impossible de se connecter au serveur d’identité", + "Identity Server URL must be HTTPS": "L’URL du serveur d’identité doit être en HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Serveur d’identité non valide (code de statut %(code)s)", + "Could not connect to Identity Server": "Impossible de se connecter au serveur d’identité", "Checking server": "Vérification du serveur", "Disconnect from the identity server ?": "Se déconnecter du serveur d’identité  ?", "Disconnect": "Se déconnecter", - "Identity server (%(server)s)": "Serveur d’identité (%(server)s)", + "Identity Server (%(server)s)": "Serveur d’identité (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Vous utilisez actuellement pour découvrir et être découvert par des contacts existants que vous connaissez. Vous pouvez changer votre serveur d’identité ci-dessous.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvert par les contacts existants que vous connaissez, ajoutez-en un ci-dessous.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La déconnexion de votre serveur d’identité signifie que vous ne serez plus découvrable par d’autres utilisateurs et que vous ne pourrez plus faire d’invitation par e-mail ou téléphone.", - "Integration manager": "Gestionnaire d’intégration", + "Integration Manager": "Gestionnaire d’intégration", "Call failed due to misconfigured server": "L’appel a échoué à cause d’un serveur mal configuré", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Demandez à l’administrateur de votre serveur d’accueil (%(homeserverDomain)s) de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Vous pouvez sinon essayer d’utiliser le serveur public turn.matrix.org, mais ça ne sera pas aussi fiable et votre adresse IP sera partagée avec ce serveur. Vous pouvez aussi gérer ce réglage dans les paramètres.", @@ -1639,23 +1639,23 @@ "%(brand)s URL": "URL de %(brand)s", "Room ID": "Identifiant du salon", "Widget ID": "Identifiant du widget", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s et votre gestionnaire d’intégrations.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s et votre gestionnaire d’intégrations.", "Using this widget may share data with %(widgetDomain)s.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s.", "Widget added by": "Widget ajouté par", "This widget may use cookies.": "Ce widget pourrait utiliser des cookies.", "Connecting to integration manager...": "Connexion au gestionnaire d’intégrations…", "Cannot connect to integration manager": "Impossible de se connecter au gestionnaire d’intégrations", "The integration manager is offline or it cannot reach your homeserver.": "Le gestionnaire d’intégrations est hors ligne ou il ne peut pas joindre votre serveur d’accueil.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations (%(serverName)s) pour gérer les robots, les widgets et les jeux d’autocollants.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations pour gérer les robots, les widgets et les jeux d’autocollants.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Les gestionnaires d’intégrations reçoivent les données de configuration et peuvent modifier les widgets, envoyer des invitations aux salons et définir les rangs à votre place.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations (%(serverName)s) pour gérer les robots, les widgets et les jeux d’autocollants.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Utilisez un gestionnaire d’intégrations pour gérer les robots, les widgets et les jeux d’autocollants.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Les gestionnaires d’intégrations reçoivent les données de configuration et peuvent modifier les widgets, envoyer des invitations aux salons et définir les rangs à votre place.", "Failed to connect to integration manager": "Échec de la connexion au gestionnaire d’intégrations", "Widgets do not use message encryption.": "Les widgets n’utilisent pas le chiffrement des messages.", "More options": "Plus d’options", "Integrations are disabled": "Les intégrations sont désactivées", "Enable 'Manage Integrations' in Settings to do this.": "Activez « Gérer les intégrations » dans les paramètres pour faire ça.", "Integrations not allowed": "Les intégrations ne sont pas autorisées", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Votre %(brand)s ne vous autorise pas à utiliser un gestionnaire d’intégrations pour faire ça. Contactez un administrateur.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Votre %(brand)s ne vous autorise pas à utiliser un gestionnaire d’intégrations pour faire ça. Contactez un administrateur.", "Reload": "Recharger", "Take picture": "Prendre une photo", "Remove for everyone": "Supprimer pour tout le monde", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 5684a9c177..b880c5b548 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -569,7 +569,7 @@ "Access Token:": "Testemuño de acceso:", "click to reveal": "Preme para mostrar", "Homeserver is": "O servidor de inicio é", - "Identity server is": "O servidor de identidade é", + "Identity Server is": "O servidor de identidade é", "%(brand)s version:": "versión %(brand)s:", "olm version:": "versión olm:", "Failed to send email": "Fallo ao enviar correo electrónico", @@ -1393,9 +1393,9 @@ "Upgrade to your own domain": "Mellora e usa un dominio propio", "Display Name": "Nome mostrado", "Profile picture": "Imaxe de perfil", - "Identity server URL must be HTTPS": "O URL do servidor de identidade debe comezar HTTPS", - "Not a valid identity server (status code %(code)s)": "Servidor de Identidade non válido (código de estado %(code)s)", - "Could not connect to identity server": "Non hai conexión co Servidor de Identidade", + "Identity Server URL must be HTTPS": "O URL do servidor de identidade debe comezar HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Servidor de Identidade non válido (código de estado %(code)s)", + "Could not connect to Identity Server": "Non hai conexión co Servidor de Identidade", "Checking server": "Comprobando servidor", "Change identity server": "Cambiar de servidor de identidade", "Disconnect from the identity server and connect to instead?": "Desconectar do servidor de identidade e conectar con ?", @@ -1413,20 +1413,20 @@ "You are still sharing your personal data on the identity server .": "Aínda estás compartindo datos personais no servidor de identidade .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Recomendámosche que elimines os teus enderezos de email e números de teléfono do servidor de identidade antes de desconectar del.", "Go back": "Atrás", - "Identity server (%(server)s)": "Servidor de Identidade (%(server)s)", + "Identity Server (%(server)s)": "Servidor de Identidade (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Neste intre usas para atopar e ser atopado polos contactos existentes que coñeces. Aquí abaixo podes cambiar de servidor de identidade.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se non queres usar para atopar e ser atopado polos contactos existentes que coñeces, escribe embaixo outro servidor de identidade.", - "Identity server": "Servidor de Identidade", + "Identity Server": "Servidor de Identidade", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Non estás a usar un servidor de identidade. Para atopar e ser atopado polos contactos existentes que coñeces, engade un embaixo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ao desconectar do teu servidor de identidade non te poderán atopar as outras usuarias e non poderás convidar a outras polo seu email ou teléfono.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar un servidor de identidade é optativo. Se escolles non usar un, non poderás ser atopado por outras usuarias e non poderás convidar a outras polo seu email ou teléfono.", "Do not use an identity server": "Non usar un servidor de identidade", "Enter a new identity server": "Escribe o novo servidor de identidade", "Change": "Cambiar", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integración (%(serverName)s) para xestionar bots, widgets e paquetes de pegatinas.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integracións para xestionar bots, widgets e paquetes de pegatinas.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integración (%(serverName)s) para xestionar bots, widgets e paquetes de pegatinas.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Usa un Xestor de Integracións para xestionar bots, widgets e paquetes de pegatinas.", "Manage integrations": "Xestionar integracións", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Os xestores de integracións reciben datos de configuración, e poden modificar os widgets, enviar convites das salas, e establecer roles no teu nome.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Os xestores de integracións reciben datos de configuración, e poden modificar os widgets, enviar convites das salas, e establecer roles no teu nome.", "New version available. Update now.": "Nova versión dispoñible. Actualiza.", "Size must be a number": "O tamaño ten que ser un número", "Custom font size can only be between %(min)s pt and %(max)s pt": "O tamaño da fonte só pode estar entre %(min)s pt e %(max)s pt", @@ -1796,7 +1796,7 @@ "%(brand)s URL": "URL %(brand)s", "Room ID": "ID da sala", "Widget ID": "ID do widget", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s e o teu Xestor de integracións.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s e o teu Xestor de integracións.", "Using this widget may share data with %(widgetDomain)s.": "Ao utilizar este widget poderías compartir datos con %(widgetDomain)s.", "Widgets do not use message encryption.": "Os Widgets non usan cifrado de mensaxes.", "Widget added by": "Widget engadido por", @@ -1892,7 +1892,7 @@ "Integrations are disabled": "As Integracións están desactivadas", "Enable 'Manage Integrations' in Settings to do this.": "Activa 'Xestionar Integracións' nos Axustes para facer esto.", "Integrations not allowed": "Non se permiten Integracións", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "O teu %(brand)s non permite que uses o Xestor de Integracións, contacta coa administración.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "O teu %(brand)s non permite que uses o Xestor de Integracións, contacta coa administración.", "Confirm to continue": "Confirma para continuar", "Click the button below to confirm your identity.": "Preme no botón inferior para confirmar a túa identidade.", "Failed to invite the following users to chat: %(csvUsers)s": "Fallo ao convidar as seguintes usuarias a conversa: %(csvUsers)s", @@ -1969,7 +1969,7 @@ "Missing session data": "Faltan datos da sesión", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Faltan algúns datos da sesión, incluíndo chaves de mensaxes cifradas. Desconecta e volve a conectar para arranxalo, restaurando as chaves desde a copia.", "Your browser likely removed this data when running low on disk space.": "O navegador probablemente eliminou estos datos ao quedar con pouco espazo de disco.", - "Integration manager": "Xestor de Integracións", + "Integration Manager": "Xestor de Integracións", "Find others by phone or email": "Atopa a outras por teléfono ou email", "Be found by phone or email": "Permite ser atopada polo email ou teléfono", "Use bots, bridges, widgets and sticker packs": "Usa bots, pontes, widgets e paquetes de adhesivos", @@ -2072,7 +2072,7 @@ "Enter your custom homeserver URL What does this mean?": "Escribe o URL do servidor personalizado ¿Qué significa esto?", "Homeserver URL": "URL do servidor", "Enter your custom identity server URL What does this mean?": "Escribe o URL do servidor de identidade personalizado ¿Que significa esto?", - "Identity server URL": "URL do servidor de identidade", + "Identity Server URL": "URL do servidor de identidade", "Other servers": "Outros servidores", "Free": "Gratuíto", "Premium": "Premium", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index fc08c62814..5baa1d7c67 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1790,7 +1790,7 @@ "Widget added by": "ישומון נוסף על ידי", "Widgets do not use message encryption.": "יישומונים אינם משתמשים בהצפנת הודעות.", "Using this widget may share data with %(widgetDomain)s.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s ומנהל האינטגרציה שלך.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s ומנהל האינטגרציה שלך.", "Widget ID": "קוד זהות הישומון", "Room ID": "קוד זהות החדר", "%(brand)s URL": "קישור %(brand)s", @@ -1948,7 +1948,7 @@ "Clear cache and reload": "נקה מטמון ואתחל", "click to reveal": "לחץ בשביל לחשוף", "Access Token:": "אסימון גישה:", - "Identity server is": "שרת ההזדהות הינו", + "Identity Server is": "שרת ההזדהות הינו", "Homeserver is": "שרת הבית הינו", "olm version:": "גרסת OLM:", "%(brand)s version:": "גרסאת %(brand)s:", @@ -1999,20 +1999,20 @@ "Hey you. You're the best!": "היי, אתם אלופים!", "Check for update": "בדוק עדכונים", "New version available. Update now.": "גרסא חדשה קיימת. שדרגו עכשיו.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", "Manage integrations": "נהל שילובים", - "Use an integration manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName)s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName)s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", "Change": "שנה", "Enter a new identity server": "הכנס שרת הזדהות חדש", "Do not use an identity server": "אל תשתמש בשרת הזדהות", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "השימוש בשרת זהות הוא אופציונלי. אם תבחר לא להשתמש בשרת זהות, משתמשים אחרים לא יוכלו לגלות ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ההתנתקות משרת הזהות שלך פירושה שלא תגלה משתמשים אחרים ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "אינך משתמש כרגע בשרת זהות. כדי לגלות ולהיות נגלים על ידי אנשי קשר קיימים שאתה מכיר, הוסף אחד למטה.", - "Identity server": "שרת הזדהות", + "Identity Server": "שרת הזדהות", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "אם אינך רוצה להשתמש ב- כדי לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר, הזן שרת זהות אחר למטה.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "אתה משתמש כרגע ב די לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר. תוכל לשנות את שרת הזהות שלך למטה.", - "Identity server (%(server)s)": "שרת הזדהות (%(server)s)", + "Identity Server (%(server)s)": "שרת הזדהות (%(server)s)", "Go back": "חזרה", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "אנו ממליצים שתסיר את כתובות הדוא\"ל ומספרי הטלפון שלך משרת הזהות לפני שתתנתק.", "You are still sharing your personal data on the identity server .": "אתה עדיין משתף את הנתונים האישיים שלך בשרת הזהות .", @@ -2030,9 +2030,9 @@ "Disconnect from the identity server and connect to instead?": "התנתק משרת זיהוי עכשווי והתחבר אל במקום?", "Change identity server": "שנה כתובת של שרת הזיהוי", "Checking server": "בודק שרת", - "Could not connect to identity server": "לא ניתן להתחבר אל שרת הזיהוי", - "Not a valid identity server (status code %(code)s)": "שרת זיהוי לא מאושר(קוד סטטוס %(code)s)", - "Identity server URL must be HTTPS": "הזיהוי של כתובת השרת חייבת להיות מאובטחת ב- HTTPS", + "Could not connect to Identity Server": "לא ניתן להתחבר אל שרת הזיהוי", + "Not a valid Identity Server (status code %(code)s)": "שרת זיהוי לא מאושר(קוד סטטוס %(code)s)", + "Identity Server URL must be HTTPS": "הזיהוי של כתובת השרת חייבת להיות מאובטחת ב- HTTPS", "not ready": "לא מוכן", "ready": "מוכן", "Secret storage:": "אחסון סודי:", @@ -2291,7 +2291,7 @@ "Use bots, bridges, widgets and sticker packs": "השתמש בבוטים, גשרים, ווידג'טים וחבילות מדבקות", "Be found by phone or email": "להימצא בטלפון או בדוא\"ל", "Find others by phone or email": "מצא אחרים בטלפון או בדוא\"ל", - "Integration manager": "מנהל אינטגרציה", + "Integration Manager": "מנהל אינטגרציה", "Your browser likely removed this data when running low on disk space.": "סביר להניח שהדפדפן שלך הסיר נתונים אלה כאשר שטח הדיסק שלהם נמוך.", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "חלק מנתוני ההפעלה, כולל מפתחות הודעות מוצפנים, חסרים. צא והיכנס כדי לתקן זאת, ושחזר את המפתחות מהגיבוי.", "Missing session data": "חסרים נתוני הפעלות", @@ -2424,7 +2424,7 @@ "Click the button below to confirm your identity.": "לחץ על הלחצן למטה כדי לאשר את זהותך.", "Confirm to continue": "אשרו בכדי להמשיך", "To continue, use Single Sign On to prove your identity.": "כדי להמשיך, השתמש בכניסה יחידה כדי להוכיח את זהותך.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s שלכם אינו מאפשר לך להשתמש במנהל שילוב לשם כך. אנא צרו קשר עם מנהל מערכת.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s שלכם אינו מאפשר לך להשתמש במנהל שילוב לשם כך. אנא צרו קשר עם מנהל מערכת.", "Integrations not allowed": "שילובים אינם מורשים", "Enable 'Manage Integrations' in Settings to do this.": "אפשר 'ניהול אינטגרציות' בהגדרות כדי לעשות זאת.", "Integrations are disabled": "שילובים מושבתים", diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json index 853b5662f2..f71c024342 100644 --- a/src/i18n/strings/hi.json +++ b/src/i18n/strings/hi.json @@ -534,7 +534,7 @@ "Versions": "संस्करण", "olm version:": "olm संस्करण:", "Homeserver is": "होमेसेर्वेर हैं", - "Identity server is": "आइडेंटिटी सर्वर हैं", + "Identity Server is": "आइडेंटिटी सर्वर हैं", "Access Token:": "एक्सेस टोकन:", "click to reveal": "देखने की लिए क्लिक करें", "Labs": "लैब्स", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 1dca0a1547..cb749f12a5 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -129,7 +129,7 @@ "Historical": "Archív", "Home": "Kezdőlap", "Homeserver is": "Matrix-kiszolgáló:", - "Identity server is": "Azonosítási kiszolgáló:", + "Identity Server is": "Azonosítási kiszolgáló:", "I have verified my email address": "Ellenőriztem az e-mail címemet", "Import": "Betöltés", "Import E2E room keys": "E2E szoba kulcsok betöltése", @@ -1067,7 +1067,7 @@ "Confirm": "Megerősítés", "Other servers": "Más szerverek", "Homeserver URL": "Matrixszerver URL", - "Identity server URL": "Azonosítási Szerver URL", + "Identity Server URL": "Azonosítási Szerver URL", "Free": "Szabad", "Join millions for free on the largest public server": "Csatlakozzon több millió felhasználóhoz ingyen a legnagyobb nyilvános szerveren", "Premium": "Prémium", @@ -1395,7 +1395,7 @@ "You're signed out": "Kijelentkeztél", "Clear personal data": "Személyes adatok törlése", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Kérlek mond el nekünk mi az ami nem működött, vagy még jobb, ha egy GitHub jegyben leírod a problémát.", - "Identity server": "Azonosítási szerver", + "Identity Server": "Azonosítási szerver", "Find others by phone or email": "Keress meg másokat telefonszám vagy e-mail cím alapján", "Be found by phone or email": "Legyél megtalálható telefonszámmal vagy e-mail címmel", "Use bots, bridges, widgets and sticker packs": "Használj botokoat, hidakat, kisalkalmazásokat és matricákat", @@ -1413,9 +1413,9 @@ "Accept to continue:": " elfogadása a továbblépéshez:", "ID": "Azonosító", "Public Name": "Nyilvános név", - "Identity server URL must be HTTPS": "Az Azonosítási Szerver URL-jének HTTPS-nek kell lennie", - "Not a valid identity server (status code %(code)s)": "Az Azonosítási Szerver nem érvényes (státusz kód: %(code)s)", - "Could not connect to identity server": "Az Azonosítási Szerverhez nem lehet csatlakozni", + "Identity Server URL must be HTTPS": "Az Azonosítási Szerver URL-jének HTTPS-nek kell lennie", + "Not a valid Identity Server (status code %(code)s)": "Az Azonosítási Szerver nem érvényes (státusz kód: %(code)s)", + "Could not connect to Identity Server": "Az Azonosítási Szerverhez nem lehet csatlakozni", "Checking server": "Szerver ellenőrzése", "Terms of service not accepted or the identity server is invalid.": "A felhasználási feltételek nincsenek elfogadva vagy az azonosítási szerver nem érvényes.", "Identity server has no terms of service": "Az azonosítási kiszolgálónak nincsenek felhasználási feltételei", @@ -1423,12 +1423,12 @@ "Only continue if you trust the owner of the server.": "Csak akkor lépj tovább, ha megbízol a kiszolgáló tulajdonosában.", "Disconnect from the identity server ?": "Bontod a kapcsolatot ezzel az azonosítási szerverrel: ?", "Disconnect": "Kapcsolat bontása", - "Identity server (%(server)s)": "Azonosítási kiszolgáló (%(server)s)", + "Identity Server (%(server)s)": "Azonosítási kiszolgáló (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "A kapcsolatok kereséséhez és hogy megtalálják az ismerősei, ezt a kiszolgálót használja: . A használt azonosítási kiszolgálót alább tudja megváltoztatni.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Jelenleg nem használsz azonosítási szervert. Ahhoz, hogy e-mail cím, vagy egyéb azonosító alapján megtalálhassanak az ismerőseid, vagy te megtalálhasd őket, be kell állítanod egy azonosítási szervert.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ha az azonosítási szerverrel bontod a kapcsolatot az azt fogja eredményezni, hogy más felhasználók nem találnak rád és nem tudsz másokat meghívni e-mail cím vagy telefonszám alapján.", "Enter a new identity server": "Új azonosítási szerver hozzáadása", - "Integration manager": "Integrációs Menedzser", + "Integration Manager": "Integrációs Menedzser", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Azonosítási szerver (%(serverName)s) felhasználási feltételeinek elfogadása, ezáltal megtalálhatóvá válsz e-mail cím vagy telefonszám megadásával.", "Discovery": "Felkutatás", "Deactivate account": "Fiók zárolása", @@ -1639,7 +1639,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "Szoba azonosító", "Widget ID": "Kisalkalmazás azonosító", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg a(z) %(widgetDomain)s oldallal és az Integrációkezelővel.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg a(z) %(widgetDomain)s oldallal és az Integrációkezelővel.", "Using this widget may share data with %(widgetDomain)s.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg %(widgetDomain)s domain-nel.", "Widget added by": "A kisalkalmazást hozzáadta", "This widget may use cookies.": "Ez a kisalkalmazás sütiket használhat.", @@ -1651,15 +1651,15 @@ "Connecting to integration manager...": "Kapcsolódás az integrációs menedzserhez...", "Cannot connect to integration manager": "A kapcsolódás az integrációs menedzserhez sikertelen", "The integration manager is offline or it cannot reach your homeserver.": "Az integrációkezelő nem működik, vagy nem éri el a Matrix-kiszolgálóját.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert (%(serverName)s) a botok, kisalkalmazások és matrica csomagok kezeléséhez.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert a botok, kisalkalmazások és matrica csomagok kezeléséhez.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrációs Menedzser megkapja a konfigurációt, módosíthat kisalkalmazásokat, szobához meghívót küldhet és a hozzáférési szintet beállíthatja helyetted.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert (%(serverName)s) a botok, kisalkalmazások és matrica csomagok kezeléséhez.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Használj Integrációs Menedzsert a botok, kisalkalmazások és matrica csomagok kezeléséhez.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrációs Menedzser megkapja a konfigurációt, módosíthat kisalkalmazásokat, szobához meghívót küldhet és a hozzáférési szintet beállíthatja helyetted.", "Failed to connect to integration manager": "Az integrációs menedzserhez nem sikerült csatlakozni", "Widgets do not use message encryption.": "A kisalkalmazások nem használnak üzenet titkosítást.", "Integrations are disabled": "Az integrációk le vannak tiltva", "Enable 'Manage Integrations' in Settings to do this.": "Ehhez engedélyezd az „Integrációk Kezelésé”-t a Beállításokban.", "Integrations not allowed": "Az integrációk nem engedélyezettek", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "A %(brand)sod nem használhat ehhez Integrációs Menedzsert. Kérlek vedd fel a kapcsolatot az adminisztrátorral.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "A %(brand)sod nem használhat ehhez Integrációs Menedzsert. Kérlek vedd fel a kapcsolatot az adminisztrátorral.", "Decline (%(counter)s)": "Elutasítás (%(counter)s)", "Manage integrations": "Integrációk kezelése", "Verification Request": "Ellenőrzési kérés", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 1546e97aa9..e8718c941a 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -335,7 +335,7 @@ "Account": "Notandaaðgangur", "Access Token:": "Aðgangsteikn:", "click to reveal": "smelltu til að birta", - "Identity server is": "Auðkennisþjónn er", + "Identity Server is": "Auðkennisþjónn er", "%(brand)s version:": "Útgáfa %(brand)s:", "olm version:": "Útgáfa olm:", "Failed to send email": "Mistókst að senda tölvupóst", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 2a54e1f01d..207ff24d58 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -589,7 +589,7 @@ "Profile": "Profilo", "click to reveal": "clicca per mostrare", "Homeserver is": "L'homeserver è", - "Identity server is": "Il server di identità è", + "Identity Server is": "Il server di identità è", "%(brand)s version:": "versione %(brand)s:", "olm version:": "versione olm:", "Failed to send email": "Invio dell'email fallito", @@ -603,7 +603,7 @@ "Incorrect username and/or password.": "Nome utente e/o password sbagliati.", "Please note you are logging into the %(hs)s server, not matrix.org.": "Nota che stai accedendo nel server %(hs)s , non matrix.org.", "The phone number entered looks invalid": "Il numero di telefono inserito sembra non valido", - "This homeserver doesn't offer any login flows which are supported by this client.": "Questo homeserver non offre alcuna procedura di accesso supportata da questo client.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Questo home server non offre alcuna procedura di accesso supportata da questo client.", "Error: Problem communicating with the given homeserver.": "Errore: problema di comunicazione con l'homeserver dato.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Impossibile connettersi all'homeserver via HTTP quando c'è un URL HTTPS nella barra del tuo browser. Usa HTTPS o attiva gli script non sicuri.", "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.": "Impossibile connettersi all'homeserver - controlla la tua connessione, assicurati che il certificato SSL dell'homeserver sia fidato e che un'estensione del browser non stia bloccando le richieste.", @@ -1202,7 +1202,7 @@ "Confirm": "Conferma", "Other servers": "Altri server", "Homeserver URL": "URL homeserver", - "Identity server URL": "URL server identità", + "Identity Server URL": "URL server identità", "Free": "Gratuito", "Join millions for free on the largest public server": "Unisciti gratis a milioni nel più grande server pubblico", "Premium": "Premium", @@ -1395,7 +1395,7 @@ "Sign in and regain access to your account.": "Accedi ed ottieni l'accesso al tuo account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Non puoi accedere al tuo account. Contatta l'admin del tuo homeserver per maggiori informazioni.", "Clear personal data": "Elimina dati personali", - "Identity server": "Server identità", + "Identity Server": "Server identità", "Find others by phone or email": "Trova altri per telefono o email", "Be found by phone or email": "Trovato per telefono o email", "Use bots, bridges, widgets and sticker packs": "Usa bot, bridge, widget e pacchetti di adesivi", @@ -1410,18 +1410,18 @@ "Actions": "Azioni", "Displays list of commands with usages and descriptions": "Visualizza l'elenco dei comandi con usi e descrizioni", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Consenti al server di assistenza alle chiamate di fallback turn.matrix.org quando il tuo homeserver non ne offre uno (il tuo indirizzo IP verrà condiviso durante una chiamata)", - "Identity server URL must be HTTPS": "L'URL di Identita' Server deve essere HTTPS", - "Not a valid Identity server (status code %(code)s)": "Non è un server di identità valido (codice di stato %(code)s)", - "Could not connect to identity server": "Impossibile connettersi al server di identità", + "Identity Server URL must be HTTPS": "L'URL di Identita' Server deve essere HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Non è un server di identità valido (codice di stato %(code)s)", + "Could not connect to Identity Server": "Impossibile connettersi al server di identità", "Checking server": "Controllo del server", "Disconnect from the identity server ?": "Disconnettere dal server di identità ?", "Disconnect": "Disconnetti", - "Identity server (%(server)s)": "Server di identità (%(server)s)", + "Identity Server (%(server)s)": "Server di identità (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Stai attualmente usando per trovare ed essere trovabile dai contatti esistenti che conosci. Puoi cambiare il tuo server di identità sotto.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Attualmente non stai usando un server di identità. Per trovare ed essere trovabile dai contatti esistenti che conosci, aggiungine uno sotto.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La disconnessione dal tuo server di identità significa che non sarai trovabile da altri utenti e non potrai invitare nessuno per email o telefono.", "Only continue if you trust the owner of the server.": "Continua solo se ti fidi del proprietario del server.", - "Integration manager": "Gestore dell'integrazione", + "Integration Manager": "Gestore dell'integrazione", "Discovery": "Scopri", "Deactivate account": "Disattiva account", "Always show the window menu bar": "Mostra sempre la barra dei menu della finestra", @@ -1476,11 +1476,11 @@ "This invite to %(roomName)s was sent to %(email)s": "Questo invito per %(roomName)s è stato inviato a %(email)s", "Use an identity server in Settings to receive invites directly in %(brand)s.": "Usa un server di identià nelle impostazioni per ricevere inviti direttamente in %(brand)s.", "Share this email in Settings to receive invites directly in %(brand)s.": "Condividi questa email nelle impostazioni per ricevere inviti direttamente in %(brand)s.", - "Change identity server": "Cambia identity server", - "Disconnect from the identity server and connect to instead?": "Disconnettersi dall'identity server e connettesi invece a ?", - "Disconnect identity server": "Disconnetti dall'identity server", - "You are still sharing your personal data on the identity server .": "Stai ancora fornendo le tue informazioni personali sull'identity server .", - "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ti suggeriamo di rimuovere il tuo indirizzo email e numero di telefono dall'identity server prima di disconnetterti.", + "Change identity server": "Cambia Identity Server", + "Disconnect from the identity server and connect to instead?": "Disconnettersi dall'Identity Server e connettesi invece a ?", + "Disconnect identity server": "Disconnetti dall'Identity Server", + "You are still sharing your personal data on the identity server .": "Stai ancora fornendo le tue informazioni personali sull'Identity Server .", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Ti suggeriamo di rimuovere il tuo indirizzo email e numero di telefono dall'Identity Server prima di disconnetterti.", "Disconnect anyway": "Disconnetti comunque", "Error changing power level requirement": "Errore nella modifica del livello dei permessi", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "C'é stato un errore nel cambio di libelli dei permessi. Assicurati di avere i permessi necessari e riprova.", @@ -1638,23 +1638,23 @@ "%(brand)s URL": "URL di %(brand)s", "Room ID": "ID stanza", "Widget ID": "ID widget", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s e il tuo Gestore di Integrazione.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s e il tuo Gestore di Integrazione.", "Using this widget may share data with %(widgetDomain)s.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s.", "Widget added by": "Widget aggiunto da", "This widget may use cookies.": "Questo widget può usare cookie.", "Connecting to integration manager...": "Connessione al gestore di integrazioni...", "Cannot connect to integration manager": "Impossibile connettere al gestore di integrazioni", "The integration manager is offline or it cannot reach your homeserver.": "Il gestore di integrazioni è offline o non riesce a raggiungere il tuo homeserver.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni (%(serverName)s) per gestire bot, widget e pacchetti di adesivi.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni per gestire bot, widget e pacchetti di adesivi.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "I gestori di integrazione ricevono dati di configurazione e possono modificare widget, inviare inviti alla stanza, assegnare permessi a tuo nome.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni (%(serverName)s) per gestire bot, widget e pacchetti di adesivi.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Usa un gestore di integrazioni per gestire bot, widget e pacchetti di adesivi.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "I gestori di integrazione ricevono dati di configurazione e possono modificare widget, inviare inviti alla stanza, assegnare permessi a tuo nome.", "Failed to connect to integration manager": "Connessione al gestore di integrazioni fallita", "Widgets do not use message encryption.": "I widget non usano la crittografia dei messaggi.", "More options": "Altre opzioni", "Integrations are disabled": "Le integrazioni sono disattivate", "Enable 'Manage Integrations' in Settings to do this.": "Attiva 'Gestisci integrazioni' nelle impostazioni per continuare.", "Integrations not allowed": "Integrazioni non permesse", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Il tuo %(brand)s non ti permette di usare il gestore di integrazioni per questa azione. Contatta un amministratore.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Il tuo %(brand)s non ti permette di usare il gestore di integrazioni per questa azione. Contatta un amministratore.", "Reload": "Ricarica", "Take picture": "Scatta foto", "Remove for everyone": "Rimuovi per tutti", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index f969ab9909..180d63f33e 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -826,7 +826,7 @@ "Access Token:": "アクセストークン:", "click to reveal": "クリックすると表示されます", "Homeserver is": "ホームサーバー:", - "Identity server is": "ID サーバー:", + "Identity Server is": "ID サーバー:", "%(brand)s version:": "%(brand)s のバージョン:", "olm version:": "olm のバージョン:", "Failed to send email": "メールを送信できませんでした", @@ -1360,7 +1360,7 @@ "Leave Room": "部屋を退出", "Failed to connect to integration manager": "インテグレーションマネージャへの接続に失敗しました", "Start verification again from their profile.": "プロフィールから再度検証を開始してください。", - "Integration manager": "インテグレーションマネージャ", + "Integration Manager": "インテグレーションマネージャ", "Do not use an identity server": "ID サーバーを使用しない", "Composer": "入力欄", "Sort by": "並び替え", @@ -1490,9 +1490,9 @@ "Mentions & Keywords": "メンションとキーワード", "Security Key": "セキュリティキー", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID サーバーの使用は任意です。ID サーバーを使用しない場合、あなたは他のユーザーから発見されなくなり、メールアドレスや電話番号で他のユーザーを招待することもできません。", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。", - "Use an integration manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ (%(serverName)s) を使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ (%(serverName)s) を使用して、ボット、ウィジェット、ステッカーパックを管理します。", "Integrations not allowed": "インテグレーションは許可されていません", "Integrations are disabled": "インテグレーションが無効になっています", "Manage integrations": "インテグレーションの管理", @@ -1668,10 +1668,10 @@ "Size must be a number": "サイズには数値を指定してください", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "identity サーバーから切断すると、連絡先を使ってユーザを見つけたり見つけられたり招待したりできなくなります。", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "現在 identity サーバーを使用していません。連絡先を使ってユーザを見つけたり見つけられたりするには identity サーバーを以下に追加します。", - "Identity server": "identity サーバー", + "Identity Server": "identity サーバー", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "連絡先の検出に ではなく他の identity サーバーを使いたい場合は以下に指定してください。", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "現在 を使用して、連絡先を検出可能にしています。以下で identity サーバーを変更できます。", - "Identity server (%(server)s)": "identity サーバー (%(server)s)", + "Identity Server (%(server)s)": "identity サーバー (%(server)s)", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "切断する前に、identity サーバーからメールアドレスと電話番号を削除することをお勧めします。", "You are still sharing your personal data on the identity server .": "まだ identity サーバー 個人データを共有しています。", "Disconnect anyway": "とにかく切断します", @@ -1688,9 +1688,9 @@ "Disconnect from the identity server and connect to instead?": "identity サーバー から切断して に接続しますか?", "Change identity server": "identity サーバーを変更する", "Checking server": "サーバーをチェックしています", - "Could not connect to identity server": "identity サーバーに接続できませんでした", - "Not a valid identity server (status code %(code)s)": "有効な identity サーバーではありません (ステータスコード %(code)s)", - "Identity server URL must be HTTPS": "identityサーバーのURLは HTTPS スキーマである必要があります", + "Could not connect to Identity Server": "identity サーバーに接続できませんでした", + "Not a valid Identity Server (status code %(code)s)": "有効な identity サーバーではありません (ステータスコード %(code)s)", + "Identity Server URL must be HTTPS": "identityサーバーのURLは HTTPS スキーマである必要があります", "not ready": "準備ができていない", "ready": "準備ができました", "unexpected type": "unexpected type", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 2a2e18f8c8..b6e1b3020f 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1293,7 +1293,7 @@ "Your display name": "Isem-ik·im yettwaskanen", "Your avatar URL": "URL n avatar-inek·inem", "%(brand)s URL": "%(brand)s URL", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Aseqdec n uwiǧit-a yezmer ad yebḍu isefka d %(widgetDomain)s & amsefrak-inek·inem n umsidef.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Aseqdec n uwiǧit-a yezmer ad yebḍu isefka d %(widgetDomain)s & amsefrak-inek·inem n umsidef.", "Using this widget may share data with %(widgetDomain)s.": "Aseqdec n uwiǧit-a yezmer ad bḍun yisefka d %(widgetDomain)s.", "Widgets do not use message encryption.": "Iwiǧiten ur seqdacen ara awgelhen n yiznan.", "Widget added by": "Awiǧit yettwarna sɣur", @@ -1608,7 +1608,7 @@ "Discovery": "Tagrut", "Help & About": "Tallalt & Ɣef", "Homeserver is": "Aqeddac agejdan d", - "Identity server is": "Aqeddac n timagit d", + "Identity Server is": "Aqeddac n timagit d", "Access Token:": "Ajuṭu n unekcum:", "click to reveal": "sit i ubeggen", "Labs": "Tinarimin", @@ -1790,7 +1790,7 @@ "Link to most recent message": "Aseɣwen n yizen akk aneggaru", "Share Room Message": "Bḍu izen n texxamt", "Command Help": "Tallalt n tiludna", - "Integration manager": "Amsefrak n umsidef", + "Integration Manager": "Amsefrak n umsidef", "Find others by phone or email": "Af-d wiyaḍ s tiliɣri neɣ s yimayl", "Be found by phone or email": "Ad d-yettwaf s tiliɣri neɣ s yimayl", "Upload files (%(current)s of %(total)s)": "Sali-d ifuyla (%(current)s ɣef %(total)s)", @@ -1821,8 +1821,8 @@ "Enable inline URL previews by default": "Rmed tiskanin n URL srid s wudem amezwer", "Enable URL previews for this room (only affects you)": "Rmed tiskanin n URL i texxamt-a (i ak·akem-yeɛnan kan)", "Enable widget screenshots on supported widgets": "Rmed tuṭṭfiwin n ugdil n uwiǧit deg yiwiǧiten yettwasferken", - "Identity server (%(server)s)": "Aqeddac n timagit (%(server)s)", - "Identity server": "Aqeddac n timagit", + "Identity Server (%(server)s)": "Aqeddac n timagit (%(server)s)", + "Identity Server": "Aqeddac n timagit", "Enter a new identity server": "Sekcem aqeddac n timagit amaynut", "No update available.": "Ulac lqem i yellan.", "Hey you. You're the best!": "Kečč·kemm. Ulac win i ak·akem-yifen!", @@ -1931,7 +1931,7 @@ "Please review and accept the policies of this homeserver:": "Ttxil-k·m senqed syen qbel tisertiyin n uqeddac-a agejdan:", "An email has been sent to %(emailAddress)s": "Yettwazen yimayl ɣer %(emailAddress)s", "Token incorrect": "Ajuṭu d arameɣtu", - "Identity server URL": "URL n uqeddac n timagit", + "Identity Server URL": "URL n uqeddac n timagit", "Other servers": "Iqeddacen wiya", "Sign in to your Matrix account on %(serverName)s": "Qqen ɣer umiḍan-ik·im n Matrix deg %(serverName)s", "Sorry, your browser is not able to run %(brand)s.": "Suref-aɣ, iminig-ik·im ur yezmir ara ad iseddu %(brand)s.", @@ -1970,9 +1970,9 @@ "There are advanced notifications which are not shown here.": "Llan yilɣa leqqayen ur d-nettwaskan ara da.", "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Ahat tsewleḍ-ten deg yimsaɣ-nniḍen mačči deg %(brand)s. Ur tezmireḍ ara ad ten-tṣeggmeḍ deg %(brand)s maca mazal-iten teddun.", "Show message in desktop notification": "Sken-d iznan deg yilɣa n tnarit", - "Identity server URL must be HTTPS": "URL n uqeddac n timagit ilaq ad yili d HTTPS", - "Not a valid identity server (status code %(code)s)": "Aqeddac n timagit mačči d ameɣtu (status code %(code)s)", - "Could not connect to identity server": "Ur izmir ara ad yeqqen ɣer uqeddac n timagit", + "Identity Server URL must be HTTPS": "URL n uqeddac n timagit ilaq ad yili d HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Aqeddac n timagit mačči d ameɣtu (status code %(code)s)", + "Could not connect to Identity Server": "Ur izmir ara ad yeqqen ɣer uqeddac n timagit", "Disconnect from the identity server and connect to instead?": "Ffeɣ seg tuqqna n uqeddac n timagit syen qqen ɣer deg wadeg-is?", "Terms of service not accepted or the identity server is invalid.": "Tiwtilin n uqeddac ur ttwaqbalent ara neɣ aqeddac n timagit d arameɣtu.", "The identity server you have chosen does not have any terms of service.": "Aqeddac n timagit i tferneḍ ulac akk ɣer-s tiwtilin n uqeddac.", @@ -2170,9 +2170,9 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Akka tura ur tesseqdaceḍ ula d yiwen n uqeddac n timagit. I wakken ad d-tafeḍ daɣen ad d-tettwafeḍ sɣur yinermisen yellan i tessneḍ, rnu yiwen ddaw.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Tuffɣa seg tuqqna n uqeddac-ik·im n timaqit anamek-is dayen ur yettuɣal yiwen ad ak·akem-id-yaf, daɣen ur tettizmireḍ ara ad d-necdeḍ wiyaḍ s yimayl neɣ s tiliɣri.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Aseqdec n uqeddac n timagit d afrayan. Ma yella tferneḍ ur tesseqdaceḍ ara aqeddac n timagit, dayen ur tettuɣaleḍ ara ad tettwafeḍ sɣur iseqdac wiyaḍ rnu ur tettizmireḍ ara ad d-necdeḍ s yimayl neɣ s tiliɣri.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef (%(serverName)s) i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Imsefrak n yimsidaf remmsen-d isefka n uswel, syen ad uɣalen zemren ad beddlen iwiǧiten, ad aznen tinubgiwin ɣer texxamin, ad yesbadu daɣen tazmert n yiswiren s yiswiren deg ubdil-ik·im.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef (%(serverName)s) i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Seqdec amsefrak n umsidef i usefrek n yibuten, n yiwiǧiten d tɣawsiwin n usenteḍ.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Imsefrak n yimsidaf remmsen-d isefka n uswel, syen ad uɣalen zemren ad beddlen iwiǧiten, ad aznen tinubgiwin ɣer texxamin, ad yesbadu daɣen tazmert n yiswiren s yiswiren deg ubdil-ik·im.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Awal-ik·im uffir yettusnifel akken iwata. Ur d-tremmseḍ ara d umatu ilɣa ɣef tɣimiyin-nniḍen alamma tɛaqdeḍ teqqneḍ ɣer-sent", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Qbel tiwtilin n umeẓlu n uqeddac n timagit (%(serverName)s) i wakken ad tsirgeḍ iman-ik·im ad d-tettwafeḍ s yimayl neɣ s wuṭṭun n tiliɣri.", "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Tiririt n yimdanen deg rrif yettwaxdam deg tebdarin n uzgal ideg llan ilugan ɣef yimdanen ara yettwazeglen. Amulteɣ ɣer tebdart n uzgal anamek-is iseqdacen/iqeddacen yettusweḥlen s tebdart-a ad akȧm-ttwaffren.", @@ -2286,7 +2286,7 @@ "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Asenqed n useqdac-a ad yecreḍ ɣef tɣimit-is tettwattkal, yerna ad yecreḍ ula ɣef tɣimit-ik·im tettwattkal i netta·nettat.", "Enable 'Manage Integrations' in Settings to do this.": "Rmed 'imsidaf n usefrek' deg yiɣewwaren i tigin n waya.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", "To continue, use Single Sign On to prove your identity.": "I ukemmel, seqdec n unekcum asuf i ubeggen n timagit-ik·im.", "Click the button below to confirm your identity.": "Sit ɣef tqeffalt ddaw i wakken ad tesnetmeḍ timagit-ik·im.", "We couldn't create your DM. Please check the users you want to invite and try again.": "D awezɣi ad ternuḍ izen-inek·inem uslig. Ttxil-k·m senqed iseqdacen i tebɣiḍ ad d-tnecdeḍ syen ɛreḍ tikkelt-nniḍen.", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index d431fb9173..f817dbc26b 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -130,7 +130,7 @@ "Historical": "기록", "Home": "홈", "Homeserver is": "홈서버:", - "Identity server is": "ID 서버:", + "Identity Server is": "ID 서버:", "I have verified my email address": "이메일 주소를 인증했습니다", "Import": "가져오기", "Import E2E room keys": "종단간 암호화 방 키 불러오기", @@ -1060,9 +1060,9 @@ "Profile picture": "프로필 사진", "Upgrade to your own domain": "자체 도메인을 업그레이드하기", "Display Name": "표시 이름", - "Identity server URL must be HTTPS": "ID 서버 URL은 HTTPS이어야 함", - "Not a valid identity server (status code %(code)s)": "올바르지 않은 ID 서버 (상태 코드 %(code)s)", - "Could not connect to identity server": "ID 서버에 연결할 수 없음", + "Identity Server URL must be HTTPS": "ID 서버 URL은 HTTPS이어야 함", + "Not a valid Identity Server (status code %(code)s)": "올바르지 않은 ID 서버 (상태 코드 %(code)s)", + "Could not connect to Identity Server": "ID 서버에 연결할 수 없음", "Checking server": "서버 확인 중", "Terms of service not accepted or the identity server is invalid.": "서비스 약관에 동의하지 않거나 ID 서버가 올바르지 않습니다.", "Identity server has no terms of service": "ID 서버에 서비스 약관이 없음", @@ -1070,17 +1070,17 @@ "Only continue if you trust the owner of the server.": "서버의 관리자를 신뢰하는 경우에만 계속하세요.", "Disconnect from the identity server ?": "ID 서버 (으)로부터 연결을 끊겠습니까?", "Disconnect": "연결 끊기", - "Identity server (%(server)s)": "ID 서버 (%(server)s)", + "Identity Server (%(server)s)": "ID 서버 (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "현재 을(를) 사용하여 알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색할 수 있습니다. 아래에서 ID 서버를 변경할 수 있습니다.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색할 수 있는 을(를) 쓰고 싶지 않다면, 아래에 다른 ID 서버를 입력하세요.", - "Identity server": "ID 서버", + "Identity Server": "ID 서버", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "현재 ID 서버를 사용하고 있지 않습니다. 알고 있는 기존 연락처 사람들을 검색하거나 사람들이 당신을 검색하려면, 아래에 하나를 추가하세요.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID 서버로부터 연결을 끊으면 다른 사용자에게 검색될 수 없고, 이메일과 전화번호로 다른 사람을 초대할 수 없게 됩니다.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID 서버를 사용하는 것은 선택입니다. ID 서버를 사용하지 않는다면, 다른 사용자에게 검색될 수 없고, 이메일과 전화번호로 다른 사람을 초대할 수 없게 됩니다.", "Do not use an identity server": "ID 서버를 사용하지 않기", "Enter a new identity server": "새 ID 서버 입력", "Change": "변경", - "Integration manager": "통합 관리자", + "Integration Manager": "통합 관리자", "Email addresses": "이메일 주소", "Phone numbers": "전화번호", "Set a new account password...": "새 계정 비밀번호를 설정하세요...", @@ -1373,7 +1373,7 @@ "Enter your custom homeserver URL What does this mean?": "맞춤 홈서버 URL을 입력 무엇을 의미하나요?", "Homeserver URL": "홈서버 URL", "Enter your custom identity server URL What does this mean?": "맞춤 ID 서버 URL을 입력 무엇을 의미하나요?", - "Identity server URL": "ID 서버 URL", + "Identity Server URL": "ID 서버 URL", "Other servers": "다른 서버", "Free": "무료", "Join millions for free on the largest public server": "가장 넓은 공개 서버에 수 백 만명이 무료로 등록함", @@ -1639,7 +1639,7 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "방 ID", "Widget ID": "위젯 ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "이 위젯을 사용하면 %(widgetDomain)s & 통합 관리자와 데이터를 공유합니다.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "이 위젯을 사용하면 %(widgetDomain)s & 통합 관리자와 데이터를 공유합니다.", "Using this widget may share data with %(widgetDomain)s.": "이 위젯을 사용하면 %(widgetDomain)s와(과) 데이터를 공유합니다.", "Widget added by": "위젯을 추가했습니다", "This widget may use cookies.": "이 위젯은 쿠키를 사용합니다.", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 55909a11ed..e216c2de5a 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1165,9 +1165,9 @@ "Confirm adding phone number": "Patvirtinkite telefono numerio pridėjimą", "Click the button below to confirm adding this phone number.": "Paspauskite žemiau esantį mygtuką, kad patvirtintumėte šio numerio pridėjimą.", "Match system theme": "Suderinti su sistemos tema", - "Identity server URL must be HTTPS": "Tapatybės Serverio URL privalo būti HTTPS", - "Not a valid identity server (status code %(code)s)": "Netinkamas Tapatybės Serveris (statuso kodas %(code)s)", - "Could not connect to identity server": "Nepavyko prisijungti prie Tapatybės Serverio", + "Identity Server URL must be HTTPS": "Tapatybės Serverio URL privalo būti HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Netinkamas Tapatybės Serveris (statuso kodas %(code)s)", + "Could not connect to Identity Server": "Nepavyko prisijungti prie Tapatybės Serverio", "Disconnect from the identity server and connect to instead?": "Atsijungti nuo tapatybės serverio ir jo vietoje prisijungti prie ?", "Terms of service not accepted or the identity server is invalid.": "Nesutikta su paslaugų teikimo sąlygomis arba tapatybės serveris yra klaidingas.", "The identity server you have chosen does not have any terms of service.": "Jūsų pasirinktas tapatybės serveris neturi jokių paslaugų teikimo sąlygų.", @@ -1177,12 +1177,12 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "patikrinti ar tarp jūsų naršyklės įskiepių nėra nieko kas galėtų blokuoti tapatybės serverį (pavyzdžiui \"Privacy Badger\")", "contact the administrators of identity server ": "susisiekti su tapatybės serverio administratoriais", "You are still sharing your personal data on the identity server .": "Jūs vis dar dalijatės savo asmeniniais duomenimis tapatybės serveryje .", - "Identity server (%(server)s)": "Tapatybės Serveris (%(server)s)", + "Identity Server (%(server)s)": "Tapatybės Serveris (%(server)s)", "Enter a new identity server": "Pridėkite naują tapatybės serverį", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą (%(serverName)s) botų, valdiklių ir lipdukų pakuočių tvarkymui.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą botų, valdiklių ir lipdukų pakuočių tvarkymui.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą (%(serverName)s) botų, valdiklių ir lipdukų pakuočių tvarkymui.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Naudokite Integracijų Tvarkytuvą botų, valdiklių ir lipdukų pakuočių tvarkymui.", "Manage integrations": "Valdyti integracijas", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.", "Invalid theme schema.": "Klaidinga temos schema.", "Error downloading theme information.": "Klaida atsisiunčiant temos informaciją.", "Theme added!": "Tema pridėta!", @@ -1203,7 +1203,7 @@ "Your theme": "Jūsų tema", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Valdiklio ištrinimas pašalina jį visiems kambaryje esantiems vartotojams. Ar tikrai norite ištrinti šį valdiklį?", "Enable 'Manage Integrations' in Settings to do this.": "Įjunkite 'Valdyti integracijas' Nustatymuose, kad tai atliktumėte.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Jūsų %(brand)s neleidžia jums naudoti integracijų tvarkytuvo tam atlikti. Susisiekite su administratoriumi.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Jūsų %(brand)s neleidžia jums naudoti integracijų tvarkytuvo tam atlikti. Susisiekite su administratoriumi.", "Enter phone number (required on this homeserver)": "Įveskite telefono numerį (privaloma šiame serveryje)", "Doesn't look like a valid phone number": "Tai nepanašu į veikiantį telefono numerį", "Invalid homeserver discovery response": "Klaidingas serverio radimo atsakas", @@ -1479,12 +1479,12 @@ "Connect this session to Key Backup": "Prijungti šį seansą prie Atsarginės Raktų Kopijos", "Backup key stored: ": "Atsarginės kopijos raktas saugomas: ", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Tam, kad galėtumėte rasti ir tam, kad būtumėte randamas esamų, jums žinomų kontaktų, jūs šiuo metu naudojate tapatybės serverį. Jį pakeisti galite žemiau.", - "Identity server": "Tapatybės Serveris", + "Identity Server": "Tapatybės Serveris", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Šiuo metu jūs nenaudojate tapatybės serverio. Tam, kad galėtumėte rasti ir tam, kad būtumėte randamas esamų, jums žinomų kontaktų, pridėkite jį žemiau.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Atsijungimas nuo tapatybės serverio reikš, kad jūs nebebūsite randamas kitų vartotojų ir jūs nebegalėsite pakviesti kitų, naudodami jų el. paštą arba telefoną.", "Appearance": "Išvaizda", "Deactivate account": "Deaktyvuoti paskyrą", - "Identity server is": "Tapatybės Serveris yra", + "Identity Server is": "Tapatybės Serveris yra", "Timeline": "Laiko juosta", "Key backup": "Atsarginė raktų kopija", "Where you’re logged in": "Kur esate prisijungę", @@ -1494,7 +1494,7 @@ "Unable to validate homeserver/identity server": "Neįmanoma patvirtinti serverio/tapatybės serverio", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nėra sukonfigūruota jokio tapatybės serverio, tad jūs negalite pridėti el. pašto adreso, tam, kad galėtumėte iš naujo nustatyti savo slaptažodį ateityje.", "Enter your custom identity server URL What does this mean?": "Įveskite savo pasirinktinio tapatybės serverio URL Ką tai reiškia?", - "Identity server URL": "Tapatybės serverio URL", + "Identity Server URL": "Tapatybės serverio URL", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Bandyta įkelti konkrečią vietą šio kambario laiko juostoje, bet jūs neturite leidimo peržiūrėti tos žinutės.", "Failed to load timeline position": "Nepavyko įkelti laiko juostos pozicijos", "Your Matrix account on %(serverName)s": "Jūsų Matrix paskyra %(serverName)s serveryje", @@ -1574,7 +1574,7 @@ "Learn more about how we use analytics.": "Sužinokite daugiau apie tai, kaip mes naudojame analitiką.", "Reset": "Iš naujo nustatyti", "Failed to connect to integration manager": "Nepavyko prisijungti prie integracijų tvarkytuvo", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Naudojimasis šiuo valdikliu gali pasidalinti duomenimis su %(widgetDomain)s ir jūsų integracijų tvarkytuvu.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Naudojimasis šiuo valdikliu gali pasidalinti duomenimis su %(widgetDomain)s ir jūsų integracijų tvarkytuvu.", "Please create a new issue on GitHub so that we can investigate this bug.": "Prašome sukurti naują problemą GitHub'e, kad mes galėtume ištirti šią klaidą.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Pasakyite mums kas nutiko, arba, dar geriau, sukurkite GitHub problemą su jos apibūdinimu.", "Before submitting logs, you must create a GitHub issue to describe your problem.": "Prieš pateikiant žurnalus jūs turite sukurti GitHub problemą, kad apibūdintumėte savo problemą.", @@ -1582,7 +1582,7 @@ "Notes": "Pastabos", "Integrations are disabled": "Integracijos yra išjungtos", "Integrations not allowed": "Integracijos neleidžiamos", - "Integration manager": "Integracijų tvarkytuvas", + "Integration Manager": "Integracijų tvarkytuvas", "This looks like a valid recovery key!": "Tai panašu į galiojantį atgavimo raktą!", "Not a valid recovery key": "Negaliojantis atgavimo raktas", "Recovery key mismatch": "Atgavimo rakto neatitikimas", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 2fb284d378..b56599f26e 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -115,7 +115,7 @@ "Historical": "Bijušie", "Home": "Mājup", "Homeserver is": "Bāzes serveris ir", - "Identity server is": "Indentifikācijas serveris ir", + "Identity Server is": "Indentifikācijas serveris ir", "I have verified my email address": "Mana epasta adrese ir verificēta", "Import": "Importēt", "Import E2E room keys": "Importēt E2E istabas atslēgas", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index f0dda3ca06..d3be9cd2ea 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -589,13 +589,13 @@ "Checking server": "Sjekker tjeneren", "Change identity server": "Bytt ut identitetstjener", "You should:": "Du burde:", - "Identity server": "Identitetstjener", + "Identity Server": "Identitetstjener", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Å bruke en identitetstjener er valgfritt. Dersom du velger å ikke bruke en identitetstjener, vil du ikke kunne oppdages av andre brukere, og du vil ikke kunne invitere andre ut i fra E-postadresse eller telefonnummer.", "Do not use an identity server": "Ikke bruk en identitetstjener", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler (%(serverName)s) til å behandle botter, moduler, og klistremerkepakker.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler til å behandle botter, moduler, og klistremerkepakker.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler (%(serverName)s) til å behandle botter, moduler, og klistremerkepakker.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Bruk en integreringsbehandler til å behandle botter, moduler, og klistremerkepakker.", "Manage integrations": "Behandle integreringer", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integreringsbehandlere mottar oppsettsdata, og kan endre på moduler, sende rominvitasjoner, og bestemme styrkenivåer på dine vegne.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integreringsbehandlere mottar oppsettsdata, og kan endre på moduler, sende rominvitasjoner, og bestemme styrkenivåer på dine vegne.", "Flair": "Merkeskilt", "Theme added!": "Temaet er lagt til!", "Set a new account password...": "Velg et nytt kontopassord …", @@ -768,7 +768,7 @@ "Email (optional)": "E-post (valgfritt)", "Phone (optional)": "Telefonnummer (valgfritt)", "Homeserver URL": "Hjemmetjener-URL", - "Identity server URL": "Identitetstjener-URL", + "Identity Server URL": "Identitetstjener-URL", "Other servers": "Andre tjenere", "Add a Room": "Legg til et rom", "Add a User": "Legg til en bruker", @@ -841,7 +841,7 @@ "Back up your keys before signing out to avoid losing them.": "Ta sikkerhetskopi av nøklene dine før du logger av for å unngå å miste dem.", "Start using Key Backup": "Begynn å bruke Nøkkelsikkerhetskopiering", "Add an email address to configure email notifications": "Legg til en E-postadresse for å sette opp E-postvarsler", - "Identity server (%(server)s)": "Identitetstjener (%(server)s)", + "Identity Server (%(server)s)": "Identitetstjener (%(server)s)", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Hvis du ikke ønsker å bruke til å oppdage og bli oppdaget av eksisterende kontakter som du kjenner, skriv inn en annen identitetstjener nedenfor.", "Enter a new identity server": "Skriv inn en ny identitetstjener", "For help with using %(brand)s, click here.": "For å få hjelp til å bruke %(brand)s, klikk her.", @@ -851,7 +851,7 @@ "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "For å rapportere inn et Matrix-relatert sikkerhetsproblem, vennligst less Matrix.org sine Retningslinjer for sikkerhetspublisering.", "Keyboard Shortcuts": "Tastatursnarveier", "Homeserver is": "Hjemmetjeneren er", - "Identity server is": "Identitetstjeneren er", + "Identity Server is": "Identitetstjeneren er", "Access Token:": "Tilgangssjetong:", "Import E2E room keys": "Importer E2E-romnøkler", "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet.", @@ -965,7 +965,7 @@ "Room Settings - %(roomName)s": "Rominnstillinger - %(roomName)s", "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", "Please set a password!": "Vennligst velg et passord!", - "Integration manager": "Integreringsbehandler", + "Integration Manager": "Integreringsbehandler", "To continue you need to accept the terms of this service.": "For å gå videre må du akseptere brukervilkårene til denne tjenesten.", "Private Chat": "Privat chat", "Public Chat": "Offentlig chat", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 2f53b1f8b7..1818a64e54 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -178,7 +178,7 @@ "Historical": "Historisch", "Home": "Thuis", "Homeserver is": "Homeserver is", - "Identity server is": "Identiteitsserver is", + "Identity Server is": "Identiteitsserver is", "I have verified my email address": "Ik heb mijn e-mailadres geverifieerd", "Import": "Inlezen", "Import E2E room keys": "E2E-gesprekssleutels importeren", @@ -1175,7 +1175,7 @@ "Confirm": "Bevestigen", "Other servers": "Andere servers", "Homeserver URL": "Thuisserver-URL", - "Identity server URL": "Identiteitsserver-URL", + "Identity Server URL": "Identiteitsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Neem deel aan de grootste openbare server met miljoenen anderen", "Premium": "Premium", @@ -1393,7 +1393,7 @@ "You're signed out": "U bent uitgelogd", "Clear personal data": "Persoonlijke gegevens wissen", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Laat ons weten wat er verkeerd is gegaan, of nog beter, maak een foutrapport aan op GitHub, waarin u het probleem beschrijft.", - "Identity server": "Identiteitsserver", + "Identity Server": "Identiteitsserver", "Find others by phone or email": "Vind anderen via telefoonnummer of e-mailadres", "Be found by phone or email": "Wees vindbaar via telefoonnummer of e-mailadres", "Use bots, bridges, widgets and sticker packs": "Gebruik robots, bruggen, widgets en stickerpakketten", @@ -1406,17 +1406,17 @@ "Messages": "Berichten", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toont een lijst van beschikbare opdrachten, met hun gebruiken en beschrijvingen", - "Identity server URL must be HTTPS": "Identiteitsserver-URL moet HTTPS zijn", - "Not a valid identity server (status code %(code)s)": "Geen geldige identiteitsserver (statuscode %(code)s)", - "Could not connect to identity server": "Kon geen verbinding maken met de identiteitsserver", + "Identity Server URL must be HTTPS": "Identiteitsserver-URL moet HTTPS zijn", + "Not a valid Identity Server (status code %(code)s)": "Geen geldige identiteitsserver (statuscode %(code)s)", + "Could not connect to Identity Server": "Kon geen verbinding maken met de identiteitsserver", "Checking server": "Server wordt gecontroleerd", "Disconnect from the identity server ?": "Wilt u de verbinding met de identiteitsserver verbreken?", "Disconnect": "Verbinding verbreken", - "Identity server (%(server)s)": "Identiteitsserver (%(server)s)", + "Identity Server (%(server)s)": "Identiteitsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Om bekenden te kunnen vinden en voor hen vindbaar te zijn gebruikt u momenteel . U kunt die identiteitsserver hieronder wijzigen.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "U gebruikt momenteel geen identiteitsserver. Voeg er hieronder één toe om bekenden te kunnen vinden en voor hen vindbaar te zijn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Als u de verbinding met uw identiteitsserver verbreekt zal u niet door andere personen gevonden kunnen worden, en dat u anderen niet via e-mail of telefoon zal kunnen uitnodigen.", - "Integration manager": "Integratiebeheerder", + "Integration Manager": "Integratiebeheerder", "Discovery": "Vindbaarheid", "Deactivate account": "Account sluiten", "Always show the window menu bar": "De venstermenubalk altijd tonen", @@ -1687,10 +1687,10 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "uw browserextensies bekijken voor extensies die mogelijk de identiteitsserver blokkeren (zoals Privacy Badger)", "contact the administrators of identity server ": "contact opnemen met de beheerders van de identiteitsserver ", "wait and try again later": "wachten en het later weer proberen", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder (%(serverName)s) om robots, widgets en stickerpakketten te beheren.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder om robots, widgets en stickerpakketten te beheren.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder (%(serverName)s) om robots, widgets en stickerpakketten te beheren.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder om robots, widgets en stickerpakketten te beheren.", "Manage integrations": "Integratiebeheerder", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveau’s namens u aanpassen.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveau’s namens u aanpassen.", "Ban list rules - %(roomName)s": "Banlijstregels - %(roomName)s", "Server rules": "Serverregels", "User rules": "Gebruikersregels", @@ -1864,7 +1864,7 @@ "%(brand)s URL": "%(brand)s-URL", "Room ID": "Gespreks-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s en uw integratiebeheerder.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s en uw integratiebeheerder.", "Using this widget may share data with %(widgetDomain)s.": "Deze widget gebruiken deelt mogelijk gegevens met %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgets gebruiken geen berichtversleuteling.", "Widget added by": "Widget toegevoegd door", @@ -1886,7 +1886,7 @@ "Integrations are disabled": "Integraties zijn uitgeschakeld", "Enable 'Manage Integrations' in Settings to do this.": "Schakel de ‘Integratiebeheerder’ in in uw Instellingen om dit te doen.", "Integrations not allowed": "Integraties niet toegestaan", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", "Failed to invite the following users to chat: %(csvUsers)s": "Het uitnodigen van volgende gebruikers voor gesprek is mislukt: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Uw direct gesprek kon niet aangemaakt worden. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.", "Something went wrong trying to invite the users.": "Er is een fout opgetreden bij het uitnodigen van de gebruikers.", diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index 427f55f72a..478f05b5cb 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -758,7 +758,7 @@ "Account": "Brukar", "click to reveal": "klikk for å visa", "Homeserver is": "Heimtenaren er", - "Identity server is": "Identitetstenaren er", + "Identity Server is": "Identitetstenaren er", "%(brand)s version:": "%(brand)s versjon:", "olm version:": "olm versjon:", "Failed to send email": "Fekk ikkje til å senda eposten", @@ -1373,7 +1373,7 @@ "Explore all public rooms": "Utforsk alle offentlege rom", "Explore public rooms": "Utforsk offentlege rom", "Use Ctrl + F to search": "Bruk Ctrl + F for søk", - "Identity server": "Identitetstenar", + "Identity Server": "Identitetstenar", "Email Address": "E-postadresse", "Go Back": "Gå attende", "Notification settings": "Varslingsinnstillingar" diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 616c091761..641247e6ee 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -174,7 +174,7 @@ "Hangup": "Rozłącz się", "Home": "Strona startowa", "Homeserver is": "Serwer domowy to", - "Identity server is": "Serwer tożsamości to", + "Identity Server is": "Serwer tożsamości to", "I have verified my email address": "Zweryfikowałem swój adres e-mail", "Import": "Importuj", "Import E2E room keys": "Importuj klucze pokoju E2E", @@ -1139,9 +1139,9 @@ "Start using Key Backup": "Rozpocznij z użyciem klucza kopii zapasowej", "Add an email address to configure email notifications": "Dodaj adres poczty elektronicznej, aby skonfigurować powiadomienia pocztowe", "Profile picture": "Obraz profilowy", - "Identity server URL must be HTTPS": "URL serwera tożsamości musi być HTTPS", - "Not a valid identity server (status code %(code)s)": "Nieprawidłowy serwer tożsamości (kod statusu %(code)s)", - "Could not connect to identity server": "Nie można połączyć z Serwerem Tożsamości", + "Identity Server URL must be HTTPS": "URL serwera tożsamości musi być HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Nieprawidłowy serwer tożsamości (kod statusu %(code)s)", + "Could not connect to Identity Server": "Nie można połączyć z Serwerem Tożsamości", "Checking server": "Sprawdzanie serwera", "Terms of service not accepted or the identity server is invalid.": "Warunki użytkowania nieakceptowane lub serwer tożsamości jest nieprawidłowy.", "Identity server has no terms of service": "Serwer tożsamości nie posiada warunków użytkowania", @@ -1149,15 +1149,15 @@ "Only continue if you trust the owner of the server.": "Kontynuj tylko wtedy, gdy ufasz właścicielowi serwera.", "Disconnect from the identity server ?": "Odłączyć od serwera tożsamości ?", "Disconnect": "Odłącz", - "Identity server (%(server)s)": "Serwer tożsamości (%(server)s)", + "Identity Server (%(server)s)": "Serwer tożsamości (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Używasz , aby odnajdywać i móc być odnajdywanym przez istniejące kontakty, które znasz. Możesz zmienić serwer tożsamości poniżej.", - "Identity server": "Serwer Tożsamości", + "Identity Server": "Serwer Tożsamości", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Nie używasz serwera tożsamości. Aby odkrywać i być odkrywanym przez istniejące kontakty które znasz, dodaj jeden poniżej.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Odłączenie się od serwera tożsamości oznacza, że inni nie będą mogli Cię odnaleźć ani Ty nie będziesz w stanie zaprosić nikogo za pomocą e-maila czy telefonu.", "Enter a new identity server": "Wprowadź nowy serwer tożsamości", "Change": "Zmień", "Upgrade to your own domain": "Zaktualizuj do swojej własnej domeny", - "Integration manager": "Menedżer Integracji", + "Integration Manager": "Menedżer Integracji", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Wyrażasz zgodę na warunki użytkowania serwera%(serverName)s aby pozwolić na odkrywanie Ciebie za pomocą adresu e-mail oraz numeru telefonu.", "Discovery": "Odkrywanie", "Deactivate account": "Dezaktywuj konto", @@ -1661,8 +1661,8 @@ "Use custom size": "Użyj niestandardowego rozmiaru", "Appearance Settings only affect this %(brand)s session.": "Ustawienia wyglądu wpływają tylko na tę sesję %(brand)s.", "Customise your appearance": "Dostosuj wygląd", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji aby zarządzać botami, widżetami i pakietami naklejek.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji %(serverName)s aby zarządzać botami, widżetami i pakietami naklejek.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji aby zarządzać botami, widżetami i pakietami naklejek.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Użyj Zarządcy Integracji %(serverName)s aby zarządzać botami, widżetami i pakietami naklejek.", "There are two ways you can provide feedback and help us improve %(brand)s.": "Są dwa sposoby na przekazanie informacji zwrotnych i pomoc w usprawnieniu %(brand)s.", "Feedback sent": "Wysłano informacje zwrotne", "Send feedback": "Wyślij informacje zwrotne", @@ -2347,7 +2347,7 @@ "Show line numbers in code blocks": "Pokazuj numery wierszy w blokach kodu", "Expand code blocks by default": "Domyślnie rozwijaj bloki kodu", "Show stickers button": "Pokaż przycisk naklejek", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Zarządcy integracji otrzymują dane konfiguracji, mogą modyfikować widżety, wysyłać zaproszenia do pokoi i ustawiać poziom uprawnień w Twoim imieniu.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Zarządcy integracji otrzymują dane konfiguracji, mogą modyfikować widżety, wysyłać zaproszenia do pokoi i ustawiać poziom uprawnień w Twoim imieniu.", "Converts the DM to a room": "Zmienia wiadomości bezpośrednie w pokój", "Converts the room to a DM": "Zmienia pokój w wiadomość bezpośrednią", "Sends the given message as a spoiler": "Wysyła podaną wiadomość jako spoiler", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 566de97b3f..4047aae760 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -38,7 +38,7 @@ "Hangup": "Desligar", "Historical": "Histórico", "Homeserver is": "Servidor padrão é", - "Identity server is": "O servidor de identificação é", + "Identity Server is": "O servidor de identificação é", "I have verified my email address": "Eu verifiquei o meu endereço de email", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de email inválido", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 03a71c4e9e..e19febd6ef 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -38,7 +38,7 @@ "Hangup": "Desligar", "Historical": "Histórico", "Homeserver is": "Servidor padrão é", - "Identity server is": "O servidor de identificação é", + "Identity Server is": "O servidor de identificação é", "I have verified my email address": "Eu confirmei o meu endereço de e-mail", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de e-mail inválido", @@ -1729,7 +1729,7 @@ "Your avatar URL": "Link da sua foto de perfil", "Your user ID": "Sua ID de usuário", "%(brand)s URL": "Link do %(brand)s", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s & seu Gerenciador de Integrações.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s & seu Gerenciador de Integrações.", "Using this widget may share data with %(widgetDomain)s.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s.", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s não fizeram alterações %(count)s vezes", "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s não fizeram alterações", @@ -1770,9 +1770,9 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Você pode ter configurado estas opções em um aplicativo que não seja o %(brand)s. Você não pode ajustar essas opções no %(brand)s, mas elas ainda se aplicam.", "Enable audible notifications for this session": "Ativar o som de notificações nesta sessão", "Display Name": "Nome e sobrenome", - "Identity server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", - "Not a valid identity server (status code %(code)s)": "Servidor de Identidade inválido (código de status %(code)s)", - "Could not connect to identity server": "Não foi possível conectar-se ao Servidor de Identidade", + "Identity Server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Servidor de Identidade inválido (código de status %(code)s)", + "Could not connect to Identity Server": "Não foi possível conectar-se ao Servidor de Identidade", "Checking server": "Verificando servidor", "Change identity server": "Alterar o servidor de identidade", "Disconnect from the identity server and connect to instead?": "Desconectar-se do servidor de identidade e conectar-se em em vez disso?", @@ -1789,10 +1789,10 @@ "You are still sharing your personal data on the identity server .": "Você ainda está compartilhando seus dados pessoais no servidor de identidade .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Recomendamos que você remova seus endereços de e-mail e números de telefone do servidor de identidade antes de desconectar.", "Go back": "Voltar", - "Identity server (%(server)s)": "Servidor de identidade (%(server)s)", + "Identity Server (%(server)s)": "Servidor de identidade (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "No momento, você está usando para descobrir e ser descoberto pelos contatos existentes que você conhece. Você pode alterar seu servidor de identidade abaixo.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Se você não quiser usar para descobrir e ser detectável pelos contatos existentes, digite outro servidor de identidade abaixo.", - "Identity server": "Servidor de identidade", + "Identity Server": "Servidor de identidade", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectar-se do servidor de identidade significa que você não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou número de celular.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar um servidor de identidade é opcional. Se você optar por não usar um servidor de identidade, não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou por número de celular.", @@ -1919,9 +1919,9 @@ "Expand room list section": "Mostrar seção da lista de salas", "The person who invited you already left the room.": "A pessoa que convidou você já saiu da sala.", "The person who invited you already left the room, or their server is offline.": "A pessoa que convidou você já saiu da sala, ou o servidor dela está indisponível.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações em (%(serverName)s) para gerenciar bots, widgets e pacotes de figurinhas.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações para gerenciar bots, widgets e pacotes de figurinhas.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "O Gerenciador de Integrações recebe dados de configuração e pode modificar widgets, enviar convites para salas e definir níveis de permissão em seu nome.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações em (%(serverName)s) para gerenciar bots, widgets e pacotes de figurinhas.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Use o Gerenciador de Integrações para gerenciar bots, widgets e pacotes de figurinhas.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "O Gerenciador de Integrações recebe dados de configuração e pode modificar widgets, enviar convites para salas e definir níveis de permissão em seu nome.", "Keyboard Shortcuts": "Atalhos do teclado", "Customise your experience with experimental labs features. Learn more.": "Personalize sua experiência com os recursos experimentais. Saiba mais.", "Ignored/Blocked": "Bloqueado", @@ -2034,7 +2034,7 @@ "Destroy cross-signing keys?": "Destruir chaves autoverificadas?", "Waiting for partner to confirm...": "Aguardando seu contato confirmar...", "Enable 'Manage Integrations' in Settings to do this.": "Para fazer isso, ative 'Gerenciar Integrações' nas Configurações.", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com o administrador.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com o administrador.", "Confirm to continue": "Confirme para continuar", "Click the button below to confirm your identity.": "Clique no botão abaixo para confirmar sua identidade.", "Failed to invite the following users to chat: %(csvUsers)s": "Falha ao convidar os seguintes usuários para a conversa: %(csvUsers)s", @@ -2058,7 +2058,7 @@ "Command Help": "Ajuda com Comandos", "To help us prevent this in future, please send us logs.": "Para nos ajudar a evitar isso no futuro, envie-nos os relatórios.", "Your browser likely removed this data when running low on disk space.": "O seu navegador provavelmente removeu esses dados quando o espaço de armazenamento ficou insuficiente.", - "Integration manager": "Gerenciador de Integrações", + "Integration Manager": "Gerenciador de Integrações", "Find others by phone or email": "Encontre outras pessoas por telefone ou e-mail", "Use bots, bridges, widgets and sticker packs": "Use bots, integrações, widgets e pacotes de figurinhas", "Terms of Service": "Termos de serviço", @@ -2100,7 +2100,7 @@ "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Defina um e-mail para poder recuperar a conta. Este e-mail também pode ser usado para encontrar seus contatos.", "Enter your custom homeserver URL What does this mean?": "Digite o endereço de um servidor local O que isso significa?", "Homeserver URL": "Endereço do servidor local", - "Identity server URL": "Endereço do servidor de identidade", + "Identity Server URL": "Endereço do servidor de identidade", "Other servers": "Outros servidores", "Free": "Gratuito", "Find other public servers or use a custom server": "Encontre outros servidores públicos ou use um servidor personalizado", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index f14e5c5ed3..91b9919d0a 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -34,7 +34,7 @@ "Hangup": "Повесить трубку", "Historical": "Архив", "Homeserver is": "Домашний сервер", - "Identity server is": "Сервер идентификации", + "Identity Server is": "Сервер идентификации", "I have verified my email address": "Я подтвердил свой email", "Import E2E room keys": "Импорт ключей шифрования", "Invalid Email Address": "Недопустимый email", @@ -1007,7 +1007,7 @@ "Confirm": "Подтвердить", "Other servers": "Другие серверы", "Homeserver URL": "URL сервера", - "Identity server URL": "URL сервера идентификации", + "Identity Server URL": "URL сервера идентификации", "Free": "Бесплатный", "Premium": "Премиум", "Other": "Другие", @@ -1381,7 +1381,7 @@ "Your homeserver doesn't seem to support this feature.": "Ваш сервер, похоже, не поддерживает эту возможность.", "Message edits": "Правки сообщения", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Модернизация этой комнаты требует закрытие комнаты в текущем состояние и создания новой комнаты вместо неё. Чтобы упростить процесс для участников, будет сделано:", - "Identity server": "Сервер идентификаций", + "Identity Server": "Сервер идентификаций", "Find others by phone or email": "Найти других по номеру телефона или email", "Be found by phone or email": "Будут найдены по номеру телефона или email", "Use bots, bridges, widgets and sticker packs": "Использовать боты, мосты, виджеты и наборы стикеров", @@ -1414,9 +1414,9 @@ "Accept to continue:": "Примите для продолжения:", "ID": "ID", "Public Name": "Публичное имя", - "Identity server URL must be HTTPS": "URL-адрес сервера идентификации должен быть HTTPS", - "Not a valid identity server (status code %(code)s)": "Неправильный Сервер идентификации (код статуса %(code)s)", - "Could not connect to identity server": "Не смог подключиться к серверу идентификации", + "Identity Server URL must be HTTPS": "URL-адрес сервера идентификации должен быть HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Неправильный Сервер идентификации (код статуса %(code)s)", + "Could not connect to Identity Server": "Не смог подключиться к серверу идентификации", "Checking server": "Проверка сервера", "Terms of service not accepted or the identity server is invalid.": "Условия использования не приняты или сервер идентификации недействителен.", "Identity server has no terms of service": "Сервер идентификации не имеет условий предоставления услуг", @@ -1424,10 +1424,10 @@ "Only continue if you trust the owner of the server.": "Продолжайте, только если доверяете владельцу сервера.", "Disconnect from the identity server ?": "Отсоединиться от сервера идентификации ?", "Disconnect": "Отключить", - "Identity server (%(server)s)": "Сервер идентификации (%(server)s)", + "Identity Server (%(server)s)": "Сервер идентификации (%(server)s)", "Do not use an identity server": "Не использовать сервер идентификации", "Enter a new identity server": "Введите новый идентификационный сервер", - "Integration manager": "Менеджер интеграции", + "Integration Manager": "Менеджер интеграции", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Кроме того, вы можете попытаться использовать общедоступный сервер по адресу turn.matrix.org , но это не будет настолько надежным, и он предоставит ваш IP-адрес этому серверу. Вы также можете управлять этим в настройках.", "Sends a message as plain text, without interpreting it as markdown": "Посылает сообщение в виде простого текста, не интерпретируя его как разметку", "Use an identity server": "Используйте сервер идентификации", @@ -1595,10 +1595,10 @@ "Delete %(count)s sessions|other": "Удалить %(count)s сессий", "Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии", "Enable audible notifications for this session": "Включить звуковые уведомления для этой сессии", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций %(serverName)s для управления ботами, виджетами и стикерами.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций %(serverName)s для управления ботами, виджетами и стикерами.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.", "Manage integrations": "Управление интеграциями", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.", "Direct Messages": "Диалоги", "%(count)s sessions|other": "%(count)s сессий", "Hide sessions": "Скрыть сессии", @@ -2191,7 +2191,7 @@ "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Произошла ошибка при обновлении альтернативных адресов комнаты. Это может быть запрещено сервером или произошел временный сбой.", "There was an error creating that address. It may not be allowed by the server or a temporary failure occurred.": "При создании этого адреса произошла ошибка. Это может быть запрещено сервером или произошел временный сбой.", "There was an error removing that address. It may no longer exist or a temporary error occurred.": "Произошла ошибка при удалении этого адреса. Возможно, он больше не существует или произошла временная ошибка.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s и вашим Менеджером Интеграции.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s и вашим Менеджером Интеграции.", "Using this widget may share data with %(widgetDomain)s.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s.", "Can't find this server or its room list": "Не можем найти этот сервер или его список комнат", "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Удаление ключей кросс-подписи является мгновенным и необратимым действием. Любой, с кем вы прошли проверку, увидит предупреждения безопасности. Вы почти наверняка не захотите этого делать, если только не потеряете все устройства, с которых можно совершать кросс-подпись.", @@ -2206,7 +2206,7 @@ "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Проверка этого устройства пометит его как доверенное, и пользователи, которые проверили его вместе с вами, будут доверять этому устройству.", "Integrations are disabled": "Интеграции отключены", "Integrations not allowed": "Интеграции не разрешены", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Ваш %(brand)s не позволяет вам использовать для этого Менеджер Интеграции. Пожалуйста, свяжитесь с администратором.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Ваш %(brand)s не позволяет вам использовать для этого Менеджер Интеграции. Пожалуйста, свяжитесь с администратором.", "To continue, use Single Sign On to prove your identity.": "Чтобы продолжить, используйте единый вход, чтобы подтвердить свою личность.", "Confirm to continue": "Подтвердите, чтобы продолжить", "Click the button below to confirm your identity.": "Нажмите кнопку ниже, чтобы подтвердить свою личность.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 3b5904fef5..0ee0c6cbc3 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -533,7 +533,7 @@ "Access Token:": "Prístupový token:", "click to reveal": "Odkryjete kliknutím", "Homeserver is": "Domovský server je", - "Identity server is": "Server totožností je", + "Identity Server is": "Server totožností je", "%(brand)s version:": "Verzia %(brand)s:", "olm version:": "Verzia olm:", "Failed to send email": "Nepodarilo sa odoslať email", @@ -1197,7 +1197,7 @@ "Confirm": "Potvrdiť", "Other servers": "Ostatné servery", "Homeserver URL": "URL adresa domovského servera", - "Identity server URL": "URL adresa servera totožností", + "Identity Server URL": "URL adresa servera totožností", "Free": "Zdarma", "Join millions for free on the largest public server": "Pripojte sa k mnohým používateľom najväčšieho verejného domovského servera zdarma", "Premium": "Premium", @@ -1270,9 +1270,9 @@ "Accept to continue:": "Ak chcete pokračovať, musíte prijať :", "ID": "ID", "Public Name": "Verejný názov", - "Identity server URL must be HTTPS": "URL adresa servera totožností musí začínať HTTPS", - "Not a valid identity server (status code %(code)s)": "Toto nie je funkčný server totožností (kód stavu %(code)s)", - "Could not connect to identity server": "Nie je možné sa pripojiť k serveru totožností", + "Identity Server URL must be HTTPS": "URL adresa servera totožností musí začínať HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Toto nie je funkčný server totožností (kód stavu %(code)s)", + "Could not connect to Identity Server": "Nie je možné sa pripojiť k serveru totožností", "Checking server": "Kontrola servera", "Terms of service not accepted or the identity server is invalid.": "Neprijali ste Podmienky poskytovania služby alebo to nie je správny server.", "Identity server has no terms of service": "Server totožností nemá žiadne podmienky poskytovania služieb", @@ -1354,19 +1354,19 @@ "Disconnect anyway": "Napriek tomu sa odpojiť", "You are still sharing your personal data on the identity server .": "Stále zdielate vaše osobné údaje so serverom totožnosti .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Odporúčame, aby ste ešte pred odpojením sa zo servera totožností odstránili vašu emailovú adresu a telefónne číslo.", - "Identity server (%(server)s)": "Server totožností (%(server)s)", + "Identity Server (%(server)s)": "Server totožností (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Momentálne na vyhľadávanie kontaktov a na možnosť byť nájdení kontaktmi ktorých poznáte používate . Zmeniť server totožností môžete nižšie.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Ak nechcete na vyhľadávanie kontaktov a možnosť byť nájdení používať , zadajte adresu servera totožností nižšie.", - "Identity server": "Server totožností", + "Identity Server": "Server totožností", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Momentálne nepoužívate žiaden server totožností. Ak chcete vyhľadávať kontakty a zároveň umožniť ostatným vašim kontaktom, aby mohli nájsť vás, nastavte si server totožností nižšie.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ak sa odpojíte od servera totožností, vaše kontakty vás nebudú môcť nájsť a ani vy nebudete môcť pozývať používateľov zadaním emailovej adresy a telefónneho čísla.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Používanie servera totožností je voliteľné. Ak sa rozhodnete, že nebudete používať server totožností, nebudú vás vaši známi môcť nájsť a ani vy nebudete môcť pozývať používateľov zadaním emailovej adresy alebo telefónneho čísla.", "Do not use an identity server": "Nepoužívať server totožností", "Enter a new identity server": "Zadať nový server totožností", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použiť integračný server (%(serverName)s) na správu botov, widgetov a balíčkov s nálepkami.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Použiť integračný server na správu botov, widgetov a balíčkov s nálepkami.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použiť integračný server (%(serverName)s) na správu botov, widgetov a balíčkov s nálepkami.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Použiť integračný server na správu botov, widgetov a balíčkov s nálepkami.", "Manage integrations": "Spravovať integrácie", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integračné servery zhromažďujú údaje nastavení, môžu spravovať widgety, odosielať vo vašom mene pozvánky alebo meniť úroveň moci.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integračné servery zhromažďujú údaje nastavení, môžu spravovať widgety, odosielať vo vašom mene pozvánky alebo meniť úroveň moci.", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Súhlaste s podmienkami používania servera totožností (%(serverName)s), aby ste mohli byť nájdení zadaním emailovej adresy alebo telefónneho čísla.", "Discovery": "Objaviť", "Deactivate account": "Deaktivovať účet", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index c5abe74ad1..b2101151e1 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -473,7 +473,7 @@ "Profile": "Profil", "Account": "Llogari", "Access Token:": "Token Hyrjesh:", - "Identity server is": "Shërbyes Identitetesh është", + "Identity Server is": "Shërbyes Identitetesh është", "%(brand)s version:": "Version %(brand)s:", "olm version:": "version olm:", "The email address linked to your account must be entered.": "Duhet dhënë adresa email e lidhur me llogarinë tuaj.", @@ -1061,7 +1061,7 @@ "Confirm": "Ripohojeni", "Other servers": "Shërbyes të tjerë", "Homeserver URL": "URL Shërbyesi Home", - "Identity server URL": "URL Shërbyesi Identitetesh", + "Identity Server URL": "URL Shërbyesi Identitetesh", "Free": "Falas", "Join millions for free on the largest public server": "Bashkojuni milionave, falas, në shërbyesin më të madh publik", "Premium": "Me Pagesë", @@ -1398,7 +1398,7 @@ "Removing…": "Po hiqet…", "Share User": "Ndani Përdorues", "Command Help": "Ndihmë Urdhri", - "Identity server": "Shërbyes Identitetesh", + "Identity Server": "Shërbyes Identitetesh", "Find others by phone or email": "Gjeni të tjerë përmes telefoni ose email-i", "Be found by phone or email": "Bëhuni i gjetshëm përmes telefoni ose email-i", "Use bots, bridges, widgets and sticker packs": "Përdorni robotë, ura, widget-e dhe paketa ngjitësish", @@ -1415,13 +1415,13 @@ "You cannot sign in to your account. Please contact your homeserver admin for more information.": "S’mund të bëni hyrjen në llogarinë tuaj. Ju lutemi, për më tepër hollësi, lidhuni me përgjegjësin e shërbyesit tuaj Home.", "Clear personal data": "Spastro të dhëna personale", "Spanner": "Çelës", - "Identity server URL must be HTTPS": "URL-ja e Shërbyesit të Identiteteve duhet të jetë HTTPS", - "Not a valid identity server (status code %(code)s)": "Shërbyes Identitetesh i pavlefshëm (kod gjendjeje %(code)s)", - "Could not connect to identity server": "S’u lidh dot me Shërbyes Identitetesh", + "Identity Server URL must be HTTPS": "URL-ja e Shërbyesit të Identiteteve duhet të jetë HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Shërbyes Identitetesh i pavlefshëm (kod gjendjeje %(code)s)", + "Could not connect to Identity Server": "S’u lidh dot me Shërbyes Identitetesh", "Checking server": "Po kontrollohet shërbyesi", "Disconnect from the identity server ?": "Të shkëputet prej shërbyesit të identiteteve ?", "Disconnect": "Shkëputu", - "Identity server (%(server)s)": "Shërbyes Identitetesh (%(server)s)", + "Identity Server (%(server)s)": "Shërbyes Identitetesh (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Jeni duke përdorur për të zbuluar dhe për t’u zbuluar nga kontakte ekzistues që njihni. Shërbyesin tuaj të identiteteve mund ta ndryshoni më poshtë.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "S’po përdorni ndonjë shërbyes identitetesh. Që të zbuloni dhe të jeni i zbulueshëm nga kontakte ekzistues që njihni, shtoni një të tillë më poshtë.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Shkëputja prej shërbyesit tuaj të identiteteve do të thotë se s’do të jeni i zbulueshëm nga përdorues të tjerë dhe s’do të jeni në gjendje të ftoni të tjerë përmes email-i apo telefoni.", @@ -1439,7 +1439,7 @@ "Only continue if you trust the owner of the server.": "Vazhdoni vetëm nëse i besoni të zotit të shërbyesit.", "Terms of service not accepted or the identity server is invalid.": "S’janë pranuar kushtet e shërbimit ose shërbyesi i identiteteve është i pavlefshëm.", "Enter a new identity server": "Jepni një shërbyes të ri identitetesh", - "Integration manager": "Përgjegjës Integrimesh", + "Integration Manager": "Përgjegjës Integrimesh", "Remove %(email)s?": "Të hiqet %(email)s?", "Remove %(phone)s?": "Të hiqet %(phone)s?", "You do not have the required permissions to use this command.": "S’keni lejet e domosdoshme për përdorimin e këtij urdhri.", @@ -1636,7 +1636,7 @@ "%(brand)s URL": "URL %(brand)s-i", "Room ID": "ID dhome", "Widget ID": "ID widget-i", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", "Using this widget may share data with %(widgetDomain)s.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s.", "Widget added by": "Widget i shtuar nga", "This widget may use cookies.": "Ky widget mund të përdorë cookies.", @@ -1644,17 +1644,17 @@ "Connecting to integration manager...": "Po lidhet me përgjegjës integrimesh…", "Cannot connect to integration manager": "S’lidhet dot te përgjegjës integrimesh", "The integration manager is offline or it cannot reach your homeserver.": "Përgjegjësi i integrimeve s’është në linjë ose s’kap dot shërbyesin tuaj Home.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh (%(serverName)s) që të administroni robotë, widget-e dhe paketa ngjitësish.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh që të administroni robotë, widget-e dhe paketa ngjitësish.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh (%(serverName)s) që të administroni robotë, widget-e dhe paketa ngjitësish.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Përdorni një Përgjegjës Integrimesh që të administroni robotë, widget-e dhe paketa ngjitësish.", "Manage integrations": "Administroni integrime", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Përgjegjësit e Integrimeve marrin të dhëna formësimi, dhe mund të ndryshojnë widget-e, të dërgojnë ftesa dhome, dhe të caktojnë shkallë pushteti në emër tuajin.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Përgjegjësit e Integrimeve marrin të dhëna formësimi, dhe mund të ndryshojnë widget-e, të dërgojnë ftesa dhome, dhe të caktojnë shkallë pushteti në emër tuajin.", "Failed to connect to integration manager": "S’u arrit të lidhet te përgjegjës integrimesh", "Widgets do not use message encryption.": "Widget-et s’përdorin fshehtëzim mesazhesh.", "More options": "Më tepër mundësi", "Integrations are disabled": "Integrimet janë të çaktivizuara", "Enable 'Manage Integrations' in Settings to do this.": "Që të bëhet kjo, aktivizoni “Administroni Integrime”, te Rregullimet.", "Integrations not allowed": "Integrimet s’lejohen", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "%(brand)s-i juah nuk ju lejon të përdorni një Përgjegjës Integrimesh për të bërë këtë. Ju lutemi, lidhuni me përgjegjësin.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-i juah nuk ju lejon të përdorni një Përgjegjës Integrimesh për të bërë këtë. Ju lutemi, lidhuni me përgjegjësin.", "Reload": "Ringarkoje", "Take picture": "Bëni një foto", "Remove for everyone": "Hiqe për këdo", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 03bfc42784..49f87321f7 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -589,7 +589,7 @@ "Access Token:": "Приступни жетон:", "click to reveal": "кликни за приказ", "Homeserver is": "Домаћи сервер је", - "Identity server is": "Идентитетски сервер је", + "Identity Server is": "Идентитетски сервер је", "%(brand)s version:": "%(brand)s издање:", "olm version:": "olm издање:", "Failed to send email": "Нисам успео да пошаљем мејл", @@ -846,7 +846,7 @@ "Find other public servers or use a custom server": "Пронађите друге јавне сервере или користите прилагођени сервер", "Other servers": "Други сервери", "Homeserver URL": "Адреса кућног сервера", - "Identity server URL": "Адреса идентитетског сервера", + "Identity Server URL": "Адреса идентитетског сервера", "Next": "Следеће", "Sign in instead": "Пријава са постојећим налогом", "Create your account": "Направите ваш налог", @@ -1700,7 +1700,7 @@ "This widget may use cookies.": "Овај виџет може користити колачиће.", "Widget added by": "Додао је виџет", "Using this widget may share data with %(widgetDomain)s.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s и вашим интеграционим менаџером.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Коришћење овог виџета може да дели податке са %(widgetDomain)s и вашим интеграционим менаџером.", "Widget ID": "ИД виџета", "Room ID": "ИД собе", "%(brand)s URL": "%(brand)s УРЛ", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 7ff1467d7b..6033b561bd 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -115,7 +115,7 @@ "Historical": "Historiska", "Home": "Hem", "Homeserver is": "Hemservern är", - "Identity server is": "Identitetsservern är", + "Identity Server is": "Identitetsservern är", "I have verified my email address": "Jag har verifierat min e-postadress", "Import": "Importera", "Import E2E room keys": "Importera rumskrypteringsnycklar", @@ -1057,7 +1057,7 @@ "Confirm": "Bekräfta", "Other servers": "Andra servrar", "Homeserver URL": "Hemserver-URL", - "Identity server URL": "Identitetsserver-URL", + "Identity Server URL": "Identitetsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Gå med miljontals användare gratis på den största publika servern", "Premium": "Premium", @@ -1242,9 +1242,9 @@ "Accept to continue:": "Acceptera för att fortsätta:", "ID": "ID", "Public Name": "Offentligt namn", - "Identity server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS", - "Not a valid identity server (status code %(code)s)": "Inte en giltig identitetsserver (statuskod %(code)s)", - "Could not connect to identity server": "Kunde inte ansluta till identitetsservern", + "Identity Server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Inte en giltig identitetsserver (statuskod %(code)s)", + "Could not connect to Identity Server": "Kunde inte ansluta till identitetsservern", "Checking server": "Kontrollerar servern", "Change identity server": "Byt identitetsserver", "Disconnect from the identity server and connect to instead?": "Koppla ifrån från identitetsservern och anslut till istället?", @@ -1255,16 +1255,16 @@ "You are still sharing your personal data on the identity server .": "Du delar fortfarande dina personuppgifter på identitetsservern .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Vi rekommenderar att du tar bort dina e-postadresser och telefonnummer från identitetsservern innan du kopplar från.", "Disconnect anyway": "Koppla ifrån ändå", - "Identity server (%(server)s)": "Identitetsserver (%(server)s)", + "Identity Server (%(server)s)": "Identitetsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Du använder för närvarande för att upptäcka och upptäckas av befintliga kontakter som du känner. Du kan byta din identitetsserver nedan.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Om du inte vill använda för att upptäcka och upptäckas av befintliga kontakter som du känner, ange en annan identitetsserver nedan.", - "Identity server": "Identitetsserver", + "Identity Server": "Identitetsserver", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Du använder för närvarande inte en identitetsserver. Lägg till en nedan om du vill upptäcka och bli upptäckbar av befintliga kontakter som du känner.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att koppla ifrån din identitetsserver betyder att du inte kan upptäckas av andra användare och att du inte kommer att kunna bjuda in andra via e-post eller telefon.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att använda en identitetsserver är valfritt. Om du väljer att inte använda en identitetsserver kan du inte upptäckas av andra användare och inte heller bjuda in andra via e-post eller telefon.", "Do not use an identity server": "Använd inte en identitetsserver", "Enter a new identity server": "Ange en ny identitetsserver", - "Integration manager": "Integrationshanterare", + "Integration Manager": "Integrationshanterare", "Discovery": "Upptäckt", "Deactivate account": "Inaktivera konto", "Always show the window menu bar": "Visa alltid fönstermenyn", @@ -1354,10 +1354,10 @@ "Connecting to integration manager...": "Ansluter till integrationshanterare…", "Cannot connect to integration manager": "Kan inte ansluta till integrationshanteraren", "The integration manager is offline or it cannot reach your homeserver.": "Integrationshanteraren är offline eller kan inte nå din hemserver.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare (%(serverName)s) för att hantera bottar, widgets och dekalpaket.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare för att hantera bottar, widgets och dekalpaket.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare (%(serverName)s) för att hantera bottar, widgets och dekalpaket.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare för att hantera bottar, widgets och dekalpaket.", "Manage integrations": "Hantera integrationer", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationshanterare får konfigurationsdata och kan ändra widgetar, skicka rumsinbjudningar och ställa in behörighetsnivåer å dina vägnar.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationshanterare får konfigurationsdata och kan ändra widgetar, skicka rumsinbjudningar och ställa in behörighetsnivåer å dina vägnar.", "Close preview": "Stäng förhandsgranskning", "Room %(name)s": "Rum %(name)s", "Recent rooms": "Senaste rummen", @@ -1410,7 +1410,7 @@ "%(brand)s URL": "%(brand)s-URL", "Room ID": "Rums-ID", "Widget ID": "Widget-ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Att använda denna widget kan dela data med %(widgetDomain)s och din integrationshanterare.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Att använda denna widget kan dela data med %(widgetDomain)s och din integrationshanterare.", "Using this widget may share data with %(widgetDomain)s.": "Att använda denna widget kan dela data med %(widgetDomain)s.", "Widgets do not use message encryption.": "Widgets använder inte meddelandekryptering.", "Widget added by": "Widget tillagd av", @@ -1441,7 +1441,7 @@ "Integrations are disabled": "Integrationer är inaktiverade", "Enable 'Manage Integrations' in Settings to do this.": "Aktivera \"Hantera integrationer\" i inställningarna för att göra detta.", "Integrations not allowed": "Integrationer är inte tillåtna", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Din %(brand)s tillåter dig inte att använda en integrationshanterare för att göra detta. Vänligen kontakta en administratör.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Din %(brand)s tillåter dig inte att använda en integrationshanterare för att göra detta. Vänligen kontakta en administratör.", "Your homeserver doesn't seem to support this feature.": "Din hemserver verkar inte stödja den här funktionen.", "Message edits": "Meddelanderedigeringar", "Preview": "Förhandsgranska", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 4a1afc1c05..16a9e521c2 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -106,7 +106,7 @@ "Hangup": "วางสาย", "Historical": "ประวัติแชทเก่า", "Homeserver is": "เซิร์ฟเวอร์บ้านคือ", - "Identity server is": "เซิร์ฟเวอร์ระบุตัวตนคือ", + "Identity Server is": "เซิร์ฟเวอร์ระบุตัวตนคือ", "I have verified my email address": "ฉันยืนยันที่อยู่อีเมลแล้ว", "Import": "นำเข้า", "Incorrect username and/or password.": "ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index fcb4c499a1..c5316ee2df 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -115,7 +115,7 @@ "Historical": "Tarihi", "Home": "Ev", "Homeserver is": "Ana Sunucusu", - "Identity server is": "Kimlik Sunucusu", + "Identity Server is": "Kimlik Sunucusu", "I have verified my email address": "E-posta adresimi doğruladım", "Import": "İçe Aktar", "Import E2E room keys": "Uçtan uca Oda Anahtarlarını İçe Aktar", @@ -661,7 +661,7 @@ "COPY": "KOPYA", "Command Help": "Komut Yardımı", "Missing session data": "Kayıp oturum verisi", - "Integration manager": "Bütünleştirme Yöneticisi", + "Integration Manager": "Bütünleştirme Yöneticisi", "Find others by phone or email": "Kişileri telefon yada e-posta ile bul", "Be found by phone or email": "Telefon veya e-posta ile bulunun", "Terms of Service": "Hizmet Şartları", @@ -723,7 +723,7 @@ "Create your Matrix account on %(serverName)s": "%(serverName)s üzerinde Matrix hesabınızı oluşturun", "Create your Matrix account on ": " üzerinde Matrix hesabınızı oluşturun", "Homeserver URL": "Ana sunucu URL", - "Identity server URL": "Kimlik Sunucu URL", + "Identity Server URL": "Kimlik Sunucu URL", "Other servers": "Diğer sunucular", "Couldn't load page": "Sayfa yüklenemiyor", "Add a Room": "Bir Oda Ekle", @@ -885,7 +885,7 @@ "Show message in desktop notification": "Masaüstü bildiriminde mesaj göster", "Display Name": "Ekran Adı", "Profile picture": "Profil resmi", - "Could not connect to identity server": "Kimlik Sunucusuna bağlanılamadı", + "Could not connect to Identity Server": "Kimlik Sunucusuna bağlanılamadı", "Checking server": "Sunucu kontrol ediliyor", "Change identity server": "Kimlik sunucu değiştir", "Sorry, your homeserver is too old to participate in this room.": "Üzgünüm, ana sunucunuz bu odaya katılabilmek için oldukça eski.", @@ -940,8 +940,8 @@ "wait and try again later": "bekle ve tekrar dene", "Disconnect anyway": "Yinede bağlantıyı kes", "Go back": "Geri dön", - "Identity server (%(server)s)": "(%(server)s) Kimlik Sunucusu", - "Identity server": "Kimlik Sunucusu", + "Identity Server (%(server)s)": "(%(server)s) Kimlik Sunucusu", + "Identity Server": "Kimlik Sunucusu", "Do not use an identity server": "Bir kimlik sunucu kullanma", "Enter a new identity server": "Yeni bir kimlik sunucu gir", "Change": "Değiştir", @@ -1046,8 +1046,8 @@ "Backup has a valid signature from this user": "Yedek bu kullanıcıdan geçerli anahtara sahip", "Backup has a invalid signature from this user": "Yedek bu kullanıcıdan geçersiz bir anahtara sahip", "Add an email address to configure email notifications": "E-posta bildirimlerini yapılandırmak için bir e-posta adresi ekleyin", - "Identity server URL must be HTTPS": "Kimlik Sunucu URL adresi HTTPS olmak zorunda", - "Not a valid identity server (status code %(code)s)": "Geçerli bir Kimlik Sunucu değil ( durum kodu %(code)s )", + "Identity Server URL must be HTTPS": "Kimlik Sunucu URL adresi HTTPS olmak zorunda", + "Not a valid Identity Server (status code %(code)s)": "Geçerli bir Kimlik Sunucu değil ( durum kodu %(code)s )", "Terms of service not accepted or the identity server is invalid.": "Hizmet şartları kabuk edilmedi yada kimlik sunucu geçersiz.", "The identity server you have chosen does not have any terms of service.": "Seçtiğiniz kimlik sunucu herhangi bir hizmet şartları sözleşmesine sahip değil.", "Disconnect identity server": "Kimlik sunucu bağlantısını kes", @@ -1432,7 +1432,7 @@ "Backup key stored: ": "Yedek anahtarı depolandı: ", "Enable desktop notifications for this session": "Bu oturum için masaüstü bildirimlerini aç", "Upgrade to your own domain": "Kendi etkinlik alanınızı yükseltin", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Botları, görsel bileşenleri ve çıkartma paketlerini yönetmek için bir entegrasyon yöneticisi kullanın.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Botları, görsel bileşenleri ve çıkartma paketlerini yönetmek için bir entegrasyon yöneticisi kullanın.", "Session ID:": "Oturum ID:", "Session key:": "Oturum anahtarı:", "This user has not verified all of their sessions.": "Bu kullanıcı bütün oturumlarında doğrulanmamış.", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 70b000ad07..92da704837 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -817,7 +817,7 @@ "Versions": "Версії", "%(brand)s version:": "версія %(brand)s:", "olm version:": "Версія olm:", - "Identity server is": "Сервер ідентифікації", + "Identity Server is": "Сервер ідентифікації", "Labs": "Лабораторія", "Customise your experience with experimental labs features. Learn more.": "Спробуйте експериментальні можливості. Більше.", "Ignored/Blocked": "Ігноровані/Заблоковані", @@ -998,8 +998,8 @@ "Disconnect": "Відключити", "You should:": "Вам варто:", "Disconnect anyway": "Відключити в будь-якому випадку", - "Identity server (%(server)s)": "Сервер ідентифікації (%(server)s)", - "Identity server": "Сервер ідентифікації", + "Identity Server (%(server)s)": "Сервер ідентифікації (%(server)s)", + "Identity Server": "Сервер ідентифікації", "Do not use an identity server": "Не використовувати сервер ідентифікації", "Enter a new identity server": "Введіть новий сервер ідентифікації", "Change": "Змінити", @@ -1194,9 +1194,9 @@ "The integration manager is offline or it cannot reach your homeserver.": "Менеджер інтеграцій непід'єднаний або не може досягти вашого домашнього сервера.", "Enable desktop notifications for this session": "Увімкнути стільничні сповіщення для цього сеансу", "Profile picture": "Зображення профілю", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, знадобами та паками наліпок.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, знадобами та паками наліпок.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", "Show %(count)s more|other": "Показати ще %(count)s", "Show %(count)s more|one": "Показати ще %(count)s", "Failed to connect to integration manager": "Не вдалось з'єднатись з менеджером інтеграцій", @@ -1207,10 +1207,10 @@ "Filter community members": "Відфільтрувати учасників спільноти", "Filter community rooms": "Відфільтрувати кімнати спільноти", "Display your community flair in rooms configured to show it.": "Відбивати ваш спільнотний значок у кімнатах, що налаштовані показувати його.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", "Show advanced": "Показати розширені", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам використовувати для цього менеджер інтеграцій. Зверніться, будь ласка, до адміністратора.", - "Integration manager": "Менеджер інтеграцій", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам використовувати для цього менеджер інтеграцій. Зверніться, будь ласка, до адміністратора.", + "Integration Manager": "Менеджер інтеграцій", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Ваша спільнота не має великого опису (HTML-сторінки, показуваної членам спільноти).
Клацніть тут щоб відкрити налаштування й створити цей опис!", "Review terms and conditions": "Переглянути умови користування", "Old cryptography data detected": "Виявлено старі криптографічні дані", diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index a521ccdc44..75ab903ebe 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -482,7 +482,7 @@ "%(brand)s version:": "%(brand)s-versie:", "olm version:": "olm-versie:", "Homeserver is": "Thuusserver es", - "Identity server is": "Identiteitsserver es", + "Identity Server is": "Identiteitsserver es", "Access Token:": "Toegangstoken:", "click to reveal": "klikt vo te toogn", "Labs": "Experimenteel", @@ -1129,7 +1129,7 @@ "Create your Matrix account on ": "Mak je Matrix-account an ip ", "Other servers": "Andere servers", "Homeserver URL": "Thuusserver-URL", - "Identity server URL": "Identiteitsserver-URL", + "Identity Server URL": "Identiteitsserver-URL", "Free": "Gratis", "Join millions for free on the largest public server": "Doe mee me miljoenen anderen ip de grotste publieke server", "Premium": "Premium", @@ -1389,7 +1389,7 @@ "Resend removal": "Verwyderienge herverstuurn", "Failed to re-authenticate due to a homeserver problem": "’t Heranmeldn is mislukt omwille van e probleem me de thuusserver", "Failed to re-authenticate": "’t Heranmeldn is mislukt", - "Identity server": "Identiteitsserver", + "Identity Server": "Identiteitsserver", "Find others by phone or email": "Viendt andere menschn via hunder telefongnumero of e-mailadresse", "Be found by phone or email": "Wor gevoundn via je telefongnumero of e-mailadresse", "Use bots, bridges, widgets and sticker packs": "Gebruukt robottn, bruggn, widgets en stickerpakkettn", @@ -1406,17 +1406,17 @@ "Messages": "Berichtn", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toogt e lyste van beschikboare ipdrachtn, met hunder gebruukn en beschryviengn", - "Identity server URL must be HTTPS": "Den identiteitsserver-URL moet HTTPS zyn", - "Not a valid identity server (status code %(code)s)": "Geen geldigen identiteitsserver (statuscode %(code)s)", - "Could not connect to identity server": "Kostege geen verbindienge moakn me den identiteitsserver", + "Identity Server URL must be HTTPS": "Den identiteitsserver-URL moet HTTPS zyn", + "Not a valid Identity Server (status code %(code)s)": "Geen geldigen identiteitsserver (statuscode %(code)s)", + "Could not connect to Identity Server": "Kostege geen verbindienge moakn me den identiteitsserver", "Checking server": "Server wor gecontroleerd", "Disconnect from the identity server ?": "Wil je de verbindienge me den identiteitsserver verbreekn?", "Disconnect": "Verbindienge verbreekn", - "Identity server (%(server)s)": "Identiteitsserver (%(server)s)", + "Identity Server (%(server)s)": "Identiteitsserver (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Je makt vo de moment gebruuk van vo deur je contactn gevoundn te kunn wordn, en von hunder te kunn viendn. Je kut hierounder jen identiteitsserver wyzign.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Je makt vo de moment geen gebruuk van een identiteitsserver. Voegt der hierounder één toe vo deur je contactn gevoundn te kunn wordn en von hunder te kunn viendn.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "De verbindienge me jen identiteitsserver verbreekn goat dervoorn zorgn da je nie mi deur andere gebruukers gevoundn goa kunn wordn, en dat andere menschn je nie via e-mail of telefong goan kunn uutnodign.", - "Integration manager": "Integroasjebeheerder", + "Integration Manager": "Integroasjebeheerder", "Discovery": "Ountdekkienge", "Deactivate account": "Account deactiveern", "Always show the window menu bar": "De veinstermenubalk alsan toogn", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 27f1f57e43..7aa0d75539 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -44,7 +44,7 @@ "Hangup": "挂断", "Historical": "历史", "Homeserver is": "主服务器是", - "Identity server is": "身份认证服务器是", + "Identity Server is": "身份认证服务器是", "I have verified my email address": "我已经验证了我的邮箱地址", "Import E2E room keys": "导入聊天室端到端加密密钥", "Incorrect verification code": "验证码错误", @@ -1154,7 +1154,7 @@ "Confirm": "确认", "Other servers": "其他服务器", "Homeserver URL": "主服务器网址", - "Identity server URL": "身份服务器网址", + "Identity Server URL": "身份服务器网址", "Free": "免费", "Join millions for free on the largest public server": "免费加入最大的公共服务器,成为数百万用户中的一员", "Premium": "高级", @@ -1542,9 +1542,9 @@ "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "你可能在非 %(brand)s 的客户端里配置了它们。你在 %(brand)s 里无法修改它们,但它们仍然适用。", "Enable desktop notifications for this session": "为此会话启用桌面通知", "Enable audible notifications for this session": "为此会话启用声音通知", - "Identity server URL must be HTTPS": "身份服务器连接必须是 HTTPS", - "Not a valid identity server (status code %(code)s)": "不是有效的身份服务器(状态码 %(code)s)", - "Could not connect to identity server": "无法连接到身份服务器", + "Identity Server URL must be HTTPS": "身份服务器连接必须是 HTTPS", + "Not a valid Identity Server (status code %(code)s)": "不是有效的身份服务器(状态码 %(code)s)", + "Could not connect to Identity Server": "无法连接到身份服务器", "Checking server": "检查服务器", "Change identity server": "更改身份服务器", "Disconnect from the identity server and connect to instead?": "从 身份服务器断开连接并连接到 吗?", @@ -1560,11 +1560,11 @@ "Disconnect anyway": "仍然断开连接", "You are still sharing your personal data on the identity server .": "你仍然在分享你的个人信息在身份服务器上。", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "我们推荐你在断开连接前从身份服务器上删除你的邮箱地址和电话号码。", - "Identity server (%(server)s)": "身份服务器(%(server)s)", + "Identity Server (%(server)s)": "身份服务器(%(server)s)", "not stored": "未存储", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "你正在使用 以发现你认识的现存联系人并被其发现。你可以在下方更改你的身份服务器。", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "如果你不想使用 以发现你认识的现存联系人并被其发现,请在下方输入另一个身份服务器。", - "Identity server": "身份服务器", + "Identity Server": "身份服务器", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "你现在没有使用身份服务器。若想发现你认识的现存联系人并被其发现,请在下方添加一个身份服务器。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "断开身份服务器连接意味着你将无法被其他用户发现,同时你也将无法使用电子邮件或电话邀请别人。", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "使用身份服务器是可选的。如果你选择不使用身份服务器,你将不能被别的用户发现,也不能用邮箱或电话邀请别人。", @@ -1686,10 +1686,10 @@ "Cannot connect to integration manager": "不能连接到集成管理器", "The integration manager is offline or it cannot reach your homeserver.": "此集成管理器为离线状态或者其不能访问你的主服务器。", "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "检查你的浏览器是否安装有可能屏蔽身份服务器的插件(例如 Privacy Badger)", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用集成管理器 (%(serverName)s) 以管理机器人、挂件和贴纸包。", - "Use an integration manager to manage bots, widgets, and sticker packs.": "使用集成管理器以管理机器人、挂件和贴纸包。", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用集成管理器 (%(serverName)s) 以管理机器人、挂件和贴纸包。", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "使用集成管理器以管理机器人、挂件和贴纸包。", "Manage integrations": "集成管理", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "集成管理器接收配置数据,并可以以你的名义修改挂件、发送聊天室邀请及设置权限级别。", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "集成管理器接收配置数据,并可以以你的名义修改挂件、发送聊天室邀请及设置权限级别。", "Use between %(min)s pt and %(max)s pt": "请使用介于 %(min)s pt 和 %(max)s pt 之间的大小", "Deactivate account": "停用账号", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "要报告 Matrix 相关的安全问题,请阅读 Matrix.org 的安全公开策略。", @@ -1924,7 +1924,7 @@ "%(brand)s URL": "%(brand)s 的链接", "Room ID": "聊天室 ID", "Widget ID": "挂件 ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "使用此挂件可能会和 %(widgetDomain)s 及你的集成管理器共享数据 。", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "使用此挂件可能会和 %(widgetDomain)s 及你的集成管理器共享数据 。", "Using this widget may share data with %(widgetDomain)s.": "使用此挂件可能会和 %(widgetDomain)s 共享数据 。", "Widgets do not use message encryption.": "挂件不适用消息加密。", "This widget may use cookies.": "此挂件可能使用 cookie。", @@ -1997,7 +1997,7 @@ "Integrations are disabled": "集成已禁用", "Enable 'Manage Integrations' in Settings to do this.": "在设置中启用「管理管理」以执行此操作。", "Integrations not allowed": "集成未被允许", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "你的 %(brand)s 不允许你使用集成管理器来完成此操作。请联系管理员。", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "你的 %(brand)s 不允许你使用集成管理器来完成此操作。请联系管理员。", "To continue, use Single Sign On to prove your identity.": "要继续,请使用单点登录证明你的身份。", "Confirm to continue": "确认以继续", "Click the button below to confirm your identity.": "点击下方按钮确认你的身份。", @@ -2074,7 +2074,7 @@ "Missing session data": "缺失会话数据", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "一些会话数据,包括加密消息密钥,已缺失。要修复此问题,登出并重新登录,然后从备份恢复密钥。", "Your browser likely removed this data when running low on disk space.": "你的浏览器可能在磁盘空间不足时删除了此数据。", - "Integration manager": "集成管理器", + "Integration Manager": "集成管理器", "Find others by phone or email": "通过电话或邮箱寻找别人", "Be found by phone or email": "通过电话或邮箱被寻找", "Use bots, bridges, widgets and sticker packs": "使用机器人、桥接、挂件和贴纸包", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 74dbba8d26..d9429fc1c3 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -70,7 +70,7 @@ "Hangup": "掛斷", "Historical": "歷史", "Homeserver is": "主伺服器是", - "Identity server is": "身分認證伺服器是", + "Identity Server is": "身分認證伺服器是", "I have verified my email address": "我已經驗證了我的電子郵件地址", "Import E2E room keys": "導入聊天室端對端加密密鑰", "Incorrect verification code": "驗證碼錯誤", @@ -1066,7 +1066,7 @@ "Confirm": "確認", "Other servers": "其他伺服器", "Homeserver URL": "家伺服器 URL", - "Identity server URL": "識別伺服器 URL", + "Identity Server URL": "識別伺服器 URL", "Free": "免費", "Join millions for free on the largest public server": "在最大的公開伺服器上免費加入數百萬人", "Premium": "專業", @@ -1393,7 +1393,7 @@ "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "請告訴我們發生了什麼錯誤,或更好的是,在 GitHub 上建立描述問題的議題。", "Sign in and regain access to your account.": "登入並取回對您帳號的控制權。", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "您無法登入到您的帳號。請聯絡您的家伺服器管理員以取得更多資訊。", - "Identity server": "身份識別伺服器", + "Identity Server": "身份識別伺服器", "Find others by phone or email": "透過電話或電子郵件尋找其他人", "Be found by phone or email": "透過電話或電子郵件找到", "Use bots, bridges, widgets and sticker packs": "使用機器人、橋接、小工具與貼紙包", @@ -1419,17 +1419,17 @@ "Please enter verification code sent via text.": "請輸入透過文字傳送的驗證碼。", "Discovery options will appear once you have added a phone number above.": "當您在上面加入電話號碼時將會出現探索選項。", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "文字訊息將會被傳送到 +%(msisdn)s。請輸入其中包含的驗證碼。", - "Identity server URL must be HTTPS": "身份識別伺服器 URL 必須為 HTTPS", - "Not a valid identity server (status code %(code)s)": "不是有效的身份識別伺服器(狀態碼 %(code)s)", - "Could not connect to identity server": "無法連線至身份識別伺服器", + "Identity Server URL must be HTTPS": "身份識別伺服器 URL 必須為 HTTPS", + "Not a valid Identity Server (status code %(code)s)": "不是有效的身份識別伺服器(狀態碼 %(code)s)", + "Could not connect to Identity Server": "無法連線至身份識別伺服器", "Checking server": "正在檢查伺服器", "Disconnect from the identity server ?": "從身份識別伺服器 斷開連線?", "Disconnect": "斷開連線", - "Identity server (%(server)s)": "身份識別伺服器 (%(server)s)", + "Identity Server (%(server)s)": "身份識別伺服器 (%(server)s)", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "您目前正在使用 來探索以及被您所知既有的聯絡人探索。您可以在下方變更身份識別伺服器。", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "您目前並未使用身份識別伺服器。要探索及被您所知既有的聯絡人探索,請在下方新增一個。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "從您的身份識別伺服器斷開連線代表您不再能被其他使用者探索到,而且您也不能透過電子郵件或電話邀請其他人。", - "Integration manager": "整合管理員", + "Integration Manager": "整合管理員", "Call failed due to misconfigured server": "因為伺服器設定錯誤,所以通話失敗", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "請詢問您家伺服器的管理員(%(homeserverDomain)s)以設定 TURN 伺服器讓通話可以正常運作。", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "或是您也可以試著使用公開伺服器 turn.matrix.org,但可能不夠可靠,而且會跟該伺服器分享您的 IP 位置。您也可以在設定中管理這個。", @@ -1638,23 +1638,23 @@ "%(brand)s URL": "%(brand)s URL", "Room ID": "聊天室 ID", "Widget ID": "小工具 ID", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "使用這個小工具可能會與 %(widgetDomain)s 以及您的整合管理員分享資料 。", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "使用這個小工具可能會與 %(widgetDomain)s 以及您的整合管理員分享資料 。", "Using this widget may share data with %(widgetDomain)s.": "使用這個小工具可能會與 %(widgetDomain)s 分享資料 。", "Widget added by": "小工具新增由", "This widget may use cookies.": "這個小工具可能會使用 cookies。", "Connecting to integration manager...": "正在連線到整合管理員……", "Cannot connect to integration manager": "無法連線到整合管理員", "The integration manager is offline or it cannot reach your homeserver.": "整合管理員已離線或無法存取您的家伺服器。", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用整合管理員 (%(serverName)s) 以管理機器人、小工具與貼紙包。", - "Use an integration manager to manage bots, widgets, and sticker packs.": "使用整合管理員以管理機器人、小工具與貼紙包。", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "整合管理員接收設定資料,並可以修改小工具、傳送聊天室邀請並設定權限等級。", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "使用整合管理員 (%(serverName)s) 以管理機器人、小工具與貼紙包。", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "使用整合管理員以管理機器人、小工具與貼紙包。", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "整合管理員接收設定資料,並可以修改小工具、傳送聊天室邀請並設定權限等級。", "Failed to connect to integration manager": "連線到整合管理員失敗", "Widgets do not use message encryption.": "小工具不使用訊息加密。", "More options": "更多選項", "Integrations are disabled": "整合已停用", "Enable 'Manage Integrations' in Settings to do this.": "在設定中啟用「管理整合」以執行此動作。", "Integrations not allowed": "不允許整合", - "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "您的 %(brand)s 不允許您使用整合管理員來執行此動作。請聯絡管理員。", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "您的 %(brand)s 不允許您使用整合管理員來執行此動作。請聯絡管理員。", "Reload": "重新載入", "Take picture": "拍照", "Remove for everyone": "對所有人移除", From 9b6495903cb25f3f32051948af2061bf27b8c6b6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 13 Jul 2021 18:35:56 -0600 Subject: [PATCH 087/135] Use TileShape enum more universally --- src/components/views/elements/ReplyThread.js | 6 ++--- src/components/views/messages/MFileBody.js | 5 +++-- src/components/views/messages/MessageEvent.js | 2 +- src/components/views/rooms/EventTile.tsx | 22 +++++++++++-------- src/components/views/rooms/ReplyPreview.js | 5 +++-- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 2047de6c58..4dcdf70845 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -1,7 +1,6 @@ /* -Copyright 2017 New Vector Ltd +Copyright 2017 - 2021 The Matrix.org Foundation C.I.C. Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> -Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,6 +31,7 @@ import sanitizeHtml from "sanitize-html"; import { UIFeature } from "../../../settings/UIFeature"; import { PERMITTED_URL_SCHEMES } from "../../../HtmlUtils"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { TileShape } from "../rooms/EventTile"; // This component does no cycle detection, simply because the only way to make such a cycle would be to // craft event_id's, using a homeserver that generates predictable event IDs; even then the impact would @@ -384,7 +384,7 @@ export default class ReplyThread extends React.Component { { dateSep } {placeholder} diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index 52a0b9ad08..4168744d42 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -42,7 +42,7 @@ export default class MessageEvent extends React.Component { onHeightChanged: PropTypes.func, /* the shape of the tile, used */ - tileShape: PropTypes.string, + tileShape: PropTypes.string, // TODO: Use TileShape enum /* the maximum image height to use, if the event is an image */ maxImageHeight: PropTypes.number, diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 7cceef4a86..1deb1c6a14 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -902,7 +902,7 @@ export default class EventTile extends React.Component { mx_EventTile_12hr: this.props.isTwelveHour, // Note: we keep the `sending` state class for tests, not for our styles mx_EventTile_sending: !isEditing && isSending, - mx_EventTile_highlight: this.props.tileShape === 'notif' ? false : this.shouldHighlight(), + mx_EventTile_highlight: this.props.tileShape === TileShape.Notif ? false : this.shouldHighlight(), mx_EventTile_selected: this.props.isSelectedEvent, mx_EventTile_continuation: this.props.tileShape ? '' : this.props.continuation, mx_EventTile_last: this.props.last, @@ -935,7 +935,7 @@ export default class EventTile extends React.Component { let avatarSize; let needsSenderProfile; - if (this.props.tileShape === "notif") { + if (this.props.tileShape === TileShape.Notif) { avatarSize = 24; needsSenderProfile = true; } else if (tileHandler === 'messages.RoomCreate' || isBubbleMessage) { @@ -949,7 +949,7 @@ export default class EventTile extends React.Component { } else if (this.props.layout == Layout.IRC) { avatarSize = 14; needsSenderProfile = true; - } else if (this.props.continuation && this.props.tileShape !== "file_grid") { + } else if (this.props.continuation && this.props.tileShape !== TileShape.FileGrid) { // no avatar or sender profile for continuation messages avatarSize = 0; needsSenderProfile = false; @@ -979,7 +979,11 @@ export default class EventTile extends React.Component { } if (needsSenderProfile) { - if (!this.props.tileShape || this.props.tileShape === 'reply' || this.props.tileShape === 'reply_preview') { + if ( + !this.props.tileShape + || this.props.tileShape === TileShape.Reply + || this.props.tileShape === TileShape.ReplyPreview + ) { sender = { } switch (this.props.tileShape) { - case 'notif': { + case TileShape.Notif: { const room = this.context.getRoom(this.props.mxEvent.getRoomId()); return React.createElement(this.props.as || "li", { "className": classes, @@ -1097,7 +1101,7 @@ export default class EventTile extends React.Component {
, ]); } - case 'file_grid': { + case TileShape.FileGrid: { return React.createElement(this.props.as || "li", { "className": classes, "aria-live": ariaLive, @@ -1128,10 +1132,10 @@ export default class EventTile extends React.Component { ]); } - case 'reply': - case 'reply_preview': { + case TileShape.Reply: + case TileShape.ReplyPreview: { let thread; - if (this.props.tileShape === 'reply_preview') { + if (this.props.tileShape === TileShape.ReplyPreview) { thread = ReplyThread.makeThread( this.props.mxEvent, this.props.onHeightChanged, diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index f9c8e622a7..e1e5a0a846 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -1,5 +1,5 @@ /* -Copyright 2017 New Vector Ltd +Copyright 2017 - 2021 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import PropTypes from "prop-types"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { UIFeature } from "../../../settings/UIFeature"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { TileShape } from "./EventTile"; function cancelQuoting() { dis.dispatch({ @@ -90,7 +91,7 @@ export default class ReplyPreview extends React.Component {
Date: Tue, 13 Jul 2021 18:51:53 -0600 Subject: [PATCH 088/135] Respect tile shape for voice messages Fixes https://github.com/vector-im/element-web/issues/17608 --- .../views/audio_messages/RecordingPlayback.tsx | 11 +++++++++-- src/components/views/messages/MVoiceMessageBody.tsx | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/views/audio_messages/RecordingPlayback.tsx b/src/components/views/audio_messages/RecordingPlayback.tsx index a0dea1c6db..d976117f3a 100644 --- a/src/components/views/audio_messages/RecordingPlayback.tsx +++ b/src/components/views/audio_messages/RecordingPlayback.tsx @@ -17,15 +17,18 @@ limitations under the License. import { Playback, PlaybackState } from "../../../voice/Playback"; import React, { ReactNode } from "react"; import { UPDATE_EVENT } from "../../../stores/AsyncStore"; -import PlaybackWaveform from "./PlaybackWaveform"; import PlayPauseButton from "./PlayPauseButton"; import PlaybackClock from "./PlaybackClock"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { TileShape } from "../rooms/EventTile"; +import PlaybackWaveform from "./PlaybackWaveform"; interface IProps { // Playback instance to render. Cannot change during component lifecycle: create // an all-new component instead. playback: Playback; + + tileShape?: TileShape; } interface IState { @@ -50,6 +53,10 @@ export default class RecordingPlayback extends React.PureComponent { this.setState({ playbackPhase: ev }); }; @@ -58,7 +65,7 @@ export default class RecordingPlayback extends React.PureComponent - + { this.isWaveformable && }
; } } diff --git a/src/components/views/messages/MVoiceMessageBody.tsx b/src/components/views/messages/MVoiceMessageBody.tsx index 2edd42f2e4..bec224dd2d 100644 --- a/src/components/views/messages/MVoiceMessageBody.tsx +++ b/src/components/views/messages/MVoiceMessageBody.tsx @@ -25,9 +25,11 @@ import { mediaFromContent } from "../../../customisations/Media"; import { decryptFile } from "../../../utils/DecryptFile"; import RecordingPlayback from "../audio_messages/RecordingPlayback"; import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; +import { TileShape } from "../rooms/EventTile"; interface IProps { mxEvent: MatrixEvent; + tileShape?: TileShape; } interface IState { @@ -103,7 +105,7 @@ export default class MVoiceMessageBody extends React.PureComponent - + ); From 49c949248434288265cc52513a66474fa4172160 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 13 Jul 2021 18:52:07 -0600 Subject: [PATCH 089/135] Pass tile shape down to tiles in the notifications panel --- src/components/views/rooms/EventTile.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 7cceef4a86..9142b5910c 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -1093,6 +1093,7 @@ export default class EventTile extends React.Component { highlightLink={this.props.highlightLink} showUrlPreview={this.props.showUrlPreview} onHeightChanged={this.props.onHeightChanged} + tileShape={this.props.tileShape} />
, ]); From 5a75539b9325fe5c412ce5e9d2ff2caacf172aa7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 13 Jul 2021 19:01:55 -0600 Subject: [PATCH 090/135] Introduce a "pinned" tile shape All components which don't understand this shape will fall through to their normal states, as they would for no explicit tile shape. --- src/components/views/audio_messages/RecordingPlayback.tsx | 4 +++- src/components/views/rooms/EventTile.tsx | 1 + src/components/views/rooms/PinnedEventTile.tsx | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/views/audio_messages/RecordingPlayback.tsx b/src/components/views/audio_messages/RecordingPlayback.tsx index d976117f3a..d23be93a7e 100644 --- a/src/components/views/audio_messages/RecordingPlayback.tsx +++ b/src/components/views/audio_messages/RecordingPlayback.tsx @@ -54,7 +54,9 @@ export default class RecordingPlayback extends React.PureComponent { diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 9142b5910c..759f846c59 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -194,6 +194,7 @@ export enum TileShape { FileGrid = "file_grid", Reply = "reply", ReplyPreview = "reply_preview", + Pinned = "pinned", } interface IProps { diff --git a/src/components/views/rooms/PinnedEventTile.tsx b/src/components/views/rooms/PinnedEventTile.tsx index 774dea70c8..0e3396e9b0 100644 --- a/src/components/views/rooms/PinnedEventTile.tsx +++ b/src/components/views/rooms/PinnedEventTile.tsx @@ -29,6 +29,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; +import { TileShape } from "./EventTile"; interface IProps { room: Room; @@ -87,6 +88,7 @@ export default class PinnedEventTile extends React.Component { className="mx_PinnedEventTile_body" maxImageHeight={150} onHeightChanged={() => {}} // we need to give this, apparently + tileShape={TileShape.Pinned} />
From 1f131db216fb1d2ffe196043e7d2e1967803f064 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 13 Jul 2021 19:02:12 -0600 Subject: [PATCH 091/135] Set a max width on waveform-less tiles --- res/css/views/audio_messages/_PlaybackContainer.scss | 4 ++++ src/components/views/audio_messages/RecordingPlayback.tsx | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/res/css/views/audio_messages/_PlaybackContainer.scss b/res/css/views/audio_messages/_PlaybackContainer.scss index fd01864bba..5548f6198e 100644 --- a/res/css/views/audio_messages/_PlaybackContainer.scss +++ b/res/css/views/audio_messages/_PlaybackContainer.scss @@ -49,4 +49,8 @@ limitations under the License. padding-right: 6px; // with the fixed width this ends up as a visual 8px most of the time, as intended. padding-left: 8px; // isolate from recording circle / play control } + + &.mx_VoiceMessagePrimaryContainer_noWaveform { + max-width: 162px; // with all the padding this results in 185px wide + } } diff --git a/src/components/views/audio_messages/RecordingPlayback.tsx b/src/components/views/audio_messages/RecordingPlayback.tsx index d23be93a7e..7d9312f369 100644 --- a/src/components/views/audio_messages/RecordingPlayback.tsx +++ b/src/components/views/audio_messages/RecordingPlayback.tsx @@ -64,7 +64,8 @@ export default class RecordingPlayback extends React.PureComponent + const shapeClass = !this.isWaveformable ? 'mx_VoiceMessagePrimaryContainer_noWaveform' : ''; + return
{ this.isWaveformable && } From 9495ba001c95f6b330c582f7b001358d64f31f8f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 13 Jul 2021 23:17:17 -0600 Subject: [PATCH 092/135] Send clear events to widgets when permitted Fixes https://github.com/vector-im/element-web/issues/17615 --- src/stores/widgets/StopGapWidget.ts | 2 +- src/stores/widgets/StopGapWidgetDriver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/widgets/StopGapWidget.ts b/src/stores/widgets/StopGapWidget.ts index 36791d3dd9..7120647078 100644 --- a/src/stores/widgets/StopGapWidget.ts +++ b/src/stores/widgets/StopGapWidget.ts @@ -415,7 +415,7 @@ export class StopGapWidget extends EventEmitter { private feedEvent(ev: MatrixEvent) { if (!this.messaging) return; - const raw = ev.event as IEvent; + const raw = ev.getClearEvent() as IEvent; this.messaging.feedEvent(raw).catch(e => { console.error("Error sending event to widget: ", e); }); diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index fd064bae61..5de8a0a361 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -164,7 +164,7 @@ export class StopGapWidgetDriver extends WidgetDriver { results.push(ev); } - return results.map(e => e.event); + return results.map(e => e.getClearEvent()); } public async readStateEvents(eventType: string, stateKey: string | undefined, limit: number): Promise { From 9aae33e076443a9f9b38eff7426cb4cdfc59433b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 09:28:37 +0200 Subject: [PATCH 093/135] Use string[] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index c875553a96..cb2815ee6a 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -31,7 +31,7 @@ import { getEventDisplayInfo } from '../../../utils/EventUtils'; interface IProps { mxEvent: MatrixEvent; permalinkCreator?: RoomPermalinkCreator; - highlights?: Array; + highlights?: string[]; highlightLink?: string; onHeightChanged?(): void; } From 74ff85ae305c03e96647620fbc01b8b91bf5a132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 09:52:45 +0200 Subject: [PATCH 094/135] Remove m.sticker since it's not a message type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index cb2815ee6a..41fc61aa7f 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -117,7 +117,6 @@ export default class ReplyTile extends React.PureComponent { [MsgType.Image]: MImageReplyBody, // We don't want a download link for files, just the file name is enough. [MsgType.File]: TextualBody, - "m.sticker": TextualBody, [MsgType.Audio]: TextualBody, [MsgType.Video]: TextualBody, }; From 58dedbeeffdaa090d0ee0deebbac929b7ab2f753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 09:52:56 +0200 Subject: [PATCH 095/135] Add missing type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/utils/EventUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/EventUtils.ts b/src/utils/EventUtils.ts index d69c285e18..849e546485 100644 --- a/src/utils/EventUtils.ts +++ b/src/utils/EventUtils.ts @@ -101,7 +101,7 @@ export function findEditableEvent(room: Room, isForward: boolean, fromEventId: s export function getEventDisplayInfo(mxEvent: MatrixEvent): { isInfoMessage: boolean; - tileHandler; + tileHandler: string; isBubbleMessage: boolean; } { const content = mxEvent.getContent(); From 7b35d2c27046c432dcdb9b768c1de40a1ca03c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 09:53:40 +0200 Subject: [PATCH 096/135] FORCED_IMAGE_HEIGHT into a const MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageReplyBody.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageReplyBody.tsx b/src/components/views/messages/MImageReplyBody.tsx index b0f7415347..44acf18004 100644 --- a/src/components/views/messages/MImageReplyBody.tsx +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -20,6 +20,8 @@ import { presentableTextForFile } from "./MFileBody"; import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; import SenderProfile from "./SenderProfile"; +const FORCED_IMAGE_HEIGHT = 44; + export default class MImageReplyBody extends MImageBody { public onClick = (ev: React.MouseEvent): void => { ev.preventDefault(); @@ -42,7 +44,7 @@ export default class MImageReplyBody extends MImageBody { const content = this.props.mxEvent.getContent(); const contentUrl = this.getContentUrl(); - const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content, 44); + const thumbnail = this.messageContent(contentUrl, this.getThumbUrl(), content, FORCED_IMAGE_HEIGHT); const fileBody = this.getFileBody(); const sender = Date: Wed, 14 Jul 2021 09:54:33 +0200 Subject: [PATCH 097/135] Omit onFinished MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 0acdbaf253..74d15dd9b5 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -115,12 +115,11 @@ export default class MImageBody extends React.Component { const content = this.props.mxEvent.getContent(); const httpUrl = this.getContentUrl(); - const params: ComponentProps = { + const params: Omit, "onFinished"> = { src: httpUrl, name: content.body?.length > 0 ? content.body : _t('Attachment'), mxEvent: this.props.mxEvent, permalinkCreator: this.props.permalinkCreator, - onFinished: () => {}, }; if (content.info) { From 4afd985e7e63e03586b8e7d003690f9ef6653621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 09:55:14 +0200 Subject: [PATCH 098/135] Kill off _afterComponentWillUnmount MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/messages/MImageBody.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 74d15dd9b5..96c8652aee 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -316,7 +316,6 @@ export default class MImageBody extends React.Component { componentWillUnmount() { this.unmounted = true; this.context.removeListener('sync', this.onClientSync); - this._afterComponentWillUnmount(); if (this.state.decryptedUrl) { URL.revokeObjectURL(this.state.decryptedUrl); @@ -326,11 +325,6 @@ export default class MImageBody extends React.Component { } } - // To be overridden by subclasses (e.g. MStickerBody) for further - // cleanup after componentWillUnmount - _afterComponentWillUnmount() { - } - protected messageContent( contentUrl: string, thumbUrl: string, From 18355599e88107f342dcef78dc6e5aa58704b4c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:07:41 +0200 Subject: [PATCH 099/135] Fix senderProfile getting cutoff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_MImageReplyBody.scss | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss index f0401d21db..0b18308847 100644 --- a/res/css/views/messages/_MImageReplyBody.scss +++ b/res/css/views/messages/_MImageReplyBody.scss @@ -21,12 +21,17 @@ limitations under the License. flex: 1; padding-right: 4px; } + + .mx_MImageReplyBody_info { + flex: 1; + + .mx_MImageReplyBody_sender { + grid-area: sender; + } + + .mx_MImageReplyBody_filename { + grid-area: filename; + } + } } -.mx_MImageReplyBody_sender { - grid-area: sender; -} - -.mx_MImageReplyBody_filename { - grid-area: filename; -} From 586e85cbff97da634fb7bf19491cffb2618487ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:14:44 +0200 Subject: [PATCH 100/135] Use MFileBody in replies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 4 ++++ src/components/views/rooms/ReplyTile.tsx | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 517ef79ef0..552d54367e 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -20,6 +20,10 @@ limitations under the License. font-size: $font-14px; position: relative; line-height: $font-16px; + + .mx_MFileBody_info { + margin: 5px 0; + } } .mx_ReplyTile > a { diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 41fc61aa7f..2911e538fc 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -27,6 +27,7 @@ import * as sdk from '../../../index'; import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; import { replaceableComponent } from '../../../utils/replaceableComponent'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; +import MFileBody from "../messages/MFileBody"; interface IProps { mxEvent: MatrixEvent; @@ -116,7 +117,7 @@ export default class ReplyTile extends React.PureComponent { const msgtypeOverrides = { [MsgType.Image]: MImageReplyBody, // We don't want a download link for files, just the file name is enough. - [MsgType.File]: TextualBody, + [MsgType.File]: MFileBody, [MsgType.Audio]: TextualBody, [MsgType.Video]: TextualBody, }; From f26c75bdcc35f98c36ee4816ff72848f8c7ac9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:23:10 +0200 Subject: [PATCH 101/135] Use margin instead of padding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_MImageReplyBody.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/messages/_MImageReplyBody.scss b/res/css/views/messages/_MImageReplyBody.scss index 0b18308847..70c53f8c9c 100644 --- a/res/css/views/messages/_MImageReplyBody.scss +++ b/res/css/views/messages/_MImageReplyBody.scss @@ -19,7 +19,7 @@ limitations under the License. .mx_MImageBody_thumbnail_container { flex: 1; - padding-right: 4px; + margin-right: 4px; } .mx_MImageReplyBody_info { From ae4d8c291daf667a422dc6596d16ace2c3e5f927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:23:24 +0200 Subject: [PATCH 102/135] It's not an override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 2911e538fc..a22fbc4494 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -27,7 +27,6 @@ import * as sdk from '../../../index'; import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; import { replaceableComponent } from '../../../utils/replaceableComponent'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; -import MFileBody from "../messages/MFileBody"; interface IProps { mxEvent: MatrixEvent; @@ -117,7 +116,6 @@ export default class ReplyTile extends React.PureComponent { const msgtypeOverrides = { [MsgType.Image]: MImageReplyBody, // We don't want a download link for files, just the file name is enough. - [MsgType.File]: MFileBody, [MsgType.Audio]: TextualBody, [MsgType.Video]: TextualBody, }; From 04db6beb108fea542db2bb3f25afc93dfe8caed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:30:24 +0200 Subject: [PATCH 103/135] Remove stale comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index a22fbc4494..8ac34afa28 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -115,7 +115,6 @@ export default class ReplyTile extends React.PureComponent { const msgtypeOverrides = { [MsgType.Image]: MImageReplyBody, - // We don't want a download link for files, just the file name is enough. [MsgType.Audio]: TextualBody, [MsgType.Video]: TextualBody, }; From 782563af5356281ef2a8264b32235554cec9a061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 10:47:29 +0200 Subject: [PATCH 104/135] Override audio and video body with file body MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 10 ++++++++-- src/components/views/rooms/ReplyTile.tsx | 6 ++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 552d54367e..8fe3a3e94c 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -21,8 +21,14 @@ limitations under the License. position: relative; line-height: $font-16px; - .mx_MFileBody_info { - margin: 5px 0; + .mx_MFileBody { + .mx_MFileBody_info { + margin: 5px 0; + } + + .mx_MFileBody_download { + display: none; + } } } diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 8ac34afa28..f2f75c4918 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -27,6 +27,7 @@ import * as sdk from '../../../index'; import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; import { replaceableComponent } from '../../../utils/replaceableComponent'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; +import MFileBody from "../messages/MFileBody"; interface IProps { mxEvent: MatrixEvent; @@ -115,8 +116,9 @@ export default class ReplyTile extends React.PureComponent { const msgtypeOverrides = { [MsgType.Image]: MImageReplyBody, - [MsgType.Audio]: TextualBody, - [MsgType.Video]: TextualBody, + // Override audio and video body with file body. We also hide the download/decrypt button using CSS + [MsgType.Audio]: MFileBody, + [MsgType.Video]: MFileBody, }; const evOverrides = { [EventType.Sticker]: TextualBody, From 4b6de3a0110b30ff9b476fb22039a85381d45c46 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 14 Jul 2021 11:10:15 +0100 Subject: [PATCH 105/135] Undo change that impacts analytics action We dont't want the analytics identitfier to change. Signed-off-by: Paulo Pinto --- src/components/views/settings/SetIdServer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/SetIdServer.tsx b/src/components/views/settings/SetIdServer.tsx index 7788aa1c07..dc38055c10 100644 --- a/src/components/views/settings/SetIdServer.tsx +++ b/src/components/views/settings/SetIdServer.tsx @@ -320,7 +320,7 @@ export default class SetIdServer extends React.Component { message = unboundMessage; } - const { finished } = Modal.createTrackedDialog('Identity server Bound Warning', '', QuestionDialog, { + const { finished } = Modal.createTrackedDialog('Identity Server Bound Warning', '', QuestionDialog, { title, description: message, button, From 6c801fea53530f37b8d309e871869d81d46d3e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 12:15:13 +0200 Subject: [PATCH 106/135] Use MImageReplyBody for stickers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index f2f75c4918..49c904a940 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -80,7 +80,9 @@ export default class ReplyTile extends React.PureComponent { }; render() { - const msgtype = this.props.mxEvent.getContent().msgtype; + const mxEvent = this.props.mxEvent; + const msgtype = mxEvent.getContent().msgtype; + const evType = mxEvent.getType() as EventType; const { tileHandler, isInfoMessage } = getEventDisplayInfo(this.props.mxEvent); // This shouldn't happen: the caller should check we support this type @@ -105,7 +107,12 @@ export default class ReplyTile extends React.PureComponent { } let sender; - const needsSenderProfile = msgtype !== MsgType.Image && tileHandler !== EventType.RoomCreate && !isInfoMessage; + const needsSenderProfile = ( + !isInfoMessage && + msgtype !== MsgType.Image && + tileHandler !== EventType.RoomCreate && + evType !== EventType.Sticker + ); if (needsSenderProfile) { sender = { [MsgType.Video]: MFileBody, }; const evOverrides = { - [EventType.Sticker]: TextualBody, + // Use MImageReplyBody so that the sticker isn't taking up a lot of space + [EventType.Sticker]: MImageReplyBody, }; return ( From 54d2784818e7c6908052997266a3613de97b575f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Jul 2021 12:19:16 +0200 Subject: [PATCH 107/135] Remove unused import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/ReplyTile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 49c904a940..f44a75a264 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -21,7 +21,6 @@ import dis from '../../../dispatcher/dispatcher'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks'; import SenderProfile from "../messages/SenderProfile"; -import TextualBody from "../messages/TextualBody"; import MImageReplyBody from "../messages/MImageReplyBody"; import * as sdk from '../../../index'; import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; From 6c7295573135f62b48e56f87e36a9036c5950fc6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jul 2021 16:41:01 +0100 Subject: [PATCH 108/135] Fix 'User' type import --- src/components/views/dialogs/VerificationRequestDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/VerificationRequestDialog.tsx b/src/components/views/dialogs/VerificationRequestDialog.tsx index 4d3123c274..65b7f71dbd 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.tsx +++ b/src/components/views/dialogs/VerificationRequestDialog.tsx @@ -21,7 +21,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import BaseDialog from "./BaseDialog"; import EncryptionPanel from "../right_panel/EncryptionPanel"; -import { User } from 'matrix-js-sdk'; +import { User } from 'matrix-js-sdk/src/models/user'; interface IProps { verificationRequest: VerificationRequest; From 5399929da59162339cf7c3031d1f86a2503dc243 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jul 2021 17:13:40 +0100 Subject: [PATCH 109/135] Comment why end to end tests are only on the develop branch --- .github/workflows/develop.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 3c3807e33b..0ae59da09a 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -1,5 +1,8 @@ name: Develop on: + # These tests won't work for non-develop branches at the moment as they + # won't pull in the right versions of other repos, so they're only enabled + # on develop. push: branches: [develop] pull_request: From 5dc3d09dd83dd1347a6d59a2cba83e31e35c0112 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Jul 2021 10:18:55 -0600 Subject: [PATCH 110/135] Use new function name --- src/stores/widgets/StopGapWidget.ts | 2 +- src/stores/widgets/StopGapWidgetDriver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/widgets/StopGapWidget.ts b/src/stores/widgets/StopGapWidget.ts index 7120647078..830544e771 100644 --- a/src/stores/widgets/StopGapWidget.ts +++ b/src/stores/widgets/StopGapWidget.ts @@ -415,7 +415,7 @@ export class StopGapWidget extends EventEmitter { private feedEvent(ev: MatrixEvent) { if (!this.messaging) return; - const raw = ev.getClearEvent() as IEvent; + const raw = ev.getEffectiveEvent(); this.messaging.feedEvent(raw).catch(e => { console.error("Error sending event to widget: ", e); }); diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 5de8a0a361..dadedcfe68 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -164,7 +164,7 @@ export class StopGapWidgetDriver extends WidgetDriver { results.push(ev); } - return results.map(e => e.getClearEvent()); + return results.map(e => e.getEffectiveEvent()); } public async readStateEvents(eventType: string, stateKey: string | undefined, limit: number): Promise { From c4b03064aeee407bb4f41ba6b497f37f12e13533 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Jul 2021 10:28:45 -0600 Subject: [PATCH 111/135] fix imports --- src/stores/widgets/StopGapWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/widgets/StopGapWidget.ts b/src/stores/widgets/StopGapWidget.ts index 830544e771..24869b5edc 100644 --- a/src/stores/widgets/StopGapWidget.ts +++ b/src/stores/widgets/StopGapWidget.ts @@ -51,7 +51,7 @@ import ThemeWatcher from "../../settings/watchers/ThemeWatcher"; import { getCustomTheme } from "../../theme"; import CountlyAnalytics from "../../CountlyAnalytics"; import { ElementWidgetCapabilities } from "./ElementWidgetCapabilities"; -import { MatrixEvent, IEvent } from "matrix-js-sdk/src/models/event"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { ELEMENT_CLIENT_ID } from "../../identifiers"; import { getUserLanguage } from "../../languageHandler"; From 0e38eee08047f9fdc64fdcc7f314ff294a73e010 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 Jul 2021 17:53:42 +0100 Subject: [PATCH 112/135] improve typing in the idb worker --- src/workers/indexeddb.worker.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/workers/indexeddb.worker.ts b/src/workers/indexeddb.worker.ts index 113bc87d6c..a05add1c7d 100644 --- a/src/workers/indexeddb.worker.ts +++ b/src/workers/indexeddb.worker.ts @@ -16,6 +16,8 @@ limitations under the License. import { IndexedDBStoreWorker } from "matrix-js-sdk/src/indexeddb-worker"; -const remoteWorker = new IndexedDBStoreWorker(postMessage as InstanceType["postMessage"]); +const ctx: Worker = self as any; -global.onmessage = remoteWorker.onMessage; +const remoteWorker = new IndexedDBStoreWorker(ctx.postMessage); + +ctx.onmessage = remoteWorker.onMessage; From e8fcf0978dcb7dd1a125744eccfeda2dd6458972 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 Jul 2021 18:05:06 +0100 Subject: [PATCH 113/135] fix worker import --- src/utils/createMatrixClient.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/createMatrixClient.ts b/src/utils/createMatrixClient.ts index da7b8441fc..0cce729e65 100644 --- a/src/utils/createMatrixClient.ts +++ b/src/utils/createMatrixClient.ts @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import IndexedDBWorker from "../workers/indexeddb.worker.ts"; // `.ts` is needed here to make TS happy +// @ts-ignore - `.ts` is needed here to make TS happy +import IndexedDBWorker from "../workers/indexeddb.worker.ts"; import { createClient, ICreateClientOpts } from "matrix-js-sdk/src/matrix"; import { IndexedDBCryptoStore } from "matrix-js-sdk/src/crypto/store/indexeddb-crypto-store"; import { WebStorageSessionStore } from "matrix-js-sdk/src/store/session/webstorage"; From 296d5d1d5e46af802f416b3cbe6390a4440086ca Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 Jul 2021 18:50:01 +0100 Subject: [PATCH 114/135] stub out workers for jest tests as it doesn't like the worker-loader --- __mocks__/workerMock.js | 1 + package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 __mocks__/workerMock.js diff --git a/__mocks__/workerMock.js b/__mocks__/workerMock.js new file mode 100644 index 0000000000..6ee585673e --- /dev/null +++ b/__mocks__/workerMock.js @@ -0,0 +1 @@ +module.exports = jest.fn(); diff --git a/package.json b/package.json index 27c4f39a09..e80ed8dd5a 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,8 @@ "\\$webapp/i18n/languages.json": "/__mocks__/languages.json", "decoderWorker\\.min\\.js": "/__mocks__/empty.js", "decoderWorker\\.min\\.wasm": "/__mocks__/empty.js", - "waveWorker\\.min\\.js": "/__mocks__/empty.js" + "waveWorker\\.min\\.js": "/__mocks__/empty.js", + "workers/(.+)\\.worker\\.ts": "/__mocks__/workerMock.js" }, "transformIgnorePatterns": [ "/node_modules/(?!matrix-js-sdk).+$" From 12761fd823f2e9bf475b130258221c9a3be41f5e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 14 Jul 2021 19:16:34 +0100 Subject: [PATCH 115/135] add valuable ts-ignore --- src/BlurhashEncoder.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/BlurhashEncoder.ts b/src/BlurhashEncoder.ts index a42c29dfa7..2aee370fe9 100644 --- a/src/BlurhashEncoder.ts +++ b/src/BlurhashEncoder.ts @@ -16,6 +16,7 @@ limitations under the License. import { defer, IDeferred } from "matrix-js-sdk/src/utils"; +// @ts-ignore - `.ts` is needed here to make TS happy import BlurhashWorker from "./workers/blurhash.worker.ts"; interface IBlurhashWorkerResponse { From 421392f33968d542dea3c359418f684242ca8c64 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Jul 2021 12:48:27 -0600 Subject: [PATCH 116/135] Exclude state events from widgets reading room events They can request state reading permissions to read state. --- src/stores/widgets/StopGapWidgetDriver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index dadedcfe68..13cd260ef0 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -159,7 +159,7 @@ export class StopGapWidgetDriver extends WidgetDriver { if (results.length >= limit) break; const ev = events[i]; - if (ev.getType() !== eventType) continue; + if (ev.getType() !== eventType || ev.isState()) continue; if (eventType === EventType.RoomMessage && msgtype && msgtype !== ev.getContent()['msgtype']) continue; results.push(ev); } From f4c767ab3ed480c38ed1e066dd7cf68a8d01a569 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jul 2021 22:37:47 +0100 Subject: [PATCH 117/135] Convert CONTRIBUTING to markdown Where by 'convert', I mean 'rename' --- CONTRIBUTING.rst => CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CONTRIBUTING.rst => CONTRIBUTING.md (100%) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.rst rename to CONTRIBUTING.md From 21a6a2d01e27dded0587bc8e4c3c7fca9434f3a6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jul 2021 22:39:03 +0100 Subject: [PATCH 118/135] Update links --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c9d11f02c8..fb237a5845 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,3 @@ - + - + From f42382edbd8922a8d02549b767e1060a5b70e72e Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 14 Jul 2021 23:29:54 +0100 Subject: [PATCH 119/135] Update PR template for new changelog stuff --- .github/PULL_REQUEST_TEMPLATE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fb237a5845..e9ede862d2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,15 @@ + + From 90d380c8aeb686963dfdef616b2bbf8222e74687 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 08:26:49 +0100 Subject: [PATCH 120/135] Cache value of feature_spaces* flags as they cause page refresh so are immutable --- src/Avatar.ts | 4 +- src/autocomplete/Autocompleter.ts | 5 +-- src/autocomplete/RoomProvider.tsx | 5 ++- src/components/structures/LoggedInView.tsx | 3 +- src/components/structures/MatrixChat.tsx | 8 ++-- src/components/structures/RightPanel.tsx | 3 +- src/components/structures/RoomView.tsx | 9 ++--- src/components/structures/SpaceRoomView.tsx | 5 +-- src/components/structures/UserMenu.tsx | 4 +- .../views/dialogs/ForwardDialog.tsx | 3 +- src/components/views/dialogs/InviteDialog.tsx | 3 +- src/components/views/right_panel/UserInfo.tsx | 17 ++++---- src/components/views/rooms/MemberList.tsx | 5 ++- src/components/views/rooms/RoomList.tsx | 2 +- .../views/rooms/ThirdPartyMemberInfo.tsx | 4 +- src/components/views/spaces/SpacePanel.tsx | 5 +-- src/stores/BreadcrumbsStore.ts | 3 +- src/stores/SpaceStore.tsx | 39 ++++++++++++------- src/stores/room-list/RoomListStore.ts | 11 +++--- src/stores/room-list/SpaceWatcher.ts | 5 +-- src/stores/room-list/algorithms/Algorithm.ts | 3 +- .../room-list/filters/VisibilityProvider.ts | 4 +- 22 files changed, 82 insertions(+), 68 deletions(-) diff --git a/src/Avatar.ts b/src/Avatar.ts index 4c4bd1c265..198d4162a0 100644 --- a/src/Avatar.ts +++ b/src/Avatar.ts @@ -21,7 +21,7 @@ import { ResizeMethod } from "matrix-js-sdk/src/@types/partials"; import DMRoomMap from './utils/DMRoomMap'; import { mediaFromMxc } from "./customisations/Media"; -import SettingsStore from "./settings/SettingsStore"; +import SpaceStore from "./stores/SpaceStore"; // Not to be used for BaseAvatar urls as that has similar default avatar fallback already export function avatarUrlForMember( @@ -153,7 +153,7 @@ export function avatarUrlForRoom(room: Room, width: number, height: number, resi } // space rooms cannot be DMs so skip the rest - if (SettingsStore.getValue("feature_spaces") && room.isSpaceRoom()) return null; + if (SpaceStore.spacesEnabled && room.isSpaceRoom()) return null; let otherMember = null; const otherUserId = DMRoomMap.shared().getUserIdForRoomId(room.roomId); diff --git a/src/autocomplete/Autocompleter.ts b/src/autocomplete/Autocompleter.ts index 7ab2ae70ea..acc7846510 100644 --- a/src/autocomplete/Autocompleter.ts +++ b/src/autocomplete/Autocompleter.ts @@ -27,8 +27,8 @@ import EmojiProvider from './EmojiProvider'; import NotifProvider from './NotifProvider'; import { timeout } from "../utils/promise"; import AutocompleteProvider, { ICommand } from "./AutocompleteProvider"; -import SettingsStore from "../settings/SettingsStore"; import SpaceProvider from "./SpaceProvider"; +import SpaceStore from "../stores/SpaceStore"; export interface ISelectionRange { beginning?: boolean; // whether the selection is in the first block of the editor or not @@ -58,8 +58,7 @@ const PROVIDERS = [ DuckDuckGoProvider, ]; -// as the spaces feature is device configurable only, and toggling it refreshes the page, we can do this here -if (SettingsStore.getValue("feature_spaces")) { +if (SpaceStore.spacesEnabled) { PROVIDERS.push(SpaceProvider); } else { PROVIDERS.push(CommunityProvider); diff --git a/src/autocomplete/RoomProvider.tsx b/src/autocomplete/RoomProvider.tsx index 7865a76daa..37ddf2c387 100644 --- a/src/autocomplete/RoomProvider.tsx +++ b/src/autocomplete/RoomProvider.tsx @@ -28,7 +28,7 @@ import { PillCompletion } from './Components'; import { makeRoomPermalink } from "../utils/permalinks/Permalinks"; import { ICompletion, ISelectionRange } from "./Autocompleter"; import RoomAvatar from '../components/views/avatars/RoomAvatar'; -import SettingsStore from "../settings/SettingsStore"; +import SpaceStore from "../stores/SpaceStore"; const ROOM_REGEX = /\B#\S*/g; @@ -59,7 +59,8 @@ export default class RoomProvider extends AutocompleteProvider { const cli = MatrixClientPeg.get(); let rooms = cli.getVisibleRooms(); - if (SettingsStore.getValue("feature_spaces")) { + // if spaces are enabled then filter them out here as they get their own autocomplete provider + if (SpaceStore.spacesEnabled) { rooms = rooms.filter(r => !r.isSpaceRoom()); } diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 89fa8db376..6c086ed17c 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -63,6 +63,7 @@ import ToastContainer from './ToastContainer'; import MyGroups from "./MyGroups"; import UserView from "./UserView"; import GroupView from "./GroupView"; +import SpaceStore from "../../stores/SpaceStore"; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. @@ -631,7 +632,7 @@ class LoggedInView extends React.Component { >
- { SettingsStore.getValue("feature_spaces") ? : null } + { SpaceStore.spacesEnabled ? : null } { private leaveRoomWarnings(roomId: string) { const roomToLeave = MatrixClientPeg.get().getRoom(roomId); - const isSpace = SettingsStore.getValue("feature_spaces") && roomToLeave?.isSpaceRoom(); + const isSpace = SpaceStore.spacesEnabled && roomToLeave?.isSpaceRoom(); // Show a warning if there are additional complications. const warnings = []; @@ -1137,7 +1137,7 @@ export default class MatrixChat extends React.PureComponent { const roomToLeave = MatrixClientPeg.get().getRoom(roomId); const warnings = this.leaveRoomWarnings(roomId); - const isSpace = SettingsStore.getValue("feature_spaces") && roomToLeave?.isSpaceRoom(); + const isSpace = SpaceStore.spacesEnabled && roomToLeave?.isSpaceRoom(); Modal.createTrackedDialog(isSpace ? "Leave space" : "Leave room", '', QuestionDialog, { title: isSpace ? _t("Leave space") : _t("Leave room"), description: ( @@ -1687,7 +1687,7 @@ export default class MatrixChat extends React.PureComponent { const type = screen === "start_sso" ? "sso" : "cas"; PlatformPeg.get().startSingleSignOn(cli, type, this.getFragmentAfterLogin()); } else if (screen === 'groups') { - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { dis.dispatch({ action: "view_home_page" }); return; } @@ -1774,7 +1774,7 @@ export default class MatrixChat extends React.PureComponent { subAction: params.action, }); } else if (screen.indexOf('group/') === 0) { - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { dis.dispatch({ action: "view_home_page" }); return; } diff --git a/src/components/structures/RightPanel.tsx b/src/components/structures/RightPanel.tsx index 63027ab627..2a3448b017 100644 --- a/src/components/structures/RightPanel.tsx +++ b/src/components/structures/RightPanel.tsx @@ -48,6 +48,7 @@ import NotificationPanel from "./NotificationPanel"; import ResizeNotifier from "../../utils/ResizeNotifier"; import PinnedMessagesCard from "../views/right_panel/PinnedMessagesCard"; import { throttle } from 'lodash'; +import SpaceStore from "../../stores/SpaceStore"; interface IProps { room?: Room; // if showing panels for a given room, this is set @@ -107,7 +108,7 @@ export default class RightPanel extends React.Component { return RightPanelPhases.GroupMemberList; } return rps.groupPanelPhase; - } else if (SettingsStore.getValue("feature_spaces") && this.props.room?.isSpaceRoom() + } else if (SpaceStore.spacesEnabled && this.props.room?.isSpaceRoom() && !RIGHT_PANEL_SPACE_PHASES.includes(rps.roomPanelPhase) ) { return RightPanelPhases.SpaceMemberList; diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 2c118149a0..a8f9e7ccb6 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -89,6 +89,7 @@ import RoomStatusBar from "./RoomStatusBar"; import MessageComposer from '../views/rooms/MessageComposer'; import JumpToBottomButton from "../views/rooms/JumpToBottomButton"; import TopUnreadMessagesBar from "../views/rooms/TopUnreadMessagesBar"; +import SpaceStore from "../../stores/SpaceStore"; const DEBUG = false; let debuglog = function(msg: string) {}; @@ -1748,10 +1749,8 @@ export default class RoomView extends React.Component { } const myMembership = this.state.room.getMyMembership(); - if (myMembership === "invite" - // SpaceRoomView handles invites itself - && (!SettingsStore.getValue("feature_spaces") || !this.state.room.isSpaceRoom()) - ) { + // SpaceRoomView handles invites itself + if (myMembership === "invite" && (!SpaceStore.spacesEnabled || !this.state.room.isSpaceRoom())) { if (this.state.joining || this.state.rejecting) { return ( @@ -1882,7 +1881,7 @@ export default class RoomView extends React.Component { room={this.state.room} /> ); - if (!this.state.canPeek && (!SettingsStore.getValue("feature_spaces") || !this.state.room?.isSpaceRoom())) { + if (!this.state.canPeek && (!SpaceStore.spacesEnabled || !this.state.room?.isSpaceRoom())) { return (
{ previewBar } diff --git a/src/components/structures/SpaceRoomView.tsx b/src/components/structures/SpaceRoomView.tsx index 24b460284f..0ee68a9578 100644 --- a/src/components/structures/SpaceRoomView.tsx +++ b/src/components/structures/SpaceRoomView.tsx @@ -62,7 +62,6 @@ import IconizedContextMenu, { import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; import { BetaPill } from "../views/beta/BetaCard"; import { UserTab } from "../views/dialogs/UserSettingsDialog"; -import SettingsStore from "../../settings/SettingsStore"; import Modal from "../../Modal"; import BetaFeedbackDialog from "../views/dialogs/BetaFeedbackDialog"; import SdkConfig from "../../SdkConfig"; @@ -178,7 +177,7 @@ const SpacePreview = ({ space, onJoinButtonClicked, onRejectButtonClicked }) => const [busy, setBusy] = useState(false); - const spacesEnabled = SettingsStore.getValue("feature_spaces"); + const spacesEnabled = SpaceStore.spacesEnabled; const cannotJoin = getEffectiveMembership(myMembership) === EffectiveMembership.Leave && space.getJoinRule() !== JoinRule.Public; @@ -854,7 +853,7 @@ export default class SpaceRoomView extends React.PureComponent { private renderBody() { switch (this.state.phase) { case Phase.Landing: - if (this.state.myMembership === "join" && SettingsStore.getValue("feature_spaces")) { + if (this.state.myMembership === "join" && SpaceStore.spacesEnabled) { return ; } else { return { }; OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate); } @@ -115,7 +115,7 @@ export default class UserMenu extends React.Component { if (this.dispatcherRef) defaultDispatcher.unregister(this.dispatcherRef); OwnProfileStore.instance.off(UPDATE_EVENT, this.onProfileUpdate); this.tagStoreRef.remove(); - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { SpaceStore.instance.off(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate); } MatrixClientPeg.get().removeListener("Room", this.onRoom); diff --git a/src/components/views/dialogs/ForwardDialog.tsx b/src/components/views/dialogs/ForwardDialog.tsx index ba06436ae2..839ca6da2f 100644 --- a/src/components/views/dialogs/ForwardDialog.tsx +++ b/src/components/views/dialogs/ForwardDialog.tsx @@ -43,6 +43,7 @@ import QueryMatcher from "../../../autocomplete/QueryMatcher"; import TruncatedList from "../elements/TruncatedList"; import EntityTile from "../rooms/EntityTile"; import BaseAvatar from "../avatars/BaseAvatar"; +import SpaceStore from "../../../stores/SpaceStore"; const AVATAR_SIZE = 30; @@ -180,7 +181,7 @@ const ForwardDialog: React.FC = ({ matrixClient: cli, event, permalinkCr const [query, setQuery] = useState(""); const lcQuery = query.toLowerCase(); - const spacesEnabled = useFeatureEnabled("feature_spaces"); + const spacesEnabled = SpaceStore.spacesEnabled; const flairEnabled = useFeatureEnabled(UIFeature.Flair); const previewLayout = useSettingValue("layout"); diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index c9475d4849..2aa14449df 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -67,6 +67,7 @@ import GenericTextContextMenu from "../context_menus/GenericTextContextMenu"; import QuestionDialog from "./QuestionDialog"; import Spinner from "../elements/Spinner"; import BaseDialog from "./BaseDialog"; +import SpaceStore from "../../../stores/SpaceStore"; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ @@ -1364,7 +1365,7 @@ export default class InviteDialog extends React.PureComponent; } else if (this.props.kind === KIND_INVITE) { const room = MatrixClientPeg.get()?.getRoom(this.props.roomId); - const isSpace = SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom(); + const isSpace = SpaceStore.spacesEnabled && room?.isSpaceRoom(); title = isSpace ? _t("Invite to %(spaceName)s", { spaceName: room.name || _t("Unnamed Space"), diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index e9d80d49c5..fc3814136d 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -69,6 +69,7 @@ import RoomName from "../elements/RoomName"; import { mediaFromMxc } from "../../../customisations/Media"; import UIStore from "../../../stores/UIStore"; import { ComposerInsertPayload } from "../../../dispatcher/payloads/ComposerInsertPayload"; +import SpaceStore from "../../../stores/SpaceStore"; export interface IDevice { deviceId: string; @@ -728,7 +729,7 @@ const MuteToggleButton: React.FC = ({ member, room, powerLevels, // if muting self, warn as it may be irreversible if (target === cli.getUserId()) { try { - if (!(await warnSelfDemote(SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom()))) return; + if (!(await warnSelfDemote(SpaceStore.spacesEnabled && room?.isSpaceRoom()))) return; } catch (e) { console.error("Failed to warn about self demotion: ", e); return; @@ -817,7 +818,7 @@ const RoomAdminToolsContainer: React.FC = ({ if (canAffectUser && me.powerLevel >= kickPowerLevel) { kickButton = ; } - if (me.powerLevel >= redactPowerLevel && (!SettingsStore.getValue("feature_spaces") || !room.isSpaceRoom())) { + if (me.powerLevel >= redactPowerLevel && (!SpaceStore.spacesEnabled || !room.isSpaceRoom())) { redactButton = ( ); @@ -1096,7 +1097,7 @@ const PowerLevelEditor: React.FC<{ } else if (myUserId === target) { // If we are changing our own PL it can only ever be decreasing, which we cannot reverse. try { - if (!(await warnSelfDemote(SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom()))) return; + if (!(await warnSelfDemote(SpaceStore.spacesEnabled && room?.isSpaceRoom()))) return; } catch (e) { console.error("Failed to warn about self demotion: ", e); } @@ -1326,10 +1327,10 @@ const BasicUserInfo: React.FC<{ if (!isRoomEncrypted) { if (!cryptoEnabled) { text = _t("This client does not support end-to-end encryption."); - } else if (room && (!SettingsStore.getValue("feature_spaces") || !room.isSpaceRoom())) { + } else if (room && (!SpaceStore.spacesEnabled || !room.isSpaceRoom())) { text = _t("Messages in this room are not end-to-end encrypted."); } - } else if (!SettingsStore.getValue("feature_spaces") || !room.isSpaceRoom()) { + } else if (!SpaceStore.spacesEnabled || !room.isSpaceRoom()) { text = _t("Messages in this room are end-to-end encrypted."); } @@ -1405,7 +1406,7 @@ const BasicUserInfo: React.FC<{ canInvite={roomPermissions.canInvite} isIgnored={isIgnored} member={member as RoomMember} - isSpace={SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom()} + isSpace={SpaceStore.spacesEnabled && room?.isSpaceRoom()} /> { adminToolsContainer } @@ -1568,7 +1569,7 @@ const UserInfo: React.FC = ({ previousPhase = RightPanelPhases.RoomMemberInfo; refireParams = { member: member }; } else if (room) { - previousPhase = previousPhase = SettingsStore.getValue("feature_spaces") && room.isSpaceRoom() + previousPhase = previousPhase = SpaceStore.spacesEnabled && room.isSpaceRoom() ? RightPanelPhases.SpaceMemberList : RightPanelPhases.RoomMemberList; } @@ -1617,7 +1618,7 @@ const UserInfo: React.FC = ({ } let scopeHeader; - if (SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom()) { + if (SpaceStore.spacesEnabled && room?.isSpaceRoom()) { scopeHeader =
diff --git a/src/components/views/rooms/MemberList.tsx b/src/components/views/rooms/MemberList.tsx index f4df70c7ee..71e54404c0 100644 --- a/src/components/views/rooms/MemberList.tsx +++ b/src/components/views/rooms/MemberList.tsx @@ -43,6 +43,7 @@ import EntityTile from "./EntityTile"; import MemberTile from "./MemberTile"; import BaseAvatar from '../avatars/BaseAvatar'; import { throttle } from 'lodash'; +import SpaceStore from "../../../stores/SpaceStore"; const INITIAL_LOAD_NUM_MEMBERS = 30; const INITIAL_LOAD_NUM_INVITED = 5; @@ -509,7 +510,7 @@ export default class MemberList extends React.Component { const chat = CommunityPrototypeStore.instance.getSelectedCommunityGeneralChat(); if (chat && chat.roomId === this.props.roomId) { inviteButtonText = _t("Invite to this community"); - } else if (SettingsStore.getValue("feature_spaces") && room.isSpaceRoom()) { + } else if (SpaceStore.spacesEnabled && room.isSpaceRoom()) { inviteButtonText = _t("Invite to this space"); } @@ -549,7 +550,7 @@ export default class MemberList extends React.Component { let previousPhase = RightPanelPhases.RoomSummary; // We have no previousPhase for when viewing a MemberList from a Space let scopeHeader; - if (SettingsStore.getValue("feature_spaces") && room?.isSpaceRoom()) { + if (SpaceStore.spacesEnabled && room?.isSpaceRoom()) { previousPhase = undefined; scopeHeader =
diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index c94256800d..7ece6add9c 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -417,7 +417,7 @@ export default class RoomList extends React.PureComponent { } private renderCommunityInvites(): ReactComponentElement[] { - if (SettingsStore.getValue("feature_spaces")) return []; + if (SpaceStore.spacesEnabled) return []; // TODO: Put community invites in a more sensible place (not in the room list) // See https://github.com/vector-im/element-web/issues/14456 return MatrixClientPeg.get().getGroups().filter(g => { diff --git a/src/components/views/rooms/ThirdPartyMemberInfo.tsx b/src/components/views/rooms/ThirdPartyMemberInfo.tsx index 2bcc3ead57..51bb891c62 100644 --- a/src/components/views/rooms/ThirdPartyMemberInfo.tsx +++ b/src/components/views/rooms/ThirdPartyMemberInfo.tsx @@ -25,9 +25,9 @@ import { isValid3pidInvite } from "../../../RoomInvite"; import RoomAvatar from "../avatars/RoomAvatar"; import RoomName from "../elements/RoomName"; import { replaceableComponent } from "../../../utils/replaceableComponent"; -import SettingsStore from "../../../settings/SettingsStore"; import ErrorDialog from '../dialogs/ErrorDialog'; import AccessibleButton from '../elements/AccessibleButton'; +import SpaceStore from "../../../stores/SpaceStore"; interface IProps { event: MatrixEvent; @@ -134,7 +134,7 @@ export default class ThirdPartyMemberInfo extends React.Component diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx index 5b3cf31cad..9cefbbd94c 100644 --- a/src/components/views/spaces/SpacePanel.tsx +++ b/src/components/views/spaces/SpacePanel.tsx @@ -42,7 +42,6 @@ import { import { Key } from "../../../Keyboard"; import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore"; import { NotificationState } from "../../../stores/notifications/NotificationState"; -import SettingsStore from "../../../settings/SettingsStore"; interface IButtonProps { space?: Room; @@ -134,7 +133,7 @@ const InnerSpacePanel = React.memo(({ children, isPanelCo const [invites, spaces, activeSpace] = useSpaces(); const activeSpaces = activeSpace ? [activeSpace] : []; - const homeNotificationState = SettingsStore.getValue("feature_spaces.all_rooms") + const homeNotificationState = SpaceStore.spacesTweakAllRoomsEnabled ? RoomNotificationStateStore.instance.globalState : SpaceStore.instance.getNotificationState(HOME_SPACE); return
@@ -142,7 +141,7 @@ const InnerSpacePanel = React.memo(({ children, isPanelCo className="mx_SpaceButton_home" onClick={() => SpaceStore.instance.setActiveSpace(null)} selected={!activeSpace} - tooltip={SettingsStore.getValue("feature_spaces.all_rooms") ? _t("All rooms") : _t("Home")} + tooltip={SpaceStore.spacesTweakAllRoomsEnabled ? _t("All rooms") : _t("Home")} notificationState={homeNotificationState} isNarrow={isPanelCollapsed} /> diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts index a3b07435c6..aceaf8b898 100644 --- a/src/stores/BreadcrumbsStore.ts +++ b/src/stores/BreadcrumbsStore.ts @@ -22,6 +22,7 @@ import defaultDispatcher from "../dispatcher/dispatcher"; import { arrayHasDiff } from "../utils/arrays"; import { isNullOrUndefined } from "matrix-js-sdk/src/utils"; import { SettingLevel } from "../settings/SettingLevel"; +import SpaceStore from "./SpaceStore"; const MAX_ROOMS = 20; // arbitrary const AUTOJOIN_WAIT_THRESHOLD_MS = 90000; // 90s, the time we wait for an autojoined room to show up @@ -122,7 +123,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient { } private async appendRoom(room: Room) { - if (SettingsStore.getValue("feature_spaces") && room.isSpaceRoom()) return; // hide space rooms + if (SpaceStore.spacesEnabled && room.isSpaceRoom()) return; // hide space rooms let updated = false; const rooms = (this.state.rooms || []).slice(); // cheap clone diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 99705a7aba..1a6b5109ec 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -59,7 +59,13 @@ export interface ISuggestedRoom extends ISpaceSummaryRoom { const MAX_SUGGESTED_ROOMS = 20; -const homeSpaceKey = SettingsStore.getValue("feature_spaces.all_rooms") ? "ALL_ROOMS" : "HOME_SPACE"; +// All of these settings cause the page to reload and can be costly if read frequently, so read them here only +const spacesEnabled = SettingsStore.getValue("feature_spaces"); +const spacesTweakAllRoomsEnabled = SettingsStore.getValue("feature_spaces.all_rooms"); +const spacesTweakSpaceMemberDMsEnabled = SettingsStore.getValue("feature_spaces.space_member_dms"); +const spacesTweakSpaceDMBadgesEnabled = SettingsStore.getValue("feature_spaces.space_dm_badges"); + +const homeSpaceKey = spacesTweakAllRoomsEnabled ? "ALL_ROOMS" : "HOME_SPACE"; const getSpaceContextKey = (space?: Room) => `mx_space_context_${space?.roomId || homeSpaceKey}`; const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces, rooms] @@ -260,7 +266,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } public getSpaceFilteredRoomIds = (space: Room | null): Set => { - if (!space && SettingsStore.getValue("feature_spaces.all_rooms")) { + if (!space && spacesTweakAllRoomsEnabled) { return new Set(this.matrixClient.getVisibleRooms().map(r => r.roomId)); } return this.spaceFilteredRooms.get(space?.roomId || HOME_SPACE) || new Set(); @@ -357,7 +363,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { }; private showInHomeSpace = (room: Room) => { - if (SettingsStore.getValue("feature_spaces.all_rooms")) return true; + if (spacesTweakAllRoomsEnabled) return true; if (room.isSpaceRoom()) return false; return !this.parentMap.get(room.roomId)?.size // put all orphaned rooms in the Home Space || DMRoomMap.shared().getUserIdForRoomId(room.roomId) // put all DMs in the Home Space @@ -389,7 +395,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const oldFilteredRooms = this.spaceFilteredRooms; this.spaceFilteredRooms = new Map(); - if (!SettingsStore.getValue("feature_spaces.all_rooms")) { + if (!spacesTweakAllRoomsEnabled) { // put all room invites in the Home Space const invites = visibleRooms.filter(r => !r.isSpaceRoom() && r.getMyMembership() === "invite"); this.spaceFilteredRooms.set(HOME_SPACE, new Set(invites.map(room => room.roomId))); @@ -416,7 +422,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const roomIds = new Set(childRooms.map(r => r.roomId)); const space = this.matrixClient?.getRoom(spaceId); - if (SettingsStore.getValue("feature_spaces.space_member_dms")) { + if (spacesTweakSpaceMemberDMsEnabled) { // Add relevant DMs space?.getMembers().forEach(member => { if (member.membership !== "join" && member.membership !== "invite") return; @@ -450,7 +456,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // Update NotificationStates this.getNotificationState(s)?.setRooms(visibleRooms.filter(room => { if (roomIds.has(room.roomId)) { - if (s !== HOME_SPACE && SettingsStore.getValue("feature_spaces.space_dm_badges")) return true; + if (s !== HOME_SPACE && spacesTweakSpaceDMBadgesEnabled) return true; return !DMRoomMap.shared().getUserIdForRoomId(room.roomId) || RoomListStore.instance.getTagsForRoom(room).includes(DefaultTagID.Favourite); @@ -549,7 +555,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // TODO confirm this after implementing parenting behaviour if (room.isSpaceRoom()) { this.onSpaceUpdate(); - } else if (!SettingsStore.getValue("feature_spaces.all_rooms")) { + } else if (!spacesTweakAllRoomsEnabled) { this.onRoomUpdate(room); } this.emit(room.roomId); @@ -573,7 +579,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { if (order !== lastOrder) { this.notifyIfOrderChanged(); } - } else if (ev.getType() === EventType.Tag && !SettingsStore.getValue("feature_spaces.all_rooms")) { + } else if (ev.getType() === EventType.Tag && !spacesTweakAllRoomsEnabled) { // If the room was in favourites and now isn't or the opposite then update its position in the trees const oldTags = lastEv?.getContent()?.tags || {}; const newTags = ev.getContent()?.tags || {}; @@ -613,13 +619,13 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } protected async onNotReady() { - if (!SettingsStore.getValue("feature_spaces")) return; + if (!SpaceStore.spacesEnabled) return; if (this.matrixClient) { this.matrixClient.removeListener("Room", this.onRoom); this.matrixClient.removeListener("Room.myMembership", this.onRoom); this.matrixClient.removeListener("Room.accountData", this.onRoomAccountData); this.matrixClient.removeListener("RoomState.events", this.onRoomState); - if (!SettingsStore.getValue("feature_spaces.all_rooms")) { + if (!spacesTweakAllRoomsEnabled) { this.matrixClient.removeListener("accountData", this.onAccountData); } } @@ -627,12 +633,12 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } protected async onReady() { - if (!SettingsStore.getValue("feature_spaces")) return; + if (!spacesEnabled) return; this.matrixClient.on("Room", this.onRoom); this.matrixClient.on("Room.myMembership", this.onRoom); this.matrixClient.on("Room.accountData", this.onRoomAccountData); this.matrixClient.on("RoomState.events", this.onRoomState); - if (!SettingsStore.getValue("feature_spaces.all_rooms")) { + if (!spacesTweakAllRoomsEnabled) { this.matrixClient.on("accountData", this.onAccountData); } @@ -646,7 +652,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } protected async onAction(payload: ActionPayload) { - if (!SettingsStore.getValue("feature_spaces")) return; + if (!spacesEnabled) return; switch (payload.action) { case "view_room": { // Don't auto-switch rooms when reacting to a context-switch @@ -660,7 +666,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // as it will cause you to end up in the wrong room this.setActiveSpace(room, false); } else if ( - (!SettingsStore.getValue("feature_spaces.all_rooms") || this.activeSpace) && + (!spacesTweakAllRoomsEnabled || this.activeSpace) && !this.getSpaceFilteredRoomIds(this.activeSpace).has(roomId) ) { this.switchToRelatedSpace(roomId); @@ -752,6 +758,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } export default class SpaceStore { + public static spacesEnabled = spacesEnabled; + public static spacesTweakAllRoomsEnabled = spacesTweakAllRoomsEnabled; + public static spacesTweakSpaceMemberDMsEnabled = spacesTweakSpaceMemberDMsEnabled; + public static spacesTweakSpaceDMBadgesEnabled = spacesTweakSpaceDMBadgesEnabled; + private static internalInstance = new SpaceStoreClass(); public static get instance(): SpaceStoreClass { diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index e26c80bb2d..a87e45acb7 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -35,6 +35,7 @@ import { NameFilterCondition } from "./filters/NameFilterCondition"; import { RoomNotificationStateStore } from "../notifications/RoomNotificationStateStore"; import { VisibilityProvider } from "./filters/VisibilityProvider"; import { SpaceWatcher } from "./SpaceWatcher"; +import SpaceStore from "../SpaceStore"; interface IState { tagsEnabled?: boolean; @@ -76,7 +77,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { } private setupWatchers() { - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { this.spaceWatcher = new SpaceWatcher(this); } else { this.tagWatcher = new TagWatcher(this); @@ -608,9 +609,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { // if spaces are enabled only consider the prefilter conditions when there are no runtime conditions // for the search all spaces feature - if (this.prefilterConditions.length > 0 - && (!SettingsStore.getValue("feature_spaces") || !this.filterConditions.length) - ) { + if (this.prefilterConditions.length > 0 && (!SpaceStore.spacesEnabled || !this.filterConditions.length)) { rooms = rooms.filter(r => { for (const filter of this.prefilterConditions) { if (!filter.isVisible(r)) { @@ -682,7 +681,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { } else { this.filterConditions.push(filter); // Runtime filters with spaces disable prefiltering for the search all spaces feature - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { // this has to be awaited so that `setKnownRooms` is called in time for the `addFilterCondition` below // this way the runtime filters are only evaluated on one dataset and not both. await this.recalculatePrefiltering(); @@ -715,7 +714,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { this.algorithm.removeFilterCondition(filter); } // Runtime filters with spaces disable prefiltering for the search all spaces feature - if (SettingsStore.getValue("feature_spaces")) { + if (SpaceStore.spacesEnabled) { promise = this.recalculatePrefiltering(); } } diff --git a/src/stores/room-list/SpaceWatcher.ts b/src/stores/room-list/SpaceWatcher.ts index a1f7786578..1cec612e6f 100644 --- a/src/stores/room-list/SpaceWatcher.ts +++ b/src/stores/room-list/SpaceWatcher.ts @@ -19,7 +19,6 @@ import { Room } from "matrix-js-sdk/src/models/room"; import { RoomListStoreClass } from "./RoomListStore"; import { SpaceFilterCondition } from "./filters/SpaceFilterCondition"; import SpaceStore, { UPDATE_SELECTED_SPACE } from "../SpaceStore"; -import SettingsStore from "../../settings/SettingsStore"; /** * Watches for changes in spaces to manage the filter on the provided RoomListStore @@ -29,7 +28,7 @@ export class SpaceWatcher { private activeSpace: Room = SpaceStore.instance.activeSpace; constructor(private store: RoomListStoreClass) { - if (!SettingsStore.getValue("feature_spaces.all_rooms")) { + if (!SpaceStore.spacesTweakAllRoomsEnabled) { this.filter = new SpaceFilterCondition(); this.updateFilter(); store.addFilter(this.filter); @@ -41,7 +40,7 @@ export class SpaceWatcher { this.activeSpace = activeSpace; if (this.filter) { - if (activeSpace || !SettingsStore.getValue("feature_spaces.all_rooms")) { + if (activeSpace || !SpaceStore.spacesTweakAllRoomsEnabled) { this.updateFilter(); } else { this.store.removeFilter(this.filter); diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/src/stores/room-list/algorithms/Algorithm.ts index 024c484c41..f50d112248 100644 --- a/src/stores/room-list/algorithms/Algorithm.ts +++ b/src/stores/room-list/algorithms/Algorithm.ts @@ -34,6 +34,7 @@ import { OrderingAlgorithm } from "./list-ordering/OrderingAlgorithm"; import { getListAlgorithmInstance } from "./list-ordering"; import SettingsStore from "../../../settings/SettingsStore"; import { VisibilityProvider } from "../filters/VisibilityProvider"; +import SpaceStore from "../../SpaceStore"; /** * Fired when the Algorithm has determined a list has been updated. @@ -199,7 +200,7 @@ export class Algorithm extends EventEmitter { } private async doUpdateStickyRoom(val: Room) { - if (SettingsStore.getValue("feature_spaces") && val?.isSpaceRoom() && val.getMyMembership() !== "invite") { + if (SpaceStore.spacesEnabled && val?.isSpaceRoom() && val.getMyMembership() !== "invite") { // no-op sticky rooms for spaces - they're effectively virtual rooms val = null; } diff --git a/src/stores/room-list/filters/VisibilityProvider.ts b/src/stores/room-list/filters/VisibilityProvider.ts index a6c55226b0..f63b622053 100644 --- a/src/stores/room-list/filters/VisibilityProvider.ts +++ b/src/stores/room-list/filters/VisibilityProvider.ts @@ -18,7 +18,7 @@ import { Room } from "matrix-js-sdk/src/models/room"; import CallHandler from "../../../CallHandler"; import { RoomListCustomisations } from "../../../customisations/RoomList"; import VoipUserMapper from "../../../VoipUserMapper"; -import SettingsStore from "../../../settings/SettingsStore"; +import SpaceStore from "../../SpaceStore"; export class VisibilityProvider { private static internalInstance: VisibilityProvider; @@ -50,7 +50,7 @@ export class VisibilityProvider { } // hide space rooms as they'll be shown in the SpacePanel - if (SettingsStore.getValue("feature_spaces") && room.isSpaceRoom()) { + if (SpaceStore.spacesEnabled && room.isSpaceRoom()) { return false; } From 80f9793c733866a4292103bb1a8f52febba32bed Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 08:29:50 +0100 Subject: [PATCH 121/135] only show space beta tweaks if you have the beta enabled as they do nothing otherwise --- src/components/views/beta/BetaCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/beta/BetaCard.tsx b/src/components/views/beta/BetaCard.tsx index 3127e1a915..ec662d831b 100644 --- a/src/components/views/beta/BetaCard.tsx +++ b/src/components/views/beta/BetaCard.tsx @@ -105,7 +105,7 @@ const BetaCard = ({ title: titleOverride, featureId }: IProps) => {
- { extraSettings &&
+ { extraSettings && value &&
{ extraSettings.map(key => ( )) } From f4788a642784cd918265a8879486f72c59f7ef45 Mon Sep 17 00:00:00 2001 From: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com> Date: Thu, 15 Jul 2021 09:55:58 +0100 Subject: [PATCH 122/135] Add dialpad to transfer dialog + various dialpad UI improvements (#6363) Co-authored-by: Germain Co-authored-by: Andrew Morgan Co-authored-by: David Baker --- res/css/_components.scss | 1 + res/css/structures/_TabbedView.scss | 110 ++++++-- res/css/views/dialogs/_InviteDialog.scss | 106 +++++++- .../elements/_DialPadBackspaceButton.scss | 40 +++ res/css/views/voip/_DialPad.scss | 41 +-- res/css/views/voip/_DialPadContextMenu.scss | 49 ++-- res/css/views/voip/_DialPadModal.scss | 36 +-- res/img/voip/tab-dialpad.svg | 3 + res/img/voip/tab-userdirectory.svg | 7 + res/themes/dark/css/_dark.scss | 2 +- src/CallHandler.tsx | 50 +++- src/components/structures/TabbedView.tsx | 21 +- .../views/context_menus/CallContextMenu.tsx | 2 +- .../context_menus/DialpadContextMenu.tsx | 29 +- src/components/views/dialogs/InviteDialog.tsx | 247 +++++++++++++----- .../views/elements/DialPadBackspaceButton.tsx | 31 +++ src/components/views/voip/DialPad.tsx | 23 +- src/components/views/voip/DialPadModal.tsx | 38 ++- src/dispatcher/actions.ts | 12 + .../payloads/TransferCallPayload.ts | 33 +++ src/i18n/strings/en_EN.json | 7 +- 21 files changed, 704 insertions(+), 184 deletions(-) create mode 100644 res/css/views/elements/_DialPadBackspaceButton.scss create mode 100644 res/img/voip/tab-dialpad.svg create mode 100644 res/img/voip/tab-userdirectory.svg create mode 100644 src/components/views/elements/DialPadBackspaceButton.tsx create mode 100644 src/dispatcher/payloads/TransferCallPayload.ts diff --git a/res/css/_components.scss b/res/css/_components.scss index 8f80f1bf97..bb22446258 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -120,6 +120,7 @@ @import "./views/elements/_AddressTile.scss"; @import "./views/elements/_DesktopBuildsNotice.scss"; @import "./views/elements/_DesktopCapturerSourcePicker.scss"; +@import "./views/elements/_DialPadBackspaceButton.scss"; @import "./views/elements/_DirectorySearchBox.scss"; @import "./views/elements/_Dropdown.scss"; @import "./views/elements/_EditableItemList.scss"; diff --git a/res/css/structures/_TabbedView.scss b/res/css/structures/_TabbedView.scss index 39a8ebed32..833450a25b 100644 --- a/res/css/structures/_TabbedView.scss +++ b/res/css/structures/_TabbedView.scss @@ -1,6 +1,7 @@ /* Copyright 2017 Travis Ralston Copyright 2019 New Vector Ltd +Copyright 2021 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,7 +21,6 @@ limitations under the License. padding: 0 0 0 16px; display: flex; flex-direction: column; - position: absolute; top: 0; bottom: 0; left: 0; @@ -28,11 +28,93 @@ limitations under the License. margin-top: 8px; } +.mx_TabbedView_tabsOnLeft { + flex-direction: column; + position: absolute; + + .mx_TabbedView_tabLabels { + width: 170px; + max-width: 170px; + position: fixed; + } + + .mx_TabbedView_tabPanel { + margin-left: 240px; // 170px sidebar + 70px padding + flex-direction: column; + } + + .mx_TabbedView_tabLabel_active { + background-color: $tab-label-active-bg-color; + color: $tab-label-active-fg-color; + } + + .mx_TabbedView_tabLabel_active .mx_TabbedView_maskedIcon::before { + background-color: $tab-label-active-icon-bg-color; + } + + .mx_TabbedView_maskedIcon { + width: 16px; + height: 16px; + margin-left: 8px; + margin-right: 16px; + } + + .mx_TabbedView_maskedIcon::before { + mask-size: 16px; + width: 16px; + height: 16px; + } +} + +.mx_TabbedView_tabsOnTop { + flex-direction: column; + + .mx_TabbedView_tabLabels { + display: flex; + margin-bottom: 8px; + } + + .mx_TabbedView_tabLabel { + padding-left: 0px; + padding-right: 52px; + + .mx_TabbedView_tabLabel_text { + font-size: 15px; + color: $tertiary-fg-color; + } + } + + .mx_TabbedView_tabPanel { + flex-direction: row; + } + + .mx_TabbedView_tabLabel_active { + color: $accent-color; + .mx_TabbedView_tabLabel_text { + color: $accent-color; + } + } + + .mx_TabbedView_tabLabel_active .mx_TabbedView_maskedIcon::before { + background-color: $accent-color; + } + + .mx_TabbedView_maskedIcon { + width: 22px; + height: 22px; + margin-left: 0px; + margin-right: 8px; + } + + .mx_TabbedView_maskedIcon::before { + mask-size: 22px; + width: inherit; + height: inherit; + } +} + .mx_TabbedView_tabLabels { - width: 170px; - max-width: 170px; color: $tab-label-fg-color; - position: fixed; } .mx_TabbedView_tabLabel { @@ -46,43 +128,25 @@ limitations under the License. position: relative; } -.mx_TabbedView_tabLabel_active { - background-color: $tab-label-active-bg-color; - color: $tab-label-active-fg-color; -} - .mx_TabbedView_maskedIcon { - margin-left: 8px; - margin-right: 16px; - width: 16px; - height: 16px; display: inline-block; } .mx_TabbedView_maskedIcon::before { display: inline-block; - background-color: $tab-label-icon-bg-color; + background-color: $icon-button-color; mask-repeat: no-repeat; - mask-size: 16px; - width: 16px; - height: 16px; mask-position: center; content: ''; } -.mx_TabbedView_tabLabel_active .mx_TabbedView_maskedIcon::before { - background-color: $tab-label-active-icon-bg-color; -} - .mx_TabbedView_tabLabel_text { vertical-align: middle; } .mx_TabbedView_tabPanel { - margin-left: 240px; // 170px sidebar + 70px padding flex-grow: 1; display: flex; - flex-direction: column; min-height: 0; // firefox } diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index c01b43c1c4..9fc4b7a15c 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -14,6 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_InviteDialog_transferWrapper .mx_Dialog { + padding-bottom: 16px; +} + .mx_InviteDialog_addressBar { display: flex; flex-direction: row; @@ -286,16 +290,41 @@ limitations under the License. } } -.mx_InviteDialog { +.mx_InviteDialog_other { // Prevent the dialog from jumping around randomly when elements change. height: 600px; padding-left: 20px; // the design wants some padding on the left - display: flex; + + .mx_InviteDialog_userSections { + height: calc(100% - 115px); // mx_InviteDialog's height minus some for the upper and lower elements + } +} + +.mx_InviteDialog_content { + height: calc(100% - 36px); // full height minus the size of the header + overflow: hidden; +} + +.mx_InviteDialog_transfer { + width: 496px; + height: 466px; flex-direction: column; .mx_InviteDialog_content { - overflow: hidden; - height: 100%; + flex-direction: column; + + .mx_TabbedView { + height: calc(100% - 60px); + } + overflow: visible; + } + + .mx_InviteDialog_addressBar { + margin-top: 8px; + } + + input[type="checkbox"] { + margin-right: 8px; } } @@ -303,7 +332,6 @@ limitations under the License. margin-top: 4px; overflow-y: auto; padding: 0 45px 4px 0; - height: calc(100% - 115px); // mx_InviteDialog's height minus some for the upper and lower elements } .mx_InviteDialog_hasFooter .mx_InviteDialog_userSections { @@ -318,6 +346,74 @@ limitations under the License. padding: 0; } +.mx_InviteDialog_dialPad .mx_InviteDialog_dialPadField { + border-top: 0; + border-left: 0; + border-right: 0; + border-radius: 0; + margin-top: 0; + border-color: $quaternary-fg-color; + + input { + font-size: 18px; + font-weight: 600; + padding-top: 0; + } +} + +.mx_InviteDialog_dialPad .mx_InviteDialog_dialPadField:focus-within { + border-color: $accent-color; +} + +.mx_InviteDialog_dialPadField .mx_Field_postfix { + /* Remove border separator between postfix and field content */ + border-left: none; +} + +.mx_InviteDialog_dialPad { + width: 224px; + margin-top: 16px; + margin-left: auto; + margin-right: auto; +} + +.mx_InviteDialog_dialPad .mx_DialPad { + row-gap: 16px; + column-gap: 48px; + + margin-left: auto; + margin-right: auto; +} + +.mx_InviteDialog_transferConsultConnect { + padding-top: 16px; + /* This wants a drop shadow the full width of the dialog, so relative-position it + * and make it wider, then compensate with padding + */ + position: relative; + width: 496px; + left: -24px; + padding-left: 24px; + padding-right: 24px; + border-top: 1px solid $message-body-panel-bg-color; + + display: flex; + flex-direction: row; + align-items: center; +} + +.mx_InviteDialog_transferConsultConnect_pushRight { + margin-left: auto; +} + +.mx_InviteDialog_userDirectoryIcon::before { + mask-image: url('$(res)/img/voip/tab-userdirectory.svg'); +} + +.mx_InviteDialog_dialPadIcon::before { + mask-image: url('$(res)/img/voip/tab-dialpad.svg'); +} + .mx_InviteDialog_multiInviterError { > h4 { font-size: $font-15px; diff --git a/res/css/views/elements/_DialPadBackspaceButton.scss b/res/css/views/elements/_DialPadBackspaceButton.scss new file mode 100644 index 0000000000..40e4af7025 --- /dev/null +++ b/res/css/views/elements/_DialPadBackspaceButton.scss @@ -0,0 +1,40 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_DialPadBackspaceButton { + position: relative; + height: 28px; + width: 28px; + + &::before { + /* force this element to appear on the DOM */ + content: ""; + + background-color: #8D97A5; + width: inherit; + height: inherit; + top: 0px; + left: 0px; + position: absolute; + display: inline-block; + vertical-align: middle; + + mask-image: url('$(res)/img/element-icons/call/delete.svg'); + mask-position: 8px; + mask-size: 20px; + mask-repeat: no-repeat; + } +} diff --git a/res/css/views/voip/_DialPad.scss b/res/css/views/voip/_DialPad.scss index 483b131bfe..eefd2e9ba5 100644 --- a/res/css/views/voip/_DialPad.scss +++ b/res/css/views/voip/_DialPad.scss @@ -16,11 +16,21 @@ limitations under the License. .mx_DialPad { display: grid; + row-gap: 16px; + column-gap: 0px; + margin-top: 24px; + margin-left: auto; + margin-right: auto; + + /* squeeze the dial pad buttons together horizontally */ grid-template-columns: repeat(3, 1fr); - gap: 16px; } .mx_DialPad_button { + display: flex; + flex-direction: column; + justify-content: center; + width: 40px; height: 40px; background-color: $dialpad-button-bg-color; @@ -29,10 +39,19 @@ limitations under the License. font-weight: 600; text-align: center; vertical-align: middle; - line-height: 40px; + margin-left: auto; + margin-right: auto; } -.mx_DialPad_deleteButton, .mx_DialPad_dialButton { +.mx_DialPad_button .mx_DialPad_buttonSubText { + font-size: 8px; +} + +.mx_DialPad_dialButton { + /* Always show the dial button in the center grid column */ + grid-column: 2; + background-color: $accent-color; + &::before { content: ''; display: inline-block; @@ -42,21 +61,7 @@ limitations under the License. mask-repeat: no-repeat; mask-size: 20px; mask-position: center; - background-color: $primary-bg-color; - } -} - -.mx_DialPad_deleteButton { - background-color: $notice-primary-color; - &::before { - mask-image: url('$(res)/img/element-icons/call/delete.svg'); - mask-position: 9px; // delete icon is right-heavy so have to be slightly to the left to look centered - } -} - -.mx_DialPad_dialButton { - background-color: $accent-color; - &::before { + background-color: #FFF; // on all themes mask-image: url('$(res)/img/element-icons/call/voice-call.svg'); } } diff --git a/res/css/views/voip/_DialPadContextMenu.scss b/res/css/views/voip/_DialPadContextMenu.scss index 31327113cf..0019994e72 100644 --- a/res/css/views/voip/_DialPadContextMenu.scss +++ b/res/css/views/voip/_DialPadContextMenu.scss @@ -14,10 +14,40 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_DialPadContextMenu_dialPad .mx_DialPad { + row-gap: 16px; + column-gap: 32px; +} + +.mx_DialPadContextMenuWrapper { + padding: 15px; +} + .mx_DialPadContextMenu_header { - margin-top: 12px; - margin-left: 12px; - margin-right: 12px; + border: none; + margin-top: 32px; + margin-left: 20px; + margin-right: 20px; + + /* a separator between the input line and the dial buttons */ + border-bottom: 1px solid $quaternary-fg-color; + transition: border-bottom 0.25s; +} + +.mx_DialPadContextMenu_cancel { + float: right; + mask: url('$(res)/img/feather-customised/cancel.svg'); + mask-repeat: no-repeat; + mask-position: center; + mask-size: cover; + width: 14px; + height: 14px; + background-color: $dialog-close-fg-color; + cursor: pointer; +} + +.mx_DialPadContextMenu_header:focus-within { + border-bottom: 1px solid $accent-color; } .mx_DialPadContextMenu_title { @@ -30,7 +60,6 @@ limitations under the License. height: 1.5em; font-size: 18px; font-weight: 600; - max-width: 150px; border: none; margin: 0px; } @@ -38,7 +67,7 @@ limitations under the License. font-size: 18px; font-weight: 600; overflow: hidden; - max-width: 150px; + max-width: 185px; text-align: left; direction: rtl; padding: 8px 0px; @@ -48,13 +77,3 @@ limitations under the License. .mx_DialPadContextMenu_dialPad { margin: 16px; } - -.mx_DialPadContextMenu_horizSep { - position: relative; - &::before { - content: ''; - position: absolute; - width: 100%; - border-bottom: 1px solid $input-darker-bg-color; - } -} diff --git a/res/css/views/voip/_DialPadModal.scss b/res/css/views/voip/_DialPadModal.scss index f9d7673a38..b8042f77ae 100644 --- a/res/css/views/voip/_DialPadModal.scss +++ b/res/css/views/voip/_DialPadModal.scss @@ -19,14 +19,23 @@ limitations under the License. } .mx_DialPadModal { - width: 192px; - height: 368px; + width: 292px; + height: 370px; + padding: 16px 0px 0px 0px; } .mx_DialPadModal_header { - margin-top: 12px; - margin-left: 12px; - margin-right: 12px; + margin-top: 32px; + margin-left: 40px; + margin-right: 40px; + + /* a separator between the input line and the dial buttons */ + border-bottom: 1px solid $quaternary-fg-color; + transition: border-bottom 0.25s; +} + +.mx_DialPadModal_header:focus-within { + border-bottom: 1px solid $accent-color; } .mx_DialPadModal_title { @@ -45,11 +54,18 @@ limitations under the License. height: 14px; background-color: $dialog-close-fg-color; cursor: pointer; + margin-right: 16px; } .mx_DialPadModal_field { border: none; margin: 0px; + height: 30px; +} + +.mx_DialPadModal_field .mx_Field_postfix { + /* Remove border separator between postfix and field content */ + border-left: none; } .mx_DialPadModal_field input { @@ -62,13 +78,3 @@ limitations under the License. margin-right: 16px; margin-top: 16px; } - -.mx_DialPadModal_horizSep { - position: relative; - &::before { - content: ''; - position: absolute; - width: 100%; - border-bottom: 1px solid $input-darker-bg-color; - } -} diff --git a/res/img/voip/tab-dialpad.svg b/res/img/voip/tab-dialpad.svg new file mode 100644 index 0000000000..b7add0addb --- /dev/null +++ b/res/img/voip/tab-dialpad.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/img/voip/tab-userdirectory.svg b/res/img/voip/tab-userdirectory.svg new file mode 100644 index 0000000000..792ded7be4 --- /dev/null +++ b/res/img/voip/tab-userdirectory.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 57cbc7efa9..74b33fbd02 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -118,7 +118,7 @@ $voipcall-plinth-color: #394049; // ******************** $theme-button-bg-color: #e3e8f0; -$dialpad-button-bg-color: #6F7882; +$dialpad-button-bg-color: #394049; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $bg-color; diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index a0adee6b8d..f90854ee64 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -394,7 +394,7 @@ export default class CallHandler extends EventEmitter { } private setCallListeners(call: MatrixCall) { - let mappedRoomId = CallHandler.sharedInstance().roomIdForCall(call); + let mappedRoomId = this.roomIdForCall(call); call.on(CallEvent.Error, (err: CallError) => { if (!this.matchesCallForThisRoom(call)) return; @@ -871,6 +871,12 @@ export default class CallHandler extends EventEmitter { case Action.DialNumber: this.dialNumber(payload.number); break; + case Action.TransferCallToMatrixID: + this.startTransferToMatrixID(payload.call, payload.destination, payload.consultFirst); + break; + case Action.TransferCallToPhoneNumber: + this.startTransferToPhoneNumber(payload.call, payload.destination, payload.consultFirst); + break; } }; @@ -905,6 +911,48 @@ export default class CallHandler extends EventEmitter { }); } + private async startTransferToPhoneNumber(call: MatrixCall, destination: string, consultFirst: boolean) { + const results = await this.pstnLookup(destination); + if (!results || results.length === 0 || !results[0].userid) { + Modal.createTrackedDialog('', '', ErrorDialog, { + title: _t("Unable to transfer call"), + description: _t("There was an error looking up the phone number"), + }); + return; + } + + await this.startTransferToMatrixID(call, results[0].userid, consultFirst); + } + + private async startTransferToMatrixID(call: MatrixCall, destination: string, consultFirst: boolean) { + if (consultFirst) { + const dmRoomId = await ensureDMExists(MatrixClientPeg.get(), destination); + + dis.dispatch({ + action: 'place_call', + type: call.type, + room_id: dmRoomId, + transferee: call, + }); + dis.dispatch({ + action: 'view_room', + room_id: dmRoomId, + should_peek: false, + joining: false, + }); + } else { + try { + await call.transfer(destination); + } catch (e) { + console.log("Failed to transfer call", e); + Modal.createTrackedDialog('Failed to transfer call', '', ErrorDialog, { + title: _t('Transfer Failed'), + description: _t('Failed to transfer call'), + }); + } + } + } + setActiveCallRoomId(activeCallRoomId: string) { logger.info("Setting call in room " + activeCallRoomId + " active"); diff --git a/src/components/structures/TabbedView.tsx b/src/components/structures/TabbedView.tsx index dcfde94811..19694cd769 100644 --- a/src/components/structures/TabbedView.tsx +++ b/src/components/structures/TabbedView.tsx @@ -20,6 +20,7 @@ import * as React from "react"; import { _t } from '../../languageHandler'; import AutoHideScrollbar from './AutoHideScrollbar'; import { replaceableComponent } from "../../utils/replaceableComponent"; +import classNames from "classnames"; import AccessibleButton from "../views/elements/AccessibleButton"; /** @@ -37,9 +38,16 @@ export class Tab { } } +export enum TabLocation { + LEFT = 'left', + TOP = 'top', +} + interface IProps { tabs: Tab[]; initialTabId?: string; + tabLocation: TabLocation; + onChange?: (tabId: string) => void; } interface IState { @@ -62,6 +70,10 @@ export default class TabbedView extends React.Component { }; } + static defaultProps = { + tabLocation: TabLocation.LEFT, + }; + private _getActiveTabIndex() { if (!this.state || !this.state.activeTabIndex) return 0; return this.state.activeTabIndex; @@ -75,6 +87,7 @@ export default class TabbedView extends React.Component { private _setActiveTab(tab: Tab) { const idx = this.props.tabs.indexOf(tab); if (idx !== -1) { + if (this.props.onChange) this.props.onChange(tab.id); this.setState({ activeTabIndex: idx }); } else { console.error("Could not find tab " + tab.label + " in tabs"); @@ -119,8 +132,14 @@ export default class TabbedView extends React.Component { const labels = this.props.tabs.map(tab => this._renderTabLabel(tab)); const panel = this._renderTabPanel(this.props.tabs[this._getActiveTabIndex()]); + const tabbedViewClasses = classNames({ + 'mx_TabbedView': true, + 'mx_TabbedView_tabsOnLeft': this.props.tabLocation == TabLocation.LEFT, + 'mx_TabbedView_tabsOnTop': this.props.tabLocation == TabLocation.TOP, + }); + return ( -
+
{labels}
diff --git a/src/components/views/context_menus/CallContextMenu.tsx b/src/components/views/context_menus/CallContextMenu.tsx index 428e18ed30..76e1670669 100644 --- a/src/components/views/context_menus/CallContextMenu.tsx +++ b/src/components/views/context_menus/CallContextMenu.tsx @@ -53,7 +53,7 @@ export default class CallContextMenu extends React.Component { onTransferClick = () => { Modal.createTrackedDialog( 'Transfer Call', '', InviteDialog, { kind: KIND_CALL_TRANSFER, call: this.props.call }, - /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, + /*className=*/"mx_InviteDialog_transferWrapper", /*isPriority=*/false, /*isStatic=*/true, ); this.props.onFinished(); }; diff --git a/src/components/views/context_menus/DialpadContextMenu.tsx b/src/components/views/context_menus/DialpadContextMenu.tsx index 28a73ba8d4..39dfd50795 100644 --- a/src/components/views/context_menus/DialpadContextMenu.tsx +++ b/src/components/views/context_menus/DialpadContextMenu.tsx @@ -15,11 +15,11 @@ limitations under the License. */ import React from 'react'; -import { _t } from '../../../languageHandler'; +import AccessibleButton from "../elements/AccessibleButton"; import { ContextMenu, IProps as IContextMenuProps } from '../../structures/ContextMenu'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import Field from "../elements/Field"; -import Dialpad from '../voip/DialPad'; +import DialPad from '../voip/DialPad'; import { replaceableComponent } from "../../../utils/replaceableComponent"; interface IProps extends IContextMenuProps { @@ -45,24 +45,29 @@ export default class DialpadContextMenu extends React.Component this.setState({ value: this.state.value + digit }); }; + onCancelClick = () => { + this.props.onFinished(); + }; + onChange = (ev) => { this.setState({ value: ev.target.value }); }; render() { return -
+
- {_t("Dial pad")} + +
+
+ +
+
+
- -
-
-
-
; } diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index c9475d4849..f8b2297f5c 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -32,7 +32,6 @@ import Modal from "../../../Modal"; import { humanizeTime } from "../../../utils/humanize"; import createRoom, { canEncryptToAllUsers, - ensureDMExists, findDMForUser, privateShouldBeEncrypted, } from "../../../createRoom"; @@ -64,9 +63,14 @@ import { copyPlaintext, selectText } from "../../../utils/strings"; import * as ContextMenu from "../../structures/ContextMenu"; import { toRightOf } from "../../structures/ContextMenu"; import GenericTextContextMenu from "../context_menus/GenericTextContextMenu"; +import { TransferCallPayload } from '../../../dispatcher/payloads/TransferCallPayload'; +import Field from '../elements/Field'; +import TabbedView, { Tab, TabLocation } from '../../structures/TabbedView'; +import Dialpad from '../voip/DialPad'; import QuestionDialog from "./QuestionDialog"; import Spinner from "../elements/Spinner"; import BaseDialog from "./BaseDialog"; +import DialPadBackspaceButton from "../elements/DialPadBackspaceButton"; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ @@ -79,11 +83,19 @@ interface IRecentUser { export const KIND_DM = "dm"; export const KIND_INVITE = "invite"; +// NB. This dialog needs the 'mx_InviteDialog_transferWrapper' wrapper class to have the correct +// padding on the bottom (because all modals have 24px padding on all sides), so this needs to +// be passed when creating the modal export const KIND_CALL_TRANSFER = "call_transfer"; const INITIAL_ROOMS_SHOWN = 3; // Number of rooms to show at first const INCREMENT_ROOMS_SHOWN = 5; // Number of rooms to add when 'show more' is clicked +enum TabId { + UserDirectory = 'users', + DialPad = 'dialpad', +} + // This is the interface that is expected by various components in the Invite Dialog and RoomInvite. // It is a bit awkward because it also matches the RoomMember class from the js-sdk with some extra support // for 3PIDs/email addresses. @@ -356,6 +368,8 @@ interface IInviteDialogState { canUseIdentityServer: boolean; tryingIdentityServer: boolean; consultFirst: boolean; + dialPadValue: string; + currentTabId: TabId; // These two flags are used for the 'Go' button to communicate what is going on. busy: boolean; @@ -407,6 +421,8 @@ export default class InviteDialog extends React.PureComponent { - this.convertFilter(); - const targets = this.convertFilter(); - const targetIds = targets.map(t => t.userId); - if (targetIds.length > 1) { - this.setState({ - errorText: _t("A call can only be transferred to a single user."), - }); - } - - if (this.state.consultFirst) { - const dmRoomId = await ensureDMExists(MatrixClientPeg.get(), targetIds[0]); - - dis.dispatch({ - action: 'place_call', - type: this.props.call.type, - room_id: dmRoomId, - transferee: this.props.call, - }); - dis.dispatch({ - action: 'view_room', - room_id: dmRoomId, - should_peek: false, - joining: false, - }); - this.props.onFinished(); - } else { - this.setState({ busy: true }); - try { - await this.props.call.transfer(targetIds[0]); - this.setState({ busy: false }); - this.props.onFinished(); - } catch (e) { + if (this.state.currentTabId == TabId.UserDirectory) { + this.convertFilter(); + const targets = this.convertFilter(); + const targetIds = targets.map(t => t.userId); + if (targetIds.length > 1) { this.setState({ - busy: false, - errorText: _t("Failed to transfer call"), + errorText: _t("A call can only be transferred to a single user."), }); + return; } + + dis.dispatch({ + action: Action.TransferCallToMatrixID, + call: this.props.call, + destination: targetIds[0], + consultFirst: this.state.consultFirst, + } as TransferCallPayload); + } else { + dis.dispatch({ + action: Action.TransferCallToPhoneNumber, + call: this.props.call, + destination: this.state.dialPadValue, + consultFirst: this.state.consultFirst, + } as TransferCallPayload); } + this.props.onFinished(); }; private onKeyDown = (e) => { @@ -827,6 +831,10 @@ export default class InviteDialog extends React.PureComponent { + this.props.onFinished([]); + }; + private updateSuggestions = async (term) => { MatrixClientPeg.get().searchUserDirectory({ term }).then(async r => { if (term !== this.state.filterText) { @@ -962,11 +970,14 @@ export default class InviteDialog extends React.PureComponent { if (!this.state.busy) { let filterText = this.state.filterText; - const targets = this.state.targets.map(t => t); // cheap clone for mutation + let targets = this.state.targets.map(t => t); // cheap clone for mutation const idx = targets.indexOf(member); if (idx >= 0) { targets.splice(idx, 1); } else { + if (this.props.kind === KIND_CALL_TRANSFER && targets.length > 0) { + targets = []; + } targets.push(member); filterText = ""; // clear the filter when the user accepts a suggestion } @@ -1189,6 +1200,11 @@ export default class InviteDialog extends React.PureComponent ( )); @@ -1201,8 +1217,9 @@ export default class InviteDialog extends React.PureComponent 0)} autoComplete="off" + placeholder={hasPlaceholder ? _t("Search") : null} /> ); return ( @@ -1249,6 +1266,28 @@ export default class InviteDialog extends React.PureComponent { + ev.preventDefault(); + this.transferCall(); + }; + + private onDialChange = ev => { + this.setState({ dialPadValue: ev.currentTarget.value }); + }; + + private onDigitPress = digit => { + this.setState({ dialPadValue: this.state.dialPadValue + digit }); + }; + + private onDeletePress = () => { + if (this.state.dialPadValue.length === 0) return; + this.setState({ dialPadValue: this.state.dialPadValue.slice(0, -1) }); + }; + + private onTabChange = (tabId: TabId) => { + this.setState({ currentTabId: tabId }); + }; + private async onLinkClick(e) { e.preventDefault(); selectText(e.target); @@ -1278,12 +1317,16 @@ export default class InviteDialog extends React.PureComponent; const identityServersEnabled = SettingsStore.getValue(UIFeature.IdentityServer); + const hasSelection = this.state.targets.length > 0 + || (this.state.filterText && this.state.filterText.includes('@')); + const cli = MatrixClientPeg.get(); const userId = cli.getUserId(); if (this.props.kind === KIND_DM) { @@ -1421,23 +1464,116 @@ export default class InviteDialog extends React.PureComponent + + consultConnectSection =
+ + {_t("Cancel")} + + + {_t("Transfer")} +
; } else { console.error("Unknown kind of InviteDialog: " + this.props.kind); } - const hasSelection = this.state.targets.length > 0 - || (this.state.filterText && this.state.filterText.includes('@')); + const goButton = this.props.kind == KIND_CALL_TRANSFER ? null : + {buttonText} + ; + + const usersSection = +

{helpText}

+
+ {this.renderEditor()} +
+ {goButton} + {spinner} +
+
+ {keySharingWarning} + {this.renderIdentityServerWarning()} +
{this.state.errorText}
+
+ {this.renderSection('recents')} + {this.renderSection('suggestions')} + {extraSection} +
+ {footer} +
; + + let dialogContent; + if (this.props.kind === KIND_CALL_TRANSFER) { + const tabs = []; + tabs.push(new Tab( + TabId.UserDirectory, _td("User Directory"), 'mx_InviteDialog_userDirectoryIcon', usersSection, + )); + + const backspaceButton = ( + + ); + + // Only show the backspace button if the field has content + let dialPadField; + if (this.state.dialPadValue.length !== 0) { + dialPadField = ; + } else { + dialPadField = ; + } + + const dialPadSection =
+
+ {dialPadField} +
+ +
; + tabs.push(new Tab(TabId.DialPad, _td("Dial pad"), 'mx_InviteDialog_dialPadIcon', dialPadSection)); + dialogContent = + + {consultConnectSection} + ; + } else { + dialogContent = + {usersSection} + {consultConnectSection} + ; + } + return (
-

{helpText}

-
- {this.renderEditor()} -
- - {buttonText} - - {spinner} -
-
- {keySharingWarning} - {this.renderIdentityServerWarning()} -
{this.state.errorText}
-
- {this.renderSection('recents')} - {this.renderSection('suggestions')} - {extraSection} -
- {footer} + {dialogContent}
); diff --git a/src/components/views/elements/DialPadBackspaceButton.tsx b/src/components/views/elements/DialPadBackspaceButton.tsx new file mode 100644 index 0000000000..69f0fcb39a --- /dev/null +++ b/src/components/views/elements/DialPadBackspaceButton.tsx @@ -0,0 +1,31 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import * as React from "react"; +import AccessibleButton from "./AccessibleButton"; + +interface IProps { + // Callback for when the button is pressed + onBackspacePress: () => void; +} + +export default class DialPadBackspaceButton extends React.PureComponent { + render() { + return
+ +
; + } +} diff --git a/src/components/views/voip/DialPad.tsx b/src/components/views/voip/DialPad.tsx index dff7a8f748..6687c89b52 100644 --- a/src/components/views/voip/DialPad.tsx +++ b/src/components/views/voip/DialPad.tsx @@ -19,16 +19,17 @@ import AccessibleButton from "../elements/AccessibleButton"; import { replaceableComponent } from "../../../utils/replaceableComponent"; const BUTTONS = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#']; +const BUTTON_LETTERS = ['', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ', '', '+', '']; enum DialPadButtonKind { Digit, - Delete, Dial, } interface IButtonProps { kind: DialPadButtonKind; digit?: string; + digitSubtext?: string; onButtonPress: (string) => void; } @@ -42,11 +43,10 @@ class DialPadButton extends React.PureComponent { case DialPadButtonKind.Digit: return {this.props.digit} +
+ {this.props.digitSubtext} +
; - case DialPadButtonKind.Delete: - return ; case DialPadButtonKind.Dial: return ; } @@ -55,7 +55,7 @@ class DialPadButton extends React.PureComponent { interface IProps { onDigitPress: (string) => void; - hasDialAndDelete: boolean; + hasDial: boolean; onDeletePress?: (string) => void; onDialPress?: (string) => void; } @@ -65,16 +65,15 @@ export default class Dialpad extends React.PureComponent { render() { const buttonNodes = []; - for (const button of BUTTONS) { + for (let i = 0; i < BUTTONS.length; i++) { + const button = BUTTONS[i]; + const digitSubtext = BUTTON_LETTERS[i]; buttonNodes.push(); } - if (this.props.hasDialAndDelete) { - buttonNodes.push(); + if (this.props.hasDial) { buttonNodes.push(); diff --git a/src/components/views/voip/DialPadModal.tsx b/src/components/views/voip/DialPadModal.tsx index 5e5903531e..033aa2e700 100644 --- a/src/components/views/voip/DialPadModal.tsx +++ b/src/components/views/voip/DialPadModal.tsx @@ -15,7 +15,6 @@ limitations under the License. */ import * as React from "react"; -import { _t } from "../../../languageHandler"; import AccessibleButton from "../elements/AccessibleButton"; import Field from "../elements/Field"; import DialPad from './DialPad'; @@ -23,6 +22,7 @@ import dis from '../../../dispatcher/dispatcher'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { DialNumberPayload } from "../../../dispatcher/payloads/DialNumberPayload"; import { Action } from "../../../dispatcher/actions"; +import DialPadBackspaceButton from "../elements/DialPadBackspaceButton"; interface IProps { onFinished: (boolean) => void; @@ -74,22 +74,38 @@ export default class DialpadModal extends React.PureComponent { }; render() { + const backspaceButton = ( + + ); + + // Only show the backspace button if the field has content + let dialPadField; + if (this.state.value.length !== 0) { + dialPadField = ; + } else { + dialPadField = ; + } + return
+
+ +
-
- {_t("Dial pad")} - -
- + {dialPadField}
-
- Date: Thu, 15 Jul 2021 10:59:52 +0100 Subject: [PATCH 123/135] Fix tests --- test/editor/caret-test.js | 1 + test/editor/model-test.js | 1 + test/editor/operations-test.js | 1 + test/editor/position-test.js | 1 + test/editor/range-test.js | 1 + test/editor/serialize-test.js | 1 + test/stores/SpaceStore-setup.ts | 23 +++++++++++++++++++++++ test/stores/SpaceStore-test.ts | 20 ++------------------ 8 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 test/stores/SpaceStore-setup.ts diff --git a/test/editor/caret-test.js b/test/editor/caret-test.js index e1a66a4431..33b40e1c64 100644 --- a/test/editor/caret-test.js +++ b/test/editor/caret-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import { getLineAndNodePosition } from "../../src/editor/caret"; import EditorModel from "../../src/editor/model"; import { createPartCreator } from "./mock"; diff --git a/test/editor/model-test.js b/test/editor/model-test.js index 35bd4143a7..15c5af5806 100644 --- a/test/editor/model-test.js +++ b/test/editor/model-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import EditorModel from "../../src/editor/model"; import { createPartCreator, createRenderer } from "./mock"; diff --git a/test/editor/operations-test.js b/test/editor/operations-test.js index 32ccaa5440..17a4c8ba11 100644 --- a/test/editor/operations-test.js +++ b/test/editor/operations-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import EditorModel from "../../src/editor/model"; import { createPartCreator, createRenderer } from "./mock"; import { toggleInlineFormat } from "../../src/editor/operations"; diff --git a/test/editor/position-test.js b/test/editor/position-test.js index 813a8e9f7f..ea8658b216 100644 --- a/test/editor/position-test.js +++ b/test/editor/position-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import EditorModel from "../../src/editor/model"; import { createPartCreator } from "./mock"; diff --git a/test/editor/range-test.js b/test/editor/range-test.js index d411a0d911..87c5b06e44 100644 --- a/test/editor/range-test.js +++ b/test/editor/range-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import EditorModel from "../../src/editor/model"; import { createPartCreator, createRenderer } from "./mock"; diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index 691130bd34..085a8afdba 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import "../skinned-sdk"; // Must be first for skinning to work import EditorModel from "../../src/editor/model"; import { htmlSerializeIfNeeded } from "../../src/editor/serialize"; import { createPartCreator } from "./mock"; diff --git a/test/stores/SpaceStore-setup.ts b/test/stores/SpaceStore-setup.ts new file mode 100644 index 0000000000..67d492255f --- /dev/null +++ b/test/stores/SpaceStore-setup.ts @@ -0,0 +1,23 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This needs to be executed before the SpaceStore gets imported but due to ES6 import hoisting we have to do this here. +// SpaceStore reads the SettingsStore which needs the localStorage values set at init time. + +localStorage.setItem("mx_labs_feature_feature_spaces", "true"); +localStorage.setItem("mx_labs_feature_feature_spaces.all_rooms", "true"); +localStorage.setItem("mx_labs_feature_feature_spaces.space_member_dms", "true"); +localStorage.setItem("mx_labs_feature_feature_spaces.space_dm_badges", "false"); diff --git a/test/stores/SpaceStore-test.ts b/test/stores/SpaceStore-test.ts index 4cbd9f43c8..eb28a72d67 100644 --- a/test/stores/SpaceStore-test.ts +++ b/test/stores/SpaceStore-test.ts @@ -16,7 +16,9 @@ limitations under the License. import { EventEmitter } from "events"; import { EventType } from "matrix-js-sdk/src/@types/event"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import "./SpaceStore-setup"; // enable space lab import "../skinned-sdk"; // Must be first for skinning to work import SpaceStore, { UPDATE_INVITED_SPACES, @@ -26,13 +28,10 @@ import SpaceStore, { import { resetAsyncStoreWithClient, setupAsyncStoreWithClient } from "../utils/test-utils"; import { mkEvent, mkStubRoom, stubClient } from "../test-utils"; import { EnhancedMap } from "../../src/utils/maps"; -import SettingsStore from "../../src/settings/SettingsStore"; import DMRoomMap from "../../src/utils/DMRoomMap"; import { MatrixClientPeg } from "../../src/MatrixClientPeg"; import defaultDispatcher from "../../src/dispatcher/dispatcher"; -type MatrixEvent = any; // importing from js-sdk upsets things - jest.useFakeTimers(); const mockStateEventImplementation = (events: MatrixEvent[]) => { @@ -79,9 +78,6 @@ const mkSpace = (spaceId: string, children: string[] = []) => { return space; }; -const getValue = jest.fn(); -SettingsStore.getValue = getValue; - const getUserIdForRoomId = jest.fn(); // @ts-ignore DMRoomMap.sharedInstance = { getUserIdForRoomId }; @@ -122,18 +118,6 @@ describe("SpaceStore", () => { beforeEach(() => { jest.runAllTimers(); client.getVisibleRooms.mockReturnValue(rooms = []); - getValue.mockImplementation(settingName => { - switch (settingName) { - case "feature_spaces": - return true; - case "feature_spaces.all_rooms": - return true; - case "feature_spaces.space_member_dms": - return true; - case "feature_spaces.space_dm_badges": - return false; - } - }); }); afterEach(async () => { await resetAsyncStoreWithClient(store); From 59feff376306c64e94c8c8606e8252aa0863904c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 11:49:15 +0100 Subject: [PATCH 124/135] Silence RoomListStore possible memory leak warning --- src/stores/room-list/RoomListStore.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index e26c80bb2d..5d26056a7d 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -73,6 +73,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { constructor() { super(defaultDispatcher); + this.setMaxListeners(20); // CustomRoomTagStore + RoomList + LeftPanel + 8xRoomSubList + spares } private setupWatchers() { From b8ac40ae55a169dc9c27cabeaeb1fe5e21f99f2f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 11:49:44 +0100 Subject: [PATCH 125/135] Fix React missing key error --- src/components/views/rooms/EventTile.tsx | 31 ++++++++++++------------ 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index b5a4bc41db..14eab5da2e 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -1152,11 +1152,11 @@ export default class EventTile extends React.Component { "aria-live": ariaLive, "aria-atomic": true, "data-scroll-tokens": scrollToken, - }, [ - ircTimestamp, - avatar, - sender, - ircPadlock, + }, <> + { ircTimestamp } + { avatar } + { sender } + { ircPadlock }
{ groupTimestamp } { groupPadlock } @@ -1169,8 +1169,8 @@ export default class EventTile extends React.Component { replacingEventId={this.props.replacingEventId} showUrlPreview={false} /> -
, - ]); +
+ ); } default: { const thread = ReplyThread.makeThread( @@ -1193,10 +1193,10 @@ export default class EventTile extends React.Component { "data-scroll-tokens": scrollToken, "onMouseEnter": () => this.setState({ hover: true }), "onMouseLeave": () => this.setState({ hover: false }), - }, [ - ircTimestamp, - sender, - ircPadlock, + }, <> + { ircTimestamp } + { sender } + { ircPadlock }
{ groupTimestamp } { groupPadlock } @@ -1214,11 +1214,10 @@ export default class EventTile extends React.Component { { keyRequestInfo } { reactionsRow } { actionBar } -
, - msgOption, - avatar, - - ]) +
+ { msgOption } + { avatar } + ) ); } } From 1eaf6dd4ed260f64b993c6be82a261e466e79da6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 11:49:55 +0100 Subject: [PATCH 126/135] Improve TS in SenderProfile --- .../views/messages/SenderProfile.tsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/views/messages/SenderProfile.tsx b/src/components/views/messages/SenderProfile.tsx index bdae9cec4a..5198effb32 100644 --- a/src/components/views/messages/SenderProfile.tsx +++ b/src/components/views/messages/SenderProfile.tsx @@ -15,12 +15,14 @@ */ import React from 'react'; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; + import Flair from '../elements/Flair'; import FlairStore from '../../../stores/FlairStore'; import { getUserNameColorClass } from '../../../utils/FormattingUtils'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { replaceableComponent } from "../../../utils/replaceableComponent"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { MsgType } from "matrix-js-sdk/lib/@types/event"; interface IProps { mxEvent: MatrixEvent; @@ -50,7 +52,7 @@ export default class SenderProfile extends React.Component { componentDidMount() { this.unmounted = false; - this._updateRelatedGroups(); + this.updateRelatedGroups(); if (this.state.userGroups.length === 0) { this.getPublicisedGroups(); @@ -64,7 +66,7 @@ export default class SenderProfile extends React.Component { this.context.removeListener('RoomState.events', this.onRoomStateEvents); } - async getPublicisedGroups() { + private async getPublicisedGroups() { if (!this.unmounted) { const userGroups = await FlairStore.getPublicisedGroupsCached( this.context, this.props.mxEvent.getSender(), @@ -73,15 +75,15 @@ export default class SenderProfile extends React.Component { } } - onRoomStateEvents = event => { + private onRoomStateEvents = (event: MatrixEvent) => { if (event.getType() === 'm.room.related_groups' && event.getRoomId() === this.props.mxEvent.getRoomId() ) { - this._updateRelatedGroups(); + this.updateRelatedGroups(); } }; - _updateRelatedGroups() { + private updateRelatedGroups() { if (this.unmounted) return; const room = this.context.getRoom(this.props.mxEvent.getRoomId()); if (!room) return; @@ -92,7 +94,7 @@ export default class SenderProfile extends React.Component { }); } - _getDisplayedGroups(userGroups, relatedGroups) { + private getDisplayedGroups(userGroups?: string[], relatedGroups?: string[]) { let displayedGroups = userGroups || []; if (relatedGroups && relatedGroups.length > 0) { displayedGroups = relatedGroups.filter((groupId) => { @@ -113,7 +115,7 @@ export default class SenderProfile extends React.Component { const displayName = mxEvent.sender?.rawDisplayName || mxEvent.getSender() || ""; const mxid = mxEvent.sender?.userId || mxEvent.getSender() || ""; - if (msgtype === 'm.emote') { + if (msgtype === MsgType.Emote) { return null; // emote message must include the name so don't duplicate it } @@ -128,7 +130,7 @@ export default class SenderProfile extends React.Component { let flair; if (this.props.enableFlair) { - const displayedGroups = this._getDisplayedGroups( + const displayedGroups = this.getDisplayedGroups( this.state.userGroups, this.state.relatedGroups, ); From e9d56d4f135c7e61df1434722aed997fdd16c70d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 12:10:01 +0100 Subject: [PATCH 127/135] Fix possible uncaught exception for getUrlPreview which would cause 0 url previews if one url was faulty --- src/components/views/rooms/LinkPreviewGroup.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/LinkPreviewGroup.tsx b/src/components/views/rooms/LinkPreviewGroup.tsx index 2541b2e375..c9842bdd33 100644 --- a/src/components/views/rooms/LinkPreviewGroup.tsx +++ b/src/components/views/rooms/LinkPreviewGroup.tsx @@ -40,10 +40,12 @@ const LinkPreviewGroup: React.FC = ({ links, mxEvent, onCancelClick, onH const ts = mxEvent.getTs(); const previews = useAsyncMemo<[string, IPreviewUrlResponse][]>(async () => { - return Promise.all<[string, IPreviewUrlResponse] | void>(links.map(link => { - return cli.getUrlPreview(link, ts).then(preview => [link, preview], error => { + return Promise.all<[string, IPreviewUrlResponse] | void>(links.map(async link => { + try { + return [link, await cli.getUrlPreview(link, ts)]; + } catch (error) { console.error("Failed to get URL preview: " + error); - }); + } })).then(a => a.filter(Boolean)) as Promise<[string, IPreviewUrlResponse][]>; }, [links, ts], []); From 7c3c04d340e2cd255e4f5d271a5c80dc870ba82b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 12:10:54 +0100 Subject: [PATCH 128/135] Fix instances of setState calls after unmount --- src/components/structures/RoomView.tsx | 33 +++++++++---------- src/components/structures/TimelinePanel.tsx | 4 +++ .../views/messages/SenderProfile.tsx | 19 ++++------- .../tabs/user/AppearanceUserSettingsTab.tsx | 6 ++++ 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 2c118149a0..2d264b00e9 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -916,6 +916,7 @@ export default class RoomView extends React.Component { // called when state.room is first initialised (either at initial load, // after a successful peek, or after we join the room). private onRoomLoaded = (room: Room) => { + if (this.unmounted) return; // Attach a widget store listener only when we get a room WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(room), this.onWidgetLayoutChange); this.onWidgetLayoutChange(); // provoke an update @@ -930,9 +931,9 @@ export default class RoomView extends React.Component { }; private async calculateRecommendedVersion(room: Room) { - this.setState({ - upgradeRecommendation: await room.getRecommendedVersion(), - }); + const upgradeRecommendation = await room.getRecommendedVersion(); + if (this.unmounted) return; + this.setState({ upgradeRecommendation }); } private async loadMembersIfJoined(room: Room) { @@ -1022,23 +1023,19 @@ export default class RoomView extends React.Component { }; private async updateE2EStatus(room: Room) { - if (!this.context.isRoomEncrypted(room.roomId)) { - return; - } - if (!this.context.isCryptoEnabled()) { - // If crypto is not currently enabled, we aren't tracking devices at all, - // so we don't know what the answer is. Let's error on the safe side and show - // a warning for this case. - this.setState({ - e2eStatus: E2EStatus.Warning, - }); - return; + if (!this.context.isRoomEncrypted(room.roomId)) return; + + // If crypto is not currently enabled, we aren't tracking devices at all, + // so we don't know what the answer is. Let's error on the safe side and show + // a warning for this case. + let e2eStatus = E2EStatus.Warning; + if (this.context.isCryptoEnabled()) { + /* At this point, the user has encryption on and cross-signing on */ + e2eStatus = await shieldStatusForRoom(this.context, room); } - /* At this point, the user has encryption on and cross-signing on */ - this.setState({ - e2eStatus: await shieldStatusForRoom(this.context, room), - }); + if (this.unmounted) return; + this.setState({ e2eStatus }); } private onAccountData = (event: MatrixEvent) => { diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index 85a048e9b8..c21aac790b 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -1051,6 +1051,8 @@ class TimelinePanel extends React.Component { { windowLimit: this.props.timelineCap }); const onLoaded = () => { + if (this.unmounted) return; + // clear the timeline min-height when // (re)loading the timeline if (this.messagePanel.current) { @@ -1092,6 +1094,8 @@ class TimelinePanel extends React.Component { }; const onError = (error) => { + if (this.unmounted) return; + this.setState({ timelineLoading: false }); console.error( `Error loading timeline panel at ${eventId}: ${error}`, diff --git a/src/components/views/messages/SenderProfile.tsx b/src/components/views/messages/SenderProfile.tsx index 5198effb32..d62c10427d 100644 --- a/src/components/views/messages/SenderProfile.tsx +++ b/src/components/views/messages/SenderProfile.tsx @@ -38,7 +38,7 @@ interface IState { @replaceableComponent("views.messages.SenderProfile") export default class SenderProfile extends React.Component { static contextType = MatrixClientContext; - private unmounted: boolean; + private unmounted = false; constructor(props: IProps) { super(props); @@ -51,7 +51,6 @@ export default class SenderProfile extends React.Component { } componentDidMount() { - this.unmounted = false; this.updateRelatedGroups(); if (this.state.userGroups.length === 0) { @@ -67,30 +66,24 @@ export default class SenderProfile extends React.Component { } private async getPublicisedGroups() { - if (!this.unmounted) { - const userGroups = await FlairStore.getPublicisedGroupsCached( - this.context, this.props.mxEvent.getSender(), - ); - this.setState({ userGroups }); - } + const userGroups = await FlairStore.getPublicisedGroupsCached(this.context, this.props.mxEvent.getSender()); + if (this.unmounted) return; + this.setState({ userGroups }); } private onRoomStateEvents = (event: MatrixEvent) => { - if (event.getType() === 'm.room.related_groups' && - event.getRoomId() === this.props.mxEvent.getRoomId() - ) { + if (event.getType() === 'm.room.related_groups' && event.getRoomId() === this.props.mxEvent.getRoomId()) { this.updateRelatedGroups(); } }; private updateRelatedGroups() { - if (this.unmounted) return; const room = this.context.getRoom(this.props.mxEvent.getRoomId()); if (!room) return; const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', ''); this.setState({ - relatedGroups: relatedGroupsEvent ? relatedGroupsEvent.getContent().groups || [] : [], + relatedGroups: relatedGroupsEvent?.getContent().groups || [], }); } diff --git a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx index 17aa9e5561..a94821e94a 100644 --- a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx @@ -76,6 +76,7 @@ export default class AppearanceUserSettingsTab extends React.Component Date: Thu, 15 Jul 2021 12:18:17 +0100 Subject: [PATCH 129/135] improve types --- src/TextForEvent.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index ef24fb8e48..95341705bf 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -32,7 +32,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; // any text to display at all. For this reason they return deferred values // to avoid the expense of looking up translations when they're not needed. -function textForMemberEvent(ev): () => string | null { +function textForMemberEvent(ev: MatrixEvent): () => string | null { // XXX: SYJS-16 "sender is sometimes null for join messages" const senderName = ev.sender ? ev.sender.name : ev.getSender(); const targetName = ev.target ? ev.target.name : ev.getStateKey(); @@ -127,7 +127,7 @@ function textForMemberEvent(ev): () => string | null { } } -function textForTopicEvent(ev): () => string | null { +function textForTopicEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); return () => _t('%(senderDisplayName)s changed the topic to "%(topic)s".', { senderDisplayName, @@ -135,7 +135,7 @@ function textForTopicEvent(ev): () => string | null { }); } -function textForRoomNameEvent(ev): () => string | null { +function textForRoomNameEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); if (!ev.getContent().name || ev.getContent().name.trim().length === 0) { @@ -154,12 +154,12 @@ function textForRoomNameEvent(ev): () => string | null { }); } -function textForTombstoneEvent(ev): () => string | null { +function textForTombstoneEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); return () => _t('%(senderDisplayName)s upgraded this room.', { senderDisplayName }); } -function textForJoinRulesEvent(ev): () => string | null { +function textForJoinRulesEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); switch (ev.getContent().join_rule) { case "public": @@ -179,7 +179,7 @@ function textForJoinRulesEvent(ev): () => string | null { } } -function textForGuestAccessEvent(ev): () => string | null { +function textForGuestAccessEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); switch (ev.getContent().guest_access) { case "can_join": @@ -195,7 +195,7 @@ function textForGuestAccessEvent(ev): () => string | null { } } -function textForRelatedGroupsEvent(ev): () => string | null { +function textForRelatedGroupsEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const groups = ev.getContent().groups || []; const prevGroups = ev.getPrevContent().groups || []; @@ -225,7 +225,7 @@ function textForRelatedGroupsEvent(ev): () => string | null { } } -function textForServerACLEvent(ev): () => string | null { +function textForServerACLEvent(ev: MatrixEvent): () => string | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const prevContent = ev.getPrevContent(); const current = ev.getContent(); @@ -255,7 +255,7 @@ function textForServerACLEvent(ev): () => string | null { return getText; } -function textForMessageEvent(ev): () => string | null { +function textForMessageEvent(ev: MatrixEvent): () => string | null { return () => { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); let message = senderDisplayName + ': ' + ev.getContent().body; @@ -268,7 +268,7 @@ function textForMessageEvent(ev): () => string | null { }; } -function textForCanonicalAliasEvent(ev): () => string | null { +function textForCanonicalAliasEvent(ev: MatrixEvent): () => string | null { const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAlias = ev.getPrevContent().alias; const oldAltAliases = ev.getPrevContent().alt_aliases || []; @@ -682,7 +682,7 @@ for (const evType of ALL_RULE_TYPES) { stateHandlers[evType] = textForMjolnirEvent; } -export function hasText(ev): boolean { +export function hasText(ev: MatrixEvent): boolean { const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()]; return Boolean(handler?.(ev)); } From 20e0356eb1b7e6623325c2be5b2ba94bd5e168bb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 15 Jul 2021 12:25:26 +0100 Subject: [PATCH 130/135] why do my IDE be dumb --- src/components/views/messages/SenderProfile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/SenderProfile.tsx b/src/components/views/messages/SenderProfile.tsx index d62c10427d..d4b74db6d0 100644 --- a/src/components/views/messages/SenderProfile.tsx +++ b/src/components/views/messages/SenderProfile.tsx @@ -16,13 +16,13 @@ import React from 'react'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { MsgType } from "matrix-js-sdk/src/@types/event"; import Flair from '../elements/Flair'; import FlairStore from '../../../stores/FlairStore'; import { getUserNameColorClass } from '../../../utils/FormattingUtils'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { replaceableComponent } from "../../../utils/replaceableComponent"; -import { MsgType } from "matrix-js-sdk/lib/@types/event"; interface IProps { mxEvent: MatrixEvent; From 375e2798258f21578a66ac312f3c0eb4f04b3603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Jul 2021 15:15:48 +0200 Subject: [PATCH 131/135] Add speaker icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/img/element-icons/speaker.svg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 res/img/element-icons/speaker.svg diff --git a/res/img/element-icons/speaker.svg b/res/img/element-icons/speaker.svg new file mode 100644 index 0000000000..fd811d2cda --- /dev/null +++ b/res/img/element-icons/speaker.svg @@ -0,0 +1,5 @@ + + + + + From 68640a4dbd8f140013fd857334f42413acd4ede2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Jul 2021 15:16:05 +0200 Subject: [PATCH 132/135] Fix icon postion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_MFileBody.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/messages/_MFileBody.scss b/res/css/views/messages/_MFileBody.scss index c215d69ec2..b91c461ce5 100644 --- a/res/css/views/messages/_MFileBody.scss +++ b/res/css/views/messages/_MFileBody.scss @@ -83,12 +83,12 @@ limitations under the License. mask-size: cover; mask-image: url('$(res)/img/element-icons/room/composer/attach.svg'); background-color: $message-body-panel-icon-fg-color; - width: 13px; + width: 15px; height: 15px; position: absolute; top: 8px; - left: 9px; + left: 8px; } } From 88da0f4dcf500c44c5bae2673b538f0f47ac76b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Jul 2021 15:17:41 +0200 Subject: [PATCH 133/135] Give audio and video replies an icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 8 ++++++++ src/components/views/rooms/ReplyTile.tsx | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index 8fe3a3e94c..ccb0069190 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -21,6 +21,14 @@ limitations under the License. position: relative; line-height: $font-16px; + &.mx_ReplyTile_audio .mx_MFileBody_info_icon::before { + mask-image: url("$(res)/img/element-icons/speaker.svg"); + } + + &.mx_ReplyTile_video .mx_MFileBody_info_icon::before { + mask-image: url("$(res)/img/element-icons/call/video-call.svg"); + } + .mx_MFileBody { .mx_MFileBody_info { margin: 5px 0; diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index f44a75a264..18b30d33d5 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -80,7 +80,7 @@ export default class ReplyTile extends React.PureComponent { render() { const mxEvent = this.props.mxEvent; - const msgtype = mxEvent.getContent().msgtype; + const msgType = mxEvent.getContent().msgtype; const evType = mxEvent.getType() as EventType; const { tileHandler, isInfoMessage } = getEventDisplayInfo(this.props.mxEvent); @@ -98,6 +98,8 @@ export default class ReplyTile extends React.PureComponent { const classes = classNames("mx_ReplyTile", { mx_ReplyTile_info: isInfoMessage && !this.props.mxEvent.isRedacted(), + mx_ReplyTile_audio: msgType === MsgType.Audio, + mx_ReplyTile_video: msgType === MsgType.Video, }); let permalink = "#"; @@ -108,7 +110,7 @@ export default class ReplyTile extends React.PureComponent { let sender; const needsSenderProfile = ( !isInfoMessage && - msgtype !== MsgType.Image && + msgType !== MsgType.Image && tileHandler !== EventType.RoomCreate && evType !== EventType.Sticker ); From 5d0afdb70673fb1401c9986ba1f72c843a8b8593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Jul 2021 15:38:07 +0200 Subject: [PATCH 134/135] Don't show line number in replies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_ReplyTile.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index ccb0069190..c8f76ee995 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -76,6 +76,11 @@ limitations under the License. font-size: $font-14px !important; } + // Hide line numbers + .mx_EventTile_lineNumbers { + display: none; + } + // Hack to cut content in
 tags too
     .mx_EventTile_pre_container > pre {
         overflow: hidden;

From a3792b75e2b1e47cecb63e622966e749f1e8fdc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0imon=20Brandner?= 
Date: Fri, 16 Jul 2021 07:53:20 +0200
Subject: [PATCH 135/135] Fix IRC layout replies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Šimon Brandner 
---
 res/css/views/rooms/_IRCLayout.scss | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss
index 5e61c3b8a3..97190807ca 100644
--- a/res/css/views/rooms/_IRCLayout.scss
+++ b/res/css/views/rooms/_IRCLayout.scss
@@ -198,8 +198,9 @@ $irc-line-height: $font-18px;
     .mx_ReplyThread {
         margin: 0;
         .mx_SenderProfile {
+            order: unset;
+            max-width: unset;
             width: unset;
-            max-width: var(--name-width);
             background: transparent;
         }