diff --git a/package.json b/package.json index 1fed55748c..33aa428d4b 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", + "qrcode-react": "^0.1.16", "querystring": "^0.2.0", "react": "^15.6.0", "react-addons-css-transition-group": "15.3.2", diff --git a/res/css/_components.scss b/res/css/_components.scss index 2734939ae3..173939e143 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -42,6 +42,7 @@ @import "./views/dialogs/_SetEmailDialog.scss"; @import "./views/dialogs/_SetMxIdDialog.scss"; @import "./views/dialogs/_SetPasswordDialog.scss"; +@import "./views/dialogs/_ShareDialog.scss"; @import "./views/dialogs/_UnknownDeviceDialog.scss"; @import "./views/directory/_NetworkDropdown.scss"; @import "./views/elements/_AccessibleButton.scss"; diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index a0191b92cf..7474c3d107 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_ContextualMenu_wrapper { position: fixed; - z-index: 2000; + z-index: 5000; } .mx_ContextualMenu_background { @@ -26,7 +26,7 @@ limitations under the License. width: 100%; height: 100%; opacity: 1.0; - z-index: 2000; + z-index: 5000; } .mx_ContextualMenu { @@ -37,7 +37,7 @@ limitations under the License. position: absolute; padding: 6px; font-size: 14px; - z-index: 2001; + z-index: 5001; } .mx_ContextualMenu.mx_ContextualMenu_right { diff --git a/res/css/views/dialogs/_ShareDialog.scss b/res/css/views/dialogs/_ShareDialog.scss new file mode 100644 index 0000000000..116bef8dfd --- /dev/null +++ b/res/css/views/dialogs/_ShareDialog.scss @@ -0,0 +1,89 @@ +/* +Copyright 2018 New Vector 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. +*/ + +.mx_ShareDialog { + // this is to center the content + padding-right: 58px; +} + +.mx_ShareDialog hr { + margin-top: 25px; + margin-bottom: 25px; + border-color: $light-fg-color; +} + +.mx_ShareDialog_content { + margin: 10px 0; +} + +.mx_ShareDialog_matrixto { + display: flex; + justify-content: space-between; + border-radius: 5px; + border: solid 1px $light-fg-color; + margin-bottom: 10px; + margin-top: 30px; + padding: 10px; +} + +.mx_ShareDialog_matrixto a { + text-decoration: none; +} + +.mx_ShareDialog_matrixto_link { + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; +} + +.mx_ShareDialog_matrixto_copy { + flex-shrink: 0; + cursor: pointer; + margin-left: 20px; + display: inherit; +} +.mx_ShareDialog_matrixto_copy > div { + background-image: url($copy-button-url); + margin-left: 5px; + width: 20px; + height: 20px; +} + +.mx_ShareDialog_split { + display: flex; + flex-wrap: wrap; +} + +.mx_ShareDialog_qrcode_container { + float: left; + background-color: #ffffff; + padding: 5px; // makes qr code more readable in dark theme + border-radius: 5px; + height: 256px; + width: 256px; + margin-right: 64px; +} + +.mx_ShareDialog_social_container { + display: inline-block; + width: 299px; +} + +.mx_ShareDialog_social_icon { + display: inline-grid; + margin-right: 10px; + margin-bottom: 10px; +} diff --git a/res/img/icons-share.svg b/res/img/icons-share.svg new file mode 100644 index 0000000000..b27616d5d5 --- /dev/null +++ b/res/img/icons-share.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/img/matrix-m.svg b/res/img/matrix-m.svg new file mode 100644 index 0000000000..ccb1df0fc5 --- /dev/null +++ b/res/img/matrix-m.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/res/img/social/email-1.png b/res/img/social/email-1.png new file mode 100644 index 0000000000..193cb659da Binary files /dev/null and b/res/img/social/email-1.png differ diff --git a/res/img/social/facebook.png b/res/img/social/facebook.png new file mode 100644 index 0000000000..6a29e3820a Binary files /dev/null and b/res/img/social/facebook.png differ diff --git a/res/img/social/linkedin.png b/res/img/social/linkedin.png new file mode 100644 index 0000000000..2b868a585b Binary files /dev/null and b/res/img/social/linkedin.png differ diff --git a/res/img/social/reddit.png b/res/img/social/reddit.png new file mode 100644 index 0000000000..bd6131186f Binary files /dev/null and b/res/img/social/reddit.png differ diff --git a/res/img/social/twitter-2.png b/res/img/social/twitter-2.png new file mode 100644 index 0000000000..84f8033a30 Binary files /dev/null and b/res/img/social/twitter-2.png differ diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index 3e867ad384..91ec312f43 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,12 +16,10 @@ limitations under the License. */ -'use strict'; - -const classNames = require('classnames'); -const React = require('react'); -const ReactDOM = require('react-dom'); +import React from 'react'; +import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and @@ -61,7 +60,12 @@ export default class ContextualMenu extends React.Component { // If true, insert an invisible screen-sized element behind the // menu that when clicked will close it. hasBackground: PropTypes.bool, - } + + // The component to render as the context menu + elementClass: PropTypes.element.isRequired, + // on resize callback + windowResize: PropTypes.func + }; constructor() { super(); @@ -145,7 +149,7 @@ export default class ContextualMenu extends React.Component { `; } - const chevron =
; + const chevron =
; const className = 'mx_ContextualMenu_wrapper'; const menuClasses = classNames({ @@ -191,13 +195,13 @@ export default class ContextualMenu extends React.Component { { chevron }
- { props.hasBackground &&
} + { props.hasBackground &&
}
; } } -export function createMenu(ElementClass, props) { +export function createMenu(ElementClass, props, hasBackground=true) { const closeMenu = function(...args) { ReactDOM.unmountComponentAtNode(getOrCreateContainer()); @@ -208,8 +212,8 @@ export function createMenu(ElementClass, props) { // We only reference closeMenu once per call to createMenu const menu = { summary.profile.short_description }; } } + if (this.state.editing) { rightButtons.push( , ); } + rightButtons.push( + + + , + ); if (this.props.collapsedRhs) { rightButtons.push( ; }, + onSelfShareClick: function() { + const cli = MatrixClientPeg.get(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share self dialog', '', ShareDialog, { + target: cli.getUser(this._me), + }); + }, + _showSpoiler: function(event) { const target = event.target; target.innerHTML = target.getAttribute('data-spoiler'); @@ -1329,10 +1337,13 @@ module.exports = React.createClass({
- { _t("Logged in as:") } { this._me } + { _t("Logged in as:") + ' ' } + + { this._me } +
- { _t('Access Token:') } + { _t('Access Token:') + ' ' } diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 99ec493ced..bdd267c4ee 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -184,6 +184,15 @@ module.exports = React.createClass({ this.closeMenu(); }, + onPermalinkClick: function(e: Event) { + e.preventDefault(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room message dialog', '', ShareDialog, { + target: this.props.mxEvent, + }); + this.closeMenu(); + }, + onReplyClick: function() { dis.dispatch({ action: 'reply_to_event', @@ -290,7 +299,7 @@ module.exports = React.createClass({ const permalinkButton = (
{ _t('Permalink') } + target="_blank" rel="noopener" onClick={this.onPermalinkClick}>{ _t('Share Message') }
); diff --git a/src/components/views/dialogs/BaseDialog.js b/src/components/views/dialogs/BaseDialog.js index 71a5da224c..8ec417a59b 100644 --- a/src/components/views/dialogs/BaseDialog.js +++ b/src/components/views/dialogs/BaseDialog.js @@ -18,6 +18,7 @@ limitations under the License. import React from 'react'; import FocusTrap from 'focus-trap-react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; import { MatrixClient } from 'matrix-js-sdk'; @@ -64,7 +65,10 @@ export default React.createClass({ // Id of content element // If provided, this is used to add a aria-describedby attribute - contentId: React.PropTypes.string, + contentId: PropTypes.string, + + // optional additional class for the title element + titleClass: PropTypes.string, }, getDefaultProps: function() { @@ -105,25 +109,28 @@ export default React.createClass({ render: function() { const TintableSvg = sdk.getComponent("elements.TintableSvg"); + let cancelButton; + if (this.props.hasCancel) { + cancelButton = + + ; + } + return ( - { this.props.hasCancel ? - - : null } -
+ { cancelButton } +
{ this.props.title }
{ this.props.children } diff --git a/src/components/views/dialogs/ChatCreateOrReuseDialog.js b/src/components/views/dialogs/ChatCreateOrReuseDialog.js index e2387064cf..95fd8848ba 100644 --- a/src/components/views/dialogs/ChatCreateOrReuseDialog.js +++ b/src/components/views/dialogs/ChatCreateOrReuseDialog.js @@ -187,7 +187,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { } } -ChatCreateOrReuseDialog.propTyps = { +ChatCreateOrReuseDialog.propTypes = { userId: PropTypes.string.isRequired, // Called when clicking outside of the dialog onFinished: PropTypes.func.isRequired, diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js new file mode 100644 index 0000000000..f074d9b1fa --- /dev/null +++ b/src/components/views/dialogs/ShareDialog.js @@ -0,0 +1,224 @@ +/* +Copyright 2018 New Vector 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 React from 'react'; +import PropTypes from 'prop-types'; +import {Room, User, Group, RoomMember, MatrixEvent} from 'matrix-js-sdk'; +import sdk from '../../../index'; +import { _t } from '../../../languageHandler'; +import QRCode from 'qrcode-react'; +import {makeEventPermalink, makeGroupPermalink, makeRoomPermalink, makeUserPermalink} from "../../../matrix-to"; +import * as ContextualMenu from "../../structures/ContextualMenu"; + +const socials = [ + { + name: 'Facebook', + img: 'img/social/facebook.png', + url: (url) => `https://www.facebook.com/sharer/sharer.php?u=${url}`, + }, { + name: 'Twitter', + img: 'img/social/twitter-2.png', + url: (url) => `https://twitter.com/home?status=${url}`, + }, /* // icon missing + name: 'Google Plus', + img: 'img/social/', + url: (url) => `https://plus.google.com/share?url=${url}`, + },*/ { + name: 'LinkedIn', + img: 'img/social/linkedin.png', + url: (url) => `https://www.linkedin.com/shareArticle?mini=true&url=${url}`, + }, { + name: 'Reddit', + img: 'img/social/reddit.png', + url: (url) => `http://www.reddit.com/submit?url=${url}`, + }, { + name: 'email', + img: 'img/social/email-1.png', + url: (url) => `mailto:?body=${url}`, + }, +]; + +export default class ShareDialog extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + target: PropTypes.oneOfType([ + PropTypes.instanceOf(Room), + PropTypes.instanceOf(User), + PropTypes.instanceOf(Group), + PropTypes.instanceOf(RoomMember), + PropTypes.instanceOf(MatrixEvent), + ]).isRequired, + }; + + constructor(props) { + super(props); + + this.onCopyClick = this.onCopyClick.bind(this); + this.onLinkSpecificEventCheckboxClick = this.onLinkSpecificEventCheckboxClick.bind(this); + + this.state = { + // MatrixEvent defaults to share linkSpecificEvent + linkSpecificEvent: this.props.target instanceof MatrixEvent, + }; + } + + static _selectText(target) { + const range = document.createRange(); + range.selectNodeContents(target); + + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + + static onLinkClick(e) { + e.preventDefault(); + const {target} = e; + ShareDialog._selectText(target); + } + + onCopyClick(e) { + e.preventDefault(); + + ShareDialog._selectText(this.refs.link); + + let successful; + try { + successful = document.execCommand('copy'); + } catch (err) { + console.error('Failed to copy: ', err); + } + + const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); + const buttonRect = e.target.getBoundingClientRect(); + + // The window X and Y offsets are to adjust position when zoomed in to page + const x = buttonRect.right + window.pageXOffset; + const y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19; + const {close} = ContextualMenu.createMenu(GenericTextContextMenu, { + chevronOffset: 10, + left: x, + top: y, + message: successful ? _t('Copied!') : _t('Failed to copy'), + }, false); + e.target.onmouseleave = close; + } + + onLinkSpecificEventCheckboxClick() { + this.setState({ + linkSpecificEvent: !this.state.linkSpecificEvent, + }); + } + + render() { + let title; + let matrixToUrl; + + let checkbox; + + if (this.props.target instanceof Room) { + title = _t('Share Room'); + + const events = this.props.target.getLiveTimeline().getEvents(); + if (events.length > 0) { + checkbox =
+ + +
; + } + + if (this.state.linkSpecificEvent) { + matrixToUrl = makeEventPermalink(this.props.target.roomId, events[events.length - 1].getId()); + } else { + matrixToUrl = makeRoomPermalink(this.props.target.roomId); + } + } else if (this.props.target instanceof User || this.props.target instanceof RoomMember) { + title = _t('Share User'); + matrixToUrl = makeUserPermalink(this.props.target.userId); + } else if (this.props.target instanceof Group) { + title = _t('Share Community'); + matrixToUrl = makeGroupPermalink(this.props.target.groupId); + } else if (this.props.target instanceof MatrixEvent) { + title = _t('Share Room Message'); + checkbox =
+ + +
; + + if (this.state.linkSpecificEvent) { + matrixToUrl = makeEventPermalink(this.props.target.getRoomId(), this.props.target.getId()); + } else { + matrixToUrl = makeRoomPermalink(this.props.target.getRoomId()); + } + } + + const encodedUrl = encodeURIComponent(matrixToUrl); + + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + return +
+ + { checkbox } +
+ +
+
+ +
+
+ { + socials.map((social) => + {social.name} + ) + } +
+
+
+
; + } +} diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index bc2a715d31..018754411c 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -336,8 +336,8 @@ module.exports = React.createClass({ left: x, top: y, message: successful ? _t('Copied!') : _t('Failed to copy'), - }); - e.target.onmouseout = close; + }, false); + e.target.onmouseleave = close; }; p.appendChild(button); }); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index bae3ac8fa7..aa2f28024e 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -439,6 +439,17 @@ module.exports = withMatrixClient(React.createClass({ }); }, + onPermalinkShareClicked: function(e) { + // These permalinks are like above, can be opened in new tab/window to matrix.to + // but otherwise fire the ShareDialog as it makes little sense to click permalink + // whilst it is in the current room + e.preventDefault(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room event dialog', '', ShareDialog, { + target: this.props.mxEvent, + }); + }, + _renderE2EPadlock: function() { const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; @@ -669,7 +680,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender }
- + { timestamp } { this._renderE2EPadlock() } @@ -696,7 +707,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender }
- + { timestamp } { this._renderE2EPadlock() } diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 75e6990120..8b4ade9c7d 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -632,6 +632,13 @@ module.exports = withMatrixClient(React.createClass({ ); }, + onShareUserClick: function() { + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room member dialog', '', ShareDialog, { + target: this.props.member, + }); + }, + _renderUserOptions: function() { const cli = this.props.matrixClient; const member = this.props.member; @@ -705,13 +712,18 @@ module.exports = withMatrixClient(React.createClass({ } } - if (!ignoreButton && !readReceiptButton && !insertPillButton && !inviteUserButton) return null; + const shareUserButton = ( + + { _t('Share Link to User') } + + ); return (

{ _t("User Options") }

{ readReceiptButton } + { shareUserButton } { insertPillButton } { ignoreButton } { inviteUserButton } diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 1851e03383..e40c715052 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -149,6 +149,13 @@ module.exports = React.createClass({ dis.dispatch({ action: 'show_right_panel' }); }, + onShareRoomClick: function(ev) { + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room dialog', '', ShareDialog, { + target: this.props.room, + }); + }, + _hasUnreadPins: function() { const currentPinEvent = this.props.room.currentState.getStateEvents("m.room.pinned_events", ''); if (!currentPinEvent) return false; @@ -379,6 +386,14 @@ module.exports = React.createClass({ ; } + let shareRoomButton; + if (this.props.inRoom) { + shareRoomButton = + + + ; + } + let rightPanelButtons; if (this.props.collapsedRhs) { rightPanelButtons = @@ -400,6 +415,7 @@ module.exports = React.createClass({
{ settingsButton } { pinnedEventsButton } + { shareRoomButton } { manageIntegsButton } { forgetButton } { searchButton } diff --git a/src/i18n/strings/be.json b/src/i18n/strings/be.json index 7e79f5d355..31360c87f4 100644 --- a/src/i18n/strings/be.json +++ b/src/i18n/strings/be.json @@ -31,7 +31,6 @@ "Noisy": "Шумна", "Resend": "Паўторна", "On": "Уключыць", - "Permalink": "Пастаянная спасылка", "remove %(name)s from the directory.": "выдаліць %(name)s з каталога.", "Off": "Выключыць", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Выдаліць псеўданім пакоя %(alias)s і выдаліць %(name)s з каталога?", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index e1709f1e0a..0b1305f3e8 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1124,7 +1124,6 @@ "Set Password": "Задаване на парола", "An error occurred whilst saving your email notification preferences.": "Възникна грешка при запазване на настройките за имейл известяване.", "Enable audible notifications in web client": "Включване на звукови известия в уеб клиент", - "Permalink": "Permalink", "Off": "Изключено", "Riot does not know how to join a room on this network": "Riot не знае как да се присъедини към стая от тази мрежа", "Mentions only": "Само при споменаване", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index ab4e803342..bd8452f0ba 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -1003,7 +1003,6 @@ "Unable to fetch notification target list": "No s'ha pogut obtenir la llista d'objectius de les notificacions", "Set Password": "Establiu una contrasenya", "Enable audible notifications in web client": "Habilita les notificacions d'àudio al client web", - "Permalink": "Enllaç permanent", "Off": "Apagat", "Riot does not know how to join a room on this network": "El Riot no sap com unir-se a una sala en aquesta xarxa", "Mentions only": "Només mencions", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 441e16e2c3..e3ce9dcf08 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1061,7 +1061,6 @@ "Set Password": "Nastavit heslo", "An error occurred whilst saving your email notification preferences.": "Při ukládání nastavení e-mailových upozornění nastala chyba.", "Enable audible notifications in web client": "Povolit zvuková upozornění ve webové aplikaci", - "Permalink": "Trvalý odkaz", "Off": "Vypnout", "#example": "#příklad", "Mentions only": "Pouze zmínky", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index e10534d7f1..18c30f29bc 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -370,7 +370,6 @@ "Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste", "Set Password": "Indstil Password", "Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten", - "Permalink": "Permanent link", "Resend": "Send igen", "Riot does not know how to join a room on this network": "Riot ved ikke, hvordan man kan deltage i et rum på dette netværk", "Mentions only": "Kun nævninger", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c3ff855020..ba31308e3a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1125,7 +1125,6 @@ "Unable to fetch notification target list": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden", "Set Password": "Passwort einrichten", "Enable audible notifications in web client": "Audio-Benachrichtigungen im Web-Client aktivieren", - "Permalink": "Permanenter Link", "Off": "Aus", "Riot does not know how to join a room on this network": "Riot weiß nicht, wie es einem Raum auf diesem Netzwerk beitreten soll", "Mentions only": "Nur, wenn du erwähnt wirst", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 929ca5e7df..b3fecf86a2 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -745,7 +745,6 @@ "What's New": "Τι νέο υπάρχει", "Set Password": "Ορισμός κωδικού πρόσβασης", "Enable audible notifications in web client": "Ενεργοποίηση ηχητικών ειδοποιήσεων", - "Permalink": "Μόνιμος σύνδεσμος", "Off": "Ανενεργό", "#example": "#παράδειγμα", "Mentions only": "Μόνο αναφορές", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index cda008ecbd..41f67ad9d9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -371,6 +371,7 @@ "Jump to read receipt": "Jump to read receipt", "Mention": "Mention", "Invite": "Invite", + "Share Link to User": "Share Link to User", "User Options": "User Options", "Direct chats": "Direct chats", "Unmute": "Unmute", @@ -452,6 +453,7 @@ "Settings": "Settings", "Forget room": "Forget room", "Search": "Search", + "Share room": "Share room", "Show panel": "Show panel", "Drop here to favourite": "Drop here to favourite", "Drop here to tag direct chat": "Drop here to tag direct chat", @@ -858,6 +860,13 @@ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", "Please set a password!": "Please set a password!", "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", + "Share Room": "Share Room", + "Link to most recent message": "Link to most recent message", + "Share User": "Share User", + "Share Community": "Share Community", + "Share Room Message": "Share Room Message", + "Link to selected message": "Link to selected message", + "COPY": "COPY", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", "Room contains unknown devices": "Room contains unknown devices", @@ -876,7 +885,7 @@ "View Source": "View Source", "View Decrypted Source": "View Decrypted Source", "Unhide Preview": "Unhide Preview", - "Permalink": "Permalink", + "Share Message": "Share Message", "Quote": "Quote", "Source URL": "Source URL", "Collapse Reply Thread": "Collapse Reply Thread", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 2a1b97b536..dcd7366a55 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -815,7 +815,6 @@ "Unable to fetch notification target list": "Unable to fetch notification target list", "Set Password": "Set Password", "Enable audible notifications in web client": "Enable audible notifications in web client", - "Permalink": "Permalink", "Off": "Off", "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", "Mentions only": "Mentions only", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index f48d10fa9f..5982871d8f 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1076,7 +1076,6 @@ "Unable to fetch notification target list": "Malsukcesis akiri la liston de celoj por sciigoj", "Set Password": "Agordi pasvorton", "Enable audible notifications in web client": "Ŝalti aŭdeblajn sciigojn en la retkliento", - "Permalink": "Konstanta ligilo", "Off": "For", "Riot does not know how to join a room on this network": "Riot ne scias aliĝi al ĉambroj en tiu ĉi reto", "Mentions only": "Nur mencioj", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 5180461828..e0e3c91bcd 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -716,7 +716,6 @@ "Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red", "Set Password": "Establecer contraseña", "Enable audible notifications in web client": "Habilitar notificaciones audibles en el cliente web", - "Permalink": "Enlace permanente", "Off": "Apagado", "#example": "#ejemplo", "Mentions only": "Sólo menciones", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index af04f66fa6..f5367ba4f3 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1126,7 +1126,6 @@ "Unable to fetch notification target list": "Ezin izan da jakinarazpen helburuen zerrenda eskuratu", "Set Password": "Ezarri pasahitza", "Enable audible notifications in web client": "Gaitu jakinarazpen entzungarriak web bezeroan", - "Permalink": "Esteka iraunkorra", "Off": "Ez", "Riot does not know how to join a room on this network": "Riotek ez daki nola elkartu gela batetara sare honetan", "Mentions only": "Aipamenak besterik ez", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 0e532d9483..2b18ba7693 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -124,7 +124,6 @@ "Set Password": "پسوردتان را انتخاب کنید", "An error occurred whilst saving your email notification preferences.": "خطایی در حین ذخیره‌ی ترجیجات شما درباره‌ی رایانامه رخ داد.", "Enable audible notifications in web client": "آگاه‌سازی صدادار را در کارگزار وب فعال کن", - "Permalink": "پایاپیوند", "Off": "خاموش", "Riot does not know how to join a room on this network": "رایوت از چگونگی ورود به یک گپ در این شبکه اطلاعی ندارد", "Mentions only": "فقط نام‌بردن‌ها", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index b96dbafa14..ebcee3b6c6 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1049,7 +1049,6 @@ "Set Password": "Aseta salasana", "An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.", "Enable audible notifications in web client": "Ota käyttöön äänelliset ilmoitukset", - "Permalink": "Pysyvä linkki", "remove %(name)s from the directory.": "poista %(name)s hakemistosta.", "Off": "Pois päältä", "Riot does not know how to join a room on this network": "Riot ei tiedä miten liittya huoneeseen tässä verkossa", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 9f276f4699..c54975b54d 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1120,7 +1120,6 @@ "Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications", "Set Password": "Définir un mot de passe", "Enable audible notifications in web client": "Activer les notifications sonores pour le client web", - "Permalink": "Permalien", "Off": "Désactivé", "Riot does not know how to join a room on this network": "Riot ne peut pas joindre un salon sur ce réseau", "Mentions only": "Seulement les mentions", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index fc1adfc478..aaf84f717d 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1126,7 +1126,6 @@ "Unable to fetch notification target list": "Non se puido procesar a lista de obxetivo de notificacións", "Set Password": "Establecer contrasinal", "Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web", - "Permalink": "Ligazón permanente", "Off": "Off", "Riot does not know how to join a room on this network": "Riot non sabe cómo conectar con unha sala en esta rede", "Mentions only": "Só mencións", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index dbae2858a9..7d96dfa089 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -221,7 +221,6 @@ "Unable to fetch notification target list": "לא ניתן לאחזר רשימת יעדי התראה", "Set Password": "הגדר סיסמא", "Enable audible notifications in web client": "אפשר התראות קוליות בדפדפן", - "Permalink": "קישור קבוע", "Off": "סגור", "Riot does not know how to join a room on this network": "Riot אינו יודע כיצד להצטרף לחדר ברשת זו", "Mentions only": "מאזכר בלבד", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 0be5087d55..64d97ece1f 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1125,7 +1125,6 @@ "Unable to fetch notification target list": "Nem sikerült letölteni az értesítési célok listáját", "Set Password": "Jelszó beállítása", "Enable audible notifications in web client": "Hangértesítések engedélyezése a webkliensben", - "Permalink": "Állandó hivatkozás", "Off": "Ki", "Riot does not know how to join a room on this network": "A Riot nem tud csatlakozni szobához ezen a hálózaton", "Mentions only": "Csak ha megemlítenek", diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 00d56e6074..86605c1d41 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -323,7 +323,6 @@ "Unable to fetch notification target list": "Tidak dapat mengambil daftar notifikasi target", "Set Password": "Ubah Password", "Enable audible notifications in web client": "Aktifkan notifikasi suara di klien web", - "Permalink": "Permalink", "Off": "Mati", "Riot does not know how to join a room on this network": "Riot tidak tau bagaimana gabung ruang di jaringan ini", "Mentions only": "Hanya jika disinggung", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 234def7dba..6770a0ea25 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -380,7 +380,6 @@ "View Source": "Skoða frumkóða", "View Decrypted Source": "Skoða afkóðaða upprunaskrá", "Unhide Preview": "Birta forskoðun", - "Permalink": "Varanlegur tengill", "Quote": "Tilvitnun", "Source URL": "Upprunaslóð", "All messages (noisy)": "Öll skilaboð (hávært)", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 61c80b6789..4728ee9106 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1121,7 +1121,6 @@ "What's New": "Novità", "Set Password": "Imposta Password", "Enable audible notifications in web client": "Abilita notifiche audio nel client web", - "Permalink": "Link permanente", "Off": "Spento", "#example": "#esempio", "Mentions only": "Solo le citazioni", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 80bd4f1ff5..741de4b551 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -223,7 +223,6 @@ "Event Type": "イベントの形式", "What's New": "新着", "Enable audible notifications in web client": "ウェブクライアントで音による通知を有効化", - "Permalink": "パーマリンク", "remove %(name)s from the directory.": "ディレクトリから %(name)s を消去する。", "Riot does not know how to join a room on this network": "Riotはこのネットワークで部屋に参加する方法を知りません", "You can now return to your account after signing out, and sign in on other devices.": "サインアウト後にあなたの\nアカウントに戻る、また、他の端末でサインインすることができます。", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 58333f23ad..f0b6e81ba8 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -753,7 +753,6 @@ "Riot does not know how to join a room on this network": "라이엇이 이 네트워크에서 방에 들어가는 법을 알 수 없어요", "Set Password": "비밀번호 설정", "Enable audible notifications in web client": "웹 클라이언트에서 알림 소리 켜기", - "Permalink": "고유주소", "Off": "끄기", "#example": "#예", "Mentions only": "답만 하기", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index bd46c25ed8..e1525f7af1 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -161,7 +161,6 @@ "Set Password": "Nustatyti slaptažodį", "An error occurred whilst saving your email notification preferences.": "Įrašant pranešimų el. paštu nuostatas, įvyko klaida.", "Unable to join network": "Nepavyko prisijungti prie tinklo", - "Permalink": "Pastovioji nuoroda", "Register": "Registruotis", "Off": "Išjungta", "Edit": "Koreguoti", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 37cb6ec324..91a7de7624 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1114,7 +1114,6 @@ "Unable to fetch notification target list": "Neizdevās iegūt paziņojumu mērķu sarakstu", "Set Password": "Iestatīt paroli", "Enable audible notifications in web client": "Iespējot skaņus paziņojumus web klientā", - "Permalink": "Pastāvīgā saite", "Off": "izslēgts", "Riot does not know how to join a room on this network": "Riot nezin kā pievienoties šajā tīklā esošajai istabai", "Mentions only": "Vienīgi atsauces", diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json index 6de7e92df7..a4bf0b421a 100644 --- a/src/i18n/strings/ml.json +++ b/src/i18n/strings/ml.json @@ -137,7 +137,6 @@ "Unable to fetch notification target list": "നോട്ടിഫിക്കേഷന്‍ ടാര്‍ഗെറ്റ് ലിസ്റ്റ് നേടാനായില്ല", "Set Password": "രഹസ്യവാക്ക് സജ്ജീകരിക്കുക", "Enable audible notifications in web client": "വെബ് പതിപ്പിലെ അറിയിപ്പുകള്‍ കേള്‍ക്കാവുന്നതാക്കുക", - "Permalink": "പെര്‍മാലിങ്ക്", "remove %(name)s from the directory.": "%(name)s ഡയറക്റ്ററിയില്‍ നിന്ന് നീക്കം ചെയ്യുക.", "Off": "ഓഫ്", "Riot does not know how to join a room on this network": "ഈ നെറ്റ്‍വര്‍ക്കിലെ ഒരു റൂമില്‍ എങ്ങനെ അംഗമാകാമെന്ന് റയട്ടിന് അറിയില്ല", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 47da50122c..9a2b859854 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -98,7 +98,6 @@ "Riot does not know how to join a room on this network": "Riot vet ikke hvordan man kan komme inn på et rom på dette nettverket", "An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.", "Enable audible notifications in web client": "Aktiver lyd-varsel i webklient", - "Permalink": "Permanent lenke", "remove %(name)s from the directory.": "fjern %(name)s fra katalogen.", "Off": "Av", "#example": "#eksempel", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 8886aab9cd..d85982a3fc 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1119,7 +1119,6 @@ "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatiedoelen op te halen", "Set Password": "Wachtwoord instellen", "Enable audible notifications in web client": "Geluidsmeldingen in de webclient aanzetten", - "Permalink": "Permanente link", "Off": "Uit", "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een ruimte op dit netwerk", "Mentions only": "Alleen vermeldingen", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 2ef30f7732..d0b71cdb8d 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -900,7 +900,6 @@ "Unable to fetch notification target list": "Nie można pobrać listy docelowej dla powiadomień", "Set Password": "Ustaw hasło", "Enable audible notifications in web client": "Włącz dźwiękowe powiadomienia w kliencie internetowym", - "Permalink": "Odnośnik bezpośredni", "Off": "Wyłącz", "Riot does not know how to join a room on this network": "Riot nie wie, jak dołączyć do pokoju w tej sieci", "Mentions only": "Tylko, gdy wymienieni", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 9b1c599501..d19eae40d4 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -825,7 +825,6 @@ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", "Set Password": "Definir palavra-passe", "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web", - "Permalink": "Link permanente", "Off": "Desativado", "Riot does not know how to join a room on this network": "O Riot não sabe como entrar numa sala nesta rede", "Mentions only": "Apenas menções", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 55a503dbe7..b786dc7182 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1100,7 +1100,6 @@ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", "Set Password": "Definir senha", "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web", - "Permalink": "Link permanente", "Off": "Desativado", "Riot does not know how to join a room on this network": "O sistema não sabe como entrar na sala desta rede", "Mentions only": "Apenas menções", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 55840f752e..2ef28d03c6 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1124,7 +1124,6 @@ "Unable to fetch notification target list": "Не удалось получить список устройств для уведомлений", "Set Password": "Задать пароль", "Enable audible notifications in web client": "Включить звуковые уведомления в веб-клиенте", - "Permalink": "Постоянная ссылка", "Off": "Выключить", "Riot does not know how to join a room on this network": "Riot не знает, как присоединиться к комнате, принадлежащей к этой сети", "Mentions only": "Только при упоминаниях", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ce8d77b791..5036699932 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1125,7 +1125,6 @@ "Set Password": "Nastaviť Heslo", "An error occurred whilst saving your email notification preferences.": "Počas ukladania vašich nastavení oznamovania emailom sa vyskytla chyba.", "Enable audible notifications in web client": "Povoliť zvukové oznámenia vo webovom klientovi", - "Permalink": "Trvalý odkaz", "Off": "Zakázané", "Riot does not know how to join a room on this network": "Riot nedokáže vstúpiť do miestnosti na tejto sieti", "Mentions only": "Len zmienky", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 2936695a6d..66f6f032b7 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -269,7 +269,6 @@ "Set Password": "Caktoni Fjalëkalim", "An error occurred whilst saving your email notification preferences.": "Ndodhi një gabim teksa ruheshin parapëlqimet tuaja për njoftime me email.", "Enable audible notifications in web client": "Aktivizoni njoftime audio te klienti web", - "Permalink": "Permalidhje", "Register": "Regjistrohuni", "Off": "Off", "Edit": "Përpunoni", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index e73107376b..b8689454d4 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1100,7 +1100,6 @@ "Set Password": "Постави лозинку", "An error occurred whilst saving your email notification preferences.": "Догодила се грешка при чувању ваших поставки мејл обавештења.", "Enable audible notifications in web client": "Омогући звучна обавештења у веб клијенту", - "Permalink": "Трајна веза", "Resend": "Поново пошаљи", "Riot does not know how to join a room on this network": "Riot не зна како да приступи соби на овој мрежи", "Mentions only": "Само спомињања", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 9dcc74d790..1ad48b27a3 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -546,7 +546,6 @@ "Unable to fetch notification target list": "Det gick inte att hämta aviseringsmållistan", "Set Password": "Välj lösenord", "Enable audible notifications in web client": "Sätt på högljudda aviseringar i webbklienten", - "Permalink": "Permanent länk", "Off": "Av", "Riot does not know how to join a room on this network": "Riot kan inte gå med i ett rum på det här nätverket", "Mentions only": "Endast omnämnande", diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json index 6aecb54bfd..b8fe318b46 100644 --- a/src/i18n/strings/ta.json +++ b/src/i18n/strings/ta.json @@ -78,7 +78,6 @@ "Off": "அமை", "On": "மீது", "Operation failed": "செயல்பாடு தோல்வியுற்றது", - "Permalink": "நிரந்தரத் தொடுப்பு", "powered by Matrix": "Matrix-ஆல் ஆனது", "Quote": "மேற்கோள்", "Reject": "நிராகரி", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index f59ae4b53b..606c60e95a 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -543,7 +543,6 @@ "Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้", "Set Password": "ตั้งรหัสผ่าน", "Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์", - "Permalink": "ลิงก์ถาวร", "Off": "ปิด", "#example": "#example", "Mentions only": "เมื่อถูกกล่าวถึงเท่านั้น", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 3fb790c0d6..1a8035a1db 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -740,7 +740,6 @@ "Unable to fetch notification target list": "Bildirim hedef listesi çekilemedi", "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.", "Enable audible notifications in web client": "Web istemcisinde sesli bildirimleri etkinleştir", - "Permalink": "Kalıcı Bağlantı(permalink)", "Off": "Kapalı", "Riot does not know how to join a room on this network": "Riot bu ağdaki bir odaya nasıl gireceğini bilmiyor", "Mentions only": "Sadece Mention'lar", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 74bf855d22..b07a5dadab 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -232,7 +232,6 @@ "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення", "Set Password": "Задати пароль", "Enable audible notifications in web client": "Увімкнути звукові сповіщення у мережевому застосунку", - "Permalink": "Постійне посилання", "Off": "Вимкнено", "Riot does not know how to join a room on this network": "Riot не знає як приєднатись до кімнати у цій мережі", "Mentions only": "Тільки згадки", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index cb39c1751b..0fbd0a4ef3 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1098,7 +1098,6 @@ "Unable to fetch notification target list": "无法获取通知目标列表", "Set Password": "设置密码", "Enable audible notifications in web client": "在网页客户端启用音频通知", - "Permalink": "永久链接", "Off": "关闭", "Riot does not know how to join a room on this network": "Riot 不知道如何在此网络中加入聊天室", "Mentions only": "只限提及", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 88cc5b6ad2..ff7650b36f 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1125,7 +1125,6 @@ "Riot does not know how to join a room on this network": "Riot 不知道如何在此網路中加入聊天室", "Set Password": "設定密碼", "Enable audible notifications in web client": "在網頁客戶端啟用音訊通知", - "Permalink": "永久連結", "Off": "關閉", "#example": "#範例", "Mentions only": "僅提及",