Merge branch 'develop' of https://github.com/matrix-org/matrix-react-sdk into t3chguy/dpsah/6785
This commit is contained in:
commit
243af3c9f2
119 changed files with 4408 additions and 2295 deletions
69
CHANGELOG.md
69
CHANGELOG.md
|
@ -1,3 +1,72 @@
|
||||||
|
Changes in [3.3.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.3.0) (2020-09-01)
|
||||||
|
===================================================================================================
|
||||||
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.3.0-rc.1...v3.3.0)
|
||||||
|
|
||||||
|
* Upgrade to JS SDK 8.2.0
|
||||||
|
|
||||||
|
Changes in [3.3.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.3.0-rc.1) (2020-08-26)
|
||||||
|
=============================================================================================================
|
||||||
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.2.0...v3.3.0-rc.1)
|
||||||
|
|
||||||
|
* Upgrade to JS SDK 8.2.0-rc.1
|
||||||
|
* Update from Weblate
|
||||||
|
[\#5146](https://github.com/matrix-org/matrix-react-sdk/pull/5146)
|
||||||
|
* BaseAvatar avoid initial render with default avatar
|
||||||
|
[\#5142](https://github.com/matrix-org/matrix-react-sdk/pull/5142)
|
||||||
|
* Enforce Secure Backup completion when requested by HS
|
||||||
|
[\#5130](https://github.com/matrix-org/matrix-react-sdk/pull/5130)
|
||||||
|
* Communities v2 prototype: Explore rooms, global state, and default room
|
||||||
|
[\#5139](https://github.com/matrix-org/matrix-react-sdk/pull/5139)
|
||||||
|
* Add communities v2 prototyping feature flag + initial tag panel prototypes
|
||||||
|
[\#5133](https://github.com/matrix-org/matrix-react-sdk/pull/5133)
|
||||||
|
* Remove some unused components
|
||||||
|
[\#5134](https://github.com/matrix-org/matrix-react-sdk/pull/5134)
|
||||||
|
* Allow avatar image view for 1:1 rooms
|
||||||
|
[\#5137](https://github.com/matrix-org/matrix-react-sdk/pull/5137)
|
||||||
|
* Send mx_local_settings in rageshake
|
||||||
|
[\#5136](https://github.com/matrix-org/matrix-react-sdk/pull/5136)
|
||||||
|
* Run all room leaving behaviour through a single function
|
||||||
|
[\#5132](https://github.com/matrix-org/matrix-react-sdk/pull/5132)
|
||||||
|
* Add clarifying comment in media device selection
|
||||||
|
[\#5131](https://github.com/matrix-org/matrix-react-sdk/pull/5131)
|
||||||
|
* Settings v3: Feature flag changes
|
||||||
|
[\#5124](https://github.com/matrix-org/matrix-react-sdk/pull/5124)
|
||||||
|
* Clear url previews if they all get edited out of the event
|
||||||
|
[\#5129](https://github.com/matrix-org/matrix-react-sdk/pull/5129)
|
||||||
|
* Consider tab completions as modifications for editing purposes to unlock
|
||||||
|
sending
|
||||||
|
[\#5128](https://github.com/matrix-org/matrix-react-sdk/pull/5128)
|
||||||
|
* Use matrix-doc for SAS emoji translations
|
||||||
|
[\#5125](https://github.com/matrix-org/matrix-react-sdk/pull/5125)
|
||||||
|
* Add a rageshake function to download the logs locally
|
||||||
|
[\#3849](https://github.com/matrix-org/matrix-react-sdk/pull/3849)
|
||||||
|
* Room List filtering visual tweaks
|
||||||
|
[\#5123](https://github.com/matrix-org/matrix-react-sdk/pull/5123)
|
||||||
|
* Make reply preview not an overlay so you can see new messages
|
||||||
|
[\#5072](https://github.com/matrix-org/matrix-react-sdk/pull/5072)
|
||||||
|
* Allow room tile context menu when minimized using right click
|
||||||
|
[\#5113](https://github.com/matrix-org/matrix-react-sdk/pull/5113)
|
||||||
|
* Add null guard to group inviter for corrupted groups
|
||||||
|
[\#5121](https://github.com/matrix-org/matrix-react-sdk/pull/5121)
|
||||||
|
* Room List styling tweaks
|
||||||
|
[\#5118](https://github.com/matrix-org/matrix-react-sdk/pull/5118)
|
||||||
|
* Fix corner rounding on images not always affecting right side
|
||||||
|
[\#5120](https://github.com/matrix-org/matrix-react-sdk/pull/5120)
|
||||||
|
* Change add room action for rooms to context menu
|
||||||
|
[\#5108](https://github.com/matrix-org/matrix-react-sdk/pull/5108)
|
||||||
|
* Switch out the globe icon and colour it depending on theme
|
||||||
|
[\#5106](https://github.com/matrix-org/matrix-react-sdk/pull/5106)
|
||||||
|
* Message Action Bar watch for event send changes
|
||||||
|
[\#5115](https://github.com/matrix-org/matrix-react-sdk/pull/5115)
|
||||||
|
* Put message previews for Emoji behind Labs
|
||||||
|
[\#5110](https://github.com/matrix-org/matrix-react-sdk/pull/5110)
|
||||||
|
* Fix styling for selected community marker
|
||||||
|
[\#5107](https://github.com/matrix-org/matrix-react-sdk/pull/5107)
|
||||||
|
* Fix action bar safe area regression
|
||||||
|
[\#5111](https://github.com/matrix-org/matrix-react-sdk/pull/5111)
|
||||||
|
* Fix /op slash command
|
||||||
|
[\#5109](https://github.com/matrix-org/matrix-react-sdk/pull/5109)
|
||||||
|
|
||||||
Changes in [3.2.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.2.0) (2020-08-17)
|
Changes in [3.2.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.2.0) (2020-08-17)
|
||||||
===================================================================================================
|
===================================================================================================
|
||||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.2.0-rc.1...v3.2.0)
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.2.0-rc.1...v3.2.0)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "matrix-react-sdk",
|
"name": "matrix-react-sdk",
|
||||||
"version": "3.2.0",
|
"version": "3.3.0",
|
||||||
"description": "SDK for matrix.org using React",
|
"description": "SDK for matrix.org using React",
|
||||||
"author": "matrix.org",
|
"author": "matrix.org",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -163,9 +163,7 @@
|
||||||
"stylelint-config-standard": "^18.3.0",
|
"stylelint-config-standard": "^18.3.0",
|
||||||
"stylelint-scss": "^3.18.0",
|
"stylelint-scss": "^3.18.0",
|
||||||
"typescript": "^3.9.7",
|
"typescript": "^3.9.7",
|
||||||
"walk": "^2.3.14",
|
"walk": "^2.3.14"
|
||||||
"webpack": "^4.43.0",
|
|
||||||
"webpack-cli": "^3.3.12"
|
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"testMatch": [
|
"testMatch": [
|
||||||
|
|
|
@ -61,7 +61,9 @@
|
||||||
@import "./views/dialogs/_BugReportDialog.scss";
|
@import "./views/dialogs/_BugReportDialog.scss";
|
||||||
@import "./views/dialogs/_ChangelogDialog.scss";
|
@import "./views/dialogs/_ChangelogDialog.scss";
|
||||||
@import "./views/dialogs/_ChatCreateOrReuseChatDialog.scss";
|
@import "./views/dialogs/_ChatCreateOrReuseChatDialog.scss";
|
||||||
|
@import "./views/dialogs/_CommunityPrototypeInviteDialog.scss";
|
||||||
@import "./views/dialogs/_ConfirmUserActionDialog.scss";
|
@import "./views/dialogs/_ConfirmUserActionDialog.scss";
|
||||||
|
@import "./views/dialogs/_CreateCommunityPrototypeDialog.scss";
|
||||||
@import "./views/dialogs/_CreateGroupDialog.scss";
|
@import "./views/dialogs/_CreateGroupDialog.scss";
|
||||||
@import "./views/dialogs/_CreateRoomDialog.scss";
|
@import "./views/dialogs/_CreateRoomDialog.scss";
|
||||||
@import "./views/dialogs/_DeactivateAccountDialog.scss";
|
@import "./views/dialogs/_DeactivateAccountDialog.scss";
|
||||||
|
@ -106,6 +108,7 @@
|
||||||
@import "./views/elements/_FormButton.scss";
|
@import "./views/elements/_FormButton.scss";
|
||||||
@import "./views/elements/_IconButton.scss";
|
@import "./views/elements/_IconButton.scss";
|
||||||
@import "./views/elements/_ImageView.scss";
|
@import "./views/elements/_ImageView.scss";
|
||||||
|
@import "./views/elements/_InfoTooltip.scss";
|
||||||
@import "./views/elements/_InlineSpinner.scss";
|
@import "./views/elements/_InlineSpinner.scss";
|
||||||
@import "./views/elements/_ManageIntegsButton.scss";
|
@import "./views/elements/_ManageIntegsButton.scss";
|
||||||
@import "./views/elements/_PowerSelector.scss";
|
@import "./views/elements/_PowerSelector.scss";
|
||||||
|
|
|
@ -30,30 +30,11 @@ limitations under the License.
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagPanel_clearButton_container {
|
|
||||||
/* Constant height within flex mx_TagPanel */
|
|
||||||
height: 70px;
|
|
||||||
width: 56px;
|
|
||||||
|
|
||||||
flex: none;
|
|
||||||
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-start;
|
|
||||||
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagPanel_clearButton object {
|
|
||||||
/* Same as .mx_SearchBox padding-top */
|
|
||||||
margin-top: 24px;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagPanel_divider {
|
.mx_TagPanel .mx_TagPanel_divider {
|
||||||
height: 0px;
|
height: 0px;
|
||||||
width: 34px;
|
width: 90%;
|
||||||
border-bottom: 1px solid $panel-divider-color;
|
border: none;
|
||||||
display: none;
|
border-bottom: 1px solid $tagpanel-divider-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagPanel_scroller {
|
.mx_TagPanel .mx_TagPanel_scroller {
|
||||||
|
@ -76,12 +57,57 @@ limitations under the License.
|
||||||
// opacity: 0.5;
|
// opacity: 0.5;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_TagPanel .mx_TagTile.mx_TagTile_prototype {
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagTile:focus,
|
.mx_TagPanel .mx_TagTile:focus,
|
||||||
.mx_TagPanel .mx_TagTile:hover,
|
.mx_TagPanel .mx_TagTile:hover,
|
||||||
.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
|
.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
|
||||||
// opacity: 1;
|
// opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_TagPanel .mx_TagTile.mx_TagTile_selected_prototype {
|
||||||
|
background-color: $primary-bg-color;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_TagTile_selected_prototype {
|
||||||
|
.mx_TagTile_homeIcon::before {
|
||||||
|
background-color: $primary-fg-color; // dark-on-light
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_TagTile:not(.mx_TagTile_selected_prototype) .mx_TagTile_homeIcon {
|
||||||
|
background-color: $roomheader-addroom-bg-color;
|
||||||
|
border-radius: 48px;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
background-color: $roomheader-addroom-fg-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_TagTile_homeIcon {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
mask-image: url('$(res)/img/element-icons/home.svg');
|
||||||
|
mask-position: center;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
mask-size: 21px;
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(50% - 16px);
|
||||||
|
left: calc(50% - 16px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.mx_TagPanel .mx_TagTile_plus {
|
.mx_TagPanel .mx_TagTile_plus {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
|
|
88
res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss
Normal file
88
res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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_CommunityPrototypeInviteDialog {
|
||||||
|
&.mx_Dialog_fixedWidth {
|
||||||
|
width: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_Dialog_content {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_people {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
|
||||||
|
.mx_AccessibleButton {
|
||||||
|
display: inline-block;
|
||||||
|
background-color: $focus-bg-color; // XXX: Abuse of variables
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 3px 5px;
|
||||||
|
font-size: $font-12px;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_morePeople {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_person {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 4px;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_Checkbox {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: calc(50% - 8px); // checkbox is 16px high
|
||||||
|
width: 16px; // to force a square
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_personIdentifiers {
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_personName {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: $font-14px;
|
||||||
|
color: $primary-fg-color;
|
||||||
|
margin-left: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_personId {
|
||||||
|
font-size: $font-12px;
|
||||||
|
color: $muted-fg-color;
|
||||||
|
margin-left: 7px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CommunityPrototypeInviteDialog_primaryButton {
|
||||||
|
display: block;
|
||||||
|
font-size: $font-13px;
|
||||||
|
line-height: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
102
res/css/views/dialogs/_CreateCommunityPrototypeDialog.scss
Normal file
102
res/css/views/dialogs/_CreateCommunityPrototypeDialog.scss
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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_CreateCommunityPrototypeDialog {
|
||||||
|
.mx_Dialog_content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_colName {
|
||||||
|
flex-basis: 66.66%;
|
||||||
|
padding-right: 100px;
|
||||||
|
|
||||||
|
.mx_Field input {
|
||||||
|
font-size: $font-16px;
|
||||||
|
line-height: $font-20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_subtext {
|
||||||
|
display: block;
|
||||||
|
color: $muted-fg-color;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mx_CreateCommunityPrototypeDialog_subtext_error {
|
||||||
|
color: $warning-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_communityId {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.mx_InfoTooltip {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_AccessibleButton {
|
||||||
|
display: block;
|
||||||
|
height: 32px;
|
||||||
|
font-size: $font-16px;
|
||||||
|
line-height: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_colAvatar {
|
||||||
|
flex-basis: 33.33%;
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_avatarContainer {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_avatar,
|
||||||
|
.mx_CreateCommunityPrototypeDialog_placeholderAvatar {
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
border-radius: 96px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_placeholderAvatar {
|
||||||
|
background-color: #368bd6; // hardcoded for both themes
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #fff; // hardcoded because the background is
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
mask-size: 96px;
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
mask-position: center;
|
||||||
|
content: '';
|
||||||
|
vertical-align: middle;
|
||||||
|
mask-image: url('$(res)/img/element-icons/add-photo.svg');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_CreateCommunityPrototypeDialog_tip {
|
||||||
|
& > b, & > span {
|
||||||
|
display: block;
|
||||||
|
color: $muted-fg-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
34
res/css/views/elements/_InfoTooltip.scss
Normal file
34
res/css/views/elements/_InfoTooltip.scss
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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_InfoTooltip_icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_InfoTooltip_icon::before {
|
||||||
|
display: inline-block;
|
||||||
|
background-color: $muted-fg-color;
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
mask-size: 16px;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
mask-position: center;
|
||||||
|
content: '';
|
||||||
|
vertical-align: middle;
|
||||||
|
mask-image: url('$(res)/img/element-icons/info.svg');
|
||||||
|
}
|
5
res/img/element-icons/add-photo.svg
Normal file
5
res/img/element-icons/add-photo.svg
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M36.7988 34.9062C37.077 33.5217 38.2978 32.5 39.7396 32.5H44.2604C45.7022 32.5 46.923 33.5217 47.2012 34.9062C47.2429 35.1137 47.3232 35.3141 47.4627 35.4731L48.0649 36.1595C48.2548 36.3759 48.5287 36.5 48.8166 36.5H52C53.1046 36.5 54 37.3954 54 38.5V49.5C54 50.6046 53.1046 51.5 52 51.5H32C30.8954 51.5 30 50.6046 30 49.5V38.5C30 37.3954 30.8954 36.5 32 36.5H35.1834C35.4713 36.5 35.7452 36.3759 35.9351 36.1595L36.5373 35.4731C36.6768 35.3141 36.7571 35.1137 36.7988 34.9062ZM42 47.5C44.2091 47.5 46 45.7091 46 43.5C46 41.2909 44.2091 39.5 42 39.5C39.7909 39.5 38 41.2909 38 43.5C38 45.7091 39.7909 47.5 42 47.5Z" fill="white"/>
|
||||||
|
<rect x="32" y="35" width="3" height="1" rx="0.5" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.75 27C59.75 26.5858 59.4142 26.25 59 26.25C58.5858 26.25 58.25 26.5858 58.25 27V31.25L54 31.25C53.5858 31.25 53.25 31.5858 53.25 32C53.25 32.4142 53.5858 32.75 54 32.75L58.25 32.75V37C58.25 37.4142 58.5858 37.75 59 37.75C59.4142 37.75 59.75 37.4142 59.75 37V32.75L64 32.75C64.4142 32.75 64.75 32.4142 64.75 32C64.75 31.5858 64.4142 31.25 64 31.25L59.75 31.25V27Z" fill="white"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
3
res/img/element-icons/home.svg
Normal file
3
res/img/element-icons/home.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.33301 7.28322V14.9493C2.33301 16.0735 3.25744 16.9776 4.38152 16.9659C4.90089 16.9605 5.44431 16.9567 6 16.9543V11.5C6 10.6716 6.67157 10 7.5 10H10.5C11.3284 10 12 10.6716 12 11.5V16.9662C12.6022 16.9703 13.1579 16.9748 13.6449 16.9791C14.7592 16.989 15.6663 16.0899 15.6663 14.9756V7.28178C15.6663 6.89062 15.4946 6.52064 15.1965 6.2673L9.97115 1.82572C9.411 1.3496 8.58834 1.3496 8.0282 1.82572L2.80281 6.2673C2.50477 6.52064 2.33301 6.89206 2.33301 7.28322Z" fill="#737D8C"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 634 B |
4
res/img/element-icons/info.svg
Normal file
4
res/img/element-icons/info.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="10" cy="10" r="9.5" stroke="#787878"/>
|
||||||
|
<path d="M9.79248 14H11.2065V8H9.79248V14ZM10.5034 7.14844C10.9526 7.14844 11.3198 6.80469 11.3198 6.38281C11.3198 5.95703 10.9526 5.61328 10.5034 5.61328C10.0503 5.61328 9.68311 5.95703 9.68311 6.38281C9.68311 6.80469 10.0503 7.14844 10.5034 7.14844Z" fill="#787878"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 424 B |
|
@ -119,6 +119,8 @@ $roomlist-bg-color: rgba(33, 38, 44, 0.90);
|
||||||
$roomlist-header-color: $tertiary-fg-color;
|
$roomlist-header-color: $tertiary-fg-color;
|
||||||
$roomsublist-divider-color: $primary-fg-color;
|
$roomsublist-divider-color: $primary-fg-color;
|
||||||
|
|
||||||
|
$tagpanel-divider-color: $roomlist-header-color;
|
||||||
|
|
||||||
$roomtile-preview-color: $secondary-fg-color;
|
$roomtile-preview-color: $secondary-fg-color;
|
||||||
$roomtile-default-badge-bg-color: #61708b;
|
$roomtile-default-badge-bg-color: #61708b;
|
||||||
$roomtile-selected-bg-color: rgba(141, 151, 165, 0.2);
|
$roomtile-selected-bg-color: rgba(141, 151, 165, 0.2);
|
||||||
|
|
|
@ -116,6 +116,8 @@ $roomlist-bg-color: $header-panel-bg-color;
|
||||||
|
|
||||||
$roomsublist-divider-color: $primary-fg-color;
|
$roomsublist-divider-color: $primary-fg-color;
|
||||||
|
|
||||||
|
$tagpanel-divider-color: $roomlist-header-color;
|
||||||
|
|
||||||
$roomtile-preview-color: #9e9e9e;
|
$roomtile-preview-color: #9e9e9e;
|
||||||
$roomtile-default-badge-bg-color: #61708b;
|
$roomtile-default-badge-bg-color: #61708b;
|
||||||
$roomtile-selected-bg-color: #1A1D23;
|
$roomtile-selected-bg-color: #1A1D23;
|
||||||
|
|
|
@ -183,6 +183,8 @@ $roomlist-bg-color: $header-panel-bg-color;
|
||||||
$roomlist-header-color: $primary-fg-color;
|
$roomlist-header-color: $primary-fg-color;
|
||||||
$roomsublist-divider-color: $primary-fg-color;
|
$roomsublist-divider-color: $primary-fg-color;
|
||||||
|
|
||||||
|
$tagpanel-divider-color: $roomlist-header-color;
|
||||||
|
|
||||||
$roomtile-preview-color: #9e9e9e;
|
$roomtile-preview-color: #9e9e9e;
|
||||||
$roomtile-default-badge-bg-color: #61708b;
|
$roomtile-default-badge-bg-color: #61708b;
|
||||||
$roomtile-selected-bg-color: #fff;
|
$roomtile-selected-bg-color: #fff;
|
||||||
|
|
|
@ -177,6 +177,8 @@ $roomlist-bg-color: rgba(245, 245, 245, 0.90);
|
||||||
$roomlist-header-color: $tertiary-fg-color;
|
$roomlist-header-color: $tertiary-fg-color;
|
||||||
$roomsublist-divider-color: $primary-fg-color;
|
$roomsublist-divider-color: $primary-fg-color;
|
||||||
|
|
||||||
|
$tagpanel-divider-color: $roomlist-header-color;
|
||||||
|
|
||||||
$roomtile-preview-color: $secondary-fg-color;
|
$roomtile-preview-color: $secondary-fg-color;
|
||||||
$roomtile-default-badge-bg-color: #61708b;
|
$roomtile-default-badge-bg-color: #61708b;
|
||||||
$roomtile-selected-bg-color: #FFF;
|
$roomtile-selected-bg-color: #FFF;
|
||||||
|
|
2
src/@types/global.d.ts
vendored
2
src/@types/global.d.ts
vendored
|
@ -27,10 +27,12 @@ import {ModalManager} from "../Modal";
|
||||||
import SettingsStore from "../settings/SettingsStore";
|
import SettingsStore from "../settings/SettingsStore";
|
||||||
import {ActiveRoomObserver} from "../ActiveRoomObserver";
|
import {ActiveRoomObserver} from "../ActiveRoomObserver";
|
||||||
import {Notifier} from "../Notifier";
|
import {Notifier} from "../Notifier";
|
||||||
|
import type {Renderer} from "react-dom";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
Modernizr: ModernizrStatic;
|
Modernizr: ModernizrStatic;
|
||||||
|
matrixChat: ReturnType<Renderer>;
|
||||||
mxMatrixClientPeg: IMatrixClientPeg;
|
mxMatrixClientPeg: IMatrixClientPeg;
|
||||||
Olm: {
|
Olm: {
|
||||||
init: () => Promise<void>;
|
init: () => Promise<void>;
|
||||||
|
|
|
@ -70,6 +70,7 @@ interface IContent {
|
||||||
|
|
||||||
interface IThumbnail {
|
interface IThumbnail {
|
||||||
info: {
|
info: {
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
thumbnail_info: {
|
thumbnail_info: {
|
||||||
w: number;
|
w: number;
|
||||||
h: number;
|
h: number;
|
||||||
|
@ -104,7 +105,12 @@ interface IAbortablePromise<T> extends Promise<T> {
|
||||||
* @return {Promise} A promise that resolves with an object with an info key
|
* @return {Promise} A promise that resolves with an object with an info key
|
||||||
* and a thumbnail key.
|
* and a thumbnail key.
|
||||||
*/
|
*/
|
||||||
function createThumbnail(element: ThumbnailableElement, inputWidth: number, inputHeight: number, mimeType: string): Promise<IThumbnail> {
|
function createThumbnail(
|
||||||
|
element: ThumbnailableElement,
|
||||||
|
inputWidth: number,
|
||||||
|
inputHeight: number,
|
||||||
|
mimeType: string,
|
||||||
|
): Promise<IThumbnail> {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
let targetWidth = inputWidth;
|
let targetWidth = inputWidth;
|
||||||
let targetHeight = inputHeight;
|
let targetHeight = inputHeight;
|
||||||
|
@ -437,11 +443,13 @@ export default class ContentMessages {
|
||||||
for (let i = 0; i < okFiles.length; ++i) {
|
for (let i = 0; i < okFiles.length; ++i) {
|
||||||
const file = okFiles[i];
|
const file = okFiles[i];
|
||||||
if (!uploadAll) {
|
if (!uploadAll) {
|
||||||
const {finished} = Modal.createTrackedDialog<[boolean, boolean]>('Upload Files confirmation', '', UploadConfirmDialog, {
|
const {finished} = Modal.createTrackedDialog<[boolean, boolean]>('Upload Files confirmation',
|
||||||
|
'', UploadConfirmDialog, {
|
||||||
file,
|
file,
|
||||||
currentIndex: i,
|
currentIndex: i,
|
||||||
totalFiles: okFiles.length,
|
totalFiles: okFiles.length,
|
||||||
});
|
},
|
||||||
|
);
|
||||||
const [shouldContinue, shouldUploadAll] = await finished;
|
const [shouldContinue, shouldUploadAll] = await finished;
|
||||||
if (!shouldContinue) break;
|
if (!shouldContinue) break;
|
||||||
if (shouldUploadAll) {
|
if (shouldUploadAll) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { deriveKey } from 'matrix-js-sdk/src/crypto/key_passphrase';
|
||||||
import { decodeRecoveryKey } from 'matrix-js-sdk/src/crypto/recoverykey';
|
import { decodeRecoveryKey } from 'matrix-js-sdk/src/crypto/recoverykey';
|
||||||
import { _t } from './languageHandler';
|
import { _t } from './languageHandler';
|
||||||
import {encodeBase64} from "matrix-js-sdk/src/crypto/olmlib";
|
import {encodeBase64} from "matrix-js-sdk/src/crypto/olmlib";
|
||||||
|
import { isSecureBackupRequired } from './utils/WellKnownUtils';
|
||||||
|
|
||||||
// This stores the secret storage private keys in memory for the JS SDK. This is
|
// This stores the secret storage private keys in memory for the JS SDK. This is
|
||||||
// only meant to act as a cache to avoid prompting the user multiple times
|
// only meant to act as a cache to avoid prompting the user multiple times
|
||||||
|
@ -34,6 +35,17 @@ function isCachingAllowed() {
|
||||||
return secretStorageBeingAccessed;
|
return secretStorageBeingAccessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This can be used by other components to check if secret storage access is in
|
||||||
|
* progress, so that we can e.g. avoid intermittently showing toasts during
|
||||||
|
* secret storage setup.
|
||||||
|
*
|
||||||
|
* @returns {bool}
|
||||||
|
*/
|
||||||
|
export function isSecretStorageBeingAccessed() {
|
||||||
|
return secretStorageBeingAccessed;
|
||||||
|
}
|
||||||
|
|
||||||
export class AccessCancelledError extends Error {
|
export class AccessCancelledError extends Error {
|
||||||
constructor() {
|
constructor() {
|
||||||
super("Secret storage access canceled");
|
super("Secret storage access canceled");
|
||||||
|
@ -57,19 +69,19 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) {
|
||||||
if (keyInfoEntries.length > 1) {
|
if (keyInfoEntries.length > 1) {
|
||||||
throw new Error("Multiple storage key requests not implemented");
|
throw new Error("Multiple storage key requests not implemented");
|
||||||
}
|
}
|
||||||
const [name, info] = keyInfoEntries[0];
|
const [keyId, keyInfo] = keyInfoEntries[0];
|
||||||
|
|
||||||
// Check the in-memory cache
|
// Check the in-memory cache
|
||||||
if (isCachingAllowed() && secretStorageKeys[name]) {
|
if (isCachingAllowed() && secretStorageKeys[keyId]) {
|
||||||
return [name, secretStorageKeys[name]];
|
return [keyId, secretStorageKeys[keyId]];
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputToKey = async ({ passphrase, recoveryKey }) => {
|
const inputToKey = async ({ passphrase, recoveryKey }) => {
|
||||||
if (passphrase) {
|
if (passphrase) {
|
||||||
return deriveKey(
|
return deriveKey(
|
||||||
passphrase,
|
passphrase,
|
||||||
info.passphrase.salt,
|
keyInfo.passphrase.salt,
|
||||||
info.passphrase.iterations,
|
keyInfo.passphrase.iterations,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return decodeRecoveryKey(recoveryKey);
|
return decodeRecoveryKey(recoveryKey);
|
||||||
|
@ -81,10 +93,10 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) {
|
||||||
AccessSecretStorageDialog,
|
AccessSecretStorageDialog,
|
||||||
/* props= */
|
/* props= */
|
||||||
{
|
{
|
||||||
keyInfo: info,
|
keyInfo,
|
||||||
checkPrivateKey: async (input) => {
|
checkPrivateKey: async (input) => {
|
||||||
const key = await inputToKey(input);
|
const key = await inputToKey(input);
|
||||||
return await MatrixClientPeg.get().checkSecretStorageKey(key, info);
|
return await MatrixClientPeg.get().checkSecretStorageKey(key, keyInfo);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
/* className= */ null,
|
/* className= */ null,
|
||||||
|
@ -106,11 +118,15 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) {
|
||||||
const key = await inputToKey(input);
|
const key = await inputToKey(input);
|
||||||
|
|
||||||
// Save to cache to avoid future prompts in the current session
|
// Save to cache to avoid future prompts in the current session
|
||||||
if (isCachingAllowed()) {
|
cacheSecretStorageKey(keyId, key);
|
||||||
secretStorageKeys[name] = key;
|
|
||||||
|
return [keyId, key];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [name, key];
|
function cacheSecretStorageKey(keyId, key) {
|
||||||
|
if (isCachingAllowed()) {
|
||||||
|
secretStorageKeys[keyId] = key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onSecretRequested = async function({
|
const onSecretRequested = async function({
|
||||||
|
@ -158,6 +174,7 @@ const onSecretRequested = async function({
|
||||||
|
|
||||||
export const crossSigningCallbacks = {
|
export const crossSigningCallbacks = {
|
||||||
getSecretStorageKey,
|
getSecretStorageKey,
|
||||||
|
cacheSecretStorageKey,
|
||||||
onSecretRequested,
|
onSecretRequested,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -206,9 +223,20 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f
|
||||||
const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '',
|
const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '',
|
||||||
import("./async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"),
|
import("./async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"),
|
||||||
{
|
{
|
||||||
force: forceReset,
|
forceReset,
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
/* priority = */ false,
|
||||||
|
/* static = */ true,
|
||||||
|
/* options = */ {
|
||||||
|
onBeforeClose(reason) {
|
||||||
|
// If Secure Backup is required, you cannot leave the modal.
|
||||||
|
if (reason === "backgroundClick") {
|
||||||
|
return !isSecureBackupRequired();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
null, /* priority = */ false, /* static = */ true,
|
|
||||||
);
|
);
|
||||||
const [confirmed] = await finished;
|
const [confirmed] = await finished;
|
||||||
if (!confirmed) {
|
if (!confirmed) {
|
||||||
|
@ -216,7 +244,7 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog");
|
const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog");
|
||||||
await cli.bootstrapSecretStorage({
|
await cli.bootstrapCrossSigning({
|
||||||
authUploadDeviceSigningKeys: async (makeRequest) => {
|
authUploadDeviceSigningKeys: async (makeRequest) => {
|
||||||
const { finished } = Modal.createTrackedDialog(
|
const { finished } = Modal.createTrackedDialog(
|
||||||
'Cross-signing keys dialog', '', InteractiveAuthDialog,
|
'Cross-signing keys dialog', '', InteractiveAuthDialog,
|
||||||
|
@ -231,7 +259,9 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f
|
||||||
throw new Error("Cross-signing key upload auth canceled");
|
throw new Error("Cross-signing key upload auth canceled");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getBackupPassphrase: promptForBackupPassphrase,
|
});
|
||||||
|
await cli.bootstrapSecretStorage({
|
||||||
|
getKeyBackupPassphrase: promptForBackupPassphrase,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {MatrixClientPeg} from './MatrixClientPeg';
|
import {MatrixClientPeg} from './MatrixClientPeg';
|
||||||
|
import dis from "./dispatcher/dispatcher";
|
||||||
import {
|
import {
|
||||||
hideToast as hideBulkUnverifiedSessionsToast,
|
hideToast as hideBulkUnverifiedSessionsToast,
|
||||||
showToast as showBulkUnverifiedSessionsToast,
|
showToast as showBulkUnverifiedSessionsToast,
|
||||||
|
@ -29,10 +30,15 @@ import {
|
||||||
showToast as showUnverifiedSessionsToast,
|
showToast as showUnverifiedSessionsToast,
|
||||||
} from "./toasts/UnverifiedSessionToast";
|
} from "./toasts/UnverifiedSessionToast";
|
||||||
import { privateShouldBeEncrypted } from "./createRoom";
|
import { privateShouldBeEncrypted } from "./createRoom";
|
||||||
|
import { isSecretStorageBeingAccessed, accessSecretStorage } from "./CrossSigningManager";
|
||||||
|
import { isSecureBackupRequired } from './utils/WellKnownUtils';
|
||||||
|
import { isLoggedIn } from './components/structures/MatrixChat';
|
||||||
|
|
||||||
|
|
||||||
const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000;
|
const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000;
|
||||||
|
|
||||||
export default class DeviceListener {
|
export default class DeviceListener {
|
||||||
|
private dispatcherRef: string;
|
||||||
// device IDs for which the user has dismissed the verify toast ('Later')
|
// device IDs for which the user has dismissed the verify toast ('Later')
|
||||||
private dismissed = new Set<string>();
|
private dismissed = new Set<string>();
|
||||||
// has the user dismissed any of the various nag toasts to setup encryption on this device?
|
// has the user dismissed any of the various nag toasts to setup encryption on this device?
|
||||||
|
@ -60,6 +66,7 @@ export default class DeviceListener {
|
||||||
MatrixClientPeg.get().on('crossSigning.keysChanged', this._onCrossSingingKeysChanged);
|
MatrixClientPeg.get().on('crossSigning.keysChanged', this._onCrossSingingKeysChanged);
|
||||||
MatrixClientPeg.get().on('accountData', this._onAccountData);
|
MatrixClientPeg.get().on('accountData', this._onAccountData);
|
||||||
MatrixClientPeg.get().on('sync', this._onSync);
|
MatrixClientPeg.get().on('sync', this._onSync);
|
||||||
|
this.dispatcherRef = dis.register(this._onAction);
|
||||||
this._recheck();
|
this._recheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +80,10 @@ export default class DeviceListener {
|
||||||
MatrixClientPeg.get().removeListener('accountData', this._onAccountData);
|
MatrixClientPeg.get().removeListener('accountData', this._onAccountData);
|
||||||
MatrixClientPeg.get().removeListener('sync', this._onSync);
|
MatrixClientPeg.get().removeListener('sync', this._onSync);
|
||||||
}
|
}
|
||||||
|
if (this.dispatcherRef) {
|
||||||
|
dis.unregister(this.dispatcherRef);
|
||||||
|
this.dispatcherRef = null;
|
||||||
|
}
|
||||||
this.dismissed.clear();
|
this.dismissed.clear();
|
||||||
this.dismissedThisDeviceToast = false;
|
this.dismissedThisDeviceToast = false;
|
||||||
this.keyBackupInfo = null;
|
this.keyBackupInfo = null;
|
||||||
|
@ -158,6 +169,11 @@ export default class DeviceListener {
|
||||||
if (state === 'PREPARED' && prevState === null) this._recheck();
|
if (state === 'PREPARED' && prevState === null) this._recheck();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_onAction = ({ action }) => {
|
||||||
|
if (action !== "on_logged_in") return;
|
||||||
|
this._recheck();
|
||||||
|
};
|
||||||
|
|
||||||
// The server doesn't tell us when key backup is set up, so we poll
|
// The server doesn't tell us when key backup is set up, so we poll
|
||||||
// & cache the result
|
// & cache the result
|
||||||
async _getKeyBackupInfo() {
|
async _getKeyBackupInfo() {
|
||||||
|
@ -170,6 +186,9 @@ export default class DeviceListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private shouldShowSetupEncryptionToast() {
|
private shouldShowSetupEncryptionToast() {
|
||||||
|
// If we're in the middle of a secret storage operation, we're likely
|
||||||
|
// modifying the state involved here, so don't add new toasts to setup.
|
||||||
|
if (isSecretStorageBeingAccessed()) return false;
|
||||||
// In a default configuration, show the toasts. If the well-known config causes e2ee default to be false
|
// In a default configuration, show the toasts. If the well-known config causes e2ee default to be false
|
||||||
// then do not show the toasts until user is in at least one encrypted room.
|
// then do not show the toasts until user is in at least one encrypted room.
|
||||||
if (privateShouldBeEncrypted()) return true;
|
if (privateShouldBeEncrypted()) return true;
|
||||||
|
@ -188,9 +207,13 @@ export default class DeviceListener {
|
||||||
// (we add a listener on sync to do once check after the initial sync is done)
|
// (we add a listener on sync to do once check after the initial sync is done)
|
||||||
if (!cli.isInitialSyncComplete()) return;
|
if (!cli.isInitialSyncComplete()) return;
|
||||||
|
|
||||||
|
// JRS: This will change again in the next PR which moves secret storage
|
||||||
|
// later in the process.
|
||||||
const crossSigningReady = await cli.isCrossSigningReady();
|
const crossSigningReady = await cli.isCrossSigningReady();
|
||||||
|
const secretStorageReady = await cli.isSecretStorageReady();
|
||||||
|
const allSystemsReady = crossSigningReady && secretStorageReady;
|
||||||
|
|
||||||
if (this.dismissedThisDeviceToast || crossSigningReady) {
|
if (this.dismissedThisDeviceToast || allSystemsReady) {
|
||||||
hideSetupEncryptionToast();
|
hideSetupEncryptionToast();
|
||||||
} else if (this.shouldShowSetupEncryptionToast()) {
|
} else if (this.shouldShowSetupEncryptionToast()) {
|
||||||
// make sure our keys are finished downloading
|
// make sure our keys are finished downloading
|
||||||
|
@ -207,10 +230,18 @@ export default class DeviceListener {
|
||||||
showSetupEncryptionToast(SetupKind.UPGRADE_ENCRYPTION);
|
showSetupEncryptionToast(SetupKind.UPGRADE_ENCRYPTION);
|
||||||
} else {
|
} else {
|
||||||
// No cross-signing or key backup on account (set up encryption)
|
// No cross-signing or key backup on account (set up encryption)
|
||||||
|
await cli.waitForClientWellKnown();
|
||||||
|
if (isSecureBackupRequired() && isLoggedIn()) {
|
||||||
|
// If we're meant to set up, and Secure Backup is required,
|
||||||
|
// trigger the flow directly without a toast once logged in.
|
||||||
|
hideSetupEncryptionToast();
|
||||||
|
accessSecretStorage();
|
||||||
|
} else {
|
||||||
showSetupEncryptionToast(SetupKind.SET_UP_ENCRYPTION);
|
showSetupEncryptionToast(SetupKind.SET_UP_ENCRYPTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This needs to be done after awaiting on downloadKeys() above, so
|
// This needs to be done after awaiting on downloadKeys() above, so
|
||||||
// we make sure we get the devices after the fetch is done.
|
// we make sure we get the devices after the fetch is done.
|
||||||
|
|
|
@ -339,33 +339,9 @@ class HtmlHighlighter extends BaseHighlighter<string> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TextHighlighter extends BaseHighlighter<React.ReactNode> {
|
|
||||||
private key = 0;
|
|
||||||
|
|
||||||
/* create a <span> node to hold the given content
|
|
||||||
*
|
|
||||||
* snippet: content of the span
|
|
||||||
* highlight: true to highlight as a search match
|
|
||||||
*
|
|
||||||
* returns a React node
|
|
||||||
*/
|
|
||||||
protected processSnippet(snippet: string, highlight: boolean): React.ReactNode {
|
|
||||||
const key = this.key++;
|
|
||||||
|
|
||||||
let node = <span key={key} className={highlight ? this.highlightClass : null}>
|
|
||||||
{ snippet }
|
|
||||||
</span>;
|
|
||||||
|
|
||||||
if (highlight && this.highlightLink) {
|
|
||||||
node = <a key={key} href={this.highlightLink}>{ node }</a>;
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IContent {
|
interface IContent {
|
||||||
format?: string;
|
format?: string;
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
formatted_body?: string;
|
formatted_body?: string;
|
||||||
body: string;
|
body: string;
|
||||||
}
|
}
|
||||||
|
@ -474,8 +450,13 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts
|
||||||
});
|
});
|
||||||
|
|
||||||
return isDisplayedWithHtml ?
|
return isDisplayedWithHtml ?
|
||||||
<span key="body" ref={opts.ref} className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir="auto" /> :
|
<span
|
||||||
<span key="body" ref={opts.ref} className={className} dir="auto">{ strippedBody }</span>;
|
key="body"
|
||||||
|
ref={opts.ref}
|
||||||
|
className={className}
|
||||||
|
dangerouslySetInnerHTML={{ __html: safeBody }}
|
||||||
|
dir="auto"
|
||||||
|
/> : <span key="body" ref={opts.ref} className={className} dir="auto">{ strippedBody }</span>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -151,7 +151,7 @@ export class ModalManager {
|
||||||
prom: Promise<React.ComponentType>,
|
prom: Promise<React.ComponentType>,
|
||||||
props?: IProps<T>,
|
props?: IProps<T>,
|
||||||
className?: string,
|
className?: string,
|
||||||
options?: IOptions<T>
|
options?: IOptions<T>,
|
||||||
) {
|
) {
|
||||||
const modal: IModal<T> = {
|
const modal: IModal<T> = {
|
||||||
onFinished: props ? props.onFinished : null,
|
onFinished: props ? props.onFinished : null,
|
||||||
|
@ -182,7 +182,7 @@ export class ModalManager {
|
||||||
|
|
||||||
private getCloseFn<T extends any[]>(
|
private getCloseFn<T extends any[]>(
|
||||||
modal: IModal<T>,
|
modal: IModal<T>,
|
||||||
props: IProps<T>
|
props: IProps<T>,
|
||||||
): [IHandle<T>["close"], IHandle<T>["finished"]] {
|
): [IHandle<T>["close"], IHandle<T>["finished"]] {
|
||||||
const deferred = defer<T>();
|
const deferred = defer<T>();
|
||||||
return [async (...args: T) => {
|
return [async (...args: T) => {
|
||||||
|
@ -264,7 +264,7 @@ export class ModalManager {
|
||||||
className?: string,
|
className?: string,
|
||||||
isPriorityModal = false,
|
isPriorityModal = false,
|
||||||
isStaticModal = false,
|
isStaticModal = false,
|
||||||
options: IOptions<T> = {}
|
options: IOptions<T> = {},
|
||||||
): IHandle<T> {
|
): IHandle<T> {
|
||||||
const {modal, closeDialog, onFinishedProm} = this.buildModal<T>(prom, props, className, options);
|
const {modal, closeDialog, onFinishedProm} = this.buildModal<T>(prom, props, className, options);
|
||||||
if (isPriorityModal) {
|
if (isPriorityModal) {
|
||||||
|
@ -287,7 +287,7 @@ export class ModalManager {
|
||||||
private appendDialogAsync<T extends any[]>(
|
private appendDialogAsync<T extends any[]>(
|
||||||
prom: Promise<React.ComponentType>,
|
prom: Promise<React.ComponentType>,
|
||||||
props?: IProps<T>,
|
props?: IProps<T>,
|
||||||
className?: string
|
className?: string,
|
||||||
): IHandle<T> {
|
): IHandle<T> {
|
||||||
const {modal, closeDialog, onFinishedProm} = this.buildModal<T>(prom, props, className, {});
|
const {modal, closeDialog, onFinishedProm} = this.buildModal<T>(prom, props, className, {});
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ import Modal from './Modal';
|
||||||
import * as sdk from './';
|
import * as sdk from './';
|
||||||
import { _t } from './languageHandler';
|
import { _t } from './languageHandler';
|
||||||
import {KIND_DM, KIND_INVITE} from "./components/views/dialogs/InviteDialog";
|
import {KIND_DM, KIND_INVITE} from "./components/views/dialogs/InviteDialog";
|
||||||
|
import CommunityPrototypeInviteDialog from "./components/views/dialogs/CommunityPrototypeInviteDialog";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invites multiple addresses to a room
|
* Invites multiple addresses to a room
|
||||||
|
@ -56,6 +57,13 @@ export function showRoomInviteDialog(roomId) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function showCommunityRoomInviteDialog(roomId, communityName) {
|
||||||
|
Modal.createTrackedDialog(
|
||||||
|
'Invite Users to Community', '', CommunityPrototypeInviteDialog, {communityName, roomId},
|
||||||
|
/*className=*/null, /*isPriority=*/false, /*isStatic=*/true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the given MatrixEvent is a valid 3rd party user invite.
|
* Checks if the given MatrixEvent is a valid 3rd party user invite.
|
||||||
* @param {MatrixEvent} event The event to check
|
* @param {MatrixEvent} event The event to check
|
||||||
|
@ -77,7 +85,7 @@ export function isValid3pidInvite(event) {
|
||||||
export function inviteUsersToRoom(roomId, userIds) {
|
export function inviteUsersToRoom(roomId, userIds) {
|
||||||
return inviteMultipleToRoom(roomId, userIds).then((result) => {
|
return inviteMultipleToRoom(roomId, userIds).then((result) => {
|
||||||
const room = MatrixClientPeg.get().getRoom(roomId);
|
const room = MatrixClientPeg.get().getRoom(roomId);
|
||||||
return _showAnyInviteErrors(result.states, room, result.inviter);
|
showAnyInviteErrors(result.states, room, result.inviter);
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
console.error(err.stack);
|
console.error(err.stack);
|
||||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
|
@ -88,7 +96,7 @@ export function inviteUsersToRoom(roomId, userIds) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function _showAnyInviteErrors(addrs, room, inviter) {
|
export function showAnyInviteErrors(addrs, room, inviter) {
|
||||||
// Show user any errors
|
// Show user any errors
|
||||||
const failedUsers = Object.keys(addrs).filter(a => addrs[a] === 'error');
|
const failedUsers = Object.keys(addrs).filter(a => addrs[a] === 'error');
|
||||||
if (failedUsers.length === 1 && inviter.fatal) {
|
if (failedUsers.length === 1 && inviter.fatal) {
|
||||||
|
@ -100,6 +108,7 @@ function _showAnyInviteErrors(addrs, room, inviter) {
|
||||||
title: _t("Failed to invite users to the room:", {roomName: room.name}),
|
title: _t("Failed to invite users to the room:", {roomName: room.name}),
|
||||||
description: inviter.getErrorText(failedUsers[0]),
|
description: inviter.getErrorText(failedUsers[0]),
|
||||||
});
|
});
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
const errorList = [];
|
const errorList = [];
|
||||||
for (const addr of failedUsers) {
|
for (const addr of failedUsers) {
|
||||||
|
@ -118,8 +127,9 @@ function _showAnyInviteErrors(addrs, room, inviter) {
|
||||||
title: _t("Failed to invite the following users to the %(roomName)s room:", {roomName: room.name}),
|
title: _t("Failed to invite the following users to the %(roomName)s room:", {roomName: room.name}),
|
||||||
description,
|
description,
|
||||||
});
|
});
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return addrs;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ const shortcuts: Record<Categories, IShortcut[]> = {
|
||||||
key: Key.U,
|
key: Key.U,
|
||||||
}],
|
}],
|
||||||
description: _td("Upload a file"),
|
description: _td("Upload a file"),
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
[Categories.ROOM_LIST]: [
|
[Categories.ROOM_LIST]: [
|
||||||
|
|
|
@ -190,7 +190,7 @@ export const RovingTabIndexProvider: React.FC<IProps> = ({children, handleHomeEn
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
ev.stopPropagation();
|
ev.stopPropagation();
|
||||||
} else if (onKeyDown) {
|
} else if (onKeyDown) {
|
||||||
return onKeyDown(ev, state);
|
return onKeyDown(ev, context.state);
|
||||||
}
|
}
|
||||||
}, [context.state, onKeyDown, handleHomeEnd]);
|
}, [context.state, onKeyDown, handleHomeEnd]);
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ const Toolbar: React.FC<IProps> = ({children, ...props}) => {
|
||||||
const target = ev.target as HTMLElement;
|
const target = ev.target as HTMLElement;
|
||||||
let handled = true;
|
let handled = true;
|
||||||
|
|
||||||
|
// HOME and END are handled by RovingTabIndexProvider
|
||||||
switch (ev.key) {
|
switch (ev.key) {
|
||||||
case Key.ARROW_UP:
|
case Key.ARROW_UP:
|
||||||
case Key.ARROW_DOWN:
|
case Key.ARROW_DOWN:
|
||||||
|
@ -47,8 +48,6 @@ const Toolbar: React.FC<IProps> = ({children, ...props}) => {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// HOME and END are handled by RovingTabIndexProvider
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
handled = false;
|
handled = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,8 @@ import AccessibleTooltipButton from "../../components/views/elements/AccessibleT
|
||||||
import {useRovingTabIndex} from "../RovingTabIndex";
|
import {useRovingTabIndex} from "../RovingTabIndex";
|
||||||
import {Ref} from "./types";
|
import {Ref} from "./types";
|
||||||
|
|
||||||
interface IProps extends Omit<React.ComponentProps<typeof AccessibleTooltipButton>, "onFocus" | "inputRef" | "tabIndex"> {
|
type ATBProps = React.ComponentProps<typeof AccessibleTooltipButton>;
|
||||||
|
interface IProps extends Omit<ATBProps, "onFocus" | "inputRef" | "tabIndex"> {
|
||||||
inputRef?: Ref;
|
inputRef?: Ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ limitations under the License.
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import AccessibleButton from "../../components/views/elements/AccessibleButton";
|
|
||||||
import {useRovingTabIndex} from "../RovingTabIndex";
|
import {useRovingTabIndex} from "../RovingTabIndex";
|
||||||
import {FocusHandler, Ref} from "./types";
|
import {FocusHandler, Ref} from "./types";
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import StyledRadioButton from '../../../../components/views/elements/StyledRadio
|
||||||
import AccessibleButton from "../../../../components/views/elements/AccessibleButton";
|
import AccessibleButton from "../../../../components/views/elements/AccessibleButton";
|
||||||
import DialogButtons from "../../../../components/views/elements/DialogButtons";
|
import DialogButtons from "../../../../components/views/elements/DialogButtons";
|
||||||
import InlineSpinner from "../../../../components/views/elements/InlineSpinner";
|
import InlineSpinner from "../../../../components/views/elements/InlineSpinner";
|
||||||
|
import { isSecureBackupRequired } from '../../../../utils/WellKnownUtils';
|
||||||
|
|
||||||
const PHASE_LOADING = 0;
|
const PHASE_LOADING = 0;
|
||||||
const PHASE_LOADERROR = 1;
|
const PHASE_LOADERROR = 1;
|
||||||
|
@ -55,12 +56,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
hasCancel: PropTypes.bool,
|
hasCancel: PropTypes.bool,
|
||||||
accountPassword: PropTypes.string,
|
accountPassword: PropTypes.string,
|
||||||
force: PropTypes.bool,
|
forceReset: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
hasCancel: true,
|
hasCancel: true,
|
||||||
force: false,
|
forceReset: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -85,8 +86,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
canUploadKeysWithPasswordOnly: null,
|
canUploadKeysWithPasswordOnly: null,
|
||||||
accountPassword: props.accountPassword || "",
|
accountPassword: props.accountPassword || "",
|
||||||
accountPasswordCorrect: null,
|
accountPasswordCorrect: null,
|
||||||
|
|
||||||
passPhraseKeySelected: CREATE_STORAGE_OPTION_KEY,
|
passPhraseKeySelected: CREATE_STORAGE_OPTION_KEY,
|
||||||
|
canSkip: !isSecureBackupRequired(),
|
||||||
};
|
};
|
||||||
|
|
||||||
this._passphraseField = createRef();
|
this._passphraseField = createRef();
|
||||||
|
@ -117,8 +118,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo)
|
MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo)
|
||||||
);
|
);
|
||||||
|
|
||||||
const { force } = this.props;
|
const { forceReset } = this.props;
|
||||||
const phase = (backupInfo && !force) ? PHASE_MIGRATE : PHASE_CHOOSE_KEY_PASSPHRASE;
|
const phase = (backupInfo && !forceReset) ? PHASE_MIGRATE : PHASE_CHOOSE_KEY_PASSPHRASE;
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
phase,
|
phase,
|
||||||
|
@ -276,20 +277,25 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
|
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
|
|
||||||
const { force } = this.props;
|
const { forceReset } = this.props;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (force) {
|
if (forceReset) {
|
||||||
console.log("Forcing secret storage reset"); // log something so we can debug this later
|
console.log("Forcing cross-signing and secret storage reset");
|
||||||
await cli.bootstrapSecretStorage({
|
await cli.bootstrapSecretStorage({
|
||||||
authUploadDeviceSigningKeys: this._doBootstrapUIAuth,
|
|
||||||
createSecretStorageKey: async () => this._recoveryKey,
|
createSecretStorageKey: async () => this._recoveryKey,
|
||||||
setupNewKeyBackup: true,
|
setupNewKeyBackup: true,
|
||||||
setupNewSecretStorage: true,
|
setupNewSecretStorage: true,
|
||||||
});
|
});
|
||||||
} else {
|
await cli.bootstrapCrossSigning({
|
||||||
await cli.bootstrapSecretStorage({
|
|
||||||
authUploadDeviceSigningKeys: this._doBootstrapUIAuth,
|
authUploadDeviceSigningKeys: this._doBootstrapUIAuth,
|
||||||
|
setupNewCrossSigning: true,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await cli.bootstrapCrossSigning({
|
||||||
|
authUploadDeviceSigningKeys: this._doBootstrapUIAuth,
|
||||||
|
});
|
||||||
|
await cli.bootstrapSecretStorage({
|
||||||
createSecretStorageKey: async () => this._recoveryKey,
|
createSecretStorageKey: async () => this._recoveryKey,
|
||||||
keyBackupInfo: this.state.backupInfo,
|
keyBackupInfo: this.state.backupInfo,
|
||||||
setupNewKeyBackup: !this.state.backupInfo,
|
setupNewKeyBackup: !this.state.backupInfo,
|
||||||
|
@ -470,7 +476,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
primaryButton={_t("Continue")}
|
primaryButton={_t("Continue")}
|
||||||
onPrimaryButtonClick={this._onChooseKeyPassphraseFormSubmit}
|
onPrimaryButtonClick={this._onChooseKeyPassphraseFormSubmit}
|
||||||
onCancel={this._onCancelClick}
|
onCancel={this._onCancelClick}
|
||||||
hasCancel={true}
|
hasCancel={this.state.canSkip}
|
||||||
/>
|
/>
|
||||||
</form>;
|
</form>;
|
||||||
}
|
}
|
||||||
|
@ -687,7 +693,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
<div className="mx_Dialog_buttons">
|
<div className="mx_Dialog_buttons">
|
||||||
<DialogButtons primaryButton={_t('Retry')}
|
<DialogButtons primaryButton={_t('Retry')}
|
||||||
onPrimaryButtonClick={this._onLoadRetryClick}
|
onPrimaryButtonClick={this._onLoadRetryClick}
|
||||||
hasCancel={true}
|
hasCancel={this.state.canSkip}
|
||||||
onCancel={this._onCancel}
|
onCancel={this._onCancel}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -714,7 +720,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
_titleForPhase(phase) {
|
_titleForPhase(phase) {
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
case PHASE_CHOOSE_KEY_PASSPHRASE:
|
case PHASE_CHOOSE_KEY_PASSPHRASE:
|
||||||
return _t('Set up Secure backup');
|
return _t('Set up Secure Backup');
|
||||||
case PHASE_MIGRATE:
|
case PHASE_MIGRATE:
|
||||||
return _t('Upgrade your encryption');
|
return _t('Upgrade your encryption');
|
||||||
case PHASE_PASSPHRASE:
|
case PHASE_PASSPHRASE:
|
||||||
|
@ -742,7 +748,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
<div className="mx_Dialog_buttons">
|
<div className="mx_Dialog_buttons">
|
||||||
<DialogButtons primaryButton={_t('Retry')}
|
<DialogButtons primaryButton={_t('Retry')}
|
||||||
onPrimaryButtonClick={this._bootstrapSecretStorage}
|
onPrimaryButtonClick={this._bootstrapSecretStorage}
|
||||||
hasCancel={true}
|
hasCancel={this.state.canSkip}
|
||||||
onCancel={this._onCancel}
|
onCancel={this._onCancel}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -89,7 +89,11 @@ export default class CommandProvider extends AutocompleteProvider {
|
||||||
|
|
||||||
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
||||||
return (
|
return (
|
||||||
<div className="mx_Autocomplete_Completion_container_block" role="listbox" aria-label={_t("Command Autocomplete")}>
|
<div
|
||||||
|
className="mx_Autocomplete_Completion_container_block"
|
||||||
|
role="listbox"
|
||||||
|
aria-label={_t("Command Autocomplete")}
|
||||||
|
>
|
||||||
{ completions }
|
{ completions }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -91,15 +91,15 @@ export default class CommunityProvider extends AutocompleteProvider {
|
||||||
href: makeGroupPermalink(groupId),
|
href: makeGroupPermalink(groupId),
|
||||||
component: (
|
component: (
|
||||||
<PillCompletion title={name} description={groupId}>
|
<PillCompletion title={name} description={groupId}>
|
||||||
<BaseAvatar name={name || groupId}
|
<BaseAvatar
|
||||||
|
name={name || groupId}
|
||||||
width={24}
|
width={24}
|
||||||
height={24}
|
height={24}
|
||||||
url={avatarUrl ? cli.mxcUrlToHttp(avatarUrl, 24, 24) : null} />
|
url={avatarUrl ? cli.mxcUrlToHttp(avatarUrl, 24, 24) : null} />
|
||||||
</PillCompletion>
|
</PillCompletion>
|
||||||
),
|
),
|
||||||
range,
|
range,
|
||||||
}))
|
})).slice(0, 4);
|
||||||
.slice(0, 4);
|
|
||||||
}
|
}
|
||||||
return completions;
|
return completions;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,11 @@ export default class EmojiProvider extends AutocompleteProvider {
|
||||||
|
|
||||||
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
||||||
return (
|
return (
|
||||||
<div className="mx_Autocomplete_Completion_container_pill" role="listbox" aria-label={_t("Emoji Autocomplete")}>
|
<div
|
||||||
|
className="mx_Autocomplete_Completion_container_pill"
|
||||||
|
role="listbox"
|
||||||
|
aria-label={_t("Emoji Autocomplete")}
|
||||||
|
>
|
||||||
{ completions }
|
{ completions }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -110,9 +110,7 @@ export default class RoomProvider extends AutocompleteProvider {
|
||||||
),
|
),
|
||||||
range,
|
range,
|
||||||
};
|
};
|
||||||
})
|
}).filter((completion) => !!completion.completion && completion.completion.length > 0).slice(0, 4);
|
||||||
.filter((completion) => !!completion.completion && completion.completion.length > 0)
|
|
||||||
.slice(0, 4);
|
|
||||||
}
|
}
|
||||||
return completions;
|
return completions;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,8 +71,13 @@ export default class UserProvider extends AutocompleteProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private onRoomTimeline = (ev: MatrixEvent, room: Room, toStartOfTimeline: boolean, removed: boolean,
|
private onRoomTimeline = (
|
||||||
data: IRoomTimelineData) => {
|
ev: MatrixEvent,
|
||||||
|
room: Room,
|
||||||
|
toStartOfTimeline: boolean,
|
||||||
|
removed: boolean,
|
||||||
|
data: IRoomTimelineData,
|
||||||
|
) => {
|
||||||
if (!room) return;
|
if (!room) return;
|
||||||
if (removed) return;
|
if (removed) return;
|
||||||
if (room.roomId !== this.room.roomId) return;
|
if (room.roomId !== this.room.roomId) return;
|
||||||
|
@ -171,7 +176,11 @@ export default class UserProvider extends AutocompleteProvider {
|
||||||
|
|
||||||
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
renderCompletions(completions: React.ReactNode[]): React.ReactNode {
|
||||||
return (
|
return (
|
||||||
<div className="mx_Autocomplete_Completion_container_pill" role="listbox" aria-label={_t("User Autocomplete")}>
|
<div
|
||||||
|
className="mx_Autocomplete_Completion_container_pill"
|
||||||
|
role="listbox"
|
||||||
|
aria-label={_t("User Autocomplete")}
|
||||||
|
>
|
||||||
{ completions }
|
{ completions }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2015, 2016 OpenMarket Ltd
|
|
||||||
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
|
|
||||||
Copyright 2019, 2020 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 React from 'react';
|
|
||||||
import createReactClass from 'create-react-class';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { _t } from '../../languageHandler';
|
|
||||||
import SdkConfig from '../../SdkConfig';
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'CompatibilityPage',
|
|
||||||
propTypes: {
|
|
||||||
onAccept: PropTypes.func,
|
|
||||||
},
|
|
||||||
|
|
||||||
getDefaultProps: function() {
|
|
||||||
return {
|
|
||||||
onAccept: function() {}, // NOP
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
onAccept: function() {
|
|
||||||
this.props.onAccept();
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
const brand = SdkConfig.get().brand;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="mx_CompatibilityPage">
|
|
||||||
<div className="mx_CompatibilityPage_box">
|
|
||||||
<p>{_t(
|
|
||||||
"Sorry, your browser is <b>not</b> able to run %(brand)s.",
|
|
||||||
{
|
|
||||||
brand,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'b': (sub) => <b>{sub}</b>,
|
|
||||||
})
|
|
||||||
}</p>
|
|
||||||
<p>
|
|
||||||
{ _t(
|
|
||||||
"%(brand)s uses many advanced browser features, some of which are not available " +
|
|
||||||
"or experimental in your current browser.",
|
|
||||||
{ brand },
|
|
||||||
) }
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{ _t(
|
|
||||||
'Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ' +
|
|
||||||
'or <safariLink>Safari</safariLink> for the best experience.',
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
|
|
||||||
'firefoxLink': (sub) => <a href="https://firefox.com">{sub}</a>,
|
|
||||||
'safariLink': (sub) => <a href="https://apple.com/safari">{sub}</a>,
|
|
||||||
},
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{ _t(
|
|
||||||
"With your current browser, the look and feel of the application may be " +
|
|
||||||
"completely incorrect, and some or all features may not function. " +
|
|
||||||
"If you want to try it anyway you can continue, but you are on your own in terms " +
|
|
||||||
"of any issues you may encounter!",
|
|
||||||
) }
|
|
||||||
</p>
|
|
||||||
<button onClick={this.onAccept}>
|
|
||||||
{ _t("I understand the risks and wish to continue") }
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -233,8 +233,7 @@ export class ContextMenu extends React.PureComponent<IProps, IState> {
|
||||||
switch (ev.key) {
|
switch (ev.key) {
|
||||||
case Key.TAB:
|
case Key.TAB:
|
||||||
case Key.ESCAPE:
|
case Key.ESCAPE:
|
||||||
// close on left and right arrows too for when it is a context menu on a <Toolbar />
|
case Key.ARROW_LEFT: // close on left and right arrows too for when it is a context menu on a <Toolbar />
|
||||||
case Key.ARROW_LEFT:
|
|
||||||
case Key.ARROW_RIGHT:
|
case Key.ARROW_RIGHT:
|
||||||
this.props.onFinished();
|
this.props.onFinished();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -43,11 +43,11 @@ import PlatformPeg from "../../PlatformPeg";
|
||||||
import { DefaultTagID } from "../../stores/room-list/models";
|
import { DefaultTagID } from "../../stores/room-list/models";
|
||||||
import {
|
import {
|
||||||
showToast as showSetPasswordToast,
|
showToast as showSetPasswordToast,
|
||||||
hideToast as hideSetPasswordToast
|
hideToast as hideSetPasswordToast,
|
||||||
} from "../../toasts/SetPasswordToast";
|
} from "../../toasts/SetPasswordToast";
|
||||||
import {
|
import {
|
||||||
showToast as showServerLimitToast,
|
showToast as showServerLimitToast,
|
||||||
hideToast as hideServerLimitToast
|
hideToast as hideServerLimitToast,
|
||||||
} from "../../toasts/ServerLimitToast";
|
} from "../../toasts/ServerLimitToast";
|
||||||
import { Action } from "../../dispatcher/actions";
|
import { Action } from "../../dispatcher/actions";
|
||||||
import LeftPanel from "./LeftPanel";
|
import LeftPanel from "./LeftPanel";
|
||||||
|
@ -79,6 +79,7 @@ interface IProps {
|
||||||
initialEventPixelOffset: number;
|
initialEventPixelOffset: number;
|
||||||
leftDisabled: boolean;
|
leftDisabled: boolean;
|
||||||
rightDisabled: boolean;
|
rightDisabled: boolean;
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
page_type: string;
|
page_type: string;
|
||||||
autoJoin: boolean;
|
autoJoin: boolean;
|
||||||
thirdPartyInvite?: object;
|
thirdPartyInvite?: object;
|
||||||
|
@ -98,7 +99,9 @@ interface IProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IUsageLimit {
|
interface IUsageLimit {
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
limit_type: "monthly_active_user" | string;
|
limit_type: "monthly_active_user" | string;
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
admin_contact?: string;
|
admin_contact?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,10 +319,10 @@ class LoggedInView extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_calculateServerLimitToast(syncErrorData: IState["syncErrorData"], usageLimitEventContent?: IUsageLimit) {
|
_calculateServerLimitToast(syncError: IState["syncErrorData"], usageLimitEventContent?: IUsageLimit) {
|
||||||
const error = syncErrorData && syncErrorData.error && syncErrorData.error.errcode === "M_RESOURCE_LIMIT_EXCEEDED";
|
const error = syncError && syncError.error && syncError.error.errcode === "M_RESOURCE_LIMIT_EXCEEDED";
|
||||||
if (error) {
|
if (error) {
|
||||||
usageLimitEventContent = syncErrorData.error.data;
|
usageLimitEventContent = syncError.error.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usageLimitEventContent) {
|
if (usageLimitEventContent) {
|
||||||
|
|
|
@ -69,7 +69,7 @@ import { ViewUserPayload } from "../../dispatcher/payloads/ViewUserPayload";
|
||||||
import { Action } from "../../dispatcher/actions";
|
import { Action } from "../../dispatcher/actions";
|
||||||
import {
|
import {
|
||||||
showToast as showAnalyticsToast,
|
showToast as showAnalyticsToast,
|
||||||
hideToast as hideAnalyticsToast
|
hideToast as hideAnalyticsToast,
|
||||||
} from "../../toasts/AnalyticsToast";
|
} from "../../toasts/AnalyticsToast";
|
||||||
import {showToast as showNotificationsToast} from "../../toasts/DesktopNotificationsToast";
|
import {showToast as showNotificationsToast} from "../../toasts/DesktopNotificationsToast";
|
||||||
import { OpenToTabPayload } from "../../dispatcher/payloads/OpenToTabPayload";
|
import { OpenToTabPayload } from "../../dispatcher/payloads/OpenToTabPayload";
|
||||||
|
@ -77,6 +77,7 @@ import ErrorDialog from "../views/dialogs/ErrorDialog";
|
||||||
import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore";
|
import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore";
|
||||||
import { SettingLevel } from "../../settings/SettingLevel";
|
import { SettingLevel } from "../../settings/SettingLevel";
|
||||||
import { leaveRoomBehaviour } from "../../utils/membership";
|
import { leaveRoomBehaviour } from "../../utils/membership";
|
||||||
|
import CreateCommunityPrototypeDialog from "../views/dialogs/CreateCommunityPrototypeDialog";
|
||||||
|
|
||||||
/** constants for MatrixChat.state.view */
|
/** constants for MatrixChat.state.view */
|
||||||
export enum Views {
|
export enum Views {
|
||||||
|
@ -128,6 +129,7 @@ interface IScreen {
|
||||||
params?: object;
|
params?: object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* eslint-disable camelcase */
|
||||||
interface IRoomInfo {
|
interface IRoomInfo {
|
||||||
room_id?: string;
|
room_id?: string;
|
||||||
room_alias?: string;
|
room_alias?: string;
|
||||||
|
@ -139,6 +141,7 @@ interface IRoomInfo {
|
||||||
oob_data?: object;
|
oob_data?: object;
|
||||||
via_servers?: string[];
|
via_servers?: string[];
|
||||||
}
|
}
|
||||||
|
/* eslint-enable camelcase */
|
||||||
|
|
||||||
interface IProps { // TODO type things better
|
interface IProps { // TODO type things better
|
||||||
config: Record<string, any>;
|
config: Record<string, any>;
|
||||||
|
@ -164,6 +167,7 @@ interface IState {
|
||||||
// the master view we are showing.
|
// the master view we are showing.
|
||||||
view: Views;
|
view: Views;
|
||||||
// What the LoggedInView would be showing if visible
|
// What the LoggedInView would be showing if visible
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
page_type?: PageTypes;
|
page_type?: PageTypes;
|
||||||
// The ID of the room we're viewing. This is either populated directly
|
// The ID of the room we're viewing. This is either populated directly
|
||||||
// in the case where we view a room by ID or by RoomView when it resolves
|
// in the case where we view a room by ID or by RoomView when it resolves
|
||||||
|
@ -179,8 +183,11 @@ interface IState {
|
||||||
middleDisabled: boolean;
|
middleDisabled: boolean;
|
||||||
// the right panel's disabled state is tracked in its store.
|
// the right panel's disabled state is tracked in its store.
|
||||||
// Parameters used in the registration dance with the IS
|
// Parameters used in the registration dance with the IS
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
register_client_secret?: string;
|
register_client_secret?: string;
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
register_session_id?: string;
|
register_session_id?: string;
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
register_id_sid?: string;
|
register_id_sid?: string;
|
||||||
// When showing Modal dialogs we need to set aria-hidden on the root app element
|
// When showing Modal dialogs we need to set aria-hidden on the root app element
|
||||||
// and disable it when there are no dialogs
|
// and disable it when there are no dialogs
|
||||||
|
@ -340,6 +347,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: [REACT-WARNING] Replace with appropriate lifecycle stage
|
// TODO: [REACT-WARNING] Replace with appropriate lifecycle stage
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
UNSAFE_componentWillUpdate(props, state) {
|
UNSAFE_componentWillUpdate(props, state) {
|
||||||
if (this.shouldTrackPageChange(this.state, state)) {
|
if (this.shouldTrackPageChange(this.state, state)) {
|
||||||
this.startPageChangeTimer();
|
this.startPageChangeTimer();
|
||||||
|
@ -609,8 +617,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
const UserSettingsDialog = sdk.getComponent("dialogs.UserSettingsDialog");
|
const UserSettingsDialog = sdk.getComponent("dialogs.UserSettingsDialog");
|
||||||
Modal.createTrackedDialog('User settings', '', UserSettingsDialog,
|
Modal.createTrackedDialog('User settings', '', UserSettingsDialog,
|
||||||
{initialTabId: tabPayload.initialTabId},
|
{initialTabId: tabPayload.initialTabId},
|
||||||
/*className=*/null, /*isPriority=*/false, /*isStatic=*/true
|
/*className=*/null, /*isPriority=*/false, /*isStatic=*/true);
|
||||||
);
|
|
||||||
|
|
||||||
// View the welcome or home page if we need something to look at
|
// View the welcome or home page if we need something to look at
|
||||||
this.viewSomethingBehindModal();
|
this.viewSomethingBehindModal();
|
||||||
|
@ -620,7 +627,10 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
this.createRoom(payload.public);
|
this.createRoom(payload.public);
|
||||||
break;
|
break;
|
||||||
case 'view_create_group': {
|
case 'view_create_group': {
|
||||||
const CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog");
|
let CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog")
|
||||||
|
if (SettingsStore.getValue("feature_communities_v2_prototypes")) {
|
||||||
|
CreateGroupDialog = CreateCommunityPrototypeDialog;
|
||||||
|
}
|
||||||
Modal.createTrackedDialog('Create Community', '', CreateGroupDialog);
|
Modal.createTrackedDialog('Create Community', '', CreateGroupDialog);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1429,7 +1439,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
cli.on("crypto.warning", (type) => {
|
cli.on("crypto.warning", (type) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'CRYPTO_WARNING_OLD_VERSION_DETECTED':
|
case 'CRYPTO_WARNING_OLD_VERSION_DETECTED':
|
||||||
const brand = SdkConfig.get().brand;
|
|
||||||
Modal.createTrackedDialog('Crypto migrated', '', ErrorDialog, {
|
Modal.createTrackedDialog('Crypto migrated', '', ErrorDialog, {
|
||||||
title: _t('Old cryptography data detected'),
|
title: _t('Old cryptography data detected'),
|
||||||
description: _t(
|
description: _t(
|
||||||
|
@ -1440,7 +1449,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
"in this version. This may also cause messages exchanged with this " +
|
"in this version. This may also cause messages exchanged with this " +
|
||||||
"version to fail. If you experience problems, log out and back in " +
|
"version to fail. If you experience problems, log out and back in " +
|
||||||
"again. To retain message history, export and re-import your keys.",
|
"again. To retain message history, export and re-import your keys.",
|
||||||
{ brand },
|
{ brand: SdkConfig.get().brand },
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
@ -2049,3 +2058,12 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
|
||||||
</ErrorBoundary>;
|
</ErrorBoundary>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isLoggedIn(): boolean {
|
||||||
|
// JRS: Maybe we should move the step that writes this to the window out of
|
||||||
|
// `element-web` and into this file? Better yet, we should probably create a
|
||||||
|
// store to hold this state.
|
||||||
|
// See also https://github.com/vector-im/element-web/issues/15034.
|
||||||
|
const app = window.matrixChat;
|
||||||
|
return app && (app as MatrixChat).state.view === Views.LOGGED_IN;
|
||||||
|
}
|
||||||
|
|
|
@ -30,6 +30,10 @@ import { instanceForInstanceId, protocolNameForInstanceId } from '../../utils/Di
|
||||||
import Analytics from '../../Analytics';
|
import Analytics from '../../Analytics';
|
||||||
import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo";
|
import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo";
|
||||||
import {ALL_ROOMS} from "../views/directory/NetworkDropdown";
|
import {ALL_ROOMS} from "../views/directory/NetworkDropdown";
|
||||||
|
import SettingsStore from "../../settings/SettingsStore";
|
||||||
|
import TagOrderStore from "../../stores/TagOrderStore";
|
||||||
|
import GroupStore from "../../stores/GroupStore";
|
||||||
|
import FlairStore from "../../stores/FlairStore";
|
||||||
|
|
||||||
const MAX_NAME_LENGTH = 80;
|
const MAX_NAME_LENGTH = 80;
|
||||||
const MAX_TOPIC_LENGTH = 160;
|
const MAX_TOPIC_LENGTH = 160;
|
||||||
|
@ -46,6 +50,7 @@ export default createReactClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState: function() {
|
getInitialState: function() {
|
||||||
|
const selectedCommunityId = TagOrderStore.getSelectedTags()[0];
|
||||||
return {
|
return {
|
||||||
publicRooms: [],
|
publicRooms: [],
|
||||||
loading: true,
|
loading: true,
|
||||||
|
@ -54,6 +59,10 @@ export default createReactClass({
|
||||||
instanceId: undefined,
|
instanceId: undefined,
|
||||||
roomServer: MatrixClientPeg.getHomeserverName(),
|
roomServer: MatrixClientPeg.getHomeserverName(),
|
||||||
filterString: null,
|
filterString: null,
|
||||||
|
selectedCommunityId: SettingsStore.getValue("feature_communities_v2_prototypes")
|
||||||
|
? selectedCommunityId
|
||||||
|
: null,
|
||||||
|
communityName: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -71,6 +80,8 @@ export default createReactClass({
|
||||||
this.setState({protocolsLoading: false});
|
this.setState({protocolsLoading: false});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this.state.selectedCommunityId) {
|
||||||
MatrixClientPeg.get().getThirdpartyProtocols().then((response) => {
|
MatrixClientPeg.get().getThirdpartyProtocols().then((response) => {
|
||||||
this.protocols = response;
|
this.protocols = response;
|
||||||
this.setState({protocolsLoading: false});
|
this.setState({protocolsLoading: false});
|
||||||
|
@ -93,6 +104,15 @@ export default createReactClass({
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
// We don't use the protocols in the communities v2 prototype experience
|
||||||
|
this.setState({protocolsLoading: false});
|
||||||
|
|
||||||
|
// Grab the profile info async
|
||||||
|
FlairStore.getGroupProfileCached(MatrixClientPeg.get(), this.state.selectedCommunityId).then(profile => {
|
||||||
|
this.setState({communityName: profile.name});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.refreshRoomList();
|
this.refreshRoomList();
|
||||||
},
|
},
|
||||||
|
@ -105,6 +125,33 @@ export default createReactClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
refreshRoomList: function() {
|
refreshRoomList: function() {
|
||||||
|
if (this.state.selectedCommunityId) {
|
||||||
|
this.setState({
|
||||||
|
publicRooms: GroupStore.getGroupRooms(this.state.selectedCommunityId).map(r => {
|
||||||
|
return {
|
||||||
|
// Translate all the group properties to the directory format
|
||||||
|
room_id: r.roomId,
|
||||||
|
name: r.name,
|
||||||
|
topic: r.topic,
|
||||||
|
canonical_alias: r.canonicalAlias,
|
||||||
|
num_joined_members: r.numJoinedMembers,
|
||||||
|
avatarUrl: r.avatarUrl,
|
||||||
|
world_readable: r.worldReadable,
|
||||||
|
guest_can_join: r.guestsCanJoin,
|
||||||
|
};
|
||||||
|
}).filter(r => {
|
||||||
|
const filterString = this.state.filterString;
|
||||||
|
if (filterString) {
|
||||||
|
const containedIn = (s: string) => (s || "").toLowerCase().includes(filterString.toLowerCase());
|
||||||
|
return containedIn(r.name) || containedIn(r.topic) || containedIn(r.canonical_alias);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}),
|
||||||
|
loading: false,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.nextBatch = null;
|
this.nextBatch = null;
|
||||||
this.setState({
|
this.setState({
|
||||||
publicRooms: [],
|
publicRooms: [],
|
||||||
|
@ -114,6 +161,7 @@ export default createReactClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
getMoreRooms: function() {
|
getMoreRooms: function() {
|
||||||
|
if (this.state.selectedCommunityId) return Promise.resolve(); // no more rooms
|
||||||
if (!MatrixClientPeg.get()) return Promise.resolve();
|
if (!MatrixClientPeg.get()) return Promise.resolve();
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -239,7 +287,7 @@ export default createReactClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
onRoomClicked: function(room, ev) {
|
onRoomClicked: function(room, ev) {
|
||||||
if (ev.shiftKey) {
|
if (ev.shiftKey && !this.state.selectedCommunityId) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
this.removeFromDirectory(room);
|
this.removeFromDirectory(room);
|
||||||
} else {
|
} else {
|
||||||
|
@ -610,6 +658,18 @@ export default createReactClass({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let dropdown = (
|
||||||
|
<NetworkDropdown
|
||||||
|
protocols={this.protocols}
|
||||||
|
onOptionChange={this.onOptionChange}
|
||||||
|
selectedServerName={this.state.roomServer}
|
||||||
|
selectedInstanceId={this.state.instanceId}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
if (this.state.selectedCommunityId) {
|
||||||
|
dropdown = null;
|
||||||
|
}
|
||||||
|
|
||||||
listHeader = <div className="mx_RoomDirectory_listheader">
|
listHeader = <div className="mx_RoomDirectory_listheader">
|
||||||
<DirectorySearchBox
|
<DirectorySearchBox
|
||||||
className="mx_RoomDirectory_searchbox"
|
className="mx_RoomDirectory_searchbox"
|
||||||
|
@ -619,12 +679,7 @@ export default createReactClass({
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
showJoinButton={showJoinButton}
|
showJoinButton={showJoinButton}
|
||||||
/>
|
/>
|
||||||
<NetworkDropdown
|
{dropdown}
|
||||||
protocols={this.protocols}
|
|
||||||
onOptionChange={this.onOptionChange}
|
|
||||||
selectedServerName={this.state.roomServer}
|
|
||||||
selectedInstanceId={this.state.instanceId}
|
|
||||||
/>
|
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
const explanation =
|
const explanation =
|
||||||
|
@ -637,12 +692,16 @@ export default createReactClass({
|
||||||
}},
|
}},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const title = this.state.selectedCommunityId
|
||||||
|
? _t("Explore rooms in %(communityName)s", {
|
||||||
|
communityName: this.state.communityName || this.state.selectedCommunityId,
|
||||||
|
}) : _t("Explore rooms");
|
||||||
return (
|
return (
|
||||||
<BaseDialog
|
<BaseDialog
|
||||||
className={'mx_RoomDirectory_dialog'}
|
className={'mx_RoomDirectory_dialog'}
|
||||||
hasCancel={true}
|
hasCancel={true}
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
title={_t("Explore rooms")}
|
title={title}
|
||||||
>
|
>
|
||||||
<div className="mx_RoomDirectory">
|
<div className="mx_RoomDirectory">
|
||||||
{explanation}
|
{explanation}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import classNames from "classnames";
|
||||||
import defaultDispatcher from "../../dispatcher/dispatcher";
|
import defaultDispatcher from "../../dispatcher/dispatcher";
|
||||||
import { _t } from "../../languageHandler";
|
import { _t } from "../../languageHandler";
|
||||||
import { ActionPayload } from "../../dispatcher/payloads";
|
import { ActionPayload } from "../../dispatcher/payloads";
|
||||||
import { throttle } from 'lodash';
|
|
||||||
import { Key } from "../../Keyboard";
|
import { Key } from "../../Keyboard";
|
||||||
import AccessibleButton from "../views/elements/AccessibleButton";
|
import AccessibleButton from "../views/elements/AccessibleButton";
|
||||||
import { Action } from "../../dispatcher/actions";
|
import { Action } from "../../dispatcher/actions";
|
||||||
|
|
|
@ -18,7 +18,6 @@ limitations under the License.
|
||||||
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import {_t} from '../../languageHandler';
|
import {_t} from '../../languageHandler';
|
||||||
import * as PropTypes from "prop-types";
|
|
||||||
import * as sdk from "../../index";
|
import * as sdk from "../../index";
|
||||||
import AutoHideScrollbar from './AutoHideScrollbar';
|
import AutoHideScrollbar from './AutoHideScrollbar';
|
||||||
import { ReactNode } from "react";
|
import { ReactNode } from "react";
|
||||||
|
|
|
@ -29,6 +29,8 @@ import { Droppable } from 'react-beautiful-dnd';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import MatrixClientContext from "../../contexts/MatrixClientContext";
|
import MatrixClientContext from "../../contexts/MatrixClientContext";
|
||||||
import AutoHideScrollbar from "./AutoHideScrollbar";
|
import AutoHideScrollbar from "./AutoHideScrollbar";
|
||||||
|
import SettingsStore from "../../settings/SettingsStore";
|
||||||
|
import UserTagTile from "../views/elements/UserTagTile";
|
||||||
|
|
||||||
const TagPanel = createReactClass({
|
const TagPanel = createReactClass({
|
||||||
displayName: 'TagPanel',
|
displayName: 'TagPanel',
|
||||||
|
@ -93,20 +95,24 @@ const TagPanel = createReactClass({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onCreateGroupClick(ev) {
|
|
||||||
ev.stopPropagation();
|
|
||||||
dis.dispatch({action: 'view_create_group'});
|
|
||||||
},
|
|
||||||
|
|
||||||
onClearFilterClick(ev) {
|
onClearFilterClick(ev) {
|
||||||
dis.dispatch({action: 'deselect_tags'});
|
dis.dispatch({action: 'deselect_tags'});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
renderGlobalIcon() {
|
||||||
|
if (!SettingsStore.getValue("feature_communities_v2_prototypes")) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<UserTagTile />
|
||||||
|
<hr className="mx_TagPanel_divider" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const DNDTagTile = sdk.getComponent('elements.DNDTagTile');
|
const DNDTagTile = sdk.getComponent('elements.DNDTagTile');
|
||||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
|
||||||
const ActionButton = sdk.getComponent('elements.ActionButton');
|
const ActionButton = sdk.getComponent('elements.ActionButton');
|
||||||
const TintableSvg = sdk.getComponent('elements.TintableSvg');
|
|
||||||
|
|
||||||
const tags = this.state.orderedTags.map((tag, index) => {
|
const tags = this.state.orderedTags.map((tag, index) => {
|
||||||
return <DNDTagTile
|
return <DNDTagTile
|
||||||
|
@ -118,26 +124,29 @@ const TagPanel = createReactClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
const itemsSelected = this.state.selectedTags.length > 0;
|
const itemsSelected = this.state.selectedTags.length > 0;
|
||||||
|
|
||||||
let clearButton;
|
|
||||||
if (itemsSelected) {
|
|
||||||
clearButton = <AccessibleButton className="mx_TagPanel_clearButton" onClick={this.onClearFilterClick}>
|
|
||||||
<TintableSvg src={require("../../../res/img/icons-close.svg")} width="24" height="24"
|
|
||||||
alt={_t("Clear filter")}
|
|
||||||
title={_t("Clear filter")}
|
|
||||||
/>
|
|
||||||
</AccessibleButton>;
|
|
||||||
}
|
|
||||||
|
|
||||||
const classes = classNames('mx_TagPanel', {
|
const classes = classNames('mx_TagPanel', {
|
||||||
mx_TagPanel_items_selected: itemsSelected,
|
mx_TagPanel_items_selected: itemsSelected,
|
||||||
});
|
});
|
||||||
|
|
||||||
return <div className={classes}>
|
let createButton = (
|
||||||
<div className="mx_TagPanel_clearButton_container">
|
<ActionButton
|
||||||
{ clearButton }
|
tooltip
|
||||||
</div>
|
label={_t("Communities")}
|
||||||
<div className="mx_TagPanel_divider" />
|
action="toggle_my_groups"
|
||||||
|
className="mx_TagTile mx_TagTile_plus" />
|
||||||
|
);
|
||||||
|
|
||||||
|
if (SettingsStore.getValue("feature_communities_v2_prototypes")) {
|
||||||
|
createButton = (
|
||||||
|
<ActionButton
|
||||||
|
tooltip
|
||||||
|
label={_t("Create community")}
|
||||||
|
action="view_create_group"
|
||||||
|
className="mx_TagTile mx_TagTile_plus" />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className={classes} onClick={this.onClearFilterClick}>
|
||||||
<AutoHideScrollbar
|
<AutoHideScrollbar
|
||||||
className="mx_TagPanel_scroller"
|
className="mx_TagPanel_scroller"
|
||||||
// XXX: Use onMouseDown as a workaround for https://github.com/atlassian/react-beautiful-dnd/issues/273
|
// XXX: Use onMouseDown as a workaround for https://github.com/atlassian/react-beautiful-dnd/issues/273
|
||||||
|
@ -153,13 +162,10 @@ const TagPanel = createReactClass({
|
||||||
className="mx_TagPanel_tagTileContainer"
|
className="mx_TagPanel_tagTileContainer"
|
||||||
ref={provided.innerRef}
|
ref={provided.innerRef}
|
||||||
>
|
>
|
||||||
|
{ this.renderGlobalIcon() }
|
||||||
{ tags }
|
{ tags }
|
||||||
<div>
|
<div>
|
||||||
<ActionButton
|
{createButton}
|
||||||
tooltip
|
|
||||||
label={_t("Communities")}
|
|
||||||
action="toggle_my_groups"
|
|
||||||
className="mx_TagTile mx_TagTile_plus" />
|
|
||||||
</div>
|
</div>
|
||||||
{ provided.placeholder }
|
{ provided.placeholder }
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -40,7 +40,7 @@ import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton";
|
||||||
import { SettingLevel } from "../../settings/SettingLevel";
|
import { SettingLevel } from "../../settings/SettingLevel";
|
||||||
import IconizedContextMenu, {
|
import IconizedContextMenu, {
|
||||||
IconizedContextMenuOption,
|
IconizedContextMenuOption,
|
||||||
IconizedContextMenuOptionList
|
IconizedContextMenuOptionList,
|
||||||
} from "../views/context_menus/IconizedContextMenu";
|
} from "../views/context_menus/IconizedContextMenu";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
|
@ -295,7 +295,10 @@ export default class UserMenu extends React.Component<IProps, IState> {
|
||||||
public render() {
|
public render() {
|
||||||
const avatarSize = 32; // should match border-radius of the avatar
|
const avatarSize = 32; // should match border-radius of the avatar
|
||||||
|
|
||||||
let name = <span className="mx_UserMenu_userName">{OwnProfileStore.instance.displayName}</span>;
|
const displayName = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId();
|
||||||
|
const avatarUrl = OwnProfileStore.instance.getHttpAvatarUrl(avatarSize);
|
||||||
|
|
||||||
|
let name = <span className="mx_UserMenu_userName">{displayName}</span>;
|
||||||
let buttons = (
|
let buttons = (
|
||||||
<span className="mx_UserMenu_headerButtons">
|
<span className="mx_UserMenu_headerButtons">
|
||||||
{/* masked image in CSS */}
|
{/* masked image in CSS */}
|
||||||
|
@ -324,9 +327,9 @@ export default class UserMenu extends React.Component<IProps, IState> {
|
||||||
<div className="mx_UserMenu_row">
|
<div className="mx_UserMenu_row">
|
||||||
<span className="mx_UserMenu_userAvatarContainer">
|
<span className="mx_UserMenu_userAvatarContainer">
|
||||||
<BaseAvatar
|
<BaseAvatar
|
||||||
idName={MatrixClientPeg.get().getUserId()}
|
idName={displayName}
|
||||||
name={OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId()}
|
name={displayName}
|
||||||
url={OwnProfileStore.instance.getHttpAvatarUrl(avatarSize)}
|
url={avatarUrl}
|
||||||
width={avatarSize}
|
width={avatarSize}
|
||||||
height={avatarSize}
|
height={avatarSize}
|
||||||
resizeMethod="crop"
|
resizeMethod="crop"
|
||||||
|
|
|
@ -17,7 +17,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useCallback, useContext, useEffect, useMemo, useState} from 'react';
|
import React, {useCallback, useContext, useEffect, useState} from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import * as AvatarLogic from '../../../Avatar';
|
import * as AvatarLogic from '../../../Avatar';
|
||||||
import SettingsStore from "../../../settings/SettingsStore";
|
import SettingsStore from "../../../settings/SettingsStore";
|
||||||
|
@ -42,22 +42,13 @@ interface IProps {
|
||||||
className?: string;
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const useImageUrl = ({url, urls}): [string, () => void] => {
|
const calculateUrls = (url, urls) => {
|
||||||
const [imageUrls, setUrls] = useState<string[]>([]);
|
|
||||||
const [urlsIndex, setIndex] = useState<number>();
|
|
||||||
|
|
||||||
const onError = useCallback(() => {
|
|
||||||
setIndex(i => i + 1); // try the next one
|
|
||||||
}, []);
|
|
||||||
const memoizedUrls = useMemo(() => urls, [JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// work out the full set of urls to try to load. This is formed like so:
|
// work out the full set of urls to try to load. This is formed like so:
|
||||||
// imageUrls: [ props.url, ...props.urls ]
|
// imageUrls: [ props.url, ...props.urls ]
|
||||||
|
|
||||||
let _urls = [];
|
let _urls = [];
|
||||||
if (!SettingsStore.getValue("lowBandwidth")) {
|
if (!SettingsStore.getValue("lowBandwidth")) {
|
||||||
_urls = memoizedUrls || [];
|
_urls = urls || [];
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
_urls.unshift(url); // put in urls[0]
|
_urls.unshift(url); // put in urls[0]
|
||||||
|
@ -65,11 +56,21 @@ const useImageUrl = ({url, urls}): [string, () => void] => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// deduplicate URLs
|
// deduplicate URLs
|
||||||
_urls = Array.from(new Set(_urls));
|
return Array.from(new Set(_urls));
|
||||||
|
};
|
||||||
|
|
||||||
|
const useImageUrl = ({url, urls}): [string, () => void] => {
|
||||||
|
const [imageUrls, setUrls] = useState<string[]>(calculateUrls(url, urls));
|
||||||
|
const [urlsIndex, setIndex] = useState<number>(0);
|
||||||
|
|
||||||
|
const onError = useCallback(() => {
|
||||||
|
setIndex(i => i + 1); // try the next one
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setUrls(calculateUrls(url, urls));
|
||||||
setIndex(0);
|
setIndex(0);
|
||||||
setUrls(_urls);
|
}, [url, JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
}, [url, memoizedUrls]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
||||||
|
|
||||||
const cli = useContext(MatrixClientContext);
|
const cli = useContext(MatrixClientContext);
|
||||||
const onClientSync = useCallback((syncState, prevState) => {
|
const onClientSync = useCallback((syncState, prevState) => {
|
||||||
|
@ -95,7 +96,7 @@ const BaseAvatar = (props: IProps) => {
|
||||||
urls,
|
urls,
|
||||||
width = 40,
|
width = 40,
|
||||||
height = 40,
|
height = 40,
|
||||||
resizeMethod = "crop", // eslint-disable-line no-unused-vars
|
resizeMethod = "crop", // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||||
defaultToInitialLetter = true,
|
defaultToInitialLetter = true,
|
||||||
onClick,
|
onClick,
|
||||||
inputRef,
|
inputRef,
|
||||||
|
|
|
@ -126,7 +126,7 @@ export default class DecoratedRoomAvatar extends React.PureComponent<IProps, ISt
|
||||||
private onPresenceUpdate = () => {
|
private onPresenceUpdate = () => {
|
||||||
if (this.isUnmounted) return;
|
if (this.isUnmounted) return;
|
||||||
|
|
||||||
let newIcon = this.getPresenceIcon();
|
const newIcon = this.getPresenceIcon();
|
||||||
if (newIcon !== this.state.icon) this.setState({icon: newIcon});
|
if (newIcon !== this.state.icon) this.setState({icon: newIcon});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ export default class GroupAvatar extends React.Component<IProps> {
|
||||||
render() {
|
render() {
|
||||||
// extract the props we use from props so we can pass any others through
|
// extract the props we use from props so we can pass any others through
|
||||||
// should consider adding this as a global rule in js-sdk?
|
// should consider adding this as a global rule in js-sdk?
|
||||||
/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
|
/* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */
|
||||||
const {groupId, groupAvatarUrl, groupName, ...otherProps} = this.props;
|
const {groupId, groupAvatarUrl, groupName, ...otherProps} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2015, 2016 OpenMarket Ltd
|
|
||||||
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.
|
|
||||||
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 createReactClass from 'create-react-class';
|
|
||||||
import { _t } from '../../../languageHandler';
|
|
||||||
|
|
||||||
const Presets = {
|
|
||||||
PrivateChat: "private_chat",
|
|
||||||
PublicChat: "public_chat",
|
|
||||||
Custom: "custom",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'CreateRoomPresets',
|
|
||||||
propTypes: {
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
preset: PropTypes.string,
|
|
||||||
},
|
|
||||||
|
|
||||||
Presets: Presets,
|
|
||||||
|
|
||||||
getDefaultProps: function() {
|
|
||||||
return {
|
|
||||||
onChange: function() {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
onValueChanged: function(ev) {
|
|
||||||
this.props.onChange(ev.target.value);
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
return (
|
|
||||||
<select className="mx_Presets" onChange={this.onValueChanged} value={this.props.preset}>
|
|
||||||
<option value={this.Presets.PrivateChat}>{ _t("Private Chat") }</option>
|
|
||||||
<option value={this.Presets.PublicChat}>{ _t("Public Chat") }</option>
|
|
||||||
<option value={this.Presets.Custom}>{ _t("Custom") }</option>
|
|
||||||
</select>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2015, 2016 OpenMarket Ltd
|
|
||||||
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.
|
|
||||||
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 createReactClass from 'create-react-class';
|
|
||||||
import { _t } from '../../../languageHandler';
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'RoomAlias',
|
|
||||||
propTypes: {
|
|
||||||
// Specifying a homeserver will make magical things happen when you,
|
|
||||||
// e.g. start typing in the room alias box.
|
|
||||||
homeserver: PropTypes.string,
|
|
||||||
alias: PropTypes.string,
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
},
|
|
||||||
|
|
||||||
getDefaultProps: function() {
|
|
||||||
return {
|
|
||||||
onChange: function() {},
|
|
||||||
alias: '',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
getAliasLocalpart: function() {
|
|
||||||
let room_alias = this.props.alias;
|
|
||||||
|
|
||||||
if (room_alias && this.props.homeserver) {
|
|
||||||
const suffix = ":" + this.props.homeserver;
|
|
||||||
if (room_alias.startsWith("#") && room_alias.endsWith(suffix)) {
|
|
||||||
room_alias = room_alias.slice(1, -suffix.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return room_alias;
|
|
||||||
},
|
|
||||||
|
|
||||||
onValueChanged: function(ev) {
|
|
||||||
this.props.onChange(ev.target.value);
|
|
||||||
},
|
|
||||||
|
|
||||||
onFocus: function(ev) {
|
|
||||||
const target = ev.target;
|
|
||||||
const curr_val = ev.target.value;
|
|
||||||
|
|
||||||
if (this.props.homeserver) {
|
|
||||||
if (curr_val == "") {
|
|
||||||
const self = this;
|
|
||||||
setTimeout(function() {
|
|
||||||
target.value = "#:" + self.props.homeserver;
|
|
||||||
target.setSelectionRange(1, 1);
|
|
||||||
}, 0);
|
|
||||||
} else {
|
|
||||||
const suffix = ":" + this.props.homeserver;
|
|
||||||
setTimeout(function() {
|
|
||||||
target.setSelectionRange(
|
|
||||||
curr_val.startsWith("#") ? 1 : 0,
|
|
||||||
curr_val.endsWith(suffix) ? (target.value.length - suffix.length) : target.value.length,
|
|
||||||
);
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onBlur: function(ev) {
|
|
||||||
const curr_val = ev.target.value;
|
|
||||||
|
|
||||||
if (this.props.homeserver) {
|
|
||||||
if (curr_val == "#:" + this.props.homeserver) {
|
|
||||||
ev.target.value = "";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curr_val != "") {
|
|
||||||
let new_val = ev.target.value;
|
|
||||||
const suffix = ":" + this.props.homeserver;
|
|
||||||
if (!curr_val.startsWith("#")) new_val = "#" + new_val;
|
|
||||||
if (!curr_val.endsWith(suffix)) new_val = new_val + suffix;
|
|
||||||
ev.target.value = new_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
return (
|
|
||||||
<input type="text" className="mx_RoomAlias" placeholder={_t("Address (optional)")}
|
|
||||||
onChange={this.onValueChanged} onFocus={this.onFocus} onBlur={this.onBlur}
|
|
||||||
value={this.props.alias} />
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
248
src/components/views/dialogs/CommunityPrototypeInviteDialog.tsx
Normal file
248
src/components/views/dialogs/CommunityPrototypeInviteDialog.tsx
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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 React, { ChangeEvent, FormEvent } from 'react';
|
||||||
|
import BaseDialog from "./BaseDialog";
|
||||||
|
import { _t } from "../../../languageHandler";
|
||||||
|
import { IDialogProps } from "./IDialogProps";
|
||||||
|
import Field from "../elements/Field";
|
||||||
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
|
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||||
|
import { arrayFastClone } from "../../../utils/arrays";
|
||||||
|
import SdkConfig from "../../../SdkConfig";
|
||||||
|
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
|
||||||
|
import InviteDialog from "./InviteDialog";
|
||||||
|
import BaseAvatar from "../avatars/BaseAvatar";
|
||||||
|
import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo";
|
||||||
|
import {inviteMultipleToRoom, showAnyInviteErrors} from "../../../RoomInvite";
|
||||||
|
import StyledCheckbox from "../elements/StyledCheckbox";
|
||||||
|
import Modal from "../../../Modal";
|
||||||
|
import ErrorDialog from "./ErrorDialog";
|
||||||
|
|
||||||
|
interface IProps extends IDialogProps {
|
||||||
|
roomId: string;
|
||||||
|
communityName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IPerson {
|
||||||
|
userId: string;
|
||||||
|
user: RoomMember;
|
||||||
|
lastActive: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IState {
|
||||||
|
emailTargets: string[];
|
||||||
|
userTargets: string[];
|
||||||
|
showPeople: boolean;
|
||||||
|
people: IPerson[];
|
||||||
|
numPeople: number;
|
||||||
|
busy: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class CommunityPrototypeInviteDialog extends React.PureComponent<IProps, IState> {
|
||||||
|
constructor(props: IProps) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
emailTargets: [],
|
||||||
|
userTargets: [],
|
||||||
|
showPeople: false,
|
||||||
|
people: this.buildSuggestions(),
|
||||||
|
numPeople: 5, // arbitrary default
|
||||||
|
busy: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildSuggestions(): IPerson[] {
|
||||||
|
const alreadyInvited = new Set([MatrixClientPeg.get().getUserId(), SdkConfig.get()['welcomeUserId']]);
|
||||||
|
if (this.props.roomId) {
|
||||||
|
const room = MatrixClientPeg.get().getRoom(this.props.roomId);
|
||||||
|
if (!room) throw new Error("Room ID given to InviteDialog does not look like a room");
|
||||||
|
room.getMembersWithMembership('invite').forEach(m => alreadyInvited.add(m.userId));
|
||||||
|
room.getMembersWithMembership('join').forEach(m => alreadyInvited.add(m.userId));
|
||||||
|
// add banned users, so we don't try to invite them
|
||||||
|
room.getMembersWithMembership('ban').forEach(m => alreadyInvited.add(m.userId));
|
||||||
|
}
|
||||||
|
|
||||||
|
return InviteDialog.buildRecents(alreadyInvited);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onSubmit = async (ev: FormEvent) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
|
||||||
|
this.setState({busy: true});
|
||||||
|
try {
|
||||||
|
const targets = [...this.state.emailTargets, ...this.state.userTargets];
|
||||||
|
const result = await inviteMultipleToRoom(this.props.roomId, targets);
|
||||||
|
const room = MatrixClientPeg.get().getRoom(this.props.roomId);
|
||||||
|
const success = showAnyInviteErrors(result.states, room, result.inviter);
|
||||||
|
if (success) {
|
||||||
|
this.props.onFinished(true);
|
||||||
|
} else {
|
||||||
|
this.setState({busy: false});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.setState({busy: false});
|
||||||
|
console.error(e);
|
||||||
|
Modal.createTrackedDialog('Failed to invite', '', ErrorDialog, {
|
||||||
|
title: _t("Failed to invite"),
|
||||||
|
description: ((e && e.message) ? e.message : _t("Operation failed")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private onAddressChange = (ev: ChangeEvent<HTMLInputElement>, index: number) => {
|
||||||
|
const targets = arrayFastClone(this.state.emailTargets);
|
||||||
|
if (index >= targets.length) {
|
||||||
|
targets.push(ev.target.value);
|
||||||
|
} else {
|
||||||
|
targets[index] = ev.target.value;
|
||||||
|
}
|
||||||
|
this.setState({emailTargets: targets});
|
||||||
|
};
|
||||||
|
|
||||||
|
private onAddressBlur = (index: number) => {
|
||||||
|
const targets = arrayFastClone(this.state.emailTargets);
|
||||||
|
if (index >= targets.length) return; // not important
|
||||||
|
if (targets[index].trim() === "") {
|
||||||
|
targets.splice(index, 1);
|
||||||
|
this.setState({emailTargets: targets});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private onShowPeopleClick = () => {
|
||||||
|
this.setState({showPeople: !this.state.showPeople});
|
||||||
|
};
|
||||||
|
|
||||||
|
private setPersonToggle = (person: IPerson, selected: boolean) => {
|
||||||
|
const targets = arrayFastClone(this.state.userTargets);
|
||||||
|
if (selected && !targets.includes(person.userId)) {
|
||||||
|
targets.push(person.userId);
|
||||||
|
} else if (!selected && targets.includes(person.userId)) {
|
||||||
|
targets.splice(targets.indexOf(person.userId), 1);
|
||||||
|
}
|
||||||
|
this.setState({userTargets: targets});
|
||||||
|
};
|
||||||
|
|
||||||
|
private renderPerson(person: IPerson, key: any) {
|
||||||
|
const avatarSize = 36;
|
||||||
|
return (
|
||||||
|
<div className="mx_CommunityPrototypeInviteDialog_person" key={key}>
|
||||||
|
<BaseAvatar
|
||||||
|
url={getHttpUriForMxc(
|
||||||
|
MatrixClientPeg.get().getHomeserverUrl(), person.user.getMxcAvatarUrl(),
|
||||||
|
avatarSize, avatarSize, "crop")}
|
||||||
|
name={person.user.name}
|
||||||
|
idName={person.user.userId}
|
||||||
|
width={avatarSize}
|
||||||
|
height={avatarSize}
|
||||||
|
/>
|
||||||
|
<div className="mx_CommunityPrototypeInviteDialog_personIdentifiers">
|
||||||
|
<span className="mx_CommunityPrototypeInviteDialog_personName">{person.user.name}</span>
|
||||||
|
<span className="mx_CommunityPrototypeInviteDialog_personId">{person.userId}</span>
|
||||||
|
</div>
|
||||||
|
<StyledCheckbox onChange={(e) => this.setPersonToggle(person, e.target.checked)} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onShowMorePeople = () => {
|
||||||
|
this.setState({numPeople: this.state.numPeople + 5}); // arbitrary increase
|
||||||
|
};
|
||||||
|
|
||||||
|
public render() {
|
||||||
|
const emailAddresses = [];
|
||||||
|
this.state.emailTargets.forEach((address, i) => {
|
||||||
|
emailAddresses.push((
|
||||||
|
<Field
|
||||||
|
key={i}
|
||||||
|
value={address}
|
||||||
|
onChange={(e) => this.onAddressChange(e, i)}
|
||||||
|
label={_t("Email address")}
|
||||||
|
placeholder={_t("Email address")}
|
||||||
|
onBlur={() => this.onAddressBlur(i)}
|
||||||
|
/>
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Push a clean input
|
||||||
|
emailAddresses.push((
|
||||||
|
<Field
|
||||||
|
key={emailAddresses.length}
|
||||||
|
value={""}
|
||||||
|
onChange={(e) => this.onAddressChange(e, emailAddresses.length)}
|
||||||
|
label={emailAddresses.length > 0 ? _t("Add another email") : _t("Email address")}
|
||||||
|
placeholder={emailAddresses.length > 0 ? _t("Add another email") : _t("Email address")}
|
||||||
|
/>
|
||||||
|
));
|
||||||
|
|
||||||
|
let peopleIntro = null;
|
||||||
|
const people = [];
|
||||||
|
if (this.state.showPeople) {
|
||||||
|
const humansToPresent = this.state.people.slice(0, this.state.numPeople);
|
||||||
|
humansToPresent.forEach((person, i) => {
|
||||||
|
people.push(this.renderPerson(person, i));
|
||||||
|
});
|
||||||
|
if (humansToPresent.length < this.state.people.length) {
|
||||||
|
people.push((
|
||||||
|
<AccessibleButton
|
||||||
|
onClick={this.onShowMorePeople}
|
||||||
|
kind="link" key="more"
|
||||||
|
className="mx_CommunityPrototypeInviteDialog_morePeople"
|
||||||
|
>{_t("Show more")}</AccessibleButton>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.state.people.length > 0) {
|
||||||
|
peopleIntro = (
|
||||||
|
<div className="mx_CommunityPrototypeInviteDialog_people">
|
||||||
|
<span>{_t("People you know on %(brand)s", {brand: SdkConfig.get().brand})}</span>
|
||||||
|
<AccessibleButton onClick={this.onShowPeopleClick}>
|
||||||
|
{this.state.showPeople ? _t("Hide") : _t("Show")}
|
||||||
|
</AccessibleButton>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let buttonText = _t("Skip");
|
||||||
|
const targetCount = this.state.userTargets.length + this.state.emailTargets.length;
|
||||||
|
if (targetCount > 0) {
|
||||||
|
buttonText = _t("Send %(count)s invites", {count: targetCount});
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BaseDialog
|
||||||
|
className="mx_CommunityPrototypeInviteDialog"
|
||||||
|
onFinished={this.props.onFinished}
|
||||||
|
title={_t("Invite people to join %(communityName)s", {communityName: this.props.communityName})}
|
||||||
|
>
|
||||||
|
<form onSubmit={this.onSubmit}>
|
||||||
|
<div className="mx_Dialog_content">
|
||||||
|
{emailAddresses}
|
||||||
|
{peopleIntro}
|
||||||
|
{people}
|
||||||
|
<AccessibleButton
|
||||||
|
kind="primary" onClick={this.onSubmit}
|
||||||
|
disabled={this.state.busy}
|
||||||
|
className="mx_CommunityPrototypeInviteDialog_primaryButton"
|
||||||
|
>{buttonText}</AccessibleButton>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</BaseDialog>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
227
src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx
Normal file
227
src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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 React, { ChangeEvent } from 'react';
|
||||||
|
import BaseDialog from "./BaseDialog";
|
||||||
|
import { _t } from "../../../languageHandler";
|
||||||
|
import { IDialogProps } from "./IDialogProps";
|
||||||
|
import Field from "../elements/Field";
|
||||||
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
|
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||||
|
import InfoTooltip from "../elements/InfoTooltip";
|
||||||
|
import dis from "../../../dispatcher/dispatcher";
|
||||||
|
import {showCommunityRoomInviteDialog} from "../../../RoomInvite";
|
||||||
|
import GroupStore from "../../../stores/GroupStore";
|
||||||
|
|
||||||
|
interface IProps extends IDialogProps {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IState {
|
||||||
|
name: string;
|
||||||
|
localpart: string;
|
||||||
|
error: string;
|
||||||
|
busy: boolean;
|
||||||
|
avatarFile: File;
|
||||||
|
avatarPreview: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class CreateCommunityPrototypeDialog extends React.PureComponent<IProps, IState> {
|
||||||
|
private avatarUploadRef: React.RefObject<HTMLInputElement> = React.createRef();
|
||||||
|
|
||||||
|
constructor(props: IProps) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
name: "",
|
||||||
|
localpart: "",
|
||||||
|
error: null,
|
||||||
|
busy: false,
|
||||||
|
avatarFile: null,
|
||||||
|
avatarPreview: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private onNameChange = (ev: ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const localpart = (ev.target.value || "").toLowerCase().replace(/[^a-z0-9.\-_]/g, '-');
|
||||||
|
this.setState({name: ev.target.value, localpart});
|
||||||
|
};
|
||||||
|
|
||||||
|
private onSubmit = async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
|
||||||
|
if (this.state.busy) return;
|
||||||
|
|
||||||
|
// We'll create the community now to see if it's taken, leaving it active in
|
||||||
|
// the background for the user to look at while they invite people.
|
||||||
|
this.setState({busy: true});
|
||||||
|
try {
|
||||||
|
let avatarUrl = ''; // must be a string for synapse to accept it
|
||||||
|
if (this.state.avatarFile) {
|
||||||
|
avatarUrl = await MatrixClientPeg.get().uploadContent(this.state.avatarFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await MatrixClientPeg.get().createGroup({
|
||||||
|
localpart: this.state.localpart,
|
||||||
|
profile: {
|
||||||
|
name: this.state.name,
|
||||||
|
avatar_url: avatarUrl,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Ensure the tag gets selected now that we've created it
|
||||||
|
dis.dispatch({action: 'deselect_tags'}, true);
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'select_tag',
|
||||||
|
tag: result.group_id,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close our own dialog before moving much further
|
||||||
|
this.props.onFinished(true);
|
||||||
|
|
||||||
|
if (result.room_id) {
|
||||||
|
// Force the group store to update as it might have missed the general chat
|
||||||
|
await GroupStore.refreshGroupRooms(result.group_id);
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'view_room',
|
||||||
|
room_id: result.room_id,
|
||||||
|
});
|
||||||
|
showCommunityRoomInviteDialog(result.room_id, this.state.name);
|
||||||
|
} else {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'view_group',
|
||||||
|
group_id: result.group_id,
|
||||||
|
group_is_new: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
this.setState({
|
||||||
|
busy: false,
|
||||||
|
error: _t(
|
||||||
|
"There was an error creating your community. The name may be taken or the " +
|
||||||
|
"server is unable to process your request.",
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private onAvatarChanged = (e: ChangeEvent<HTMLInputElement>) => {
|
||||||
|
if (!e.target.files || !e.target.files.length) {
|
||||||
|
this.setState({avatarFile: null});
|
||||||
|
} else {
|
||||||
|
this.setState({busy: true});
|
||||||
|
const file = e.target.files[0];
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = (ev: ProgressEvent<FileReader>) => {
|
||||||
|
this.setState({avatarFile: file, busy: false, avatarPreview: ev.target.result as string});
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private onChangeAvatar = () => {
|
||||||
|
if (this.avatarUploadRef.current) this.avatarUploadRef.current.click();
|
||||||
|
};
|
||||||
|
|
||||||
|
public render() {
|
||||||
|
let communityId = null;
|
||||||
|
if (this.state.localpart) {
|
||||||
|
communityId = (
|
||||||
|
<span className="mx_CreateCommunityPrototypeDialog_communityId">
|
||||||
|
{_t("Community ID: +<localpart />:%(domain)s", {
|
||||||
|
domain: MatrixClientPeg.getHomeserverName(),
|
||||||
|
}, {
|
||||||
|
localpart: () => <u>{this.state.localpart}</u>,
|
||||||
|
})}
|
||||||
|
<InfoTooltip
|
||||||
|
tooltip={_t(
|
||||||
|
"Use this when referencing your community to others. The community ID " +
|
||||||
|
"cannot be changed.",
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let helpText = (
|
||||||
|
<span className="mx_CreateCommunityPrototypeDialog_subtext">
|
||||||
|
{_t("You can change this later if needed.")}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
if (this.state.error) {
|
||||||
|
const classes = "mx_CreateCommunityPrototypeDialog_subtext mx_CreateCommunityPrototypeDialog_subtext_error";
|
||||||
|
helpText = (
|
||||||
|
<span className={classes}>
|
||||||
|
{this.state.error}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let preview = <img src={this.state.avatarPreview} className="mx_CreateCommunityPrototypeDialog_avatar" />;
|
||||||
|
if (!this.state.avatarPreview) {
|
||||||
|
preview = <div className="mx_CreateCommunityPrototypeDialog_placeholderAvatar" />
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BaseDialog
|
||||||
|
className="mx_CreateCommunityPrototypeDialog"
|
||||||
|
onFinished={this.props.onFinished}
|
||||||
|
title={_t("What's the name of your community or team?")}
|
||||||
|
>
|
||||||
|
<form onSubmit={this.onSubmit}>
|
||||||
|
<div className="mx_Dialog_content">
|
||||||
|
<div className="mx_CreateCommunityPrototypeDialog_colName">
|
||||||
|
<Field
|
||||||
|
value={this.state.name}
|
||||||
|
onChange={this.onNameChange}
|
||||||
|
placeholder={_t("Enter name")}
|
||||||
|
label={_t("Enter name")}
|
||||||
|
/>
|
||||||
|
{helpText}
|
||||||
|
<span className="mx_CreateCommunityPrototypeDialog_subtext">
|
||||||
|
{/*nbsp is to reserve the height of this element when there's nothing*/}
|
||||||
|
{communityId}
|
||||||
|
</span>
|
||||||
|
<AccessibleButton kind="primary" onClick={this.onSubmit} disabled={this.state.busy}>
|
||||||
|
{_t("Create")}
|
||||||
|
</AccessibleButton>
|
||||||
|
</div>
|
||||||
|
<div className="mx_CreateCommunityPrototypeDialog_colAvatar">
|
||||||
|
<input
|
||||||
|
type="file" style={{display: "none"}}
|
||||||
|
ref={this.avatarUploadRef} accept="image/*"
|
||||||
|
onChange={this.onAvatarChanged}
|
||||||
|
/>
|
||||||
|
<AccessibleButton
|
||||||
|
onClick={this.onChangeAvatar}
|
||||||
|
className="mx_CreateCommunityPrototypeDialog_avatarContainer"
|
||||||
|
>
|
||||||
|
{preview}
|
||||||
|
</AccessibleButton>
|
||||||
|
<div className="mx_CreateCommunityPrototypeDialog_tip">
|
||||||
|
<b>{_t("Add image (optional)")}</b>
|
||||||
|
<span>
|
||||||
|
{_t("An image will help people identify your community.")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</BaseDialog>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,8 @@ import { _t } from '../../../languageHandler';
|
||||||
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
||||||
import {Key} from "../../../Keyboard";
|
import {Key} from "../../../Keyboard";
|
||||||
import {privateShouldBeEncrypted} from "../../../createRoom";
|
import {privateShouldBeEncrypted} from "../../../createRoom";
|
||||||
|
import TagOrderStore from "../../../stores/TagOrderStore";
|
||||||
|
import GroupStore from "../../../stores/GroupStore";
|
||||||
|
|
||||||
export default createReactClass({
|
export default createReactClass({
|
||||||
displayName: 'CreateRoomDialog',
|
displayName: 'CreateRoomDialog',
|
||||||
|
@ -70,6 +72,10 @@ export default createReactClass({
|
||||||
opts.encryption = this.state.isEncrypted;
|
opts.encryption = this.state.isEncrypted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TagOrderStore.getSelectedPrototypeTag()) {
|
||||||
|
opts.associatedWithCommunity = TagOrderStore.getSelectedPrototypeTag();
|
||||||
|
}
|
||||||
|
|
||||||
return opts;
|
return opts;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -178,18 +184,25 @@ export default createReactClass({
|
||||||
const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch');
|
const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch');
|
||||||
const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField');
|
const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField');
|
||||||
|
|
||||||
let publicPrivateLabel;
|
|
||||||
let aliasField;
|
let aliasField;
|
||||||
if (this.state.isPublic) {
|
if (this.state.isPublic) {
|
||||||
publicPrivateLabel = (<p>{_t("Set a room address to easily share your room with other people.")}</p>);
|
|
||||||
const domain = MatrixClientPeg.get().getDomain();
|
const domain = MatrixClientPeg.get().getDomain();
|
||||||
aliasField = (
|
aliasField = (
|
||||||
<div className="mx_CreateRoomDialog_aliasContainer">
|
<div className="mx_CreateRoomDialog_aliasContainer">
|
||||||
<RoomAliasField ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} value={this.state.alias} />
|
<RoomAliasField ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} value={this.state.alias} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
publicPrivateLabel = (<p>{_t("This room is private, and can only be joined by invitation.")}</p>);
|
|
||||||
|
let publicPrivateLabel = <p>{_t(
|
||||||
|
"Private rooms can be found and joined by invitation only. Public rooms can be " +
|
||||||
|
"found and joined by anyone.",
|
||||||
|
)}</p>;
|
||||||
|
if (TagOrderStore.getSelectedPrototypeTag()) {
|
||||||
|
publicPrivateLabel = <p>{_t(
|
||||||
|
"Private rooms can be found and joined by invitation only. Public rooms can be " +
|
||||||
|
"found and joined by anyone in this community.",
|
||||||
|
)}</p>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let e2eeSection;
|
let e2eeSection;
|
||||||
|
@ -212,7 +225,25 @@ export default createReactClass({
|
||||||
</React.Fragment>;
|
</React.Fragment>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room');
|
let federateLabel = _t(
|
||||||
|
"You might enable this if the room will only be used for collaborating with internal " +
|
||||||
|
"teams on your homeserver. This cannot be changed later.",
|
||||||
|
);
|
||||||
|
if (SdkConfig.get().default_federate === false) {
|
||||||
|
// We only change the label if the default setting is different to avoid jarring text changes to the
|
||||||
|
// user. They will have read the implications of turning this off/on, so no need to rephrase for them.
|
||||||
|
federateLabel = _t(
|
||||||
|
"You might disable this if the room will be used for collaborating with external " +
|
||||||
|
"teams who have their own homeserver. This cannot be changed later.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room');
|
||||||
|
if (TagOrderStore.getSelectedPrototypeTag()) {
|
||||||
|
const summary = GroupStore.getSummary(TagOrderStore.getSelectedPrototypeTag());
|
||||||
|
const name = summary?.profile?.name || TagOrderStore.getSelectedPrototypeTag();
|
||||||
|
title = _t("Create a room in %(communityName)s", {communityName: name});
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<BaseDialog className="mx_CreateRoomDialog" onFinished={this.props.onFinished}
|
<BaseDialog className="mx_CreateRoomDialog" onFinished={this.props.onFinished}
|
||||||
title={title}
|
title={title}
|
||||||
|
@ -227,7 +258,15 @@ export default createReactClass({
|
||||||
{ aliasField }
|
{ aliasField }
|
||||||
<details ref={this.collectDetailsRef} className="mx_CreateRoomDialog_details">
|
<details ref={this.collectDetailsRef} className="mx_CreateRoomDialog_details">
|
||||||
<summary className="mx_CreateRoomDialog_details_summary">{ this.state.detailsOpen ? _t('Hide advanced') : _t('Show advanced') }</summary>
|
<summary className="mx_CreateRoomDialog_details_summary">{ this.state.detailsOpen ? _t('Hide advanced') : _t('Show advanced') }</summary>
|
||||||
<LabelledToggleSwitch label={ _t('Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)')} onChange={this.onNoFederateChange} value={this.state.noFederate} />
|
<LabelledToggleSwitch
|
||||||
|
label={_t(
|
||||||
|
"Block anyone not part of %(serverName)s from ever joining this room.",
|
||||||
|
{serverName: MatrixClientPeg.getHomeserverName()},
|
||||||
|
)}
|
||||||
|
onChange={this.onNoFederateChange}
|
||||||
|
value={this.state.noFederate}
|
||||||
|
/>
|
||||||
|
<p>{federateLabel}</p>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
19
src/components/views/dialogs/IDialogProps.ts
Normal file
19
src/components/views/dialogs/IDialogProps.ts
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface IDialogProps {
|
||||||
|
onFinished: (bool) => void;
|
||||||
|
}
|
|
@ -327,7 +327,7 @@ export default class InviteDialog extends React.PureComponent {
|
||||||
this.state = {
|
this.state = {
|
||||||
targets: [], // array of Member objects (see interface above)
|
targets: [], // array of Member objects (see interface above)
|
||||||
filterText: "",
|
filterText: "",
|
||||||
recents: this._buildRecents(alreadyInvited),
|
recents: InviteDialog.buildRecents(alreadyInvited),
|
||||||
numRecentsShown: INITIAL_ROOMS_SHOWN,
|
numRecentsShown: INITIAL_ROOMS_SHOWN,
|
||||||
suggestions: this._buildSuggestions(alreadyInvited),
|
suggestions: this._buildSuggestions(alreadyInvited),
|
||||||
numSuggestionsShown: INITIAL_ROOMS_SHOWN,
|
numSuggestionsShown: INITIAL_ROOMS_SHOWN,
|
||||||
|
@ -344,7 +344,7 @@ export default class InviteDialog extends React.PureComponent {
|
||||||
this._editorRef = createRef();
|
this._editorRef = createRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
|
static buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
|
||||||
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room
|
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room
|
||||||
|
|
||||||
// Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the
|
// Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the
|
||||||
|
|
|
@ -27,9 +27,9 @@ import Spinner from "../elements/Spinner";
|
||||||
import AccessibleButton from "../elements/AccessibleButton";
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
|
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
|
||||||
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||||
|
import { IDialogProps } from "./IDialogProps";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps extends IDialogProps {
|
||||||
onFinished: (bool) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class ServerOfflineDialog extends React.PureComponent<IProps> {
|
export default class ServerOfflineDialog extends React.PureComponent<IProps> {
|
||||||
|
|
|
@ -31,6 +31,7 @@ import {toRightOf} from "../../structures/ContextMenu";
|
||||||
import {copyPlaintext, selectText} from "../../../utils/strings";
|
import {copyPlaintext, selectText} from "../../../utils/strings";
|
||||||
import StyledCheckbox from '../elements/StyledCheckbox';
|
import StyledCheckbox from '../elements/StyledCheckbox';
|
||||||
import AccessibleTooltipButton from '../elements/AccessibleTooltipButton';
|
import AccessibleTooltipButton from '../elements/AccessibleTooltipButton';
|
||||||
|
import { IDialogProps } from "./IDialogProps";
|
||||||
|
|
||||||
const socials = [
|
const socials = [
|
||||||
{
|
{
|
||||||
|
@ -60,8 +61,7 @@ const socials = [
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
interface IProps {
|
interface IProps extends IDialogProps {
|
||||||
onFinished: () => void;
|
|
||||||
target: Room | User | Group | RoomMember | MatrixEvent;
|
target: Room | User | Group | RoomMember | MatrixEvent;
|
||||||
permalinkCreator: RoomPermalinkCreator;
|
permalinkCreator: RoomPermalinkCreator;
|
||||||
}
|
}
|
||||||
|
@ -198,14 +198,16 @@ export default class ShareDialog extends React.PureComponent<IProps, IState> {
|
||||||
const encodedUrl = encodeURIComponent(matrixToUrl);
|
const encodedUrl = encodeURIComponent(matrixToUrl);
|
||||||
|
|
||||||
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
||||||
return <BaseDialog title={title}
|
return <BaseDialog
|
||||||
|
title={title}
|
||||||
className='mx_ShareDialog'
|
className='mx_ShareDialog'
|
||||||
contentId='mx_Dialog_content'
|
contentId='mx_Dialog_content'
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
>
|
>
|
||||||
<div className="mx_ShareDialog_content">
|
<div className="mx_ShareDialog_content">
|
||||||
<div className="mx_ShareDialog_matrixto">
|
<div className="mx_ShareDialog_matrixto">
|
||||||
<a href={matrixToUrl}
|
<a
|
||||||
|
href={matrixToUrl}
|
||||||
onClick={ShareDialog.onLinkClick}
|
onClick={ShareDialog.onLinkClick}
|
||||||
className="mx_ShareDialog_matrixto_link"
|
className="mx_ShareDialog_matrixto_link"
|
||||||
>
|
>
|
||||||
|
|
|
@ -735,7 +735,7 @@ export default class AppTile extends React.Component {
|
||||||
|
|
||||||
// Additional iframe feature pemissions
|
// Additional iframe feature pemissions
|
||||||
// (see - https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-permissions-in-cross-origin-iframes and https://wicg.github.io/feature-policy/)
|
// (see - https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-permissions-in-cross-origin-iframes and https://wicg.github.io/feature-policy/)
|
||||||
const iframeFeatures = "microphone; camera; encrypted-media; autoplay;";
|
const iframeFeatures = "microphone; camera; encrypted-media; autoplay; display-capture;";
|
||||||
|
|
||||||
const appTileBodyClass = 'mx_AppTileBody' + (this.props.miniMode ? '_mini ' : ' ');
|
const appTileBodyClass = 'mx_AppTileBody' + (this.props.miniMode ? '_mini ' : ' ');
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ export interface ILocationState {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Draggable extends React.Component<IProps, IState> {
|
export default class Draggable extends React.Component<IProps, IState> {
|
||||||
|
|
||||||
constructor(props: IProps) {
|
constructor(props: IProps) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
|
@ -77,5 +76,4 @@ export default class Draggable extends React.Component<IProps, IState> {
|
||||||
render() {
|
render() {
|
||||||
return <div className={this.props.className} onMouseDown={this.onMouseDown.bind(this)} />;
|
return <div className={this.props.className} onMouseDown={this.onMouseDown.bind(this)} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -39,11 +39,13 @@ interface IProps {
|
||||||
className: string;
|
className: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* eslint-disable camelcase */
|
||||||
interface IState {
|
interface IState {
|
||||||
userId: string;
|
userId: string;
|
||||||
displayname: string;
|
displayname: string;
|
||||||
avatar_url: string;
|
avatar_url: string;
|
||||||
}
|
}
|
||||||
|
/* eslint-enable camelcase */
|
||||||
|
|
||||||
const AVATAR_SIZE = 32;
|
const AVATAR_SIZE = 32;
|
||||||
|
|
||||||
|
@ -63,19 +65,18 @@ export default class EventTilePreview extends React.Component<IProps, IState> {
|
||||||
const client = MatrixClientPeg.get();
|
const client = MatrixClientPeg.get();
|
||||||
const userId = client.getUserId();
|
const userId = client.getUserId();
|
||||||
const profileInfo = await client.getProfileInfo(userId);
|
const profileInfo = await client.getProfileInfo(userId);
|
||||||
const avatar_url = Avatar.avatarUrlForUser(
|
const avatarUrl = Avatar.avatarUrlForUser(
|
||||||
{avatarUrl: profileInfo.avatar_url},
|
{avatarUrl: profileInfo.avatar_url},
|
||||||
AVATAR_SIZE, AVATAR_SIZE, "crop");
|
AVATAR_SIZE, AVATAR_SIZE, "crop");
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
userId,
|
userId,
|
||||||
displayname: profileInfo.displayname,
|
displayname: profileInfo.displayname,
|
||||||
avatar_url,
|
avatar_url: avatarUrl,
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fakeEvent({userId, displayname, avatar_url}: IState) {
|
private fakeEvent({userId, displayname, avatar_url: avatarUrl}: IState) {
|
||||||
// Fake it till we make it
|
// Fake it till we make it
|
||||||
const event = new MatrixEvent(JSON.parse(`{
|
const event = new MatrixEvent(JSON.parse(`{
|
||||||
"type": "m.room.message",
|
"type": "m.room.message",
|
||||||
|
@ -85,12 +86,12 @@ export default class EventTilePreview extends React.Component<IProps, IState> {
|
||||||
"msgtype": "m.text",
|
"msgtype": "m.text",
|
||||||
"body": "${this.props.message}",
|
"body": "${this.props.message}",
|
||||||
"displayname": "${displayname}",
|
"displayname": "${displayname}",
|
||||||
"avatar_url": "${avatar_url}"
|
"avatar_url": "${avatarUrl}"
|
||||||
},
|
},
|
||||||
"msgtype": "m.text",
|
"msgtype": "m.text",
|
||||||
"body": "${this.props.message}",
|
"body": "${this.props.message}",
|
||||||
"displayname": "${displayname}",
|
"displayname": "${displayname}",
|
||||||
"avatar_url": "${avatar_url}"
|
"avatar_url": "${avatarUrl}"
|
||||||
},
|
},
|
||||||
"unsigned": {
|
"unsigned": {
|
||||||
"age": 97
|
"age": 97
|
||||||
|
@ -104,7 +105,7 @@ export default class EventTilePreview extends React.Component<IProps, IState> {
|
||||||
name: displayname,
|
name: displayname,
|
||||||
userId: userId,
|
userId: userId,
|
||||||
getAvatarUrl: (..._) => {
|
getAvatarUrl: (..._) => {
|
||||||
return avatar_url;
|
return avatarUrl;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -114,13 +115,10 @@ export default class EventTilePreview extends React.Component<IProps, IState> {
|
||||||
public render() {
|
public render() {
|
||||||
const event = this.fakeEvent(this.state);
|
const event = this.fakeEvent(this.state);
|
||||||
|
|
||||||
let className = classnames(
|
const className = classnames(this.props.className, {
|
||||||
this.props.className,
|
|
||||||
{
|
|
||||||
"mx_IRCLayout": this.props.useIRCLayout,
|
"mx_IRCLayout": this.props.useIRCLayout,
|
||||||
"mx_GroupLayout": !this.props.useIRCLayout,
|
"mx_GroupLayout": !this.props.useIRCLayout,
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
return <div className={className}>
|
return <div className={className}>
|
||||||
<EventTile mxEvent={event} useIRCLayout={this.props.useIRCLayout} />
|
<EventTile mxEvent={event} useIRCLayout={this.props.useIRCLayout} />
|
||||||
|
|
|
@ -198,11 +198,9 @@ export default class Field extends React.PureComponent<PropShapes, IState> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
const {
|
/* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */
|
||||||
element, prefixComponent, postfixComponent, className, onValidate, children,
|
const { element, prefixComponent, postfixComponent, className, onValidate, children,
|
||||||
tooltipContent, forceValidity, tooltipClassName, list, ...inputProps} = this.props;
|
tooltipContent, forceValidity, tooltipClassName, list, ...inputProps} = this.props;
|
||||||
|
|
||||||
// Set some defaults for the <input> element
|
// Set some defaults for the <input> element
|
||||||
|
|
|
@ -78,7 +78,12 @@ export default class IRCTimelineProfileResizer extends React.Component<IProps, I
|
||||||
|
|
||||||
private onMoueUp(event: MouseEvent) {
|
private onMoueUp(event: MouseEvent) {
|
||||||
if (this.props.roomId) {
|
if (this.props.roomId) {
|
||||||
SettingsStore.setValue("ircDisplayNameWidth", this.props.roomId, SettingLevel.ROOM_DEVICE, this.state.width);
|
SettingsStore.setValue(
|
||||||
|
"ircDisplayNameWidth",
|
||||||
|
this.props.roomId,
|
||||||
|
SettingLevel.ROOM_DEVICE,
|
||||||
|
this.state.width,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
72
src/components/views/elements/InfoTooltip.tsx
Normal file
72
src/components/views/elements/InfoTooltip.tsx
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
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 classNames from 'classnames';
|
||||||
|
|
||||||
|
import Tooltip from './Tooltip';
|
||||||
|
import { _t } from "../../../languageHandler";
|
||||||
|
|
||||||
|
interface ITooltipProps {
|
||||||
|
tooltip?: React.ReactNode;
|
||||||
|
tooltipClassName?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IState {
|
||||||
|
hover: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class InfoTooltip extends React.PureComponent<ITooltipProps, IState> {
|
||||||
|
constructor(props: ITooltipProps) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
hover: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
onMouseOver = () => {
|
||||||
|
this.setState({
|
||||||
|
hover: true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onMouseLeave = () => {
|
||||||
|
this.setState({
|
||||||
|
hover: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {tooltip, children, tooltipClassName} = this.props;
|
||||||
|
const title = _t("Information");
|
||||||
|
|
||||||
|
// Tooltip are forced on the right for a more natural feel to them on info icons
|
||||||
|
const tip = this.state.hover ? <Tooltip
|
||||||
|
className="mx_InfoTooltip_container"
|
||||||
|
tooltipClassName={classNames("mx_InfoTooltip_tooltip", tooltipClassName)}
|
||||||
|
label={tooltip || title}
|
||||||
|
forceOnRight={true}
|
||||||
|
/> : <div />;
|
||||||
|
return (
|
||||||
|
<div onMouseOver={this.onMouseOver} onMouseLeave={this.onMouseLeave} className="mx_InfoTooltip">
|
||||||
|
<span className="mx_InfoTooltip_icon" aria-label={title} />
|
||||||
|
{children}
|
||||||
|
{tip}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,7 +41,7 @@ const QRCode: React.FC<IProps> = ({data, className, ...options}) => {
|
||||||
return () => {
|
return () => {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
};
|
};
|
||||||
}, [JSON.stringify(data), options]);
|
}, [JSON.stringify(data), options]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
return <div className={classNames("mx_QRCode", className)}>
|
return <div className={classNames("mx_QRCode", className)}>
|
||||||
{ dataUri ? <img src={dataUri} className="mx_VerificationQRCode" alt={_t("QR Code")} /> : <Spinner /> }
|
{ dataUri ? <img src={dataUri} className="mx_VerificationQRCode" alt={_t("QR Code")} /> : <Spinner /> }
|
||||||
|
|
|
@ -45,7 +45,7 @@ export default class Slider extends React.Component<IProps> {
|
||||||
// non linear slider.
|
// non linear slider.
|
||||||
private offset(values: number[], value: number): number {
|
private offset(values: number[], value: number): number {
|
||||||
// the index of the first number greater than value.
|
// the index of the first number greater than value.
|
||||||
let closest = values.reduce((prev, curr) => {
|
const closest = values.reduce((prev, curr) => {
|
||||||
return (value > curr ? prev + 1 : prev);
|
return (value > curr ? prev + 1 : prev);
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
|
@ -68,12 +68,11 @@ export default class Slider extends React.Component<IProps> {
|
||||||
const linearInterpolation = (value - closestLessValue) / (closestGreaterValue - closestLessValue);
|
const linearInterpolation = (value - closestLessValue) / (closestGreaterValue - closestLessValue);
|
||||||
|
|
||||||
return 100 * (closest - 1 + linearInterpolation) * intervalWidth;
|
return 100 * (closest - 1 + linearInterpolation) * intervalWidth;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render(): React.ReactNode {
|
render(): React.ReactNode {
|
||||||
const dots = this.props.values.map(v =>
|
const dots = this.props.values.map(v => <Dot
|
||||||
<Dot active={v <= this.props.value}
|
active={v <= this.props.value}
|
||||||
label={this.props.displayFunc(v)}
|
label={this.props.displayFunc(v)}
|
||||||
onClick={this.props.disabled ? () => {} : () => this.props.onSelectionChange(v)}
|
onClick={this.props.disabled ? () => {} : () => this.props.onSelectionChange(v)}
|
||||||
key={v}
|
key={v}
|
||||||
|
|
|
@ -17,8 +17,6 @@ limitations under the License.
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { randomString } from "matrix-js-sdk/src/randomstring";
|
import { randomString } from "matrix-js-sdk/src/randomstring";
|
||||||
|
|
||||||
const CHECK_BOX_SVG = require("../../../../res/img/feather-customised/check.svg");
|
|
||||||
|
|
||||||
interface IProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
interface IProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,13 +37,14 @@ export default class StyledCheckbox extends React.PureComponent<IProps, IState>
|
||||||
}
|
}
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
|
/* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */
|
||||||
const { children, className, ...otherProps } = this.props;
|
const { children, className, ...otherProps } = this.props;
|
||||||
return <span className={"mx_Checkbox " + className}>
|
return <span className={"mx_Checkbox " + className}>
|
||||||
<input id={this.id} {...otherProps} type="checkbox" />
|
<input id={this.id} {...otherProps} type="checkbox" />
|
||||||
<label htmlFor={this.id}>
|
<label htmlFor={this.id}>
|
||||||
{/* Using the div to center the image */}
|
{/* Using the div to center the image */}
|
||||||
<div className="mx_Checkbox_background">
|
<div className="mx_Checkbox_background">
|
||||||
<img src={CHECK_BOX_SVG}/>
|
<img src={require("../../../../res/img/feather-customised/check.svg")} />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{ this.props.children }
|
{ this.props.children }
|
||||||
|
|
|
@ -30,6 +30,7 @@ import GroupStore from '../../../stores/GroupStore';
|
||||||
import TagOrderStore from '../../../stores/TagOrderStore';
|
import TagOrderStore from '../../../stores/TagOrderStore';
|
||||||
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
||||||
import AccessibleButton from "./AccessibleButton";
|
import AccessibleButton from "./AccessibleButton";
|
||||||
|
import SettingsStore from "../../../settings/SettingsStore";
|
||||||
|
|
||||||
// A class for a child of TagPanel (possibly wrapped in a DNDTagTile) that represents
|
// A class for a child of TagPanel (possibly wrapped in a DNDTagTile) that represents
|
||||||
// a thing to click on for the user to filter the visible rooms in the RoomList to:
|
// a thing to click on for the user to filter the visible rooms in the RoomList to:
|
||||||
|
@ -46,6 +47,7 @@ export default createReactClass({
|
||||||
contextMenuButtonRef: PropTypes.object,
|
contextMenuButtonRef: PropTypes.object,
|
||||||
openMenu: PropTypes.func,
|
openMenu: PropTypes.func,
|
||||||
menuDisplayed: PropTypes.bool,
|
menuDisplayed: PropTypes.bool,
|
||||||
|
selected: PropTypes.bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
statics: {
|
statics: {
|
||||||
|
@ -112,6 +114,7 @@ export default createReactClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
onMouseOver: function() {
|
onMouseOver: function() {
|
||||||
|
if (SettingsStore.getValue("feature_communities_v2_prototypes")) return;
|
||||||
this.setState({ hover: true });
|
this.setState({ hover: true });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -123,6 +126,7 @@ export default createReactClass({
|
||||||
// Prevent the TagTile onClick event firing as well
|
// Prevent the TagTile onClick event firing as well
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (SettingsStore.getValue("feature_communities_v2_prototypes")) return;
|
||||||
this.setState({ hover: false });
|
this.setState({ hover: false });
|
||||||
this.props.openMenu();
|
this.props.openMenu();
|
||||||
},
|
},
|
||||||
|
@ -137,9 +141,12 @@ export default createReactClass({
|
||||||
profile.avatarUrl, avatarHeight, avatarHeight, "crop",
|
profile.avatarUrl, avatarHeight, avatarHeight, "crop",
|
||||||
) : null;
|
) : null;
|
||||||
|
|
||||||
|
const isPrototype = SettingsStore.getValue("feature_communities_v2_prototypes");
|
||||||
const className = classNames({
|
const className = classNames({
|
||||||
mx_TagTile: true,
|
mx_TagTile: true,
|
||||||
mx_TagTile_selected: this.props.selected,
|
mx_TagTile_prototype: isPrototype,
|
||||||
|
mx_TagTile_selected: this.props.selected && !isPrototype,
|
||||||
|
mx_TagTile_selected_prototype: this.props.selected && isPrototype,
|
||||||
});
|
});
|
||||||
|
|
||||||
const badge = TagOrderStore.getGroupBadge(this.props.tag);
|
const badge = TagOrderStore.getGroupBadge(this.props.tag);
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2015, 2016 OpenMarket Ltd
|
|
||||||
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.
|
|
||||||
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, {createRef} from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import createReactClass from 'create-react-class';
|
|
||||||
import { _t } from '../../../languageHandler';
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'UserSelector',
|
|
||||||
|
|
||||||
propTypes: {
|
|
||||||
onChange: PropTypes.func,
|
|
||||||
selected_users: PropTypes.arrayOf(PropTypes.string),
|
|
||||||
},
|
|
||||||
|
|
||||||
getDefaultProps: function() {
|
|
||||||
return {
|
|
||||||
onChange: function() {},
|
|
||||||
selected: [],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO: [REACT-WARNING] Replace component with real class, use constructor for refs
|
|
||||||
UNSAFE_componentWillMount: function() {
|
|
||||||
this._user_id_input = createRef();
|
|
||||||
},
|
|
||||||
|
|
||||||
addUser: function(user_id) {
|
|
||||||
if (this.props.selected_users.indexOf(user_id == -1)) {
|
|
||||||
this.props.onChange(this.props.selected_users.concat([user_id]));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
removeUser: function(user_id) {
|
|
||||||
this.props.onChange(this.props.selected_users.filter(function(e) {
|
|
||||||
return e != user_id;
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
onAddUserId: function() {
|
|
||||||
this.addUser(this._user_id_input.current.value);
|
|
||||||
this._user_id_input.current.value = "";
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
const self = this;
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<ul className="mx_UserSelector_UserIdList">
|
|
||||||
{ this.props.selected_users.map(function(user_id, i) {
|
|
||||||
return <li key={user_id}>{ user_id } - <span onClick={function() {self.removeUser(user_id);}}>X</span></li>;
|
|
||||||
}) }
|
|
||||||
</ul>
|
|
||||||
<input type="text" ref={this._user_id_input} defaultValue="" className="mx_UserSelector_userIdInput" placeholder={_t("ex. @bob:example.com")} />
|
|
||||||
<button onClick={this.onAddUserId} className="mx_UserSelector_AddUserId">
|
|
||||||
{ _t("Add User") }
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
85
src/components/views/elements/UserTagTile.tsx
Normal file
85
src/components/views/elements/UserTagTile.tsx
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 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 React from "react";
|
||||||
|
import defaultDispatcher from "../../../dispatcher/dispatcher";
|
||||||
|
import * as fbEmitter from "fbemitter";
|
||||||
|
import TagOrderStore from "../../../stores/TagOrderStore";
|
||||||
|
import AccessibleTooltipButton from "./AccessibleTooltipButton";
|
||||||
|
import classNames from "classnames";
|
||||||
|
import { _t } from "../../../languageHandler";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IState {
|
||||||
|
selected: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class UserTagTile extends React.PureComponent<IProps, IState> {
|
||||||
|
private tagStoreRef: fbEmitter.EventSubscription;
|
||||||
|
|
||||||
|
constructor(props: IProps) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
selected: TagOrderStore.getSelectedTags().length === 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public componentDidMount() {
|
||||||
|
this.tagStoreRef = TagOrderStore.addListener(this.onTagStoreUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public componentWillUnmount() {
|
||||||
|
this.tagStoreRef.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
private onTagStoreUpdate = () => {
|
||||||
|
const selected = TagOrderStore.getSelectedTags().length === 0;
|
||||||
|
this.setState({selected});
|
||||||
|
};
|
||||||
|
|
||||||
|
private onTileClick = (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
|
||||||
|
// Deselect all tags
|
||||||
|
defaultDispatcher.dispatch({action: "deselect_tags"});
|
||||||
|
};
|
||||||
|
|
||||||
|
public render() {
|
||||||
|
// XXX: We reuse TagTile classes for ease of demonstration - we should probably generify
|
||||||
|
// TagTile instead if we continue to use this component.
|
||||||
|
const className = classNames({
|
||||||
|
mx_TagTile: true,
|
||||||
|
mx_TagTile_prototype: true,
|
||||||
|
mx_TagTile_selected_prototype: this.state.selected,
|
||||||
|
mx_TagTile_home: true,
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<AccessibleTooltipButton
|
||||||
|
className={className}
|
||||||
|
onClick={this.onTileClick}
|
||||||
|
title={_t("Home")}
|
||||||
|
>
|
||||||
|
<div className="mx_TagTile_avatar">
|
||||||
|
<div className="mx_TagTile_homeIcon" />
|
||||||
|
</div>
|
||||||
|
</AccessibleTooltipButton>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,13 +15,13 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from "react";
|
import React, {forwardRef} from "react";
|
||||||
|
|
||||||
export default ({mxEvent}) => {
|
export default forwardRef(({mxEvent}, ref) => {
|
||||||
const text = mxEvent.getContent().body;
|
const text = mxEvent.getContent().body;
|
||||||
return (
|
return (
|
||||||
<span className="mx_UnknownBody">
|
<span className="mx_UnknownBody" ref={ref}>
|
||||||
{ text }
|
{ text }
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
};
|
});
|
||||||
|
|
|
@ -76,14 +76,16 @@ const EncryptionInfo: React.FC<IProps> = ({
|
||||||
description = (
|
description = (
|
||||||
<div>
|
<div>
|
||||||
<p>{_t("Messages in this room are end-to-end encrypted.")}</p>
|
<p>{_t("Messages in this room are end-to-end encrypted.")}</p>
|
||||||
<p>{_t("Your messages are secured and only you and the recipient have the unique keys to unlock them.")}</p>
|
<p>{_t("Your messages are secured and only you and the recipient have " +
|
||||||
|
"the unique keys to unlock them.")}</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
description = (
|
description = (
|
||||||
<div>
|
<div>
|
||||||
<p>{_t("Messages in this room are not end-to-end encrypted.")}</p>
|
<p>{_t("Messages in this room are not end-to-end encrypted.")}</p>
|
||||||
<p>{_t("In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.")}</p>
|
<p>{_t("In encrypted rooms, your messages are secured and only you and the recipient have " +
|
||||||
|
"the unique keys to unlock them.")}</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,10 @@ import dis from '../../../dispatcher/dispatcher';
|
||||||
import RightPanelStore from "../../../stores/RightPanelStore";
|
import RightPanelStore from "../../../stores/RightPanelStore";
|
||||||
import {RightPanelPhases} from "../../../stores/RightPanelStorePhases";
|
import {RightPanelPhases} from "../../../stores/RightPanelStorePhases";
|
||||||
import {Action} from '../../../dispatcher/actions';
|
import {Action} from '../../../dispatcher/actions';
|
||||||
import {SetRightPanelPhasePayload, SetRightPanelPhaseRefireParams} from '../../../dispatcher/payloads/SetRightPanelPhasePayload';
|
import {
|
||||||
|
SetRightPanelPhasePayload,
|
||||||
|
SetRightPanelPhaseRefireParams,
|
||||||
|
} from '../../../dispatcher/payloads/SetRightPanelPhasePayload';
|
||||||
import {EventSubscription} from "fbemitter";
|
import {EventSubscription} from "fbemitter";
|
||||||
|
|
||||||
export enum HeaderKind {
|
export enum HeaderKind {
|
||||||
|
@ -38,7 +41,7 @@ interface IState {
|
||||||
|
|
||||||
interface IProps {}
|
interface IProps {}
|
||||||
|
|
||||||
export default class HeaderButtons extends React.Component<IProps, IState> {
|
export default abstract class HeaderButtons extends React.Component<IProps, IState> {
|
||||||
private storeToken: EventSubscription;
|
private storeToken: EventSubscription;
|
||||||
private dispatcherRef: string;
|
private dispatcherRef: string;
|
||||||
|
|
||||||
|
@ -92,14 +95,7 @@ export default class HeaderButtons extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: Make renderButtons a prop
|
// XXX: Make renderButtons a prop
|
||||||
public renderButtons(): JSX.Element[] {
|
public abstract renderButtons(): JSX.Element[];
|
||||||
// Ignore - intended to be overridden by subclasses
|
|
||||||
// Return empty fragment to satisfy the type
|
|
||||||
return [
|
|
||||||
<React.Fragment>
|
|
||||||
</React.Fragment>
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
// inline style as this will be swapped around in future commits
|
// inline style as this will be swapped around in future commits
|
||||||
|
|
|
@ -30,8 +30,6 @@ import {_t} from "../../../languageHandler";
|
||||||
import SdkConfig from "../../../SdkConfig";
|
import SdkConfig from "../../../SdkConfig";
|
||||||
import E2EIcon from "../rooms/E2EIcon";
|
import E2EIcon from "../rooms/E2EIcon";
|
||||||
import {
|
import {
|
||||||
PHASE_UNSENT,
|
|
||||||
PHASE_REQUESTED,
|
|
||||||
PHASE_READY,
|
PHASE_READY,
|
||||||
PHASE_DONE,
|
PHASE_DONE,
|
||||||
PHASE_STARTED,
|
PHASE_STARTED,
|
||||||
|
@ -104,10 +102,11 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
if (showSAS) {
|
if (showSAS) {
|
||||||
sasBlockDialog =
|
sasBlockDialog = <div className='mx_VerificationPanel_QRPhase_startOption'>
|
||||||
<div className='mx_VerificationPanel_QRPhase_startOption'>
|
|
||||||
<p>{_t("Compare unique emoji")}</p>
|
<p>{_t("Compare unique emoji")}</p>
|
||||||
<span className='mx_VerificationPanel_QRPhase_helpText'>{_t("Compare a unique set of emoji if you don't have a camera on either device")}</span>
|
<span className='mx_VerificationPanel_QRPhase_helpText'>
|
||||||
|
{_t("Compare a unique set of emoji if you don't have a camera on either device")}
|
||||||
|
</span>
|
||||||
<AccessibleButton disabled={this.state.emojiButtonClicked} onClick={this.startSAS} kind='primary'>
|
<AccessibleButton disabled={this.state.emojiButtonClicked} onClick={this.startSAS} kind='primary'>
|
||||||
{_t("Start")}
|
{_t("Start")}
|
||||||
</AccessibleButton>
|
</AccessibleButton>
|
||||||
|
|
|
@ -92,6 +92,7 @@ export default class NotificationBadge extends React.PureComponent<XOR<IProps, I
|
||||||
};
|
};
|
||||||
|
|
||||||
public render(): React.ReactElement {
|
public render(): React.ReactElement {
|
||||||
|
/* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */
|
||||||
const {notification, forceCount, roomId, onClick, ...props} = this.props;
|
const {notification, forceCount, roomId, onClick, ...props} = this.props;
|
||||||
|
|
||||||
// Don't show a badge if we don't need to
|
// Don't show a badge if we don't need to
|
||||||
|
|
|
@ -45,6 +45,7 @@ import { arrayFastClone, arrayHasDiff } from "../../../utils/arrays";
|
||||||
import { objectShallowClone, objectWithOnly } from "../../../utils/objects";
|
import { objectShallowClone, objectWithOnly } from "../../../utils/objects";
|
||||||
import { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../context_menus/IconizedContextMenu";
|
import { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../context_menus/IconizedContextMenu";
|
||||||
import AccessibleButton from "../elements/AccessibleButton";
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
|
import TagOrderStore from "../../../stores/TagOrderStore";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
onKeyDown: (ev: React.KeyboardEvent) => void;
|
onKeyDown: (ev: React.KeyboardEvent) => void;
|
||||||
|
@ -129,7 +130,9 @@ const TAG_AESTHETICS: {
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<IconizedContextMenuOption
|
<IconizedContextMenuOption
|
||||||
label={_t("Explore public rooms")}
|
label={TagOrderStore.getSelectedPrototypeTag()
|
||||||
|
? _t("Explore community rooms")
|
||||||
|
: _t("Explore public rooms")}
|
||||||
iconClassName="mx_RoomList_iconExplore"
|
iconClassName="mx_RoomList_iconExplore"
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -215,7 +218,7 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
|
||||||
|
|
||||||
private getRoomDelta = (roomId: string, delta: number, unread = false) => {
|
private getRoomDelta = (roomId: string, delta: number, unread = false) => {
|
||||||
const lists = RoomListStore.instance.orderedLists;
|
const lists = RoomListStore.instance.orderedLists;
|
||||||
let rooms: Room = [];
|
const rooms: Room = [];
|
||||||
TAG_ORDER.forEach(t => {
|
TAG_ORDER.forEach(t => {
|
||||||
let listRooms = lists[t];
|
let listRooms = lists[t];
|
||||||
|
|
||||||
|
@ -343,8 +346,7 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
|
||||||
: TAG_AESTHETICS[orderedTagId];
|
: TAG_AESTHETICS[orderedTagId];
|
||||||
if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`);
|
if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`);
|
||||||
|
|
||||||
components.push(
|
components.push(<RoomSublist
|
||||||
<RoomSublist
|
|
||||||
key={`sublist-${orderedTagId}`}
|
key={`sublist-${orderedTagId}`}
|
||||||
tagId={orderedTagId}
|
tagId={orderedTagId}
|
||||||
forRooms={true}
|
forRooms={true}
|
||||||
|
@ -356,8 +358,7 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
|
||||||
isMinimized={this.props.isMinimized}
|
isMinimized={this.props.isMinimized}
|
||||||
onResize={this.props.onResize}
|
onResize={this.props.onResize}
|
||||||
extraBadTilesThatShouldntExist={extraTiles}
|
extraBadTilesThatShouldntExist={extraTiles}
|
||||||
/>
|
/>);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return components;
|
return components;
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016 OpenMarket 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 createReactClass from 'create-react-class';
|
|
||||||
import {MatrixClientPeg} from "../../../MatrixClientPeg";
|
|
||||||
import * as sdk from "../../../index";
|
|
||||||
import { _t } from '../../../languageHandler';
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'RoomNameEditor',
|
|
||||||
|
|
||||||
propTypes: {
|
|
||||||
room: PropTypes.object.isRequired,
|
|
||||||
},
|
|
||||||
|
|
||||||
getInitialState: function() {
|
|
||||||
return {
|
|
||||||
name: null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO: [REACT-WARNING] Move this to constructor
|
|
||||||
UNSAFE_componentWillMount: function() {
|
|
||||||
const room = this.props.room;
|
|
||||||
const name = room.currentState.getStateEvents('m.room.name', '');
|
|
||||||
const myId = MatrixClientPeg.get().credentials.userId;
|
|
||||||
const defaultName = room.getDefaultRoomName(myId);
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
name: name ? name.getContent().name : '',
|
|
||||||
});
|
|
||||||
|
|
||||||
this._placeholderName = _t("Unnamed Room");
|
|
||||||
if (defaultName && defaultName !== 'Empty room') { // default name from JS SDK, needs no translation as we don't ever show it.
|
|
||||||
this._placeholderName += " (" + defaultName + ")";
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getRoomName: function() {
|
|
||||||
return this.state.name;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onValueChanged: function(value, shouldSubmit) {
|
|
||||||
this.setState({
|
|
||||||
name: value,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
const EditableText = sdk.getComponent("elements.EditableText");
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="mx_RoomHeader_name">
|
|
||||||
<EditableText
|
|
||||||
className="mx_RoomHeader_nametext mx_RoomHeader_editable"
|
|
||||||
placeholderClassName="mx_RoomHeader_placeholder"
|
|
||||||
placeholder={this._placeholderName}
|
|
||||||
blurToCancel={false}
|
|
||||||
initialValue={this.state.name}
|
|
||||||
onValueChanged={this._onValueChanged}
|
|
||||||
dir="auto" />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -26,6 +26,8 @@ import classNames from 'classnames';
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
import SdkConfig from "../../../SdkConfig";
|
import SdkConfig from "../../../SdkConfig";
|
||||||
import IdentityAuthClient from '../../../IdentityAuthClient';
|
import IdentityAuthClient from '../../../IdentityAuthClient';
|
||||||
|
import {CommunityPrototypeStore} from "../../../stores/CommunityPrototypeStore";
|
||||||
|
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
|
||||||
|
|
||||||
const MessageCase = Object.freeze({
|
const MessageCase = Object.freeze({
|
||||||
NotLoggedIn: "NotLoggedIn",
|
NotLoggedIn: "NotLoggedIn",
|
||||||
|
@ -100,6 +102,7 @@ export default createReactClass({
|
||||||
|
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
this._checkInvitedEmail();
|
this._checkInvitedEmail();
|
||||||
|
CommunityPrototypeStore.instance.on(UPDATE_EVENT, this._onCommunityUpdate);
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidUpdate: function(prevProps, prevState) {
|
componentDidUpdate: function(prevProps, prevState) {
|
||||||
|
@ -108,6 +111,10 @@ export default createReactClass({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
componentWillUnmount: function() {
|
||||||
|
CommunityPrototypeStore.instance.off(UPDATE_EVENT, this._onCommunityUpdate);
|
||||||
|
},
|
||||||
|
|
||||||
_checkInvitedEmail: async function() {
|
_checkInvitedEmail: async function() {
|
||||||
// If this is an invite and we've been told what email address was
|
// If this is an invite and we've been told what email address was
|
||||||
// invited, fetch the user's account emails and discovery bindings so we
|
// invited, fetch the user's account emails and discovery bindings so we
|
||||||
|
@ -143,6 +150,13 @@ export default createReactClass({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onCommunityUpdate: function (roomId) {
|
||||||
|
if (this.props.room && this.props.room.roomId !== roomId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.forceUpdate(); // we have nothing to update
|
||||||
|
},
|
||||||
|
|
||||||
_getMessageCase() {
|
_getMessageCase() {
|
||||||
const isGuest = MatrixClientPeg.get().isGuest();
|
const isGuest = MatrixClientPeg.get().isGuest();
|
||||||
|
|
||||||
|
@ -219,8 +233,15 @@ export default createReactClass({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_communityProfile: function() {
|
||||||
|
if (this.props.room) return CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId);
|
||||||
|
return {displayName: null, avatarMxc: null};
|
||||||
|
},
|
||||||
|
|
||||||
_roomName: function(atStart = false) {
|
_roomName: function(atStart = false) {
|
||||||
const name = this.props.room ? this.props.room.name : this.props.roomAlias;
|
let name = this.props.room ? this.props.room.name : this.props.roomAlias;
|
||||||
|
const profile = this._communityProfile();
|
||||||
|
if (profile.displayName) name = profile.displayName;
|
||||||
if (name) {
|
if (name) {
|
||||||
return name;
|
return name;
|
||||||
} else if (atStart) {
|
} else if (atStart) {
|
||||||
|
@ -439,7 +460,10 @@ export default createReactClass({
|
||||||
}
|
}
|
||||||
case MessageCase.Invite: {
|
case MessageCase.Invite: {
|
||||||
const RoomAvatar = sdk.getComponent("views.avatars.RoomAvatar");
|
const RoomAvatar = sdk.getComponent("views.avatars.RoomAvatar");
|
||||||
const avatar = <RoomAvatar room={this.props.room} oobData={this.props.oobData} />;
|
const oobData = Object.assign({}, this.props.oobData, {
|
||||||
|
avatarUrl: this._communityProfile().avatarMxc,
|
||||||
|
});
|
||||||
|
const avatar = <RoomAvatar room={this.props.room} oobData={oobData} />;
|
||||||
|
|
||||||
const inviteMember = this._getInviteMember();
|
const inviteMember = this._getInviteMember();
|
||||||
let inviterElement;
|
let inviterElement;
|
||||||
|
|
|
@ -517,15 +517,13 @@ export default class RoomSublist extends React.Component<IProps, IState> {
|
||||||
if (this.state.rooms) {
|
if (this.state.rooms) {
|
||||||
const visibleRooms = this.state.rooms.slice(0, this.numVisibleTiles);
|
const visibleRooms = this.state.rooms.slice(0, this.numVisibleTiles);
|
||||||
for (const room of visibleRooms) {
|
for (const room of visibleRooms) {
|
||||||
tiles.push(
|
tiles.push(<RoomTile
|
||||||
<RoomTile
|
|
||||||
room={room}
|
room={room}
|
||||||
key={`room-${room.roomId}`}
|
key={`room-${room.roomId}`}
|
||||||
showMessagePreview={this.layout.showPreviews}
|
showMessagePreview={this.layout.showPreviews}
|
||||||
isMinimized={this.props.isMinimized}
|
isMinimized={this.props.isMinimized}
|
||||||
tag={this.props.tagId}
|
tag={this.props.tagId}
|
||||||
/>
|
/>);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,7 +708,12 @@ export default class RoomSublist extends React.Component<IProps, IState> {
|
||||||
// doesn't become sticky.
|
// doesn't become sticky.
|
||||||
// The same applies to the notification badge.
|
// The same applies to the notification badge.
|
||||||
return (
|
return (
|
||||||
<div className={classes} onKeyDown={this.onHeaderKeyDown} onFocus={onFocus} aria-label={this.props.label}>
|
<div
|
||||||
|
className={classes}
|
||||||
|
onKeyDown={this.onHeaderKeyDown}
|
||||||
|
onFocus={onFocus}
|
||||||
|
aria-label={this.props.label}
|
||||||
|
>
|
||||||
<div className="mx_RoomSublist_stickable">
|
<div className="mx_RoomSublist_stickable">
|
||||||
<Button
|
<Button
|
||||||
onFocus={onFocus}
|
onFocus={onFocus}
|
||||||
|
@ -762,7 +765,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
|
||||||
const showMoreAtMinHeight = minTiles < this.numTiles;
|
const showMoreAtMinHeight = minTiles < this.numTiles;
|
||||||
const minHeightPadding = RESIZE_HANDLE_HEIGHT + (showMoreAtMinHeight ? SHOW_N_BUTTON_HEIGHT : 0);
|
const minHeightPadding = RESIZE_HANDLE_HEIGHT + (showMoreAtMinHeight ? SHOW_N_BUTTON_HEIGHT : 0);
|
||||||
const minTilesPx = layout.tilesToPixelsWithPadding(minTiles, minHeightPadding);
|
const minTilesPx = layout.tilesToPixelsWithPadding(minTiles, minHeightPadding);
|
||||||
let maxTilesPx = layout.tilesToPixelsWithPadding(this.numTiles, this.padding);
|
const maxTilesPx = layout.tilesToPixelsWithPadding(this.numTiles, this.padding);
|
||||||
const showMoreBtnClasses = classNames({
|
const showMoreBtnClasses = classNames({
|
||||||
'mx_RoomSublist_showNButton': true,
|
'mx_RoomSublist_showNButton': true,
|
||||||
});
|
});
|
||||||
|
|
|
@ -27,11 +27,11 @@ import defaultDispatcher from '../../../dispatcher/dispatcher';
|
||||||
import { Key } from "../../../Keyboard";
|
import { Key } from "../../../Keyboard";
|
||||||
import ActiveRoomObserver from "../../../ActiveRoomObserver";
|
import ActiveRoomObserver from "../../../ActiveRoomObserver";
|
||||||
import { _t } from "../../../languageHandler";
|
import { _t } from "../../../languageHandler";
|
||||||
import { ChevronFace, ContextMenuTooltipButton, MenuItemRadio } from "../../structures/ContextMenu";
|
import { ChevronFace, ContextMenuTooltipButton } from "../../structures/ContextMenu";
|
||||||
import { DefaultTagID, TagID } from "../../../stores/room-list/models";
|
import { DefaultTagID, TagID } from "../../../stores/room-list/models";
|
||||||
import { MessagePreviewStore, ROOM_PREVIEW_CHANGED } from "../../../stores/room-list/MessagePreviewStore";
|
import { MessagePreviewStore, ROOM_PREVIEW_CHANGED } from "../../../stores/room-list/MessagePreviewStore";
|
||||||
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
|
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
|
||||||
import { ALL_MESSAGES, ALL_MESSAGES_LOUD, MENTIONS_ONLY, MUTE, } from "../../../RoomNotifs";
|
import { ALL_MESSAGES, ALL_MESSAGES_LOUD, MENTIONS_ONLY, MUTE } from "../../../RoomNotifs";
|
||||||
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||||
import NotificationBadge from "./NotificationBadge";
|
import NotificationBadge from "./NotificationBadge";
|
||||||
import { Volume } from "../../../RoomNotifsTypes";
|
import { Volume } from "../../../RoomNotifsTypes";
|
||||||
|
@ -47,8 +47,11 @@ import { PROPERTY_UPDATED } from "../../../stores/local-echo/GenericEchoChamber"
|
||||||
import IconizedContextMenu, {
|
import IconizedContextMenu, {
|
||||||
IconizedContextMenuCheckbox,
|
IconizedContextMenuCheckbox,
|
||||||
IconizedContextMenuOption,
|
IconizedContextMenuOption,
|
||||||
IconizedContextMenuOptionList, IconizedContextMenuRadio
|
IconizedContextMenuOptionList,
|
||||||
|
IconizedContextMenuRadio,
|
||||||
} from "../context_menus/IconizedContextMenu";
|
} from "../context_menus/IconizedContextMenu";
|
||||||
|
import { CommunityPrototypeStore, IRoomProfile } from "../../../stores/CommunityPrototypeStore";
|
||||||
|
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
room: Room;
|
room: Room;
|
||||||
|
@ -101,6 +104,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
|
this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
|
||||||
this.roomProps = EchoChamber.forRoom(this.props.room);
|
this.roomProps = EchoChamber.forRoom(this.props.room);
|
||||||
this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
|
this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
|
||||||
|
CommunityPrototypeStore.instance.on(UPDATE_EVENT, this.onCommunityUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private onNotificationUpdate = () => {
|
private onNotificationUpdate = () => {
|
||||||
|
@ -140,6 +144,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
defaultDispatcher.unregister(this.dispatcherRef);
|
defaultDispatcher.unregister(this.dispatcherRef);
|
||||||
MessagePreviewStore.instance.off(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged);
|
MessagePreviewStore.instance.off(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged);
|
||||||
this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
|
this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
|
||||||
|
CommunityPrototypeStore.instance.off(UPDATE_EVENT, this.onCommunityUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private onAction = (payload: ActionPayload) => {
|
private onAction = (payload: ActionPayload) => {
|
||||||
|
@ -150,6 +155,11 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private onCommunityUpdate = (roomId: string) => {
|
||||||
|
if (roomId !== this.props.room.roomId) return;
|
||||||
|
this.forceUpdate(); // we don't have anything to actually update
|
||||||
|
};
|
||||||
|
|
||||||
private onRoomPreviewChanged = (room: Room) => {
|
private onRoomPreviewChanged = (room: Room) => {
|
||||||
if (this.props.room && room.roomId === this.props.room.roomId) {
|
if (this.props.room && room.roomId === this.props.room.roomId) {
|
||||||
// generatePreview() will return nothing if the user has previews disabled
|
// generatePreview() will return nothing if the user has previews disabled
|
||||||
|
@ -239,7 +249,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
removeTag,
|
removeTag,
|
||||||
addTag,
|
addTag,
|
||||||
undefined,
|
undefined,
|
||||||
0
|
0,
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
console.warn(`Unexpected tag ${tagId} applied to ${this.props.room.room_id}`);
|
console.warn(`Unexpected tag ${tagId} applied to ${this.props.room.room_id}`);
|
||||||
|
@ -461,11 +471,21 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
'mx_RoomTile_minimized': this.props.isMinimized,
|
'mx_RoomTile_minimized': this.props.isMinimized,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let roomProfile: IRoomProfile = {displayName: null, avatarMxc: null};
|
||||||
|
if (this.props.tag === DefaultTagID.Invite) {
|
||||||
|
roomProfile = CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId);
|
||||||
|
}
|
||||||
|
|
||||||
|
let name = roomProfile.displayName || this.props.room.name;
|
||||||
|
if (typeof name !== 'string') name = '';
|
||||||
|
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
|
||||||
|
|
||||||
const roomAvatar = <DecoratedRoomAvatar
|
const roomAvatar = <DecoratedRoomAvatar
|
||||||
room={this.props.room}
|
room={this.props.room}
|
||||||
avatarSize={32}
|
avatarSize={32}
|
||||||
tag={this.props.tag}
|
tag={this.props.tag}
|
||||||
displayBadge={this.props.isMinimized}
|
displayBadge={this.props.isMinimized}
|
||||||
|
oobData={({avatarUrl: roomProfile.avatarMxc})}
|
||||||
/>;
|
/>;
|
||||||
|
|
||||||
let badge: React.ReactNode;
|
let badge: React.ReactNode;
|
||||||
|
@ -482,10 +502,6 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = this.props.room.name;
|
|
||||||
if (typeof name !== 'string') name = '';
|
|
||||||
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
|
|
||||||
|
|
||||||
let messagePreview = null;
|
let messagePreview = null;
|
||||||
if (this.showMessagePreview && this.state.messagePreview) {
|
if (this.showMessagePreview && this.state.messagePreview) {
|
||||||
messagePreview = (
|
messagePreview = (
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2016 OpenMarket 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 createReactClass from 'create-react-class';
|
|
||||||
import * as sdk from '../../../index';
|
|
||||||
import { _t } from "../../../languageHandler";
|
|
||||||
|
|
||||||
export default createReactClass({
|
|
||||||
displayName: 'RoomTopicEditor',
|
|
||||||
|
|
||||||
propTypes: {
|
|
||||||
room: PropTypes.object.isRequired,
|
|
||||||
},
|
|
||||||
|
|
||||||
getInitialState: function() {
|
|
||||||
return {
|
|
||||||
topic: null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
componentDidMount: function() {
|
|
||||||
const room = this.props.room;
|
|
||||||
const topic = room.currentState.getStateEvents('m.room.topic', '');
|
|
||||||
this.setState({
|
|
||||||
topic: topic ? topic.getContent().topic : '',
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getTopic: function() {
|
|
||||||
return this.state.topic;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onValueChanged: function(value) {
|
|
||||||
this.setState({
|
|
||||||
topic: value,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function() {
|
|
||||||
const EditableText = sdk.getComponent("elements.EditableText");
|
|
||||||
|
|
||||||
return (
|
|
||||||
<EditableText
|
|
||||||
className="mx_RoomHeader_topic mx_RoomHeader_editable"
|
|
||||||
placeholderClassName="mx_RoomHeader_placeholder"
|
|
||||||
placeholder={_t("Add a topic")}
|
|
||||||
blurToCancel={false}
|
|
||||||
initialValue={this.state.topic}
|
|
||||||
onValueChanged={this._onValueChanged}
|
|
||||||
dir="auto" />
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
|
@ -19,9 +19,7 @@ import classNames from "classnames";
|
||||||
import {
|
import {
|
||||||
RovingAccessibleButton,
|
RovingAccessibleButton,
|
||||||
RovingAccessibleTooltipButton,
|
RovingAccessibleTooltipButton,
|
||||||
RovingTabIndexWrapper
|
|
||||||
} from "../../../accessibility/RovingTabIndex";
|
} from "../../../accessibility/RovingTabIndex";
|
||||||
import AccessibleButton from "../../views/elements/AccessibleButton";
|
|
||||||
import NotificationBadge from "./NotificationBadge";
|
import NotificationBadge from "./NotificationBadge";
|
||||||
import { NotificationState } from "../../../stores/notifications/NotificationState";
|
import { NotificationState } from "../../../stores/notifications/NotificationState";
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,7 @@ export default class CrossSigningPanel extends React.PureComponent {
|
||||||
const homeserverSupportsCrossSigning =
|
const homeserverSupportsCrossSigning =
|
||||||
await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing");
|
await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing");
|
||||||
const crossSigningReady = await cli.isCrossSigningReady();
|
const crossSigningReady = await cli.isCrossSigningReady();
|
||||||
|
const secretStorageReady = await cli.isSecretStorageReady();
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
crossSigningPublicKeysOnDevice,
|
crossSigningPublicKeysOnDevice,
|
||||||
|
@ -101,6 +102,7 @@ export default class CrossSigningPanel extends React.PureComponent {
|
||||||
secretStorageKeyInAccount,
|
secretStorageKeyInAccount,
|
||||||
homeserverSupportsCrossSigning,
|
homeserverSupportsCrossSigning,
|
||||||
crossSigningReady,
|
crossSigningReady,
|
||||||
|
secretStorageReady,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,6 +153,7 @@ export default class CrossSigningPanel extends React.PureComponent {
|
||||||
secretStorageKeyInAccount,
|
secretStorageKeyInAccount,
|
||||||
homeserverSupportsCrossSigning,
|
homeserverSupportsCrossSigning,
|
||||||
crossSigningReady,
|
crossSigningReady,
|
||||||
|
secretStorageReady,
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
let errorSection;
|
let errorSection;
|
||||||
|
@ -166,14 +169,19 @@ export default class CrossSigningPanel extends React.PureComponent {
|
||||||
summarisedStatus = <p>{_t(
|
summarisedStatus = <p>{_t(
|
||||||
"Your homeserver does not support cross-signing.",
|
"Your homeserver does not support cross-signing.",
|
||||||
)}</p>;
|
)}</p>;
|
||||||
} else if (crossSigningReady) {
|
} else if (crossSigningReady && secretStorageReady) {
|
||||||
summarisedStatus = <p>✅ {_t(
|
summarisedStatus = <p>✅ {_t(
|
||||||
"Cross-signing and secret storage are enabled.",
|
"Cross-signing and secret storage are ready for use.",
|
||||||
|
)}</p>;
|
||||||
|
} else if (crossSigningReady && !secretStorageReady) {
|
||||||
|
summarisedStatus = <p>✅ {_t(
|
||||||
|
"Cross-signing is ready for use, but secret storage is " +
|
||||||
|
"currently not being used to backup your keys.",
|
||||||
)}</p>;
|
)}</p>;
|
||||||
} else if (crossSigningPrivateKeysInStorage) {
|
} else if (crossSigningPrivateKeysInStorage) {
|
||||||
summarisedStatus = <p>{_t(
|
summarisedStatus = <p>{_t(
|
||||||
"Your account has a cross-signing identity in secret storage, but it " +
|
"Your account has a cross-signing identity in secret storage, " +
|
||||||
"is not yet trusted by this session.",
|
"but it is not yet trusted by this session.",
|
||||||
)}</p>;
|
)}</p>;
|
||||||
} else {
|
} else {
|
||||||
summarisedStatus = <p>{_t(
|
summarisedStatus = <p>{_t(
|
||||||
|
|
|
@ -21,6 +21,7 @@ import * as sdk from '../../../index';
|
||||||
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
import Modal from '../../../Modal';
|
import Modal from '../../../Modal';
|
||||||
|
import { isSecureBackupRequired } from '../../../utils/WellKnownUtils';
|
||||||
|
|
||||||
export default class KeyBackupPanel extends React.PureComponent {
|
export default class KeyBackupPanel extends React.PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -315,14 +316,19 @@ export default class KeyBackupPanel extends React.PureComponent {
|
||||||
trustedLocally = _t("This backup is trusted because it has been restored on this session");
|
trustedLocally = _t("This backup is trusted because it has been restored on this session");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let deleteBackupButton;
|
||||||
|
if (!isSecureBackupRequired()) {
|
||||||
|
deleteBackupButton = <AccessibleButton kind="danger" onClick={this._deleteBackup}>
|
||||||
|
{_t("Delete Backup")}
|
||||||
|
</AccessibleButton>;
|
||||||
|
}
|
||||||
|
|
||||||
const buttonRow = (
|
const buttonRow = (
|
||||||
<div className="mx_KeyBackupPanel_buttonRow">
|
<div className="mx_KeyBackupPanel_buttonRow">
|
||||||
<AccessibleButton kind="primary" onClick={this._restoreBackup}>
|
<AccessibleButton kind="primary" onClick={this._restoreBackup}>
|
||||||
{restoreButtonCaption}
|
{restoreButtonCaption}
|
||||||
</AccessibleButton>
|
</AccessibleButton>
|
||||||
<AccessibleButton kind="danger" onClick={this._deleteBackup}>
|
{deleteBackupButton}
|
||||||
{_t("Delete Backup")}
|
|
||||||
</AccessibleButton>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ function getStatusText(status: UpdateCheckStatus, errorDetail?: string) {
|
||||||
return _t('Downloading update...');
|
return _t('Downloading update...');
|
||||||
case UpdateCheckStatus.Ready:
|
case UpdateCheckStatus.Ready:
|
||||||
return _t("New version available. <a>Update now.</a>", {}, {
|
return _t("New version available. <a>Update now.</a>", {}, {
|
||||||
a: sub => <AccessibleButton kind="link" onClick={installUpdate}>{sub}</AccessibleButton>
|
a: sub => <AccessibleButton kind="link" onClick={installUpdate}>{sub}</AccessibleButton>,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,7 +170,7 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I
|
||||||
"baseFontSize",
|
"baseFontSize",
|
||||||
null,
|
null,
|
||||||
SettingLevel.DEVICE,
|
SettingLevel.DEVICE,
|
||||||
parseInt(value, 10) - FontWatcher.SIZE_DIFF
|
parseInt(value, 10) - FontWatcher.SIZE_DIFF,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {valid: true, feedback: _t('Use between %(min)s pt and %(max)s pt', {min, max})};
|
return {valid: true, feedback: _t('Use between %(min)s pt and %(max)s pt', {min, max})};
|
||||||
|
|
|
@ -29,7 +29,15 @@ interface IProps extends IGenericToastProps {
|
||||||
|
|
||||||
const SECOND = 1000;
|
const SECOND = 1000;
|
||||||
|
|
||||||
const GenericExpiringToast: React.FC<IProps> = ({description, acceptLabel, dismissLabel, onAccept, onDismiss, toastKey, numSeconds}) => {
|
const GenericExpiringToast: React.FC<IProps> = ({
|
||||||
|
description,
|
||||||
|
acceptLabel,
|
||||||
|
dismissLabel,
|
||||||
|
onAccept,
|
||||||
|
onDismiss,
|
||||||
|
toastKey,
|
||||||
|
numSeconds,
|
||||||
|
}) => {
|
||||||
const onReject = () => {
|
const onReject = () => {
|
||||||
if (onDismiss) onDismiss();
|
if (onDismiss) onDismiss();
|
||||||
ToastStore.sharedInstance().dismissToast(toastKey);
|
ToastStore.sharedInstance().dismissToast(toastKey);
|
||||||
|
|
|
@ -31,7 +31,13 @@ interface IPropsExtended extends IProps {
|
||||||
onReject();
|
onReject();
|
||||||
}
|
}
|
||||||
|
|
||||||
const GenericToast: React.FC<XOR<IPropsExtended, IProps>> = ({description, acceptLabel, rejectLabel, onAccept, onReject}) => {
|
const GenericToast: React.FC<XOR<IPropsExtended, IProps>> = ({
|
||||||
|
description,
|
||||||
|
acceptLabel,
|
||||||
|
rejectLabel,
|
||||||
|
onAccept,
|
||||||
|
onReject,
|
||||||
|
}) => {
|
||||||
return <div>
|
return <div>
|
||||||
<div className="mx_Toast_description">
|
<div className="mx_Toast_description">
|
||||||
{ description }
|
{ description }
|
||||||
|
|
|
@ -97,10 +97,7 @@ export default class CallView extends React.Component<IProps, IState> {
|
||||||
if (this.props.room) {
|
if (this.props.room) {
|
||||||
const roomId = this.props.room.roomId;
|
const roomId = this.props.room.roomId;
|
||||||
call = CallHandler.getCallForRoom(roomId) ||
|
call = CallHandler.getCallForRoom(roomId) ||
|
||||||
(this.props.ConferenceHandler ?
|
(this.props.ConferenceHandler ? this.props.ConferenceHandler.getConferenceCallForRoom(roomId) : null);
|
||||||
this.props.ConferenceHandler.getConferenceCallForRoom(roomId) :
|
|
||||||
null
|
|
||||||
);
|
|
||||||
|
|
||||||
if (this.call) {
|
if (this.call) {
|
||||||
this.setState({ call: call });
|
this.setState({ call: call });
|
||||||
|
|
|
@ -51,7 +51,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
|
||||||
|
|
||||||
private onAction = (payload: ActionPayload) => {
|
private onAction = (payload: ActionPayload) => {
|
||||||
switch (payload.action) {
|
switch (payload.action) {
|
||||||
case 'call_state':
|
case 'call_state': {
|
||||||
const call = CallHandler.getCall(payload.room_id);
|
const call = CallHandler.getCall(payload.room_id);
|
||||||
if (call && call.call_state === 'ringing') {
|
if (call && call.call_state === 'ringing') {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -63,6 +63,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private onAnswerClick: React.MouseEventHandler = (e) => {
|
private onAnswerClick: React.MouseEventHandler = (e) => {
|
||||||
|
|
|
@ -26,8 +26,8 @@ import dis from "./dispatcher/dispatcher";
|
||||||
import * as Rooms from "./Rooms";
|
import * as Rooms from "./Rooms";
|
||||||
import DMRoomMap from "./utils/DMRoomMap";
|
import DMRoomMap from "./utils/DMRoomMap";
|
||||||
import {getAddressType} from "./UserAddress";
|
import {getAddressType} from "./UserAddress";
|
||||||
|
import { getE2EEWellKnown } from "./utils/WellKnownUtils";
|
||||||
const E2EE_WK_KEY = "im.vector.riot.e2ee";
|
import GroupStore from "./stores/GroupStore";
|
||||||
|
|
||||||
// we define a number of interfaces which take their names from the js-sdk
|
// we define a number of interfaces which take their names from the js-sdk
|
||||||
/* eslint-disable camelcase */
|
/* eslint-disable camelcase */
|
||||||
|
@ -80,6 +80,7 @@ interface IOpts {
|
||||||
encryption?: boolean;
|
encryption?: boolean;
|
||||||
inlineErrors?: boolean;
|
inlineErrors?: boolean;
|
||||||
andView?: boolean;
|
andView?: boolean;
|
||||||
|
associatedWithCommunity?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -182,6 +183,10 @@ export default function createRoom(opts: IOpts): Promise<string | null> {
|
||||||
} else {
|
} else {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
}).then(() => {
|
||||||
|
if (opts.associatedWithCommunity) {
|
||||||
|
return GroupStore.addRoomToGroup(opts.associatedWithCommunity, roomId, false);
|
||||||
|
}
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
// NB createRoom doesn't block on the client seeing the echo that the
|
// NB createRoom doesn't block on the client seeing the echo that the
|
||||||
// room has been created, so we race here with the client knowing that
|
// room has been created, so we race here with the client knowing that
|
||||||
|
@ -294,12 +299,11 @@ export async function ensureDMExists(client: MatrixClient, userId: string): Prom
|
||||||
return roomId;
|
return roomId;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function privateShouldBeEncrypted() {
|
export function privateShouldBeEncrypted(): boolean {
|
||||||
const clientWellKnown = MatrixClientPeg.get().getClientWellKnown();
|
const e2eeWellKnown = getE2EEWellKnown();
|
||||||
if (clientWellKnown && clientWellKnown[E2EE_WK_KEY]) {
|
if (e2eeWellKnown) {
|
||||||
const defaultDisabled = clientWellKnown[E2EE_WK_KEY]["default"] === false;
|
const defaultDisabled = e2eeWellKnown["default"] === false;
|
||||||
return !defaultDisabled;
|
return !defaultDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2164,5 +2164,54 @@
|
||||||
"Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, <code>@bot:*</code> would ignore all users that have the name 'bot' on any server.": "Sem přídejte servery a uživatele, které chcete ignorovat. Hvězdička pro %(brand)s zastupuje libovolný počet kterýchkoliv znaků. Např. <code>@bot:*</code> bude ignorovat všechny uživatele se jménem „bot“ na kterémkoliv serveru.",
|
"Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, <code>@bot:*</code> would ignore all users that have the name 'bot' on any server.": "Sem přídejte servery a uživatele, které chcete ignorovat. Hvězdička pro %(brand)s zastupuje libovolný počet kterýchkoliv znaků. Např. <code>@bot:*</code> bude ignorovat všechny uživatele se jménem „bot“ na kterémkoliv serveru.",
|
||||||
"Signature upload success": "Podpis úspěšně nahrán",
|
"Signature upload success": "Podpis úspěšně nahrán",
|
||||||
"Signature upload failed": "Podpis se nepodařilo nahrát",
|
"Signature upload failed": "Podpis se nepodařilo nahrát",
|
||||||
"If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Je-li jiná verze programu %(brand)s stále otevřená na jiné kartě, tak ji prosím zavřete, neboť užívání programu %(brand)s stejným hostitelem se zpožděným nahráváním současně povoleným i zakázaným bude působit problémy."
|
"If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Je-li jiná verze programu %(brand)s stále otevřená na jiné kartě, tak ji prosím zavřete, neboť užívání programu %(brand)s stejným hostitelem se zpožděným nahráváním současně povoleným i zakázaným bude působit problémy.",
|
||||||
|
"Unexpected server error trying to leave the room": "Neočekávaná chyba serveru při odcházení z místnosti",
|
||||||
|
"The person who invited you already left the room.": "Uživatel který vás pozval už místnosti není.",
|
||||||
|
"The person who invited you already left the room, or their server is offline.": "Uživatel který vás pozvat už odešel z místnosti a nebo je jeho server offline.",
|
||||||
|
"You left the call": "Odešli jste z hovoru",
|
||||||
|
"%(senderName)s left the call": "%(senderName)s opustil/a hovor",
|
||||||
|
"Call ended": "Hovor skončil",
|
||||||
|
"You started a call": "Začali jste hovor",
|
||||||
|
"%(senderName)s started a call": "%(senderName)s začal/a hovor",
|
||||||
|
"Waiting for answer": "Čekání na odpověď",
|
||||||
|
"%(senderName)s is calling": "%(senderName)s volá",
|
||||||
|
"* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s",
|
||||||
|
"%(senderName)s: %(message)s": "%(senderName)s: %(message)s",
|
||||||
|
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
|
||||||
|
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
|
||||||
|
"Change notification settings": "Upravit nastavení oznámení",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototyp komunit verze 2. Vyžaduje kompatibilní domovský server. Experimentální - používejte opatrně.",
|
||||||
|
"Use custom size": "Použít vlastní velikost",
|
||||||
|
"Use a more compact ‘Modern’ layout": "Používat kompaktní ‘Moderní’ vzhled",
|
||||||
|
"Use a system font": "Používat systémové nastavení písma",
|
||||||
|
"System font name": "Jméno systémového písma",
|
||||||
|
"Uploading logs": "Nahrávání záznamů",
|
||||||
|
"Downloading logs": "Stahování záznamů",
|
||||||
|
"Unknown caller": "Neznámý volající",
|
||||||
|
"Incoming voice call": "Příchozí hovor",
|
||||||
|
"Incoming video call": "Příchozí videohovor",
|
||||||
|
"Incoming call": "Příchozí hovor",
|
||||||
|
"Your server isn't responding to some <a>requests</a>.": "Váš server neodpovídá na některé <a>požadavky</a>.",
|
||||||
|
"Master private key:": "Hlavní soukromý klíč:",
|
||||||
|
"%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use <desktopLink>%(brand)s Desktop</desktopLink> for encrypted messages to appear in search results.": "%(brand)s nemůže v prohlížeči lokálně bezpečně uložit zprávy. Použijte <desktopLink>%(brand)s Desktop</desktopLink> aby fungovalo vyhledávání v šifrovaných zprávách.",
|
||||||
|
"Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Váš administrátor vypnul šifrování ve výchozím nastavení soukromých místností a přímých chatů.",
|
||||||
|
"To link to this room, please add an address.": "Přidejte prosím místnosti adresu aby na ní šlo odkazovat.",
|
||||||
|
"The authenticity of this encrypted message can't be guaranteed on this device.": "Pravost této šifrované zprávy nelze na tomto zařízení ověřit.",
|
||||||
|
"Emoji picker": "Výběr emoji",
|
||||||
|
"No recently visited rooms": "Žádné nedávno navštívené místnosti",
|
||||||
|
"People": "Lidé",
|
||||||
|
"Explore public rooms": "Prozkoumat veřejné místnosti",
|
||||||
|
"Custom Tag": "Vlastní štítek",
|
||||||
|
"Can't see what you’re looking for?": "Nikde nevidíte co hledáte?",
|
||||||
|
"Explore all public rooms": "Prozkoumat všechny veřejné místnosti",
|
||||||
|
"%(count)s results|other": "%(count)s výsledků",
|
||||||
|
"Preparing to download logs": "Příprava na stažení záznamů",
|
||||||
|
"Download logs": "Stáhnout záznamy",
|
||||||
|
"a new cross-signing key signature": "nový podpis klíče pro cross-signing",
|
||||||
|
"a key signature": "podpis klíče",
|
||||||
|
"%(brand)s encountered an error during upload of:": "%(brand)s narazil na chybu při nahrávání:",
|
||||||
|
"Upload completed": "Nahrávání dokončeno",
|
||||||
|
"Cancelled signature upload": "Nahrávání podpisu zrušeno",
|
||||||
|
"Unable to upload": "Nelze nahrát",
|
||||||
|
"Server isn't responding": "Server neodpovídá"
|
||||||
}
|
}
|
||||||
|
|
|
@ -572,7 +572,7 @@
|
||||||
"was unbanned %(count)s times|one": "wurde entbannt",
|
"was unbanned %(count)s times|one": "wurde entbannt",
|
||||||
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)shat den Namen geändert",
|
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)shat den Namen geändert",
|
||||||
"%(items)s and %(count)s others|other": "%(items)s und %(count)s andere",
|
"%(items)s and %(count)s others|other": "%(items)s und %(count)s andere",
|
||||||
"%(items)s and %(count)s others|one": "%(items)s und noch jemand",
|
"%(items)s and %(count)s others|one": "%(items)s und ein weiteres Raummitglied",
|
||||||
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Eine E-Mail wurde an %(emailAddress)s gesendet. Folge dem in der E-Mail enthaltenen Link und klicke dann unten.",
|
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Eine E-Mail wurde an %(emailAddress)s gesendet. Folge dem in der E-Mail enthaltenen Link und klicke dann unten.",
|
||||||
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.",
|
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.",
|
||||||
"Visibility in Room List": "Sichtbarkeit in Raum-Liste",
|
"Visibility in Room List": "Sichtbarkeit in Raum-Liste",
|
||||||
|
@ -1034,7 +1034,7 @@
|
||||||
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s hat den Raum auf eingeladene User beschränkt.",
|
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s hat den Raum auf eingeladene User beschränkt.",
|
||||||
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s änderte die Zutrittsregel auf '%(rule)s'",
|
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s änderte die Zutrittsregel auf '%(rule)s'",
|
||||||
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.",
|
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.",
|
||||||
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat verboten, dass Gäste diesem Raum beitreten.",
|
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat Gästen verboten diesem Raum beizutreten.",
|
||||||
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s änderte den Gastzugriff auf '%(rule)s'",
|
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s änderte den Gastzugriff auf '%(rule)s'",
|
||||||
"Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere & filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)",
|
"Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere & filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)",
|
||||||
"Unable to find a supported verification method.": "Konnte kein unterstützte Verifikationsmethode finden.",
|
"Unable to find a supported verification method.": "Konnte kein unterstützte Verifikationsmethode finden.",
|
||||||
|
@ -1328,7 +1328,7 @@
|
||||||
"Find a room…": "Suche einen Raum…",
|
"Find a room…": "Suche einen Raum…",
|
||||||
"Find a room… (e.g. %(exampleRoom)s)": "Suche einen Raum… (z.B. %(exampleRoom)s)",
|
"Find a room… (e.g. %(exampleRoom)s)": "Suche einen Raum… (z.B. %(exampleRoom)s)",
|
||||||
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder <a>Erstelle einen neuen Raum</a>.",
|
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder <a>Erstelle einen neuen Raum</a>.",
|
||||||
"Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter <code>turn.matrix.org</code> zu verwenden. Allerdings wird dieser nicht so zuverlässig sein, und deine IP-Adresse mit diesem teilen. Du kannst dies auch in den Einstellungen konfigurieren.",
|
"Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter <code>turn.matrix.org</code> zu verwenden. Allerdings wird dieser nicht so zuverlässig sein, und deine IP-Adresse mit diesem Server teilen. Du kannst dies auch in den Einstellungen konfigurieren.",
|
||||||
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver <server /> zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.",
|
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver <server /> zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.",
|
||||||
"Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Inhaber*innen des Servers vertraust.",
|
"Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Inhaber*innen des Servers vertraust.",
|
||||||
"Trust": "Vertrauen",
|
"Trust": "Vertrauen",
|
||||||
|
@ -1337,7 +1337,7 @@
|
||||||
"Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.",
|
"Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.",
|
||||||
"%(name)s (%(userId)s)": "%(name)s (%(userId)s)",
|
"%(name)s (%(userId)s)": "%(name)s (%(userId)s)",
|
||||||
"Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)",
|
"Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)",
|
||||||
"Send read receipts for messages (requires compatible homeserver to disable)": "Schicke Lesebestätigungen für Nachrichten (erfordert kompatiblen Heimserver zum Deaktivieren)",
|
"Send read receipts for messages (requires compatible homeserver to disable)": "Lesebestätigungen für Nachrichten senden (Deaktivieren erfordert einen kompatiblen Heimserver)",
|
||||||
"My Ban List": "Meine Bannliste",
|
"My Ban List": "Meine Bannliste",
|
||||||
"This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!",
|
"This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!",
|
||||||
"Accept <policyLink /> to continue:": "Akzeptiere <policyLink />, um fortzufahren:",
|
"Accept <policyLink /> to continue:": "Akzeptiere <policyLink />, um fortzufahren:",
|
||||||
|
@ -1587,8 +1587,8 @@
|
||||||
"Reject & Ignore user": "Ablehnen & Nutzer ignorieren",
|
"Reject & Ignore user": "Ablehnen & Nutzer ignorieren",
|
||||||
"%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s",
|
"%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s",
|
||||||
"%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s",
|
"%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s",
|
||||||
"Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Erlaube den Standard-Server zur Anrufunterstützung (turn.matrix.org) zu verwenden wenn dein Heimserver keinen eigenen anbietet (deine IP Adresse wird bei dem Anruf übermittelt)",
|
"Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (deine IP-Adresse wird während eines Anrufs geteilt)",
|
||||||
"Show more": "mehr",
|
"Show more": "Mehr zeigen",
|
||||||
"This session is <b>not backing up your keys</b>, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung <b>speichert deine Schlüssel nicht</b>, du kannst sie aber an die Schlüsselsicherung anschließen.",
|
"This session is <b>not backing up your keys</b>, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung <b>speichert deine Schlüssel nicht</b>, du kannst sie aber an die Schlüsselsicherung anschließen.",
|
||||||
"Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.",
|
"Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.",
|
||||||
"This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde",
|
"This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde",
|
||||||
|
@ -1633,11 +1633,11 @@
|
||||||
"Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren",
|
"Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren",
|
||||||
"Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen",
|
"Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen",
|
||||||
"Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteteten Räumen über der Raumliste anzeigen",
|
"Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteteten Räumen über der Raumliste anzeigen",
|
||||||
"Use Single Sign On to continue": "Nutze „Single Sign-On“ (Einmal-Anmeldung) um fortzufahren",
|
"Use Single Sign On to continue": "Verwende Single Sign on um fortzufahren",
|
||||||
"Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser E-Mail-Adresse mit „Single Sign-On“, um deine Identität nachzuweisen.",
|
"Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single Sign-On, um deine Identität nachzuweisen.",
|
||||||
"Single Sign On": "Single Sign-On",
|
"Single Sign On": "Single Sign-On",
|
||||||
"Confirm adding email": "Hinzufügen der E-Mail-Adresse bestätigen",
|
"Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse",
|
||||||
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnummer, indem du deine Identität mittels „Single Sign-On“ nachweist.",
|
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels Single Sign-On nachweist.",
|
||||||
"Click the button below to confirm adding this phone number.": "Klicke unten die Schaltfläche, um die hinzugefügte Telefonnummer zu bestätigen.",
|
"Click the button below to confirm adding this phone number.": "Klicke unten die Schaltfläche, um die hinzugefügte Telefonnummer zu bestätigen.",
|
||||||
"If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.",
|
"If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.",
|
||||||
"%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an",
|
"%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an",
|
||||||
|
@ -1645,14 +1645,14 @@
|
||||||
"Command failed": "Befehl fehlgeschlagen",
|
"Command failed": "Befehl fehlgeschlagen",
|
||||||
"Could not find user in room": "Der Benutzer konnte im Raum nicht gefunden werden",
|
"Could not find user in room": "Der Benutzer konnte im Raum nicht gefunden werden",
|
||||||
"Click the button below to confirm adding this email address.": "Klicke unten auf die Schaltfläche, um die hinzugefügte E-Mail-Adresse zu bestätigen.",
|
"Click the button below to confirm adding this email address.": "Klicke unten auf die Schaltfläche, um die hinzugefügte E-Mail-Adresse zu bestätigen.",
|
||||||
"Confirm adding phone number": "Hinzufügen der Telefonnummer bestätigen",
|
"Confirm adding phone number": "Bestätige hinzugefügte Telefonnummer",
|
||||||
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
|
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
|
||||||
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erneuert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
|
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erneuert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
|
||||||
"Not Trusted": "Nicht vertraut",
|
"Not Trusted": "Nicht vertraut",
|
||||||
"Manually Verify by Text": "Verifiziere manuell mit einem Text",
|
"Manually Verify by Text": "Verifiziere manuell mit einem Text",
|
||||||
"Interactively verify by Emoji": "Verifiziere interaktiv mit Emojis",
|
"Interactively verify by Emoji": "Verifiziere interaktiv mit Emojis",
|
||||||
"Support adding custom themes": "Unterstütze das Hinzufügen von benutzerdefinierten Designs",
|
"Support adding custom themes": "Unterstütze das Hinzufügen von benutzerdefinierten Designs",
|
||||||
"Ask this user to verify their session, or manually verify it below.": "Bitte diese/n Nutzer!n, seine/ihre Sitzung zu verifizieren, oder verifiziere diese unten manuell.",
|
"Ask this user to verify their session, or manually verify it below.": "Bitte diesen Nutzer, seine Sitzung zu verifizieren, oder verifiziere diesen unten manuell.",
|
||||||
"a few seconds from now": "in ein paar Sekunden",
|
"a few seconds from now": "in ein paar Sekunden",
|
||||||
"Manually verify all remote sessions": "Verifiziere alle Remotesitzungen",
|
"Manually verify all remote sessions": "Verifiziere alle Remotesitzungen",
|
||||||
"Confirm the emoji below are displayed on both sessions, in the same order:": "Bestätige, dass die unten angezeigten Emojis auf beiden Sitzungen in der selben Reihenfolge angezeigt werden:",
|
"Confirm the emoji below are displayed on both sessions, in the same order:": "Bestätige, dass die unten angezeigten Emojis auf beiden Sitzungen in der selben Reihenfolge angezeigt werden:",
|
||||||
|
@ -1724,7 +1724,7 @@
|
||||||
"Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion",
|
"Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion",
|
||||||
"this room": "Dieser Raum",
|
"this room": "Dieser Raum",
|
||||||
"View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.",
|
"View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.",
|
||||||
"Send a bug report with logs": "Sende Fehlermeldung mit Protokoll",
|
"Send a bug report with logs": "Sende einen Fehlerbericht mit Logs",
|
||||||
"Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen",
|
"Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen",
|
||||||
"Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.",
|
"Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.",
|
||||||
"You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:",
|
"You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:",
|
||||||
|
@ -1732,16 +1732,16 @@
|
||||||
"Upgrade": "Hochstufen",
|
"Upgrade": "Hochstufen",
|
||||||
"Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s",
|
"Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s",
|
||||||
"From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)",
|
"From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)",
|
||||||
"Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt cross-signing nicht.",
|
"Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt Cross-Signing nicht.",
|
||||||
"Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.",
|
"Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.",
|
||||||
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine cross-signing Identität im sicheren Speicher aber diese Sitzung wird noch nicht vertraut.",
|
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Cross-Signing Identität im sicheren Speicher, aber dieser wird von dieser Sitzung noch nicht vertraut.",
|
||||||
"Cross-signing and secret storage are not yet set up.": "Cross-signing und der sichere Speicher wurden noch nicht eingerichtet.",
|
"Cross-signing and secret storage are not yet set up.": "Cross-Signing und der sichere Speicher sind noch nicht eingerichtet.",
|
||||||
"Reset cross-signing and secret storage": "Setze cross-signing und den sicheren Speicher zurück",
|
"Reset cross-signing and secret storage": "Setze Cross-Signing und den sicheren Speicher zurück",
|
||||||
"Bootstrap cross-signing and secret storage": "Richte cross-signing und den sicheren Speicher ein",
|
"Bootstrap cross-signing and secret storage": "Richte cross-signing und den sicheren Speicher ein",
|
||||||
"unexpected type": "unbekannter Typ",
|
"unexpected type": "unbekannter Typ",
|
||||||
"Cross-signing public keys:": "Öffentliche Cross-signing Schlüssel:",
|
"Cross-signing public keys:": "Öffentliche Cross-Signing-Schlüssel:",
|
||||||
"in memory": "im Speicher",
|
"in memory": "im Speicher",
|
||||||
"Cross-signing private keys:": "Private Cross-signing Schlüssel:",
|
"Cross-signing private keys:": "Private Cross-Signing-Schlüssel:",
|
||||||
"in secret storage": "im sicheren Speicher",
|
"in secret storage": "im sicheren Speicher",
|
||||||
"Self signing private key:": "Selbst signierter privater Schlüssel:",
|
"Self signing private key:": "Selbst signierter privater Schlüssel:",
|
||||||
"cached locally": "lokal zwischengespeichert",
|
"cached locally": "lokal zwischengespeichert",
|
||||||
|
@ -1754,7 +1754,7 @@
|
||||||
"exists": "existiert",
|
"exists": "existiert",
|
||||||
"Delete sessions|other": "Lösche Sitzungen",
|
"Delete sessions|other": "Lösche Sitzungen",
|
||||||
"Delete sessions|one": "Lösche Sitzung",
|
"Delete sessions|one": "Lösche Sitzung",
|
||||||
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Sitzungen eines Benutzers einzeln verifizieren. Geräten, die ein Benutzer als vertrauenswürdig markiert hat, wird nicht automatisch vertraut (cross-signing).",
|
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Cross-Signing verifiziert sind.",
|
||||||
"Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ",
|
"Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ",
|
||||||
" to store messages from ": " um Nachrichten aus ",
|
" to store messages from ": " um Nachrichten aus ",
|
||||||
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with <nativeLink>search components added</nativeLink>.": "%(brand)s benötigt weitere Komponenten um verschlüsselte Nachrichten lokal zu durchsuchen. Wenn du diese Funktion testen möchtest kannst du dir deine eigene Version von %(brand)s Desktop mit der <nativeLink>integrierten Suchfunktion bauen</nativeLink>.",
|
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with <nativeLink>search components added</nativeLink>.": "%(brand)s benötigt weitere Komponenten um verschlüsselte Nachrichten lokal zu durchsuchen. Wenn du diese Funktion testen möchtest kannst du dir deine eigene Version von %(brand)s Desktop mit der <nativeLink>integrierten Suchfunktion bauen</nativeLink>.",
|
||||||
|
@ -2408,5 +2408,20 @@
|
||||||
"Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Bewahre deinen Sicherheitsschlüssel an einem sicheren Ort wie z. B. in einem Passwort-Manager oder einem Safe auf. Er wird zum Schutz deiner verschlüsselten Daten verwendet.",
|
"Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Bewahre deinen Sicherheitsschlüssel an einem sicheren Ort wie z. B. in einem Passwort-Manager oder einem Safe auf. Er wird zum Schutz deiner verschlüsselten Daten verwendet.",
|
||||||
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Wenn du jetzt abbrichst, kannst du verschlüsselte Nachrichten und Daten verlieren, wenn du den Zugriff auf deine Logins verlierst.",
|
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Wenn du jetzt abbrichst, kannst du verschlüsselte Nachrichten und Daten verlieren, wenn du den Zugriff auf deine Logins verlierst.",
|
||||||
"You can also set up Secure Backup & manage your keys in Settings.": "Du kannst auch in den Einstellungen eine Sicherung erstellen & deine Schlüssel verwalten.",
|
"You can also set up Secure Backup & manage your keys in Settings.": "Du kannst auch in den Einstellungen eine Sicherung erstellen & deine Schlüssel verwalten.",
|
||||||
"Set up Secure backup": "Sicheres Backup einrichten"
|
"Set up Secure backup": "Sicheres Backup einrichten",
|
||||||
|
"Show message previews for reactions in DMs": "Anzeigen einer Nachrichtenvorschau für Reaktionen in DMs",
|
||||||
|
"Show message previews for reactions in all rooms": "Zeigen Sie eine Nachrichtenvorschau für Reaktionen in allen Räumen an",
|
||||||
|
"Uploading logs": "Protokolle werden hochgeladen",
|
||||||
|
"Downloading logs": "Protokolle werden heruntergeladen",
|
||||||
|
"Explore public rooms": "Erkunde öffentliche Räume",
|
||||||
|
"Can't see what you’re looking for?": "Kannst du nicht finden wonach du suchst?",
|
||||||
|
"Explore all public rooms": "Erkunde alle öffentlichen Räume",
|
||||||
|
"%(count)s results|other": "%(count)s Ergebnisse",
|
||||||
|
"Preparing to download logs": "Bereite das Herunterladen der Protokolle vor",
|
||||||
|
"Download logs": "Protokolle herunterladen",
|
||||||
|
"Unexpected server error trying to leave the room": "Unerwarteter Server-Fehler beim Versuch den Raum zu verlassen",
|
||||||
|
"Error leaving room": "Fehler beim Verlassen des Raums",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 Prototyp. Benötigt einen kompatiblen Heimserver. Höchst experimentell - mit Vorsicht verwenden.",
|
||||||
|
"Explore rooms in %(communityName)s": "Erkunde Räume in %(communityName)s",
|
||||||
|
"Set up Secure Backup": "Sicherung einrichten"
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,6 +444,7 @@
|
||||||
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
|
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
|
||||||
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
|
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
|
||||||
"Change notification settings": "Change notification settings",
|
"Change notification settings": "Change notification settings",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.",
|
||||||
"New spinner design": "New spinner design",
|
"New spinner design": "New spinner design",
|
||||||
"Message Pinning": "Message Pinning",
|
"Message Pinning": "Message Pinning",
|
||||||
"Custom user status messages": "Custom user status messages",
|
"Custom user status messages": "Custom user status messages",
|
||||||
|
@ -644,7 +645,8 @@
|
||||||
"Confirm password": "Confirm password",
|
"Confirm password": "Confirm password",
|
||||||
"Change Password": "Change Password",
|
"Change Password": "Change Password",
|
||||||
"Your homeserver does not support cross-signing.": "Your homeserver does not support cross-signing.",
|
"Your homeserver does not support cross-signing.": "Your homeserver does not support cross-signing.",
|
||||||
"Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.",
|
"Cross-signing and secret storage are ready for use.": "Cross-signing and secret storage are ready for use.",
|
||||||
|
"Cross-signing is ready for use, but secret storage is currently not being used to backup your keys.": "Cross-signing is ready for use, but secret storage is currently not being used to backup your keys.",
|
||||||
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.",
|
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.",
|
||||||
"Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.",
|
"Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.",
|
||||||
"Reset cross-signing and secret storage": "Reset cross-signing and secret storage",
|
"Reset cross-signing and secret storage": "Reset cross-signing and secret storage",
|
||||||
|
@ -1120,6 +1122,7 @@
|
||||||
"Rooms": "Rooms",
|
"Rooms": "Rooms",
|
||||||
"Add room": "Add room",
|
"Add room": "Add room",
|
||||||
"Create new room": "Create new room",
|
"Create new room": "Create new room",
|
||||||
|
"Explore community rooms": "Explore community rooms",
|
||||||
"Explore public rooms": "Explore public rooms",
|
"Explore public rooms": "Explore public rooms",
|
||||||
"Low priority": "Low priority",
|
"Low priority": "Low priority",
|
||||||
"System Alerts": "System Alerts",
|
"System Alerts": "System Alerts",
|
||||||
|
@ -1197,7 +1200,6 @@
|
||||||
"%(count)s unread messages.|other": "%(count)s unread messages.",
|
"%(count)s unread messages.|other": "%(count)s unread messages.",
|
||||||
"%(count)s unread messages.|one": "1 unread message.",
|
"%(count)s unread messages.|one": "1 unread message.",
|
||||||
"Unread messages.": "Unread messages.",
|
"Unread messages.": "Unread messages.",
|
||||||
"Add a topic": "Add a topic",
|
|
||||||
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.",
|
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.",
|
||||||
"This room has already been upgraded.": "This room has already been upgraded.",
|
"This room has already been upgraded.": "This room has already been upgraded.",
|
||||||
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.",
|
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.",
|
||||||
|
@ -1483,6 +1485,7 @@
|
||||||
"Rotate Right": "Rotate Right",
|
"Rotate Right": "Rotate Right",
|
||||||
"Rotate clockwise": "Rotate clockwise",
|
"Rotate clockwise": "Rotate clockwise",
|
||||||
"Download this file": "Download this file",
|
"Download this file": "Download this file",
|
||||||
|
"Information": "Information",
|
||||||
"Language Dropdown": "Language Dropdown",
|
"Language Dropdown": "Language Dropdown",
|
||||||
"Manage Integrations": "Manage Integrations",
|
"Manage Integrations": "Manage Integrations",
|
||||||
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
|
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
|
||||||
|
@ -1552,8 +1555,7 @@
|
||||||
"Room directory": "Room directory",
|
"Room directory": "Room directory",
|
||||||
"Sign in with single sign-on": "Sign in with single sign-on",
|
"Sign in with single sign-on": "Sign in with single sign-on",
|
||||||
"And %(count)s more...|other": "And %(count)s more...",
|
"And %(count)s more...|other": "And %(count)s more...",
|
||||||
"ex. @bob:example.com": "ex. @bob:example.com",
|
"Home": "Home",
|
||||||
"Add User": "Add User",
|
|
||||||
"Enter a server name": "Enter a server name",
|
"Enter a server name": "Enter a server name",
|
||||||
"Looks good": "Looks good",
|
"Looks good": "Looks good",
|
||||||
"Can't find this server or its room list": "Can't find this server or its room list",
|
"Can't find this server or its room list": "Can't find this server or its room list",
|
||||||
|
@ -1596,6 +1598,15 @@
|
||||||
"Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s",
|
"Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s",
|
||||||
"Unavailable": "Unavailable",
|
"Unavailable": "Unavailable",
|
||||||
"Changelog": "Changelog",
|
"Changelog": "Changelog",
|
||||||
|
"Email address": "Email address",
|
||||||
|
"Add another email": "Add another email",
|
||||||
|
"People you know on %(brand)s": "People you know on %(brand)s",
|
||||||
|
"Hide": "Hide",
|
||||||
|
"Show": "Show",
|
||||||
|
"Skip": "Skip",
|
||||||
|
"Send %(count)s invites|other": "Send %(count)s invites",
|
||||||
|
"Send %(count)s invites|one": "Send %(count)s invite",
|
||||||
|
"Invite people to join %(communityName)s": "Invite people to join %(communityName)s",
|
||||||
"You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)",
|
"You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)",
|
||||||
"Removing…": "Removing…",
|
"Removing…": "Removing…",
|
||||||
"Destroy cross-signing keys?": "Destroy cross-signing keys?",
|
"Destroy cross-signing keys?": "Destroy cross-signing keys?",
|
||||||
|
@ -1606,6 +1617,15 @@
|
||||||
"Clear all data in this session?": "Clear all data in this session?",
|
"Clear all data in this session?": "Clear all data in this session?",
|
||||||
"Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.",
|
"Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.",
|
||||||
"Clear all data": "Clear all data",
|
"Clear all data": "Clear all data",
|
||||||
|
"There was an error creating your community. The name may be taken or the server is unable to process your request.": "There was an error creating your community. The name may be taken or the server is unable to process your request.",
|
||||||
|
"Community ID: +<localpart />:%(domain)s": "Community ID: +<localpart />:%(domain)s",
|
||||||
|
"Use this when referencing your community to others. The community ID cannot be changed.": "Use this when referencing your community to others. The community ID cannot be changed.",
|
||||||
|
"You can change this later if needed.": "You can change this later if needed.",
|
||||||
|
"What's the name of your community or team?": "What's the name of your community or team?",
|
||||||
|
"Enter name": "Enter name",
|
||||||
|
"Create": "Create",
|
||||||
|
"Add image (optional)": "Add image (optional)",
|
||||||
|
"An image will help people identify your community.": "An image will help people identify your community.",
|
||||||
"Community IDs cannot be empty.": "Community IDs cannot be empty.",
|
"Community IDs cannot be empty.": "Community IDs cannot be empty.",
|
||||||
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'",
|
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'",
|
||||||
"Something went wrong whilst creating your community": "Something went wrong whilst creating your community",
|
"Something went wrong whilst creating your community": "Something went wrong whilst creating your community",
|
||||||
|
@ -1614,20 +1634,22 @@
|
||||||
"Example": "Example",
|
"Example": "Example",
|
||||||
"Community ID": "Community ID",
|
"Community ID": "Community ID",
|
||||||
"example": "example",
|
"example": "example",
|
||||||
"Create": "Create",
|
|
||||||
"Please enter a name for the room": "Please enter a name for the room",
|
"Please enter a name for the room": "Please enter a name for the room",
|
||||||
"Set a room address to easily share your room with other people.": "Set a room address to easily share your room with other people.",
|
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.",
|
||||||
"This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.",
|
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.",
|
||||||
"You can’t disable this later. Bridges & most bots won’t work yet.": "You can’t disable this later. Bridges & most bots won’t work yet.",
|
"You can’t disable this later. Bridges & most bots won’t work yet.": "You can’t disable this later. Bridges & most bots won’t work yet.",
|
||||||
"Enable end-to-end encryption": "Enable end-to-end encryption",
|
"Enable end-to-end encryption": "Enable end-to-end encryption",
|
||||||
|
"You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.",
|
||||||
|
"You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.",
|
||||||
"Create a public room": "Create a public room",
|
"Create a public room": "Create a public room",
|
||||||
"Create a private room": "Create a private room",
|
"Create a private room": "Create a private room",
|
||||||
|
"Create a room in %(communityName)s": "Create a room in %(communityName)s",
|
||||||
"Name": "Name",
|
"Name": "Name",
|
||||||
"Topic (optional)": "Topic (optional)",
|
"Topic (optional)": "Topic (optional)",
|
||||||
"Make this room public": "Make this room public",
|
"Make this room public": "Make this room public",
|
||||||
"Hide advanced": "Hide advanced",
|
"Hide advanced": "Hide advanced",
|
||||||
"Show advanced": "Show advanced",
|
"Show advanced": "Show advanced",
|
||||||
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)",
|
"Block anyone not part of %(serverName)s from ever joining this room.": "Block anyone not part of %(serverName)s from ever joining this room.",
|
||||||
"Create Room": "Create Room",
|
"Create Room": "Create Room",
|
||||||
"Sign out": "Sign out",
|
"Sign out": "Sign out",
|
||||||
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this",
|
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this",
|
||||||
|
@ -1773,9 +1795,7 @@
|
||||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.",
|
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.",
|
||||||
"Verification Pending": "Verification Pending",
|
"Verification Pending": "Verification Pending",
|
||||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.",
|
"Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.",
|
||||||
"Email address": "Email address",
|
|
||||||
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
|
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
|
||||||
"Skip": "Skip",
|
|
||||||
"A username can only contain lower case letters, numbers and '=_-./'": "A username can only contain lower case letters, numbers and '=_-./'",
|
"A username can only contain lower case letters, numbers and '=_-./'": "A username can only contain lower case letters, numbers and '=_-./'",
|
||||||
"Username not available": "Username not available",
|
"Username not available": "Username not available",
|
||||||
"Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
|
"Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
|
||||||
|
@ -1863,10 +1883,6 @@
|
||||||
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Warning</b>: You should only set up key backup from a trusted computer.",
|
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Warning</b>: You should only set up key backup from a trusted computer.",
|
||||||
"Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.",
|
"Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.",
|
||||||
"If you've forgotten your recovery key you can <button>set up new recovery options</button>": "If you've forgotten your recovery key you can <button>set up new recovery options</button>",
|
"If you've forgotten your recovery key you can <button>set up new recovery options</button>": "If you've forgotten your recovery key you can <button>set up new recovery options</button>",
|
||||||
"Private Chat": "Private Chat",
|
|
||||||
"Public Chat": "Public Chat",
|
|
||||||
"Custom": "Custom",
|
|
||||||
"Address (optional)": "Address (optional)",
|
|
||||||
"Reject invitation": "Reject invitation",
|
"Reject invitation": "Reject invitation",
|
||||||
"Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
|
"Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
|
||||||
"Unable to reject invite": "Unable to reject invite",
|
"Unable to reject invite": "Unable to reject invite",
|
||||||
|
@ -1888,7 +1904,6 @@
|
||||||
"Set status": "Set status",
|
"Set status": "Set status",
|
||||||
"Set a new status...": "Set a new status...",
|
"Set a new status...": "Set a new status...",
|
||||||
"View Community": "View Community",
|
"View Community": "View Community",
|
||||||
"Hide": "Hide",
|
|
||||||
"Reload": "Reload",
|
"Reload": "Reload",
|
||||||
"Take picture": "Take picture",
|
"Take picture": "Take picture",
|
||||||
"Remove for everyone": "Remove for everyone",
|
"Remove for everyone": "Remove for everyone",
|
||||||
|
@ -1961,11 +1976,6 @@
|
||||||
"Sign in to your Matrix account on %(serverName)s": "Sign in to your Matrix account on %(serverName)s",
|
"Sign in to your Matrix account on %(serverName)s": "Sign in to your Matrix account on %(serverName)s",
|
||||||
"Sign in to your Matrix account on <underlinedServerName />": "Sign in to your Matrix account on <underlinedServerName />",
|
"Sign in to your Matrix account on <underlinedServerName />": "Sign in to your Matrix account on <underlinedServerName />",
|
||||||
"Sign in with SSO": "Sign in with SSO",
|
"Sign in with SSO": "Sign in with SSO",
|
||||||
"Sorry, your browser is <b>not</b> able to run %(brand)s.": "Sorry, your browser is <b>not</b> able to run %(brand)s.",
|
|
||||||
"%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.",
|
|
||||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.",
|
|
||||||
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!",
|
|
||||||
"I understand the risks and wish to continue": "I understand the risks and wish to continue",
|
|
||||||
"Couldn't load page": "Couldn't load page",
|
"Couldn't load page": "Couldn't load page",
|
||||||
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
|
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
|
||||||
"You must join the room to see its files": "You must join the room to see its files",
|
"You must join the room to see its files": "You must join the room to see its files",
|
||||||
|
@ -2063,6 +2073,7 @@
|
||||||
"Find a room…": "Find a room…",
|
"Find a room…": "Find a room…",
|
||||||
"Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)s)",
|
"Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)s)",
|
||||||
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.",
|
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.",
|
||||||
|
"Explore rooms in %(communityName)s": "Explore rooms in %(communityName)s",
|
||||||
"Clear filter": "Clear filter",
|
"Clear filter": "Clear filter",
|
||||||
"Search rooms": "Search rooms",
|
"Search rooms": "Search rooms",
|
||||||
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.",
|
"You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.",
|
||||||
|
@ -2089,13 +2100,13 @@
|
||||||
"Click to mute video": "Click to mute video",
|
"Click to mute video": "Click to mute video",
|
||||||
"Click to unmute audio": "Click to unmute audio",
|
"Click to unmute audio": "Click to unmute audio",
|
||||||
"Click to mute audio": "Click to mute audio",
|
"Click to mute audio": "Click to mute audio",
|
||||||
|
"Create community": "Create community",
|
||||||
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
|
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
|
||||||
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
|
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
|
||||||
"Failed to load timeline position": "Failed to load timeline position",
|
"Failed to load timeline position": "Failed to load timeline position",
|
||||||
"Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others",
|
"Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others",
|
||||||
"Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s",
|
"Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s",
|
||||||
"Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other",
|
"Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other",
|
||||||
"Home": "Home",
|
|
||||||
"Switch to light mode": "Switch to light mode",
|
"Switch to light mode": "Switch to light mode",
|
||||||
"Switch to dark mode": "Switch to dark mode",
|
"Switch to dark mode": "Switch to dark mode",
|
||||||
"Switch theme": "Switch theme",
|
"Switch theme": "Switch theme",
|
||||||
|
@ -2236,7 +2247,7 @@
|
||||||
"Retry": "Retry",
|
"Retry": "Retry",
|
||||||
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.",
|
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.",
|
||||||
"You can also set up Secure Backup & manage your keys in Settings.": "You can also set up Secure Backup & manage your keys in Settings.",
|
"You can also set up Secure Backup & manage your keys in Settings.": "You can also set up Secure Backup & manage your keys in Settings.",
|
||||||
"Set up Secure backup": "Set up Secure backup",
|
"Set up Secure Backup": "Set up Secure Backup",
|
||||||
"Upgrade your encryption": "Upgrade your encryption",
|
"Upgrade your encryption": "Upgrade your encryption",
|
||||||
"Set a Security Phrase": "Set a Security Phrase",
|
"Set a Security Phrase": "Set a Security Phrase",
|
||||||
"Confirm Security Phrase": "Confirm Security Phrase",
|
"Confirm Security Phrase": "Confirm Security Phrase",
|
||||||
|
|
|
@ -858,7 +858,7 @@
|
||||||
"Gift": "Donaco",
|
"Gift": "Donaco",
|
||||||
"Light bulb": "Lampo",
|
"Light bulb": "Lampo",
|
||||||
"Book": "Libro",
|
"Book": "Libro",
|
||||||
"Pencil": "Grifelo",
|
"Pencil": "Krajono",
|
||||||
"Scissors": "Tondilo",
|
"Scissors": "Tondilo",
|
||||||
"Key": "Ŝlosilo",
|
"Key": "Ŝlosilo",
|
||||||
"Hammer": "Martelo",
|
"Hammer": "Martelo",
|
||||||
|
@ -2387,5 +2387,25 @@
|
||||||
"Enable advanced debugging for the room list": "Ŝalti altnivelan erarserĉadon por la ĉambrobreto",
|
"Enable advanced debugging for the room list": "Ŝalti altnivelan erarserĉadon por la ĉambrobreto",
|
||||||
"* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s",
|
"* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s",
|
||||||
"Custom Tag": "Propra etikedo",
|
"Custom Tag": "Propra etikedo",
|
||||||
"Feedback": "Prikomenti"
|
"Feedback": "Prikomenti",
|
||||||
|
"The person who invited you already left the room.": "La persono, kiu vin invitis, jam foriris de la ĉambro.",
|
||||||
|
"The person who invited you already left the room, or their server is offline.": "Aŭ la persono, kiu vin invitis, jam foriris de la ĉambro, aŭ ĝia servilo estas eksterreta.",
|
||||||
|
"Change notification settings": "Ŝanĝi agordojn pri sciigoj",
|
||||||
|
"Show message previews for reactions in DMs": "Montri antaŭrigardojn al mesaĝoj ĉe reagoj en rektaj ĉambroj",
|
||||||
|
"Show message previews for reactions in all rooms": "Montri antaŭrigardojn al mesaĝoj ĉe reagoj en ĉiuj ĉambroj",
|
||||||
|
"Your server isn't responding to some <a>requests</a>.": "Via servilo ne respondas al iuj <a>petoj</a>.",
|
||||||
|
"Server isn't responding": "Servilo ne respondas",
|
||||||
|
"Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Via servilo ne respondas al iuj el viaj petoj. Vidu sube kelkon de la plej probablaj kialoj.",
|
||||||
|
"The server (%(serverName)s) took too long to respond.": "La servilo (%(serverName)s) tro longe ne respondis.",
|
||||||
|
"Your firewall or anti-virus is blocking the request.": "Via fajroŝirmilo aŭ kontraŭvirusilo blokas la peton.",
|
||||||
|
"A browser extension is preventing the request.": "Kromprogramo de la foliumilo malhelpas la peton.",
|
||||||
|
"The server is offline.": "La servilo estas eksterreta.",
|
||||||
|
"The server has denied your request.": "La servilo rifuzis vian peton.",
|
||||||
|
"Your area is experiencing difficulties connecting to the internet.": "Via loko nun havas problemojn pri interreta konekto.",
|
||||||
|
"A connection error occurred while trying to contact the server.": "Eraris konekto dum provo kontakti la servilon.",
|
||||||
|
"The server is not configured to indicate what the problem is (CORS).": "La servilo ne estas agordita por indiki la problemon (CORS).",
|
||||||
|
"Recent changes that have not yet been received": "Freŝaj ŝanĝoj ankoraŭ ne ricevitaj",
|
||||||
|
"No files visible in this room": "Neniuj dosieroj videblas en ĉi tiu ĉambro",
|
||||||
|
"You have no visible notifications in this room.": "Vi havas neniujn videblajn sciigojn en ĉi tiu ĉambro.",
|
||||||
|
"%(brand)s Android": "%(brand)s por Android"
|
||||||
}
|
}
|
||||||
|
|
|
@ -650,7 +650,7 @@
|
||||||
"Where you’re logged in": "Kus sa oled võrku loginud",
|
"Where you’re logged in": "Kus sa oled võrku loginud",
|
||||||
"Manage the names of and sign out of your sessions below or <a>verify them in your User Profile</a>.": "Halda alljärgnevas oma sessioonide nimesid, logi neist välja või <a>verifitseeri neid oma kasutajaprofiilis</a>.",
|
"Manage the names of and sign out of your sessions below or <a>verify them in your User Profile</a>.": "Halda alljärgnevas oma sessioonide nimesid, logi neist välja või <a>verifitseeri neid oma kasutajaprofiilis</a>.",
|
||||||
"A session's public name is visible to people you communicate with": "Sessiooni avalik nimi on nähtav neile, kellega sa suhtled",
|
"A session's public name is visible to people you communicate with": "Sessiooni avalik nimi on nähtav neile, kellega sa suhtled",
|
||||||
"%(brand)s collects anonymous analytics to allow us to improve the application.": "Võimaldamaks meil rakendust parandada kogub %(brand)s anonüümset analüütikat.",
|
"%(brand)s collects anonymous analytics to allow us to improve the application.": "Võimaldamaks meil rakendust parandada kogub %(brand)s anonüümset teavet rakenduse kasutuse kohta.",
|
||||||
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privaatsus on meile oluline ning seega me ei kogu ei isiklikke ega isikustatavaid andmeid.",
|
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privaatsus on meile oluline ning seega me ei kogu ei isiklikke ega isikustatavaid andmeid.",
|
||||||
"Learn more about how we use analytics.": "Loe lisaks kuidas me kasutama analüütikat.",
|
"Learn more about how we use analytics.": "Loe lisaks kuidas me kasutama analüütikat.",
|
||||||
"No media permissions": "Meediaõigused puuduvad",
|
"No media permissions": "Meediaõigused puuduvad",
|
||||||
|
@ -839,7 +839,7 @@
|
||||||
"Heart": "Süda",
|
"Heart": "Süda",
|
||||||
"Smiley": "Smaili",
|
"Smiley": "Smaili",
|
||||||
"Robot": "Robot",
|
"Robot": "Robot",
|
||||||
"Hat": "Müts",
|
"Hat": "Kübar",
|
||||||
"Glasses": "Prillid",
|
"Glasses": "Prillid",
|
||||||
"Spanner": "Mutrivõti",
|
"Spanner": "Mutrivõti",
|
||||||
"Santa": "Jõuluvana",
|
"Santa": "Jõuluvana",
|
||||||
|
@ -870,7 +870,7 @@
|
||||||
"Anchor": "Ankur",
|
"Anchor": "Ankur",
|
||||||
"Headphones": "Kõrvaklapid",
|
"Headphones": "Kõrvaklapid",
|
||||||
"Folder": "Kaust",
|
"Folder": "Kaust",
|
||||||
"Pin": "Knopka",
|
"Pin": "Nööpnõel",
|
||||||
"Verify all your sessions to ensure your account & messages are safe": "Selleks et sinu konto ja sõnumid oleks turvatud, verifitseeri kõik oma sessioonid",
|
"Verify all your sessions to ensure your account & messages are safe": "Selleks et sinu konto ja sõnumid oleks turvatud, verifitseeri kõik oma sessioonid",
|
||||||
"Later": "Hiljem",
|
"Later": "Hiljem",
|
||||||
"Review": "Vaata üle",
|
"Review": "Vaata üle",
|
||||||
|
@ -1025,7 +1025,7 @@
|
||||||
"Permissions": "Õigused",
|
"Permissions": "Õigused",
|
||||||
"Select the roles required to change various parts of the room": "Vali rollid, mis on vajalikud jututoa eri osade muutmiseks",
|
"Select the roles required to change various parts of the room": "Vali rollid, mis on vajalikud jututoa eri osade muutmiseks",
|
||||||
"Enable encryption?": "Kas võtame krüptimise kasutusele?",
|
"Enable encryption?": "Kas võtame krüptimise kasutusele?",
|
||||||
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine takistada nii robotite kui sõnumisildade tööd. <a>Lisateave krüptimise kohta.</a>",
|
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine võib takistada nii robotite kui sõnumisildade tööd. <a>Lisateave krüptimise kohta.</a>",
|
||||||
"Guests cannot join this room even if explicitly invited.": "Külalised ei saa selle jututoaga liituda ka siis, kui neid on otseselt kutsutud.",
|
"Guests cannot join this room even if explicitly invited.": "Külalised ei saa selle jututoaga liituda ka siis, kui neid on otseselt kutsutud.",
|
||||||
"Click here to fix": "Parandamiseks klõpsi siia",
|
"Click here to fix": "Parandamiseks klõpsi siia",
|
||||||
"Server error": "Serveri viga",
|
"Server error": "Serveri viga",
|
||||||
|
@ -1334,7 +1334,7 @@
|
||||||
"If you cancel now, you won't complete your operation.": "Kui sa katkestad nüüd, siis sul jääb pooleliolev tegevus lõpetamata.",
|
"If you cancel now, you won't complete your operation.": "Kui sa katkestad nüüd, siis sul jääb pooleliolev tegevus lõpetamata.",
|
||||||
"Cancel entering passphrase?": "Kas katkestame paroolifraasi sisestamise?",
|
"Cancel entering passphrase?": "Kas katkestame paroolifraasi sisestamise?",
|
||||||
"Enter passphrase": "Sisesta paroolifraas",
|
"Enter passphrase": "Sisesta paroolifraas",
|
||||||
"Setting up keys": "Võtamevõtmed kasutusele",
|
"Setting up keys": "Võtame krüptovõtmed kasutusele",
|
||||||
"Room name or address": "Jututoa nimi või aadress",
|
"Room name or address": "Jututoa nimi või aadress",
|
||||||
"Unable to enable Notifications": "Teavituste kasutusele võtmine ei õnnestunud",
|
"Unable to enable Notifications": "Teavituste kasutusele võtmine ei õnnestunud",
|
||||||
"This email address was not found": "Seda e-posti aadressi ei leidunud",
|
"This email address was not found": "Seda e-posti aadressi ei leidunud",
|
||||||
|
@ -2289,8 +2289,8 @@
|
||||||
"All keys backed up": "Kõik krüptovõtmed on varundatud",
|
"All keys backed up": "Kõik krüptovõtmed on varundatud",
|
||||||
"Backup has a <validity>valid</validity> signature from this user": "Varukoopial on selle kasutaja <validity>kehtiv</validity> allkiri",
|
"Backup has a <validity>valid</validity> signature from this user": "Varukoopial on selle kasutaja <validity>kehtiv</validity> allkiri",
|
||||||
"Backup has a <validity>invalid</validity> signature from this user": "Varukoopial on selle kasutaja <validity>vigane</validity> allkiri",
|
"Backup has a <validity>invalid</validity> signature from this user": "Varukoopial on selle kasutaja <validity>vigane</validity> allkiri",
|
||||||
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "Varukoopial <verify>tundmatu</verify> kasutaja allkiri seadme tunnusega %(deviceId)s",
|
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "Varukoopial on <verify>tundmatu</verify> kasutaja allkiri seadme tunnusega %(deviceId)s",
|
||||||
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "Varukoopial <verify>tundmatu</verify> sessiooni allkiri seadme tunnusega %(deviceId)s",
|
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "Varukoopial on <verify>tundmatu</verify> sessiooni allkiri seadme tunnusega %(deviceId)s",
|
||||||
"Backup has a <validity>valid</validity> signature from this session": "Varukoopial on selle sessiooni <validity>kehtiv</validity> allkiri",
|
"Backup has a <validity>valid</validity> signature from this session": "Varukoopial on selle sessiooni <validity>kehtiv</validity> allkiri",
|
||||||
"Backup has an <validity>invalid</validity> signature from this session": "Varukoopial on selle sessiooni <validity>vigane</validity> allkiri",
|
"Backup has an <validity>invalid</validity> signature from this session": "Varukoopial on selle sessiooni <validity>vigane</validity> allkiri",
|
||||||
"Backup is not signed by any of your sessions": "Varunduse andmetel pole mitte ühegi sinu sessiooni allkirja",
|
"Backup is not signed by any of your sessions": "Varunduse andmetel pole mitte ühegi sinu sessiooni allkirja",
|
||||||
|
@ -2403,5 +2403,27 @@
|
||||||
"You have no visible notifications in this room.": "Jututoas pole nähtavaid teavitusi.",
|
"You have no visible notifications in this room.": "Jututoas pole nähtavaid teavitusi.",
|
||||||
"You're all caught up.": "Ei tea... kõik vist on nüüd tehtud.",
|
"You're all caught up.": "Ei tea... kõik vist on nüüd tehtud.",
|
||||||
"You’re all caught up": "Ei tea... kõik vist on nüüd tehtud",
|
"You’re all caught up": "Ei tea... kõik vist on nüüd tehtud",
|
||||||
"%(brand)s Android": "%(brand)s Android"
|
"%(brand)s Android": "%(brand)s Android",
|
||||||
|
"Show message previews for reactions in DMs": "Näita eelvaates otsesõnumitele regeerimisi",
|
||||||
|
"Show message previews for reactions in all rooms": "Näita kõikides jututubades eelvaadetes sõnumitele regeerimisi",
|
||||||
|
"Master private key:": "Üldine privaatvõti:",
|
||||||
|
"Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud",
|
||||||
|
"Explore public rooms": "Sirvi avalikke jututubasid",
|
||||||
|
"Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist",
|
||||||
|
"You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Oled varem kasutanud %(brand)s serveriga %(host)s ja lubanud andmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe seadistuse vahel ei ühildu, peab %(brand)s sinu konto uuesti sünkroonima.",
|
||||||
|
"If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.",
|
||||||
|
"Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See kindlasti põhjustab läbiva krüptimise tõrke vanemas versioonis. Läbivalt krüptitud sõnumid, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada vigu ka selle versiooniga saadetud sõnumite lugemisel. Kui teil tekib probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma krüptovõtmed.",
|
||||||
|
"Navigation": "Navigeerimine",
|
||||||
|
"Uploading logs": "Laen üles logisid",
|
||||||
|
"Downloading logs": "Laen alla logisid",
|
||||||
|
"Can't see what you’re looking for?": "Kas sa ei leia seda, mida otsisid?",
|
||||||
|
"Explore all public rooms": "Sirvi kõiki avalikke jututubasid",
|
||||||
|
"%(count)s results|other": "%(count)s tulemust",
|
||||||
|
"Preparing to download logs": "Valmistun logikirjete allalaadimiseks",
|
||||||
|
"Download logs": "Lae logikirjed alla",
|
||||||
|
"Unexpected server error trying to leave the room": "Jututoast lahkumisel tekkis serveris ootamatu viga",
|
||||||
|
"Error leaving room": "Viga jututoast lahkumisel",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Kogukondade v2 prototüüp. Eeldab, et koduserver toetab sellist funktsionaalsust. Lahendus on esialgne ja katseline - kui kasutad, siis väga ettevaatlikult.",
|
||||||
|
"Explore rooms in %(communityName)s": "Uuri jututubasid %(communityName)s kogukonnas",
|
||||||
|
"Set up Secure Backup": "Võta kasutusele turvaline varundus"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2233,7 +2233,7 @@
|
||||||
"Alt": "Alt",
|
"Alt": "Alt",
|
||||||
"Alt Gr": "Alt Gr",
|
"Alt Gr": "Alt Gr",
|
||||||
"Shift": "Maiús",
|
"Shift": "Maiús",
|
||||||
"Super": "Super",
|
"Super": "Súper",
|
||||||
"Ctrl": "Ctrl",
|
"Ctrl": "Ctrl",
|
||||||
"Toggle Bold": "Activa Resaltar",
|
"Toggle Bold": "Activa Resaltar",
|
||||||
"Toggle Italics": "Activa Cursiva",
|
"Toggle Italics": "Activa Cursiva",
|
||||||
|
@ -2410,5 +2410,20 @@
|
||||||
"You’re all caught up": "Xa estás ó día",
|
"You’re all caught up": "Xa estás ó día",
|
||||||
"You have no visible notifications in this room.": "Non tes notificacións visibles nesta sala.",
|
"You have no visible notifications in this room.": "Non tes notificacións visibles nesta sala.",
|
||||||
"%(brand)s Android": "%(brand)s Android",
|
"%(brand)s Android": "%(brand)s Android",
|
||||||
"Master private key:": "Chave mestra principal:"
|
"Master private key:": "Chave mestra principal:",
|
||||||
|
"Show message previews for reactions in DMs": "Mostrar vista previa das mensaxes para reaccións en MDs",
|
||||||
|
"Show message previews for reactions in all rooms": "Mostrar vista previa das mensaxes para reaccións en todas as salas",
|
||||||
|
"Explore public rooms": "Explorar salas públicas",
|
||||||
|
"Uploading logs": "Subindo o rexistro",
|
||||||
|
"Downloading logs": "Descargando o rexistro",
|
||||||
|
"Can't see what you’re looking for?": "¿Non atopas o que buscas?",
|
||||||
|
"Explore all public rooms": "Explora todas as salas públicas",
|
||||||
|
"%(count)s results|other": "%(count)s resultados",
|
||||||
|
"Preparing to download logs": "Preparándose para descargar rexistro",
|
||||||
|
"Download logs": "Descargar rexistro",
|
||||||
|
"Unexpected server error trying to leave the room": "Fallo non agardado no servidor ó intentar saír da sala",
|
||||||
|
"Error leaving room": "Erro ó saír da sala",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototipos de Comunidades v2. Require un servidor compatible. Característica experimental - usa con tino.",
|
||||||
|
"Explore rooms in %(communityName)s": "Explorar salas en %(communityName)s",
|
||||||
|
"Set up Secure Backup": "Configurar Copia de apoio Segura"
|
||||||
}
|
}
|
||||||
|
|
|
@ -811,7 +811,7 @@
|
||||||
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle.",
|
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle.",
|
||||||
"No Audio Outputs detected": "Nem található hang kimenet",
|
"No Audio Outputs detected": "Nem található hang kimenet",
|
||||||
"Audio Output": "Hang kimenet",
|
"Audio Output": "Hang kimenet",
|
||||||
"Share Link to User": "Hivatkozás megosztása felhasználóval",
|
"Share Link to User": "A felhasználóra mutató hivatkozás",
|
||||||
"Share room": "Szoba megosztása",
|
"Share room": "Szoba megosztása",
|
||||||
"Share Room": "Szoba megosztása",
|
"Share Room": "Szoba megosztása",
|
||||||
"Link to most recent message": "A legfrissebb üzenetre hivatkozás",
|
"Link to most recent message": "A legfrissebb üzenetre hivatkozás",
|
||||||
|
@ -987,7 +987,7 @@
|
||||||
"Send typing notifications": "Gépelés visszajelzés küldése",
|
"Send typing notifications": "Gépelés visszajelzés küldése",
|
||||||
"Enable Community Filter Panel": "Közösségi szűrő panel bekapcsolása",
|
"Enable Community Filter Panel": "Közösségi szűrő panel bekapcsolása",
|
||||||
"Messages containing my username": "Üzenetek amik a nevemet tartalmazzák",
|
"Messages containing my username": "Üzenetek amik a nevemet tartalmazzák",
|
||||||
"The other party cancelled the verification.": "A másik fél törölte az ellenőrzést.",
|
"The other party cancelled the verification.": "A másik fél megszakította az ellenőrzést.",
|
||||||
"Verified!": "Ellenőrizve!",
|
"Verified!": "Ellenőrizve!",
|
||||||
"You've successfully verified this user.": "Sikeresen ellenőrizted ezt a felhasználót.",
|
"You've successfully verified this user.": "Sikeresen ellenőrizted ezt a felhasználót.",
|
||||||
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Az üzenetek a felhasználóval végponttól végpontig titkosítva vannak és azt más nem tudja elolvasni.",
|
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Az üzenetek a felhasználóval végponttól végpontig titkosítva vannak és azt más nem tudja elolvasni.",
|
||||||
|
@ -1630,7 +1630,7 @@
|
||||||
"<strong>%(role)s</strong> in %(roomName)s": "<strong>%(role)s</strong> a szobában: %(roomName)s",
|
"<strong>%(role)s</strong> in %(roomName)s": "<strong>%(role)s</strong> a szobában: %(roomName)s",
|
||||||
"Messages in this room are end-to-end encrypted.": "Az üzenetek a szobában végponttól végpontig titkosítottak.",
|
"Messages in this room are end-to-end encrypted.": "Az üzenetek a szobában végponttól végpontig titkosítottak.",
|
||||||
"Security": "Biztonság",
|
"Security": "Biztonság",
|
||||||
"Verify": "Ellenőriz",
|
"Verify": "Ellenőrzés",
|
||||||
"Any of the following data may be shared:": "Az alábbi adatok közül bármelyik megosztásra kerülhet:",
|
"Any of the following data may be shared:": "Az alábbi adatok közül bármelyik megosztásra kerülhet:",
|
||||||
"Your display name": "Megjelenítési neved",
|
"Your display name": "Megjelenítési neved",
|
||||||
"Your avatar URL": "Profilképed URL-je",
|
"Your avatar URL": "Profilképed URL-je",
|
||||||
|
@ -1888,7 +1888,7 @@
|
||||||
"You've successfully verified %(displayName)s!": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!",
|
"You've successfully verified %(displayName)s!": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!",
|
||||||
"Got it": "Értem",
|
"Got it": "Értem",
|
||||||
"Encryption enabled": "Titkosítás bekapcsolva",
|
"Encryption enabled": "Titkosítás bekapcsolva",
|
||||||
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és ellenőrzéshez nyisd meg a felhasználó profilját.",
|
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és az ellenőrzéshez nyisd meg a felhasználók profiljait!",
|
||||||
"Encryption not enabled": "Titkosítás nincs engedélyezve",
|
"Encryption not enabled": "Titkosítás nincs engedélyezve",
|
||||||
"The encryption used by this room isn't supported.": "A szobában használt titkosítás nem támogatott.",
|
"The encryption used by this room isn't supported.": "A szobában használt titkosítás nem támogatott.",
|
||||||
"Clear all data in this session?": "Minden adat törlése ebben a munkamenetben?",
|
"Clear all data in this session?": "Minden adat törlése ebben a munkamenetben?",
|
||||||
|
@ -2109,7 +2109,7 @@
|
||||||
"Server did not return valid authentication information.": "A szerver semmilyen érvényes azonosítási információt sem küldött vissza.",
|
"Server did not return valid authentication information.": "A szerver semmilyen érvényes azonosítási információt sem küldött vissza.",
|
||||||
"There was a problem communicating with the server. Please try again.": "A szerverrel való kommunikációval probléma történt. Kérlek próbáld újra.",
|
"There was a problem communicating with the server. Please try again.": "A szerverrel való kommunikációval probléma történt. Kérlek próbáld újra.",
|
||||||
"Sign in with SSO": "Belépés SSO-val",
|
"Sign in with SSO": "Belépés SSO-val",
|
||||||
"Welcome to %(appName)s": "Üdv itt: %(appName)s",
|
"Welcome to %(appName)s": "Üdvözöl az %(appName)s",
|
||||||
"Liberate your communication": "Szabadítsd fel a kommunikációdat",
|
"Liberate your communication": "Szabadítsd fel a kommunikációdat",
|
||||||
"Send a Direct Message": "Közvetlen üzenet küldése",
|
"Send a Direct Message": "Közvetlen üzenet küldése",
|
||||||
"Explore Public Rooms": "Nyilvános szobák felderítése",
|
"Explore Public Rooms": "Nyilvános szobák felderítése",
|
||||||
|
@ -2177,7 +2177,7 @@
|
||||||
"Waiting for your other session to verify…": "A másik munkameneted ellenőrzésére várunk…",
|
"Waiting for your other session to verify…": "A másik munkameneted ellenőrzésére várunk…",
|
||||||
"You've successfully verified your device!": "Sikeresen ellenőrizted az eszközödet!",
|
"You've successfully verified your device!": "Sikeresen ellenőrizted az eszközödet!",
|
||||||
"Message deleted": "Üzenet törölve",
|
"Message deleted": "Üzenet törölve",
|
||||||
"Message deleted by %(name)s": "%(name)s törölte az üzenetet",
|
"Message deleted by %(name)s": "%(name)s törölte ezt az üzenetet",
|
||||||
"QR Code": "QR kód",
|
"QR Code": "QR kód",
|
||||||
"To continue, use Single Sign On to prove your identity.": "A folytatáshoz a személyazonosságod megerősítéséhez használd az egyszeri bejelentkezést.",
|
"To continue, use Single Sign On to prove your identity.": "A folytatáshoz a személyazonosságod megerősítéséhez használd az egyszeri bejelentkezést.",
|
||||||
"Confirm to continue": "Erősítsd meg a továbblépéshez",
|
"Confirm to continue": "Erősítsd meg a továbblépéshez",
|
||||||
|
@ -2234,12 +2234,12 @@
|
||||||
"Emoji picker": "Emodzsi választó",
|
"Emoji picker": "Emodzsi választó",
|
||||||
"No recently visited rooms": "Nincsenek nemrégiben meglátogatott szobák",
|
"No recently visited rooms": "Nincsenek nemrégiben meglátogatott szobák",
|
||||||
"People": "Emberek",
|
"People": "Emberek",
|
||||||
"Sort by": "Rendezve:",
|
"Sort by": "Rendezés",
|
||||||
"Unread rooms": "Olvasatlan szobák",
|
"Unread rooms": "Olvasatlan szobák",
|
||||||
"Always show first": "Mindig az elsőt mutatja",
|
"Always show first": "Mindig az elsőt mutatja",
|
||||||
"Show": "Mutat",
|
"Show": "Mutat",
|
||||||
"Message preview": "Üzenet előnézet",
|
"Message preview": "Üzenet előnézet",
|
||||||
"List options": "Lista beállítások",
|
"List options": "Lista beállításai",
|
||||||
"Show %(count)s more|other": "Még %(count)s megjelenítése",
|
"Show %(count)s more|other": "Még %(count)s megjelenítése",
|
||||||
"Show %(count)s more|one": "Még %(count)s megjelenítése",
|
"Show %(count)s more|one": "Még %(count)s megjelenítése",
|
||||||
"Leave Room": "Szoba elhagyása",
|
"Leave Room": "Szoba elhagyása",
|
||||||
|
@ -2404,5 +2404,14 @@
|
||||||
"Your area is experiencing difficulties connecting to the internet.": "Probléma az Internet elérésben.",
|
"Your area is experiencing difficulties connecting to the internet.": "Probléma az Internet elérésben.",
|
||||||
"A connection error occurred while trying to contact the server.": "Kapcsolati hiba lépett fel miközben a szervert próbáltad elérni.",
|
"A connection error occurred while trying to contact the server.": "Kapcsolati hiba lépett fel miközben a szervert próbáltad elérni.",
|
||||||
"The server is not configured to indicate what the problem is (CORS).": "A szerver nincs beállítva, hogy megmutassa mi okozhatta a hibát (CORS).",
|
"The server is not configured to indicate what the problem is (CORS).": "A szerver nincs beállítva, hogy megmutassa mi okozhatta a hibát (CORS).",
|
||||||
"Recent changes that have not yet been received": "Legutóbbi változások amik még nem érkeztek meg"
|
"Recent changes that have not yet been received": "Legutóbbi változások amik még nem érkeztek meg",
|
||||||
|
"Show message previews for reactions in DMs": "Üzenet előnézet mutatása a reakcióhoz a közvetlen beszélgetéseknél",
|
||||||
|
"Show message previews for reactions in all rooms": "Üzenet előnézet mutatása a reakciókhoz minden szobában",
|
||||||
|
"Master private key:": "Privát elsődleges kulcs:",
|
||||||
|
"No files visible in this room": "Ebben a szobában nincsenek fájlok",
|
||||||
|
"Attach files from chat or just drag and drop them anywhere in a room.": "Csatolj fájlt a csevegésből vagy húzd és ejtsd bárhova a szobában.",
|
||||||
|
"You’re all caught up": "Mindent elolvastál",
|
||||||
|
"You have no visible notifications in this room.": "Nincsenek látható értesítéseid ebben a szobában.",
|
||||||
|
"%(brand)s Android": "%(brand)s Android",
|
||||||
|
"Explore public rooms": "Nyilvános szobák felderítése"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2413,5 +2413,15 @@
|
||||||
"Attach files from chat or just drag and drop them anywhere in a room.": "Allega file dalla chat o trascinali in qualsiasi punto in una stanza.",
|
"Attach files from chat or just drag and drop them anywhere in a room.": "Allega file dalla chat o trascinali in qualsiasi punto in una stanza.",
|
||||||
"You’re all caught up": "Non hai nulla di nuovo da vedere",
|
"You’re all caught up": "Non hai nulla di nuovo da vedere",
|
||||||
"You have no visible notifications in this room.": "Non hai alcuna notifica visibile in questa stanza.",
|
"You have no visible notifications in this room.": "Non hai alcuna notifica visibile in questa stanza.",
|
||||||
"%(brand)s Android": "%(brand)s Android"
|
"%(brand)s Android": "%(brand)s Android",
|
||||||
|
"Show message previews for reactions in DMs": "Mostra anteprime messaggi per le reazioni nei messaggi diretti",
|
||||||
|
"Show message previews for reactions in all rooms": "Mostra anteprime messaggi per le reazioni in tutte le stanze",
|
||||||
|
"Explore public rooms": "Esplora stanze pubbliche",
|
||||||
|
"Uploading logs": "Invio dei log",
|
||||||
|
"Downloading logs": "Scaricamento dei log",
|
||||||
|
"Can't see what you’re looking for?": "Non vedi quello che cerchi?",
|
||||||
|
"Explore all public rooms": "Esplora tutte le stanze pubbliche",
|
||||||
|
"%(count)s results|other": "%(count)s risultati",
|
||||||
|
"Preparing to download logs": "Preparazione al download dei log",
|
||||||
|
"Download logs": "Scarica i log"
|
||||||
}
|
}
|
||||||
|
|
|
@ -579,7 +579,7 @@
|
||||||
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました",
|
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました",
|
||||||
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました",
|
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました",
|
||||||
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました",
|
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました",
|
||||||
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s が%(count)s 回参加し、退出した",
|
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s が %(count)s 回参加し、退出しました",
|
||||||
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s は参加して退出しました",
|
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s は参加して退出しました",
|
||||||
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s が %(count)s 回参加し退出しました",
|
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s が %(count)s 回参加し退出しました",
|
||||||
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s が参加し退出しました",
|
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s が参加し退出しました",
|
||||||
|
@ -668,7 +668,7 @@
|
||||||
"Update any local room aliases to point to the new room": "新しいルームを指すようにローカルルームのエイリアスを更新する",
|
"Update any local room aliases to point to the new room": "新しいルームを指すようにローカルルームのエイリアスを更新する",
|
||||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "古いバージョンの部屋でのユーザーの発言を停止し、新しい部屋に移動するようユーザーに通知するメッセージを投稿する",
|
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "古いバージョンの部屋でのユーザーの発言を停止し、新しい部屋に移動するようユーザーに通知するメッセージを投稿する",
|
||||||
"Mention": "記載",
|
"Mention": "記載",
|
||||||
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s が %(count)s 回招待を撤回した",
|
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s が %(count)s 回招待を取り消しました",
|
||||||
"was unbanned %(count)s times|one": "ブロック解除されました",
|
"was unbanned %(count)s times|one": "ブロック解除されました",
|
||||||
"Put a link back to the old room at the start of the new room so people can see old messages": "新しい部屋の始めに古い部屋にリンクを張って、人々が古いメッセージを見ることができるようにする",
|
"Put a link back to the old room at the start of the new room so people can see old messages": "新しい部屋の始めに古い部屋にリンクを張って、人々が古いメッセージを見ることができるようにする",
|
||||||
"Sign out": "サインアウト",
|
"Sign out": "サインアウト",
|
||||||
|
@ -1373,5 +1373,19 @@
|
||||||
"Show %(count)s more|one": "さらに %(count)s 件を表示",
|
"Show %(count)s more|one": "さらに %(count)s 件を表示",
|
||||||
"%(num)s minutes ago": "%(num)s 分前",
|
"%(num)s minutes ago": "%(num)s 分前",
|
||||||
"%(num)s hours ago": "%(num)s 時間前",
|
"%(num)s hours ago": "%(num)s 時間前",
|
||||||
"%(num)s days ago": "%(num)s 日前"
|
"%(num)s days ago": "%(num)s 日前",
|
||||||
|
"Favourited": "お気に入り登録中",
|
||||||
|
"Room options": "部屋の設定",
|
||||||
|
"Ignored users": "無視しているユーザー",
|
||||||
|
"Show tray icon and minimize window to it on close": "トレイアイコンを表示しウィンドウを閉じても最小化して待機する",
|
||||||
|
"This message cannot be decrypted": "メッセージが復号できません",
|
||||||
|
"Unencrypted": "暗号化されていません",
|
||||||
|
"Encrypted by a deleted session": "削除済みのセッションによる暗号化",
|
||||||
|
"Scroll to most recent messages": "最新のメッセージを表示",
|
||||||
|
"Emoji picker": "絵文字を選択",
|
||||||
|
"All rooms": "全ての部屋",
|
||||||
|
"Your server": "あなたのサーバー",
|
||||||
|
"Matrix": "Matrix",
|
||||||
|
"Add a new server": "新しいサーバーを追加",
|
||||||
|
"Server name": "サーバー名"
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1407,5 +1407,14 @@
|
||||||
"Sign in to your Matrix account on %(serverName)s": "Logg inn på Matrix-kontoen din på %(serverName)s",
|
"Sign in to your Matrix account on %(serverName)s": "Logg inn på Matrix-kontoen din på %(serverName)s",
|
||||||
"Sign in to your Matrix account on <underlinedServerName />": "Logg inn på Matrix-kontoen din på <underlinedServerName />",
|
"Sign in to your Matrix account on <underlinedServerName />": "Logg inn på Matrix-kontoen din på <underlinedServerName />",
|
||||||
"If you've joined lots of rooms, this might take a while": "Hvis du har blitt med i mange rom, kan dette ta en stund",
|
"If you've joined lots of rooms, this might take a while": "Hvis du har blitt med i mange rom, kan dette ta en stund",
|
||||||
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Den nye økten din er nå verifisert. Den har tilgang til dine krypterte meldinger, og andre brukere vil se at den blir stolt på."
|
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Den nye økten din er nå verifisert. Den har tilgang til dine krypterte meldinger, og andre brukere vil se at den blir stolt på.",
|
||||||
|
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer, fra det tidspunktet de ble/blir invitert.",
|
||||||
|
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer, fra det tidspunktet de ble med.",
|
||||||
|
"%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer.",
|
||||||
|
"%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle.",
|
||||||
|
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer (%(visibility)s).",
|
||||||
|
"To return to your account in future you need to set a password": "For å komme tilbake til kontoen din senere, må du velge et passord",
|
||||||
|
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert (<b>Advarsel:</b> Dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)",
|
||||||
|
"To help us prevent this in future, please <a>send us logs</a>.": "For å hjelpe oss med å forhindre dette i fremtiden, vennligst <a>send oss loggfiler</a>.",
|
||||||
|
"No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Ingen identitetstjener er satt opp, så du kan ikke bruke en E-postadresse til å tilbakestille passordet ditt senere."
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,5 +59,284 @@
|
||||||
"This Room": "Aquesta sala",
|
"This Room": "Aquesta sala",
|
||||||
"All Rooms": "Totas les salas",
|
"All Rooms": "Totas les salas",
|
||||||
"Search…": "Cercar…",
|
"Search…": "Cercar…",
|
||||||
"Server error": "Error servidor"
|
"Server error": "Error servidor",
|
||||||
|
"Single Sign On": "Autentificacion unica",
|
||||||
|
"Confirm": "Confirmar",
|
||||||
|
"Dismiss": "Far desaparéisser",
|
||||||
|
"OK": "D’acòrdi",
|
||||||
|
"Continue": "Contunhar",
|
||||||
|
"Go Back": "En arrièr",
|
||||||
|
"Cancel": "Anullar",
|
||||||
|
"Sun": "Dg",
|
||||||
|
"Mon": "Dl",
|
||||||
|
"Tue": "Dm",
|
||||||
|
"Wed": "Dc",
|
||||||
|
"Thu": "Dj",
|
||||||
|
"Fri": "Dv",
|
||||||
|
"Sat": "Ds",
|
||||||
|
"Jan": "Gen",
|
||||||
|
"Feb": "Febr",
|
||||||
|
"Mar": "Març",
|
||||||
|
"Apr": "Abr",
|
||||||
|
"May": "mai",
|
||||||
|
"Jun": "Junh",
|
||||||
|
"Jul": "Julh",
|
||||||
|
"Aug": "Ago",
|
||||||
|
"Sep": "Set",
|
||||||
|
"Oct": "Oct",
|
||||||
|
"Nov": "Nov",
|
||||||
|
"Dec": "Dec",
|
||||||
|
"PM": "PM",
|
||||||
|
"AM": "AM",
|
||||||
|
"Trust": "Aprovacion",
|
||||||
|
"Sign In": "Se connectar",
|
||||||
|
"Default": "Predefinit",
|
||||||
|
"Moderator": "Moderator",
|
||||||
|
"Admin": "Admin",
|
||||||
|
"Operation failed": "L'operacion a fracassat",
|
||||||
|
"Messages": "Messatges",
|
||||||
|
"Actions": "Accions",
|
||||||
|
"Advanced": "Avançat",
|
||||||
|
"Other": "Autre",
|
||||||
|
"Usage": "Usatge",
|
||||||
|
"Command failed": "La comanda a fracassat",
|
||||||
|
"Thank you!": "Mercés !",
|
||||||
|
"Reason": "Rason",
|
||||||
|
"Light": "Clar",
|
||||||
|
"Dark": "Escur",
|
||||||
|
"Review": "Reveire",
|
||||||
|
"Notifications": "Notificacions",
|
||||||
|
"Close": "Tampar",
|
||||||
|
"Ok": "Validar",
|
||||||
|
"Set up": "Parametrar",
|
||||||
|
"Upgrade": "Metre a jorn",
|
||||||
|
"Verify": "Verificar",
|
||||||
|
"Update": "Mesa a jorn",
|
||||||
|
"Restart": "Reaviar",
|
||||||
|
"Font size": "Talha de poliça",
|
||||||
|
"Incoming video call": "Sonada vidèo entranta",
|
||||||
|
"Incoming call": "Sonada entranta",
|
||||||
|
"Accept": "Acceptar",
|
||||||
|
"Start": "Començament",
|
||||||
|
"Cancelling…": "Anullacion...",
|
||||||
|
"Fish": "Pes",
|
||||||
|
"Butterfly": "Parpalhòl",
|
||||||
|
"Tree": "Arborescéncia",
|
||||||
|
"Cloud": "Nívol",
|
||||||
|
"Apple": "Apple",
|
||||||
|
"Heart": "Còr",
|
||||||
|
"Clock": "Relòtge",
|
||||||
|
"Pencil": "Gredon",
|
||||||
|
"Scissors": "Cisèus intelligents",
|
||||||
|
"Lock": "Verrolhar",
|
||||||
|
"Key": "Clau",
|
||||||
|
"Telephone": "Telefòn",
|
||||||
|
"Trophy": "Trophy",
|
||||||
|
"Ball": "Balas",
|
||||||
|
"Anchor": "Ancorar",
|
||||||
|
"Headphones": "Escotadors",
|
||||||
|
"Folder": "Dorsièr",
|
||||||
|
"Pin": "Penjar",
|
||||||
|
"Upload": "Enviar",
|
||||||
|
"Show less": "Ne veire mens",
|
||||||
|
"Show more": "Ne veire mai",
|
||||||
|
"Current password": "Senhal actual",
|
||||||
|
"New Password": "Senhal novèl",
|
||||||
|
"Confirm password": "Confirmar lo senhal",
|
||||||
|
"Change Password": "Modificar senhal",
|
||||||
|
"not found": "pas trobat",
|
||||||
|
"exists": "existís",
|
||||||
|
"Authentication": "Autentificacion",
|
||||||
|
"ID": "ID",
|
||||||
|
"Manage": "Manage",
|
||||||
|
"Enable": "Activar",
|
||||||
|
"Restore from Backup": "Restablir a partir de l'archiu",
|
||||||
|
"Keywords": "Mots clau",
|
||||||
|
"Clear notifications": "Escafar",
|
||||||
|
"Off": "Atudat",
|
||||||
|
"Display Name": "Nom d'afichatge",
|
||||||
|
"Save": "Salvagardar",
|
||||||
|
"Disconnect": "Se desconnectar",
|
||||||
|
"Go back": "Precedent",
|
||||||
|
"Change": "Cambiar",
|
||||||
|
"Theme": "Tèma",
|
||||||
|
"Compact": "Ordenador",
|
||||||
|
"Success": "Succès",
|
||||||
|
"Profile": "Perfil",
|
||||||
|
"Account": "Compte",
|
||||||
|
"General": "General",
|
||||||
|
"Legal": "Legal",
|
||||||
|
"Credits": "Crèdits",
|
||||||
|
"FAQ": "FAQ",
|
||||||
|
"Keyboard Shortcuts": "Acorchis de clavièr",
|
||||||
|
"Versions": "Versions",
|
||||||
|
"Unsubscribe": "Se desabonar",
|
||||||
|
"Ignore": "Ignorar",
|
||||||
|
"Subscribe": "S'inscriure",
|
||||||
|
"Preferences": "Preferéncias",
|
||||||
|
"Composer": "Compositor",
|
||||||
|
"Timeline": "Axe temporal",
|
||||||
|
"Unignore": "Ignorar pas",
|
||||||
|
"Security & Privacy": "Seguretat e vida privada",
|
||||||
|
"Audio Output": "Sortida àudio",
|
||||||
|
"Microphone": "Microfòn",
|
||||||
|
"Camera": "Aparelh de fotografiar",
|
||||||
|
"Bridges": "Bridges",
|
||||||
|
"Sounds": "Sons",
|
||||||
|
"Reset": "Recomençar",
|
||||||
|
"Browse": "Percórrer",
|
||||||
|
"Unban": "Reabilitar",
|
||||||
|
"Permissions": "Permissions",
|
||||||
|
"Encryption": "Chiframent",
|
||||||
|
"Encrypted": "Chifrat",
|
||||||
|
"Complete": "Acabat",
|
||||||
|
"Revoke": "Revocar",
|
||||||
|
"Share": "Partiment",
|
||||||
|
"Add": "Ajustar",
|
||||||
|
"Phone Number": "Numèro de telefòn",
|
||||||
|
"Mod": "Moderador",
|
||||||
|
"Unencrypted": "Pas chifrat",
|
||||||
|
"Hangup": "Penjar",
|
||||||
|
"Italics": "Italicas",
|
||||||
|
"Strikethrough": "Raiat",
|
||||||
|
"Invites": "Convits",
|
||||||
|
"People": "Gent",
|
||||||
|
"Historical": "Istoric",
|
||||||
|
"Sign Up": "S’inscriure",
|
||||||
|
"Appearance": "Aparéncia",
|
||||||
|
"Sort by": "Triar per",
|
||||||
|
"Activity": "Activitat",
|
||||||
|
"A-Z": "A-Z",
|
||||||
|
"List options": "Opcions de lista",
|
||||||
|
"Favourite": "Favorit",
|
||||||
|
"Low Priority": "Prioritat bassa",
|
||||||
|
"Mark all as read": "Tot marcar coma legit",
|
||||||
|
"Members": "Participants",
|
||||||
|
"Trusted": "Fisable",
|
||||||
|
"Not trusted": "Pas securizat",
|
||||||
|
"Invite": "Convidar",
|
||||||
|
"Demote": "Retrogradar",
|
||||||
|
"Kick": "Forabandir",
|
||||||
|
"Ban": "Bandir",
|
||||||
|
"Are you sure?": "O volètz vertadièrament ?",
|
||||||
|
"Security": "Seguretat",
|
||||||
|
"Yes": "Òc",
|
||||||
|
"Got it": "Ai comprés",
|
||||||
|
"Sunday": "Dimenge",
|
||||||
|
"Monday": "Diluns",
|
||||||
|
"Tuesday": "Dimars",
|
||||||
|
"Wednesday": "Dimècres",
|
||||||
|
"Thursday": "Dijòus",
|
||||||
|
"Friday": "Divendres",
|
||||||
|
"Saturday": "Dissabte",
|
||||||
|
"Today": "Uèi",
|
||||||
|
"Yesterday": "Ièr",
|
||||||
|
"View Source": "Veire la font",
|
||||||
|
"Reply": "Respondre",
|
||||||
|
"Edit": "Editar",
|
||||||
|
"Attachment": "Pèça junta",
|
||||||
|
"Show image": "Afichar l'imatge",
|
||||||
|
"Show all": "O mostrar tot",
|
||||||
|
"Failed to copy": "Impossible de copiar",
|
||||||
|
"Smileys & People": "Emoticònas e personatges",
|
||||||
|
"Animals & Nature": "Animals e natura",
|
||||||
|
"Food & Drink": "Noiridura e bevenda",
|
||||||
|
"Activities": "Activitats",
|
||||||
|
"Travel & Places": "Viatges e luòcs",
|
||||||
|
"Objects": "Objèctes",
|
||||||
|
"Symbols": "Simbòls",
|
||||||
|
"Flags": "Marcadors",
|
||||||
|
"Categories": "Categorias",
|
||||||
|
"Cancel search": "Anullar la recèrca",
|
||||||
|
"More options": "Autras opcions",
|
||||||
|
"Join": "Jónher",
|
||||||
|
"No results": "Pas cap de resultat",
|
||||||
|
"Rotate Left": "Pivotar cap a èrra",
|
||||||
|
"Rotate Right": "Pivotar cap a drecha",
|
||||||
|
"Rotate clockwise": "Pivotar dins lo sens de las agulhas d'un relòtge",
|
||||||
|
"Add User": "Apondre un utilizaire",
|
||||||
|
"Matrix": "Matritz",
|
||||||
|
"Server name": "Títol del servidor",
|
||||||
|
"email address": "adreça de messatjariá",
|
||||||
|
"Notes": "Nòtas",
|
||||||
|
"Unavailable": "Pas disponible",
|
||||||
|
"Changelog": "Istoric dels cambiaments (Changelog)",
|
||||||
|
"Removing…": "Supression en cors…",
|
||||||
|
"Example": "Exemple",
|
||||||
|
"example": "exemple",
|
||||||
|
"Create": "Crear",
|
||||||
|
"Name": "Escais",
|
||||||
|
"Sign out": "Se desconnectar",
|
||||||
|
"Back": "Precedenta",
|
||||||
|
"Send": "Mandar",
|
||||||
|
"Toolbox": "Bóstia d'aisinas",
|
||||||
|
"Developer Tools": "Aisinas de desvolopament",
|
||||||
|
"An error has occurred.": "Una error s'es producha.",
|
||||||
|
"Suggestions": "Prepausicions",
|
||||||
|
"Go": "Validar",
|
||||||
|
"Session name": "Nom de session",
|
||||||
|
"Your password": "Vòstre senhal",
|
||||||
|
"Refresh": "Actualizada",
|
||||||
|
"Email address": "Adreça de corrièl",
|
||||||
|
"Skip": "Ignorar",
|
||||||
|
"Checking...": "Verificacion en cors...",
|
||||||
|
"Copy": "Copiar",
|
||||||
|
"Terms of Service": "Terms of Service",
|
||||||
|
"Service": "Servici",
|
||||||
|
"Summary": "Resumit",
|
||||||
|
"Document": "Document",
|
||||||
|
"Next": "Seguent",
|
||||||
|
"Upload files": "Mandar de fichièrs",
|
||||||
|
"Allow": "Autorizar",
|
||||||
|
"Deny": "Refusar",
|
||||||
|
"Custom": "Personalizada",
|
||||||
|
"Address (optional)": "Adreça (opcionala)",
|
||||||
|
"Leave": "Quitar",
|
||||||
|
"Forget": "Doblidar",
|
||||||
|
"Hide": "Amagar",
|
||||||
|
"Home": "Dorsièr personal",
|
||||||
|
"Sign in": "Connexion",
|
||||||
|
"Reload": "Tornar cargar",
|
||||||
|
"Away": "Absent",
|
||||||
|
"Submit": "Mandar",
|
||||||
|
"Enter password": "Sasissètz lo senhal",
|
||||||
|
"Email": "Corrièl",
|
||||||
|
"Username": "Nom d'_utilizaire",
|
||||||
|
"Phone": "Telefòn",
|
||||||
|
"Passwords don't match": "Los senhals correspondon pas",
|
||||||
|
"Register": "S'enregistrar",
|
||||||
|
"Free": "Liure",
|
||||||
|
"Premium": "De la melhora qualitat",
|
||||||
|
"Everyone": "Tot lo monde",
|
||||||
|
"Description": "descripcion",
|
||||||
|
"Unknown error": "Error desconeguda",
|
||||||
|
"Logout": "Desconnexion",
|
||||||
|
"Preview": "Apercebut",
|
||||||
|
"View": "Visualizacion",
|
||||||
|
"Search failed": "La recèrca a fracassat",
|
||||||
|
"Room": "Sala",
|
||||||
|
"Feedback": "Comentaris",
|
||||||
|
"Incorrect password": "Senhal incorrècte",
|
||||||
|
"Commands": "Comandas",
|
||||||
|
"Emoji": "Emoji",
|
||||||
|
"Users": "Utilizaires",
|
||||||
|
"Export": "Exportar",
|
||||||
|
"Import": "Importar",
|
||||||
|
"Restore": "Restablir",
|
||||||
|
"Download": "Telecargament",
|
||||||
|
"Retry": "Tornar ensajar",
|
||||||
|
"Success!": "Capitada !",
|
||||||
|
"Navigation": "Navigacion",
|
||||||
|
"Alt": "Alt",
|
||||||
|
"Alt Gr": "Alt Gr",
|
||||||
|
"Shift": "Descalatge",
|
||||||
|
"Super": "Super",
|
||||||
|
"Ctrl": "Ctrl",
|
||||||
|
"Upload a file": "Actualizar un fichièr",
|
||||||
|
"Page Up": "Pagina precedenta",
|
||||||
|
"Page Down": "Pagina seguenta",
|
||||||
|
"Esc": "Escap",
|
||||||
|
"Enter": "Entrada",
|
||||||
|
"Space": "Espaci",
|
||||||
|
"End": "Fin"
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"Current password": "Senha atual",
|
"Current password": "Senha atual",
|
||||||
"Deactivate Account": "Desativar minha conta",
|
"Deactivate Account": "Desativar minha conta",
|
||||||
"Default": "Padrão",
|
"Default": "Padrão",
|
||||||
"Deops user with given id": "Retirar função de moderador do usuário com o identificador informado",
|
"Deops user with given id": "Retirar nível de moderador do usuário com o identificador informado",
|
||||||
"Displays action": "Visualizar atividades",
|
"Displays action": "Visualizar atividades",
|
||||||
"Emoji": "Emoji",
|
"Emoji": "Emoji",
|
||||||
"Error": "Erro",
|
"Error": "Erro",
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
"Historical": "Histórico",
|
"Historical": "Histórico",
|
||||||
"Homeserver is": "Servidor padrão é",
|
"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 e-mail",
|
"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",
|
"Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala",
|
||||||
"Invalid Email Address": "Endereço de e-mail inválido",
|
"Invalid Email Address": "Endereço de e-mail inválido",
|
||||||
"Invites": "Convidar",
|
"Invites": "Convidar",
|
||||||
|
@ -62,7 +62,7 @@
|
||||||
"Passwords can't be empty": "As senhas não podem estar em branco",
|
"Passwords can't be empty": "As senhas não podem estar em branco",
|
||||||
"Permissions": "Permissões",
|
"Permissions": "Permissões",
|
||||||
"Phone": "Telefone",
|
"Phone": "Telefone",
|
||||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, verifique o seu e-mail e clique no link enviado. Feito isso, clique em continuar.",
|
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, confirme o seu e-mail e clique no link enviado. Feito isso, clique em continuar.",
|
||||||
"Privileged Users": "Usuárias/os privilegiadas/os",
|
"Privileged Users": "Usuárias/os privilegiadas/os",
|
||||||
"Profile": "Perfil",
|
"Profile": "Perfil",
|
||||||
"Reject invitation": "Recusar o convite",
|
"Reject invitation": "Recusar o convite",
|
||||||
|
@ -85,20 +85,20 @@
|
||||||
"This room is not accessible by remote Matrix servers": "Esta sala não é acessível para servidores Matrix remotos",
|
"This room is not accessible by remote Matrix servers": "Esta sala não é acessível para servidores Matrix remotos",
|
||||||
"Unable to add email address": "Não foi possível adicionar um endereço de e-mail",
|
"Unable to add email address": "Não foi possível adicionar um endereço de e-mail",
|
||||||
"Unable to remove contact information": "Não foi possível remover informação de contato",
|
"Unable to remove contact information": "Não foi possível remover informação de contato",
|
||||||
"Unable to verify email address.": "Não foi possível verificar o endereço de e-mail.",
|
"Unable to verify email address.": "Não foi possível confirmar o endereço de e-mail.",
|
||||||
"Unban": "Remover banimento",
|
"Unban": "Remover banimento",
|
||||||
"unknown error code": "código de erro desconhecido",
|
"unknown error code": "código de erro desconhecido",
|
||||||
"Upload avatar": "Enviar uma foto de perfil",
|
"Upload avatar": "Enviar uma foto de perfil",
|
||||||
"Upload file": "Enviar arquivo",
|
"Upload file": "Enviar arquivo",
|
||||||
"Users": "Usuários",
|
"Users": "Usuários",
|
||||||
"Verification Pending": "Verificação pendente",
|
"Verification Pending": "Confirmação pendente",
|
||||||
"Video call": "Chamada de vídeo",
|
"Video call": "Chamada de vídeo",
|
||||||
"Voice call": "Chamada de voz",
|
"Voice call": "Chamada de voz",
|
||||||
"VoIP conference finished.": "Chamada em grupo encerrada.",
|
"VoIP conference finished.": "Chamada em grupo encerrada.",
|
||||||
"VoIP conference started.": "Chamada em grupo iniciada.",
|
"VoIP conference started.": "Chamada em grupo iniciada.",
|
||||||
"Who can access this room?": "Quem pode acessar esta sala?",
|
"Who can access this room?": "Quem pode acessar esta sala?",
|
||||||
"Who can read history?": "Quem pode ler o histórico da sala?",
|
"Who can read history?": "Quem pode ler o histórico da sala?",
|
||||||
"You do not have permission to post to this room": "Você não tem permissão de postar nesta sala",
|
"You do not have permission to post to this room": "Você não tem permissão para digitar nesta sala",
|
||||||
"You have no visible notifications": "Voce não possui notificações visíveis",
|
"You have no visible notifications": "Voce não possui notificações visíveis",
|
||||||
"Sun": "Dom",
|
"Sun": "Dom",
|
||||||
"Mon": "Seg",
|
"Mon": "Seg",
|
||||||
|
@ -135,7 +135,7 @@
|
||||||
"Existing Call": "Chamada em andamento",
|
"Existing Call": "Chamada em andamento",
|
||||||
"Failed to send email": "Não foi possível enviar e-mail",
|
"Failed to send email": "Não foi possível enviar e-mail",
|
||||||
"Failed to send request.": "Não foi possível mandar requisição.",
|
"Failed to send request.": "Não foi possível mandar requisição.",
|
||||||
"Failed to verify email address: make sure you clicked the link in the email": "Falha ao verificar o endereço de e-mail: certifique-se de clicar no link do e-mail",
|
"Failed to verify email address: make sure you clicked the link in the email": "Falha ao confirmar o endereço de e-mail: certifique-se de clicar no link do e-mail",
|
||||||
"Failure to create room": "Não foi possível criar a sala",
|
"Failure to create room": "Não foi possível criar a sala",
|
||||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s",
|
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s",
|
||||||
"%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.",
|
"%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.",
|
||||||
|
@ -156,7 +156,7 @@
|
||||||
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o nome e sobrenome (%(oldDisplayName)s).",
|
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o nome e sobrenome (%(oldDisplayName)s).",
|
||||||
"%(senderName)s removed their profile picture.": "%(senderName)s removeu a foto de perfil.",
|
"%(senderName)s removed their profile picture.": "%(senderName)s removeu a foto de perfil.",
|
||||||
"%(senderName)s requested a VoIP conference.": "%(senderName)s deseja iniciar uma chamada em grupo.",
|
"%(senderName)s requested a VoIP conference.": "%(senderName)s deseja iniciar uma chamada em grupo.",
|
||||||
"%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s não tem permissão para lhe enviar notificações - verifique as configurações do seu navegador",
|
"%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s não tem permissão para lhe enviar notificações - confirme as configurações do seu navegador",
|
||||||
"%(brand)s was not given permission to send notifications - please try again": "%(brand)s não tem permissão para lhe enviar notificações - tente novamente",
|
"%(brand)s was not given permission to send notifications - please try again": "%(brand)s não tem permissão para lhe enviar notificações - tente novamente",
|
||||||
"Room %(roomId)s not visible": "A sala %(roomId)s não está visível",
|
"Room %(roomId)s not visible": "A sala %(roomId)s não está visível",
|
||||||
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.",
|
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.",
|
||||||
|
@ -168,7 +168,7 @@
|
||||||
"The remote side failed to pick up": "A pessoa não atendeu a chamada",
|
"The remote side failed to pick up": "A pessoa não atendeu a chamada",
|
||||||
"This room is not recognised.": "Esta sala não é reconhecida.",
|
"This room is not recognised.": "Esta sala não é reconhecida.",
|
||||||
"This phone number is already in use": "Este número de telefone já está sendo usado",
|
"This phone number is already in use": "Este número de telefone já está sendo usado",
|
||||||
"To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, aguarde o carregamento dos resultados de autocompletar e então escolha entre as opções.",
|
"To use it, just wait for autocomplete results to load and tab through them.": "Para usar este recurso, aguarde o carregamento dos resultados de autocompletar e então escolha entre as opções.",
|
||||||
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s removeu o banimento de %(targetName)s.",
|
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s removeu o banimento de %(targetName)s.",
|
||||||
"Unable to capture screen": "Não foi possível capturar a imagem da tela",
|
"Unable to capture screen": "Não foi possível capturar a imagem da tela",
|
||||||
"Unable to enable Notifications": "Não foi possível ativar as notificações",
|
"Unable to enable Notifications": "Não foi possível ativar as notificações",
|
||||||
|
@ -217,7 +217,7 @@
|
||||||
"Failed to reject invite": "Não foi possível recusar o convite",
|
"Failed to reject invite": "Não foi possível recusar o convite",
|
||||||
"Failed to set display name": "Falha ao definir o nome e sobrenome",
|
"Failed to set display name": "Falha ao definir o nome e sobrenome",
|
||||||
"Fill screen": "Tela cheia",
|
"Fill screen": "Tela cheia",
|
||||||
"Incorrect verification code": "Código de verificação incorreto",
|
"Incorrect verification code": "Código de confirmação incorreto",
|
||||||
"Join Room": "Ingressar na sala",
|
"Join Room": "Ingressar na sala",
|
||||||
"Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.",
|
"Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.",
|
||||||
"Kick": "Remover da sala",
|
"Kick": "Remover da sala",
|
||||||
|
@ -285,7 +285,7 @@
|
||||||
"Add User": "Adicionar usuária(o)",
|
"Add User": "Adicionar usuária(o)",
|
||||||
"Custom Server Options": "Opções para Servidor Personalizado",
|
"Custom Server Options": "Opções para Servidor Personalizado",
|
||||||
"Dismiss": "Descartar",
|
"Dismiss": "Descartar",
|
||||||
"Please check your email to continue registration.": "Por favor, verifique o seu e-mail para continuar a inscrição.",
|
"Please check your email to continue registration.": "Por favor, confirme o seu e-mail para continuar a inscrição.",
|
||||||
"Token incorrect": "Token incorreto",
|
"Token incorrect": "Token incorreto",
|
||||||
"Please enter the code it contains:": "Por favor, entre com o código que está na mensagem:",
|
"Please enter the code it contains:": "Por favor, entre com o código que está na mensagem:",
|
||||||
"powered by Matrix": "oferecido por Matrix",
|
"powered by Matrix": "oferecido por Matrix",
|
||||||
|
@ -310,13 +310,13 @@
|
||||||
"Incorrect username and/or password.": "Nome de usuário e/ou senha incorreto.",
|
"Incorrect username and/or password.": "Nome de usuário e/ou senha incorreto.",
|
||||||
"Invited": "Convidada(o)",
|
"Invited": "Convidada(o)",
|
||||||
"Results from DuckDuckGo": "Resultados de DuckDuckGo",
|
"Results from DuckDuckGo": "Resultados de DuckDuckGo",
|
||||||
"Verified key": "Chave verificada",
|
"Verified key": "Chave confirmada",
|
||||||
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a foto da sala.",
|
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a foto da sala.",
|
||||||
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a foto da sala %(roomName)s",
|
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a foto da sala %(roomName)s",
|
||||||
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a foto da sala para <img/>",
|
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a foto da sala para <img/>",
|
||||||
"No Microphones detected": "Não foi detectado nenhum microfone",
|
"No Microphones detected": "Não foi detectado nenhum microfone",
|
||||||
"No Webcams detected": "Nenhuma câmera detectada",
|
"No Webcams detected": "Nenhuma câmera detectada",
|
||||||
"No media permissions": "Não há permissões de uso de vídeo/áudio no seu navegador",
|
"No media permissions": "Não tem permissões para acessar a mídia",
|
||||||
"You may need to manually permit %(brand)s to access your microphone/webcam": "Pode ser necessário permitir manualmente ao %(brand)s acessar seu microfone ou sua câmera",
|
"You may need to manually permit %(brand)s to access your microphone/webcam": "Pode ser necessário permitir manualmente ao %(brand)s acessar seu microfone ou sua câmera",
|
||||||
"Default Device": "Aparelho padrão",
|
"Default Device": "Aparelho padrão",
|
||||||
"Microphone": "Microfone",
|
"Microphone": "Microfone",
|
||||||
|
@ -338,7 +338,7 @@
|
||||||
"Uploading %(filename)s and %(count)s others|one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
|
"Uploading %(filename)s and %(count)s others|one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
|
||||||
"Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
|
"Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
|
||||||
"Username invalid: %(errMessage)s": "Nome de usuário inválido: %(errMessage)s",
|
"Username invalid: %(errMessage)s": "Nome de usuário inválido: %(errMessage)s",
|
||||||
"You must <a>register</a> to use this functionality": "Você deve <a>se registrar</a> para poder usar esta funcionalidade",
|
"You must <a>register</a> to use this functionality": "Você deve <a>se registrar</a> para usar este recurso",
|
||||||
"Create new room": "Criar nova sala",
|
"Create new room": "Criar nova sala",
|
||||||
"Room directory": "Lista pública de salas",
|
"Room directory": "Lista pública de salas",
|
||||||
"Start chat": "Iniciar conversa",
|
"Start chat": "Iniciar conversa",
|
||||||
|
@ -380,7 +380,7 @@
|
||||||
"(no answer)": "(sem resposta)",
|
"(no answer)": "(sem resposta)",
|
||||||
"(unknown failure: %(reason)s)": "(falha desconhecida: %(reason)s)",
|
"(unknown failure: %(reason)s)": "(falha desconhecida: %(reason)s)",
|
||||||
"Your browser does not support the required cryptography extensions": "O seu navegador não suporta as extensões de criptografia necessárias",
|
"Your browser does not support the required cryptography extensions": "O seu navegador não suporta as extensões de criptografia necessárias",
|
||||||
"Not a valid %(brand)s keyfile": "Não é um arquivo de chaves %(brand)s válido",
|
"Not a valid %(brand)s keyfile": "Não é um arquivo de chave válido do %(brand)s",
|
||||||
"Authentication check failed: incorrect password?": "Falha ao checar a autenticação: senha incorreta?",
|
"Authentication check failed: incorrect password?": "Falha ao checar a autenticação: senha incorreta?",
|
||||||
"Do you want to set an email address?": "Você deseja definir um endereço de e-mail?",
|
"Do you want to set an email address?": "Você deseja definir um endereço de e-mail?",
|
||||||
"This will allow you to reset your password and receive notifications.": "Isso permitirá que você redefina sua senha e receba notificações.",
|
"This will allow you to reset your password and receive notifications.": "Isso permitirá que você redefina sua senha e receba notificações.",
|
||||||
|
@ -394,7 +394,7 @@
|
||||||
"Failed to invite the following users to %(groupId)s:": "Falha ao convidar os seguintes usuários para %(groupId)s:",
|
"Failed to invite the following users to %(groupId)s:": "Falha ao convidar os seguintes usuários para %(groupId)s:",
|
||||||
"Failed to add the following rooms to %(groupId)s:": "Falha ao adicionar as seguintes salas em %(groupId)s:",
|
"Failed to add the following rooms to %(groupId)s:": "Falha ao adicionar as seguintes salas em %(groupId)s:",
|
||||||
"You are not in this room.": "Você não está nesta sala.",
|
"You are not in this room.": "Você não está nesta sala.",
|
||||||
"You do not have permission to do that in this room.": "Você não tem permissão para fazer isto nesta sala.",
|
"You do not have permission to do that in this room.": "Você não tem permissão para fazer isso nesta sala.",
|
||||||
"Ignored user": "Usuário bloqueado",
|
"Ignored user": "Usuário bloqueado",
|
||||||
"You are no longer ignoring %(userId)s": "Você não está mais bloqueando %(userId)s",
|
"You are no longer ignoring %(userId)s": "Você não está mais bloqueando %(userId)s",
|
||||||
"Edit": "Editar",
|
"Edit": "Editar",
|
||||||
|
@ -449,8 +449,8 @@
|
||||||
"Jump to read receipt": "Ir para a confirmação de leitura",
|
"Jump to read receipt": "Ir para a confirmação de leitura",
|
||||||
"Mention": "Mencionar",
|
"Mention": "Mencionar",
|
||||||
"Invite": "Convidar",
|
"Invite": "Convidar",
|
||||||
"Send an encrypted reply…": "Enviar uma resposta criptografada…",
|
"Send an encrypted reply…": "Digite sua resposta criptografada…",
|
||||||
"Send an encrypted message…": "Enviar mensagem criptografada…",
|
"Send an encrypted message…": "Digite uma mensagem criptografada…",
|
||||||
"Jump to message": "Pular para mensagem",
|
"Jump to message": "Pular para mensagem",
|
||||||
"No pinned messages.": "Não há mensagens fixas.",
|
"No pinned messages.": "Não há mensagens fixas.",
|
||||||
"Loading...": "Carregando...",
|
"Loading...": "Carregando...",
|
||||||
|
@ -464,14 +464,14 @@
|
||||||
"Offline for %(duration)s": "Desconectado há %(duration)s",
|
"Offline for %(duration)s": "Desconectado há %(duration)s",
|
||||||
"Unknown for %(duration)s": "Status desconhecido há %(duration)s",
|
"Unknown for %(duration)s": "Status desconhecido há %(duration)s",
|
||||||
"Unknown": "Desconhecido",
|
"Unknown": "Desconhecido",
|
||||||
"Replying": "Respondendo",
|
"Replying": "Em resposta a",
|
||||||
"No rooms to show": "Nenhuma sala para mostrar",
|
"No rooms to show": "Nenhuma sala para mostrar",
|
||||||
"Unnamed room": "Sala sem nome",
|
"Unnamed room": "Sala sem nome",
|
||||||
"World readable": "Aberto publicamente à leitura",
|
"World readable": "Aberto publicamente à leitura",
|
||||||
"Guests can join": "Convidadas/os podem entrar",
|
"Guests can join": "Convidadas/os podem entrar",
|
||||||
"Community Invites": "Convites a comunidades",
|
"Community Invites": "Convites a comunidades",
|
||||||
"Banned by %(displayName)s": "Banido por %(displayName)s",
|
"Banned by %(displayName)s": "Banido por %(displayName)s",
|
||||||
"Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas em %(domain)s's?",
|
"Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas da %(domain)s?",
|
||||||
"Members only (since the point in time of selecting this option)": "Apenas integrantes (a partir do momento em que esta opção for selecionada)",
|
"Members only (since the point in time of selecting this option)": "Apenas integrantes (a partir do momento em que esta opção for selecionada)",
|
||||||
"Members only (since they were invited)": "Apenas integrantes (desde que foram convidadas/os)",
|
"Members only (since they were invited)": "Apenas integrantes (desde que foram convidadas/os)",
|
||||||
"Members only (since they joined)": "Apenas integrantes (desde que entraram na sala)",
|
"Members only (since they joined)": "Apenas integrantes (desde que entraram na sala)",
|
||||||
|
@ -640,7 +640,7 @@
|
||||||
"Failed to set direct chat tag": "Falha ao definir esta conversa como direta",
|
"Failed to set direct chat tag": "Falha ao definir esta conversa como direta",
|
||||||
"Failed to remove tag %(tagName)s from room": "Falha ao remover a tag %(tagName)s da sala",
|
"Failed to remove tag %(tagName)s from room": "Falha ao remover a tag %(tagName)s da sala",
|
||||||
"Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala",
|
"Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala",
|
||||||
"Did you know: you can use communities to filter your %(brand)s experience!": "Você sabia? Você pode usar as comunidades para filtrar a sua experiência no %(brand)s!",
|
"Did you know: you can use communities to filter your %(brand)s experience!": "Você sabia? Você pode usar comunidades para filtrar a sua experiência no %(brand)s!",
|
||||||
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para criar um filtro, arraste a foto de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na foto de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade.",
|
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para criar um filtro, arraste a foto de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na foto de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade.",
|
||||||
"Key request sent.": "Requisição de chave enviada.",
|
"Key request sent.": "Requisição de chave enviada.",
|
||||||
"Fetching third party location failed": "Falha ao acessar a localização de terceiros",
|
"Fetching third party location failed": "Falha ao acessar a localização de terceiros",
|
||||||
|
@ -677,7 +677,7 @@
|
||||||
"Please set a password!": "Por favor, defina uma senha!",
|
"Please set a password!": "Por favor, defina uma senha!",
|
||||||
"You have successfully set a password!": "Você definiu sua senha com sucesso!",
|
"You have successfully set a password!": "Você definiu sua senha com sucesso!",
|
||||||
"An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao salvar sua configuração de notificações por e-mail.",
|
"An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao salvar sua configuração de notificações por e-mail.",
|
||||||
"Explore Room State": "Explorar Estado da Sala",
|
"Explore Room State": "Explorar estado da sala",
|
||||||
"Source URL": "Link do código-fonte",
|
"Source URL": "Link do código-fonte",
|
||||||
"Messages sent by bot": "Mensagens enviadas por bots",
|
"Messages sent by bot": "Mensagens enviadas por bots",
|
||||||
"Filter results": "Filtrar resultados",
|
"Filter results": "Filtrar resultados",
|
||||||
|
@ -696,9 +696,9 @@
|
||||||
"Search…": "Buscar…",
|
"Search…": "Buscar…",
|
||||||
"You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!",
|
"You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!",
|
||||||
"Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
|
"Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
|
||||||
"%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "O %(brand)s usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.",
|
"%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s usa muitos recursos avançados, e alguns deles não estão disponíveis ou ainda são experimentais no seu navegador de internet atual.",
|
||||||
"Developer Tools": "Ferramentas do desenvolvedor",
|
"Developer Tools": "Ferramentas do desenvolvedor",
|
||||||
"Explore Account Data": "Explorar Dados da Conta",
|
"Explore Account Data": "Explorar dados da conta",
|
||||||
"Remove from Directory": "Remover da lista pública de salas",
|
"Remove from Directory": "Remover da lista pública de salas",
|
||||||
"Saturday": "Sábado",
|
"Saturday": "Sábado",
|
||||||
"Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se: você pode sempre definir um endereço de e-mail nas configurações de usuário, se mudar de ideia.",
|
"Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se: você pode sempre definir um endereço de e-mail nas configurações de usuário, se mudar de ideia.",
|
||||||
|
@ -736,7 +736,7 @@
|
||||||
"Show message in desktop notification": "Mostrar a mensagem na notificação da área de trabalho",
|
"Show message in desktop notification": "Mostrar a mensagem na notificação da área de trabalho",
|
||||||
"Unhide Preview": "Mostrar a pré-visualização",
|
"Unhide Preview": "Mostrar a pré-visualização",
|
||||||
"Unable to join network": "Não foi possível conectar na rede",
|
"Unable to join network": "Não foi possível conectar na rede",
|
||||||
"Sorry, your browser is <b>not</b> able to run %(brand)s.": "Perdão. O seu navegador <b>não</b> é capaz de rodar o %(brand)s.",
|
"Sorry, your browser is <b>not</b> able to run %(brand)s.": "Infelizmente, o seu navegador <b>não</b> é capaz de rodar o %(brand)s.",
|
||||||
"Messages in group chats": "Mensagens em salas",
|
"Messages in group chats": "Mensagens em salas",
|
||||||
"Yesterday": "Ontem",
|
"Yesterday": "Ontem",
|
||||||
"Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).",
|
"Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).",
|
||||||
|
@ -758,7 +758,7 @@
|
||||||
"Event Content": "Conteúdo do Evento",
|
"Event Content": "Conteúdo do Evento",
|
||||||
"Thank you!": "Obrigado!",
|
"Thank you!": "Obrigado!",
|
||||||
"Quote": "Citar",
|
"Quote": "Citar",
|
||||||
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!",
|
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e alguns dos recursos poderão não funcionar. Você ainda pode prosseguir, mas estará sozinho diante de problemas que possam surgir!",
|
||||||
"Checking for an update...": "Verificando se há atualizações...",
|
"Checking for an update...": "Verificando se há atualizações...",
|
||||||
"Every page you use in the app": "Toda a página que você usa no aplicativo",
|
"Every page you use in the app": "Toda a página que você usa no aplicativo",
|
||||||
"e.g. <CurrentPageURL>": "por exemplo: <CurrentPageURL>",
|
"e.g. <CurrentPageURL>": "por exemplo: <CurrentPageURL>",
|
||||||
|
@ -766,9 +766,9 @@
|
||||||
"Call in Progress": "Chamada em andamento",
|
"Call in Progress": "Chamada em andamento",
|
||||||
"A call is currently being placed!": "Uma chamada já está em andamento!",
|
"A call is currently being placed!": "Uma chamada já está em andamento!",
|
||||||
"A call is already in progress!": "Uma chamada já está em andamento!",
|
"A call is already in progress!": "Uma chamada já está em andamento!",
|
||||||
"Permission Required": "Permissão Exigida",
|
"Permission Required": "Permissão necessária",
|
||||||
"You do not have permission to start a conference call in this room": "Você não tem permissão para iniciar uma chamada em grupo nesta sala",
|
"You do not have permission to start a conference call in this room": "Você não tem permissão para iniciar uma chamada em grupo nesta sala",
|
||||||
"Unable to load! Check your network connectivity and try again.": "Incapaz de carregar! Verifique sua conectividade de rede e tente novamente.",
|
"Unable to load! Check your network connectivity and try again.": "Não foi possível carregar! Verifique sua conexão de rede e tente novamente.",
|
||||||
"Failed to invite users to the room:": "Não foi possível convidar usuários para a sala:",
|
"Failed to invite users to the room:": "Não foi possível convidar usuários para a sala:",
|
||||||
"Missing roomId.": "RoomId ausente.",
|
"Missing roomId.": "RoomId ausente.",
|
||||||
"Opens the Developer Tools dialog": "Abre a caixa de diálogo Ferramentas do desenvolvedor",
|
"Opens the Developer Tools dialog": "Abre a caixa de diálogo Ferramentas do desenvolvedor",
|
||||||
|
@ -867,7 +867,7 @@
|
||||||
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Os registros de depuração contêm dados de uso do aplicativo, incluindo seu nome de usuário, os IDs ou aliases das salas ou comunidades que você visitou e os nomes de usuários de outros usuários. Eles não contêm mensagens.",
|
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Os registros de depuração contêm dados de uso do aplicativo, incluindo seu nome de usuário, os IDs ou aliases das salas ou comunidades que você visitou e os nomes de usuários de outros usuários. Eles não contêm mensagens.",
|
||||||
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Antes de enviar os registros, você deve <a>criar um bilhete de erro no GitHub</a> para descrever seu problema.",
|
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Antes de enviar os registros, você deve <a>criar um bilhete de erro no GitHub</a> para descrever seu problema.",
|
||||||
"Unable to load commit detail: %(msg)s": "Não é possível carregar os detalhes do commit: %(msg)s",
|
"Unable to load commit detail: %(msg)s": "Não é possível carregar os detalhes do commit: %(msg)s",
|
||||||
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Para evitar perder seu histórico de bate-papo, você deve exportar as chaves da sua sala antes de se desconectar. Para fazer isso, você precisará retornar na versão mais atual do %(brand)s",
|
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Para evitar perder seu histórico de bate-papo, você precisa exportar as chaves da sua sala antes de se desconectar. Quando entrar novamente, você precisará usar a versão mais atual do %(brand)s",
|
||||||
"Incompatible Database": "Banco de dados incompatível",
|
"Incompatible Database": "Banco de dados incompatível",
|
||||||
"Continue With Encryption Disabled": "Continuar com criptografia desativada",
|
"Continue With Encryption Disabled": "Continuar com criptografia desativada",
|
||||||
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Isso tornará sua conta permanentemente inutilizável. Você não poderá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta deixe todas as salas nas quais está participando e removerá os detalhes da sua conta do seu servidor de identidade. <b>Esta ação é irreversível.</ b>",
|
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Isso tornará sua conta permanentemente inutilizável. Você não poderá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta deixe todas as salas nas quais está participando e removerá os detalhes da sua conta do seu servidor de identidade. <b>Esta ação é irreversível.</ b>",
|
||||||
|
@ -877,16 +877,16 @@
|
||||||
"To continue, please enter your password:": "Para continuar, por favor digite sua senha:",
|
"To continue, please enter your password:": "Para continuar, por favor digite sua senha:",
|
||||||
"Incompatible local cache": "Cache local incompatível",
|
"Incompatible local cache": "Cache local incompatível",
|
||||||
"Clear cache and resync": "Limpar cache e ressincronizar",
|
"Clear cache and resync": "Limpar cache e ressincronizar",
|
||||||
"%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s agora usa 3-5x menos memória, pois carrega informação sobre outros usuários apenas quando for necessário. Por favor, aguarde enquanto ressincronizamos com o servidor!",
|
"%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s agora usa de 3 a 5 vezes menos memória, pois carrega as informações dos outros usuários apenas quando for necessário. Por favor, aguarde enquanto ressincronizamos com o servidor!",
|
||||||
"Updating %(brand)s": "Atualizando %(brand)s",
|
"Updating %(brand)s": "Atualizando o %(brand)s",
|
||||||
"Failed to upgrade room": "Falha ao atualizar a sala",
|
"Failed to upgrade room": "Falha ao atualizar a sala",
|
||||||
"The room upgrade could not be completed": "A atualização da sala não pode ser completada",
|
"The room upgrade could not be completed": "A atualização da sala não pode ser completada",
|
||||||
"Upgrade this room to version %(version)s": "Atualize essa sala para versão %(version)s",
|
"Upgrade this room to version %(version)s": "Atualize essa sala para versão %(version)s",
|
||||||
"Upgrade Room Version": "Atualize a Versão da Sala",
|
"Upgrade Room Version": "Atualize a Versão da Sala",
|
||||||
"Create a new room with the same name, description and avatar": "Criar uma nova sala com o mesmo nome, descrição e foto",
|
"Create a new room with the same name, description and avatar": "Criar uma nova sala com o mesmo nome, descrição e foto",
|
||||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Impedir usuários de conversar na versão antiga da sala e postar uma mensagem aconselhando os usuários a migrarem para a nova sala",
|
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Impeça os usuários de conversarem na versão antiga da sala. Além disso, digite uma mensagem aconselhando os usuários a migrarem para a nova sala",
|
||||||
"Put a link back to the old room at the start of the new room so people can see old messages": "Colocar um link para a sala antiga no começo da sala nova de modo que as pessoas possam ver mensagens antigas",
|
"Put a link back to the old room at the start of the new room so people can see old messages": "Colocar um link para a sala antiga no começo da sala nova de modo que as pessoas possam ver mensagens antigas",
|
||||||
"You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Você já usou o %(brand)s em %(host)s com o carregamento Lazy de membros ativado. Nesta versão, o carregamento Lazy está desativado. Como o cache local não é compatível entre essas duas configurações, a %(brand)s precisa ressincronizar sua conta.",
|
"You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Você já usou o %(brand)s em %(host)s com o carregamento Lazy de membros ativado. Nesta versão, o carregamento Lazy está desativado. Como o cache local não é compatível entre essas duas configurações, o %(brand)s precisa ressincronizar sua conta.",
|
||||||
"If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Se a outra versão do %(brand)s ainda estiver aberta em outra aba, por favor, feche-a pois usar o %(brand)s no mesmo host com o carregamento Lazy ativado e desativado simultaneamente causará problemas.",
|
"If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Se a outra versão do %(brand)s ainda estiver aberta em outra aba, por favor, feche-a pois usar o %(brand)s no mesmo host com o carregamento Lazy ativado e desativado simultaneamente causará problemas.",
|
||||||
"Update any local room aliases to point to the new room": "Atualize todos os aliases da sala local para apontar para a nova sala",
|
"Update any local room aliases to point to the new room": "Atualize todos os aliases da sala local para apontar para a nova sala",
|
||||||
"Clear Storage and Sign Out": "Limpar armazenamento e sair",
|
"Clear Storage and Sign Out": "Limpar armazenamento e sair",
|
||||||
|
@ -907,7 +907,7 @@
|
||||||
"Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Acesse seu histórico de mensagens seguras e configure mensagens seguras digitando sua frase secreta de recuperação.",
|
"Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Acesse seu histórico de mensagens seguras e configure mensagens seguras digitando sua frase secreta de recuperação.",
|
||||||
"Next": "Próximo",
|
"Next": "Próximo",
|
||||||
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "Se você esqueceu sua frase secreta de recuperação, você pode <button1>usar sua chave de recuperação</button1> ou <button2>configurar novas opções de recuperação</button2>",
|
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "Se você esqueceu sua frase secreta de recuperação, você pode <button1>usar sua chave de recuperação</button1> ou <button2>configurar novas opções de recuperação</button2>",
|
||||||
"This looks like a valid recovery key!": "Isso parece uma chave de recuperação válida!",
|
"This looks like a valid recovery key!": "A chave de recuperação está correta!",
|
||||||
"Not a valid recovery key": "Não é uma chave de recuperação válida",
|
"Not a valid recovery key": "Não é uma chave de recuperação válida",
|
||||||
"Access your secure message history and set up secure messaging by entering your recovery key.": "Acesse seu histórico seguro de mensagens e configure mensagens seguras inserindo sua chave de recuperação.",
|
"Access your secure message history and set up secure messaging by entering your recovery key.": "Acesse seu histórico seguro de mensagens e configure mensagens seguras inserindo sua chave de recuperação.",
|
||||||
"Share Message": "Compartilhar Mensagem",
|
"Share Message": "Compartilhar Mensagem",
|
||||||
|
@ -984,28 +984,28 @@
|
||||||
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s tornou a sala disponível apenas por convite.",
|
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s tornou a sala disponível apenas por convite.",
|
||||||
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s alterou a regra de entrada para %(rule)s",
|
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s alterou a regra de entrada para %(rule)s",
|
||||||
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s permitiu que os convidados entrem na sala.",
|
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s permitiu que os convidados entrem na sala.",
|
||||||
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s impediu que os convidados entrassem na sala.",
|
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s impediu que convidados entrassem na sala.",
|
||||||
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s alterou a permissão de acesso de convidados para %(rule)s",
|
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s alterou a permissão de acesso de convidados para %(rule)s",
|
||||||
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(groups)s nesta sala.",
|
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(groups)s nesta sala.",
|
||||||
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s desativou o ícone de %(groups)s nesta sala.",
|
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s desativou o ícone de %(groups)s nesta sala.",
|
||||||
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(newGroups)s e desativou o ícone de %(oldGroups)s nesta sala.",
|
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(newGroups)s e desativou o ícone de %(oldGroups)s nesta sala.",
|
||||||
"%(displayName)s is typing …": "%(displayName)s está digitando…",
|
"%(displayName)s is typing …": "%(displayName)s está digitando…",
|
||||||
"%(names)s and %(count)s others are typing …|other": "%(names)s e %(count)s outras pessoas estão digitando…",
|
"%(names)s and %(count)s others are typing …|other": "%(names)s e %(count)s outras pessoas estão digitando…",
|
||||||
"%(names)s and %(count)s others are typing …|one": "%(names)s e outro está digitando …",
|
"%(names)s and %(count)s others are typing …|one": "%(names)s e outra pessoa estão digitando…",
|
||||||
"%(names)s and %(lastPerson)s are typing …": "%(names)s e %(lastPerson)s estão digitando…",
|
"%(names)s and %(lastPerson)s are typing …": "%(names)s e %(lastPerson)s estão digitando…",
|
||||||
"Show read receipts sent by other users": "Mostrar confirmações de leitura enviadas por outros usuários",
|
"Show read receipts sent by other users": "Mostrar confirmações de leitura enviadas por outros usuários",
|
||||||
"Show avatars in user and room mentions": "Mostrar fotos de perfil em menções de usuários e de salas",
|
"Show avatars in user and room mentions": "Mostrar fotos de perfil em menções de usuários e de salas",
|
||||||
"Enable big emoji in chat": "Ativar emojis grandes no bate-papo",
|
"Enable big emoji in chat": "Ativar emojis grandes no bate-papo",
|
||||||
"Send typing notifications": "Enviar notificações de digitação",
|
"Send typing notifications": "Permitir que saibam quando eu estiver digitando",
|
||||||
"Enable Community Filter Panel": "Ativar o painel de comunidades",
|
"Enable Community Filter Panel": "Ativar o painel de comunidades",
|
||||||
"Allow Peer-to-Peer for 1:1 calls": "Permitir Peer-to-Peer para chamadas 1:1",
|
"Allow Peer-to-Peer for 1:1 calls": "Permitir Peer-to-Peer para chamadas 1:1",
|
||||||
"Messages containing my username": "Mensagens contendo meu nome de usuário",
|
"Messages containing my username": "Mensagens contendo meu nome de usuário",
|
||||||
"The other party cancelled the verification.": "Seu contato cancelou a verificação.",
|
"The other party cancelled the verification.": "Seu contato cancelou a confirmação.",
|
||||||
"Verified!": "Verificado!",
|
"Verified!": "Confirmado!",
|
||||||
"You've successfully verified this user.": "Você confirmou este usuário com sucesso.",
|
"You've successfully verified this user.": "Você confirmou este usuário com sucesso.",
|
||||||
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "As mensagens com este usuário estão protegidas com a criptografia de ponta a ponta e não podem ser lidas por terceiros.",
|
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "As mensagens com este usuário estão protegidas com a criptografia de ponta a ponta e não podem ser lidas por terceiros.",
|
||||||
"Got It": "Ok, entendi",
|
"Got It": "Ok, entendi",
|
||||||
"Unable to find a supported verification method.": "Não é possível encontrar um método de confirmação suportado.",
|
"Unable to find a supported verification method.": "Não há um método de confirmação suportado.",
|
||||||
"Dog": "Cachorro",
|
"Dog": "Cachorro",
|
||||||
"Cat": "Gato",
|
"Cat": "Gato",
|
||||||
"Lion": "Leão",
|
"Lion": "Leão",
|
||||||
|
@ -1046,8 +1046,8 @@
|
||||||
"User %(userId)s is already in the room": "O usuário %(userId)s já está na sala",
|
"User %(userId)s is already in the room": "O usuário %(userId)s já está na sala",
|
||||||
"The user must be unbanned before they can be invited.": "O banimento do usuário precisa ser removido antes de ser convidado.",
|
"The user must be unbanned before they can be invited.": "O banimento do usuário precisa ser removido antes de ser convidado.",
|
||||||
"Show display name changes": "Mostrar alterações de nome e sobrenome",
|
"Show display name changes": "Mostrar alterações de nome e sobrenome",
|
||||||
"Verify this user by confirming the following emoji appear on their screen.": "Verifique este usuário confirmando os emojis a seguir exibidos na tela dele.",
|
"Verify this user by confirming the following emoji appear on their screen.": "Confirme este usuário confirmando os emojis a seguir exibidos na tela dele.",
|
||||||
"Verify this user by confirming the following number appears on their screen.": "Confirme este usuário confirmando se o número a seguir aparece na tela dele.",
|
"Verify this user by confirming the following number appears on their screen.": "Confirme este usuário, comparando os números a seguir que serão exibidos na sua e na tela dele.",
|
||||||
"Thumbs up": "Joinha",
|
"Thumbs up": "Joinha",
|
||||||
"Umbrella": "Guarda-chuva",
|
"Umbrella": "Guarda-chuva",
|
||||||
"Hourglass": "Ampulheta",
|
"Hourglass": "Ampulheta",
|
||||||
|
@ -1087,8 +1087,8 @@
|
||||||
"All keys backed up": "O Backup de todas as chaves foi realizado",
|
"All keys backed up": "O Backup de todas as chaves foi realizado",
|
||||||
"Start using Key Backup": "Comece a usar o Backup de chave",
|
"Start using Key Backup": "Comece a usar o Backup de chave",
|
||||||
"Add an email address to configure email notifications": "Adicione um endereço de e-mail para configurar notificações por e-mail",
|
"Add an email address to configure email notifications": "Adicione um endereço de e-mail para configurar notificações por e-mail",
|
||||||
"Unable to verify phone number.": "Não é possível verificar o número de telefone.",
|
"Unable to verify phone number.": "Não foi possível confirmar o número de telefone.",
|
||||||
"Verification code": "Código de verificação",
|
"Verification code": "Código de confirmação",
|
||||||
"Phone Number": "Número de telefone",
|
"Phone Number": "Número de telefone",
|
||||||
"Profile picture": "Foto de perfil",
|
"Profile picture": "Foto de perfil",
|
||||||
"<a>Upgrade</a> to your own domain": "<a>Atualize</a> para seu próprio domínio",
|
"<a>Upgrade</a> to your own domain": "<a>Atualize</a> para seu próprio domínio",
|
||||||
|
@ -1101,7 +1101,7 @@
|
||||||
"Deactivating your account is a permanent action - be careful!": "Desativar sua conta é uma ação permanente - tenha cuidado!",
|
"Deactivating your account is a permanent action - be careful!": "Desativar sua conta é uma ação permanente - tenha cuidado!",
|
||||||
"General": "Geral",
|
"General": "Geral",
|
||||||
"Credits": "Créditos",
|
"Credits": "Créditos",
|
||||||
"For help with using %(brand)s, click <a>here</a>.": "Para ajuda com o uso do %(brand)s, clique <a>aqui</a>.",
|
"For help with using %(brand)s, click <a>here</a>.": "Para obter ajuda com o uso do %(brand)s, clique <a>aqui</a>.",
|
||||||
"For help with using %(brand)s, click <a>here</a> or start a chat with our bot using the button below.": "Para obter ajuda com o uso do %(brand)s, clique <a>aqui</a> ou inicie um bate-papo com nosso bot usando o botão abaixo.",
|
"For help with using %(brand)s, click <a>here</a> or start a chat with our bot using the button below.": "Para obter ajuda com o uso do %(brand)s, clique <a>aqui</a> ou inicie um bate-papo com nosso bot usando o botão abaixo.",
|
||||||
"Chat with %(brand)s Bot": "Converse com o bot do %(brand)s",
|
"Chat with %(brand)s Bot": "Converse com o bot do %(brand)s",
|
||||||
"Help & About": "Ajuda & Sobre",
|
"Help & About": "Ajuda & Sobre",
|
||||||
|
@ -1146,9 +1146,9 @@
|
||||||
"Add Email Address": "Adicionar endereço de e-mail",
|
"Add Email Address": "Adicionar endereço de e-mail",
|
||||||
"Confirm adding phone number": "Confirmar adição de número de telefone",
|
"Confirm adding phone number": "Confirmar adição de número de telefone",
|
||||||
"Add Phone Number": "Adicionar número de telefone",
|
"Add Phone Number": "Adicionar número de telefone",
|
||||||
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Se estiver usando %(brand)s em um aparelho onde touch é o mecanismo primário de entrada de dados",
|
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Se estiver usando o %(brand)s em um aparelho onde a tela principal é touch",
|
||||||
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Se você está usando ou não o recurso 'breadcrumbs' (fotos acima da lista de salas)",
|
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Se você está usando ou não o recurso 'breadcrumbs' (fotos acima da lista de salas)",
|
||||||
"Whether you're using %(brand)s as an installed Progressive Web App": "Se estiver usando %(brand)s como uma Progressive Web App (PWA)",
|
"Whether you're using %(brand)s as an installed Progressive Web App": "Se estiver usando o %(brand)s como um Progressive Web App (PWA)",
|
||||||
"Your user agent": "Seu agente de usuária(o)",
|
"Your user agent": "Seu agente de usuária(o)",
|
||||||
"Call failed due to misconfigured server": "A chamada falhou por conta de má configuração no servidor",
|
"Call failed due to misconfigured server": "A chamada falhou por conta de má configuração no servidor",
|
||||||
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Por favor, peça ao administrador do seu servidor (<code>%(homeserverDomain)s</code>) para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável.",
|
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Por favor, peça ao administrador do seu servidor (<code>%(homeserverDomain)s</code>) para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável.",
|
||||||
|
@ -1168,7 +1168,7 @@
|
||||||
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Esta ação requer acesso ao servidor de identidade padrão <server /> para poder validar um endereço de e-mail ou número de telefone, mas este servidor não tem nenhum termo de uso.",
|
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Esta ação requer acesso ao servidor de identidade padrão <server /> para poder validar um endereço de e-mail ou número de telefone, mas este servidor não tem nenhum termo de uso.",
|
||||||
"Only continue if you trust the owner of the server.": "Continue apenas se você confia em quem possui este servidor.",
|
"Only continue if you trust the owner of the server.": "Continue apenas se você confia em quem possui este servidor.",
|
||||||
"Trust": "Confiança",
|
"Trust": "Confiança",
|
||||||
"%(name)s is requesting verification": "%(name)s está solicitando verificação",
|
"%(name)s is requesting verification": "%(name)s está solicitando confirmação",
|
||||||
"Use your account to sign in to the latest version": "Use sua conta para logar na última versão",
|
"Use your account to sign in to the latest version": "Use sua conta para logar na última versão",
|
||||||
"We’re excited to announce Riot is now Element": "Estamos muito felizes em anunciar que Riot agora é Element",
|
"We’re excited to announce Riot is now Element": "Estamos muito felizes em anunciar que Riot agora é Element",
|
||||||
"Riot is now Element!": "Riot agora é Element!",
|
"Riot is now Element!": "Riot agora é Element!",
|
||||||
|
@ -1185,7 +1185,7 @@
|
||||||
"Sends a message as html, without interpreting it as markdown": "Envia uma mensagem como HTML, sem interpretá-la como markdown",
|
"Sends a message as html, without interpreting it as markdown": "Envia uma mensagem como HTML, sem interpretá-la como markdown",
|
||||||
"You do not have the required permissions to use this command.": "Você não tem as permissões necessárias para usar este comando.",
|
"You do not have the required permissions to use this command.": "Você não tem as permissões necessárias para usar este comando.",
|
||||||
"Error upgrading room": "Erro atualizando a sala",
|
"Error upgrading room": "Erro atualizando a sala",
|
||||||
"Double check that your server supports the room version chosen and try again.": "Verifique mais uma ver se seu servidor suporta a versão de sala escolhida e tente novamente.",
|
"Double check that your server supports the room version chosen and try again.": "Verifique se seu servidor suporta a versão de sala escolhida e tente novamente.",
|
||||||
"Changes the avatar of the current room": "Altera a foto da sala atual",
|
"Changes the avatar of the current room": "Altera a foto da sala atual",
|
||||||
"Changes your avatar in this current room only": "Altera a sua foto de perfil apenas nesta sala",
|
"Changes your avatar in this current room only": "Altera a sua foto de perfil apenas nesta sala",
|
||||||
"Changes your avatar in all rooms": "Altera a sua foto de perfil em todas as salas",
|
"Changes your avatar in all rooms": "Altera a sua foto de perfil em todas as salas",
|
||||||
|
@ -1201,12 +1201,12 @@
|
||||||
"Please supply a widget URL or embed code": "Forneça o link de um widget ou de um código de incorporação",
|
"Please supply a widget URL or embed code": "Forneça o link de um widget ou de um código de incorporação",
|
||||||
"Please supply a https:// or http:// widget URL": "Forneça o link de um widget com https:// ou http://",
|
"Please supply a https:// or http:// widget URL": "Forneça o link de um widget com https:// ou http://",
|
||||||
"You cannot modify widgets in this room.": "Você não pode modificar widgets nesta sala.",
|
"You cannot modify widgets in this room.": "Você não pode modificar widgets nesta sala.",
|
||||||
"Verifies a user, session, and pubkey tuple": "Verifica um(a) usuário(a), e a tupla de chave pública",
|
"Verifies a user, session, and pubkey tuple": "Confirma um usuário, sessão, e chave criptografada pública",
|
||||||
"Unknown (user, session) pair:": "Par (usuária(o), sessão) desconhecido:",
|
"Unknown (user, session) pair:": "Par (usuária(o), sessão) desconhecido:",
|
||||||
"Session already verified!": "Sessão já verificada!",
|
"Session already verified!": "Sessão já confirmada!",
|
||||||
"WARNING: Session already verified, but keys do NOT MATCH!": "ATENÇÃO: Sessão já verificada, mas as chaves NÃO SE CORRESPONDEM!",
|
"WARNING: Session already verified, but keys do NOT MATCH!": "ATENÇÃO: Sessão já confirmada, mas as chaves NÃO SÃO IGUAIS!",
|
||||||
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: A VERIFICAÇÃO DA CHAVE FALHOU! A chave de assinatura para %(userId)s e sessão %(deviceId)s é \"%(fprint)s\", o que não corresponde à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estejam sendo interceptadas por terceiros!",
|
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: A CONFIRMAÇÃO DA CHAVE FALHOU! A chave de assinatura para %(userId)s e sessão %(deviceId)s é \"%(fprint)s\", o que não corresponde à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estejam sendo interceptadas por terceiros!",
|
||||||
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A chave de assinatura que você forneceu corresponde à chave de assinatura que você recebeu da sessão %(deviceId)s da(do) usuária(o) %(userId)s. Esta sessão foi marcada como verificada.",
|
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A chave de assinatura que você forneceu corresponde à chave de assinatura que você recebeu da sessão %(deviceId)s do usuário %(userId)s. Esta sessão foi marcada como confirmada.",
|
||||||
"Sends the given message coloured as a rainbow": "Envia a mensagem colorida como arco-íris",
|
"Sends the given message coloured as a rainbow": "Envia a mensagem colorida como arco-íris",
|
||||||
"Sends the given emote coloured as a rainbow": "Envia o emoji colorido como um arco-íris",
|
"Sends the given emote coloured as a rainbow": "Envia o emoji colorido como um arco-íris",
|
||||||
"Displays list of commands with usages and descriptions": "Exibe a lista de comandos com usos e descrições",
|
"Displays list of commands with usages and descriptions": "Exibe a lista de comandos com usos e descrições",
|
||||||
|
@ -1247,22 +1247,22 @@
|
||||||
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s alterou uma regra que bania o que correspondia a %(oldGlob)s para corresponder a %(newGlob)s devido à %(reason)s",
|
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s alterou uma regra que bania o que correspondia a %(oldGlob)s para corresponder a %(newGlob)s devido à %(reason)s",
|
||||||
"Light": "Claro",
|
"Light": "Claro",
|
||||||
"Dark": "Escuro",
|
"Dark": "Escuro",
|
||||||
"You signed in to a new session without verifying it:": "Você entrou em uma nova sessão sem verificá-la:",
|
"You signed in to a new session without verifying it:": "Você entrou em uma nova sessão sem confirmá-la:",
|
||||||
"Verify your other session using one of the options below.": "Verifique suas outras sessões usando uma das opções abaixo.",
|
"Verify your other session using one of the options below.": "Confirme suas outras sessões usando uma das opções abaixo.",
|
||||||
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) entrou em uma nova sessão sem verificá-la:",
|
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) entrou em uma nova sessão sem confirmá-la:",
|
||||||
"Ask this user to verify their session, or manually verify it below.": "Peça a este usuário para verificar a sessão, ou verifique manualmente abaixo.",
|
"Ask this user to verify their session, or manually verify it below.": "Peça a este usuário para confirmar a sessão dele, ou confirme-a manualmente abaixo.",
|
||||||
"Not Trusted": "Não confiável",
|
"Not Trusted": "Não confiável",
|
||||||
"Manually Verify by Text": "Verifique manualmente por texto",
|
"Manually Verify by Text": "Confirme manualmente por texto",
|
||||||
"Interactively verify by Emoji": "Verifiquem interativamente por emojis",
|
"Interactively verify by Emoji": "Confirme interativamente por emojis",
|
||||||
"Done": "Pronto",
|
"Done": "Fechar",
|
||||||
"Cannot reach homeserver": "Não consigo acessar o servidor",
|
"Cannot reach homeserver": "Não consigo acessar o servidor",
|
||||||
"Ensure you have a stable internet connection, or get in touch with the server admin": "Verifique se está com uma conexão de internet estável, ou entre em contato com os administradores do servidor",
|
"Ensure you have a stable internet connection, or get in touch with the server admin": "Verifique se está com uma conexão de internet estável, ou entre em contato com os administradores do servidor",
|
||||||
"Your %(brand)s is misconfigured": "O %(brand)s está mal configurado",
|
"Your %(brand)s is misconfigured": "O %(brand)s está mal configurado",
|
||||||
"Ask your %(brand)s admin to check <a>your config</a> for incorrect or duplicate entries.": "Peça aos administradores do %(brand)s que verifique <a>suas configurações</a> por entradas incorretas ou duplicadas.",
|
"Ask your %(brand)s admin to check <a>your config</a> for incorrect or duplicate entries.": "Entre em contato com o administrador do %(brand)s para verificar se há entradas inválidas ou duplicadas nas <a>suas configurações</a>.",
|
||||||
"Cannot reach identity server": "Não consigo acessar o servidor de identidade",
|
"Cannot reach identity server": "Não consigo acessar o servidor de identidade",
|
||||||
"You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode se registrar, mas algumas funcionalidades não estarão disponíveis até que o servidor de identidade esteja de volta online. Se você continuar vendo este alerta, verifique sua configuração ou entre em contato com um dos administradores do servidor.",
|
"You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode se registrar, mas alguns recursos não estarão disponíveis até que o servidor de identidade esteja no ar novamente. Se você continuar vendo este alerta, verifique sua configuração ou entre em contato com um dos administradores do servidor.",
|
||||||
"You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode trocar sua senha, mas algumas das funcionalidades não estarão mais disponíveis até que o servidor de identidade esteja de volta ao ar. Se você seguir vendo este alerta, verifique suas configurações ou entre em contato com um dos administradores do servidor.",
|
"You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode trocar sua senha, mas alguns recursos não estarão disponíveis até que o servidor de identidade esteja no ar novamente. Se você seguir vendo este alerta, verifique suas configurações ou entre em contato com um dos administradores do servidor.",
|
||||||
"You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode fazer login, mas algumas funcionalidades estarão indisponíveis até que o servidor de identidade estiver de volta. Se você continuar vendo este alerta, verifique suas configurações ou entre em contato com os administradores do servidor.",
|
"You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode fazer login, mas alguns recursos estarão indisponíveis até que o servidor de identidade estiver no ar novamente. Se você continuar vendo este alerta, verifique suas configurações ou entre em contato com os administradores do servidor.",
|
||||||
"No homeserver URL provided": "Nenhum endereço fornecido do servidor local",
|
"No homeserver URL provided": "Nenhum endereço fornecido do servidor local",
|
||||||
"Unexpected error resolving homeserver configuration": "Erro inesperado buscando a configuração do servidor",
|
"Unexpected error resolving homeserver configuration": "Erro inesperado buscando a configuração do servidor",
|
||||||
"Unexpected error resolving identity server configuration": "Erro inesperado buscando a configuração do servidor de identidade",
|
"Unexpected error resolving identity server configuration": "Erro inesperado buscando a configuração do servidor de identidade",
|
||||||
|
@ -1283,11 +1283,11 @@
|
||||||
"%(num)s days from now": "dentro de %(num)s dias",
|
"%(num)s days from now": "dentro de %(num)s dias",
|
||||||
"%(name)s (%(userId)s)": "%(name)s (%(userId)s)",
|
"%(name)s (%(userId)s)": "%(name)s (%(userId)s)",
|
||||||
"The user's homeserver does not support the version of the room.": "O servidor desta(e) usuária(o) não suporta a versão desta sala.",
|
"The user's homeserver does not support the version of the room.": "O servidor desta(e) usuária(o) não suporta a versão desta sala.",
|
||||||
"Help us improve %(brand)s": "Ajude-nos a melhorar %(brand)s",
|
"Help us improve %(brand)s": "Ajude-nos a melhorar o %(brand)s",
|
||||||
"Send <UsageDataLink>anonymous usage data</UsageDataLink> which helps us improve %(brand)s. This will use a <PolicyLink>cookie</PolicyLink>.": "Envie <UsageDataLink>dados anônimos de uso</UsageDataLink> que nos ajudam a melhorar o %(brand)s. Isso necessitará do uso de um <PolicyLink>cookie</PolicyLink>.",
|
"Send <UsageDataLink>anonymous usage data</UsageDataLink> which helps us improve %(brand)s. This will use a <PolicyLink>cookie</PolicyLink>.": "Envie <UsageDataLink>dados anônimos de uso</UsageDataLink> que nos ajudam a melhorar o %(brand)s. Isso necessitará do uso de um <PolicyLink>cookie</PolicyLink>.",
|
||||||
"I want to help": "Quero ajudar",
|
"I want to help": "Quero ajudar",
|
||||||
"Review where you’re logged in": "Revisar onde você está logada(o)",
|
"Review where you’re logged in": "Revisar onde você está logada(o)",
|
||||||
"Verify all your sessions to ensure your account & messages are safe": "Verifique todas as suas sessões para garantir que sua conta e mensagens estão seguras",
|
"Verify all your sessions to ensure your account & messages are safe": "Confirme todas as suas sessões para garantir que sua conta e mensagens estão seguras",
|
||||||
"Review": "Revisar",
|
"Review": "Revisar",
|
||||||
"Later": "Mais tarde",
|
"Later": "Mais tarde",
|
||||||
"Your homeserver has exceeded its user limit.": "Seu servidor ultrapassou seu limite de usuárias(os).",
|
"Your homeserver has exceeded its user limit.": "Seu servidor ultrapassou seu limite de usuárias(os).",
|
||||||
|
@ -1298,10 +1298,10 @@
|
||||||
"To return to your account in future you need to set a password": "Para retornar à sua conta no futuro, você precisa definir uma senha",
|
"To return to your account in future you need to set a password": "Para retornar à sua conta no futuro, você precisa definir uma senha",
|
||||||
"Set up encryption": "Configurar a criptografia",
|
"Set up encryption": "Configurar a criptografia",
|
||||||
"Encryption upgrade available": "Atualização de criptografia disponível",
|
"Encryption upgrade available": "Atualização de criptografia disponível",
|
||||||
"Verify this session": "Verificar esta sessão",
|
"Verify this session": "Confirmar esta sessão",
|
||||||
"Upgrade": "Atualizar",
|
"Upgrade": "Atualizar",
|
||||||
"Verify": "Verificar",
|
"Verify": "Confirmar",
|
||||||
"Verify yourself & others to keep your chats safe": "Verifique a sua conta e as dos seus contatos, para manter suas conversas seguras",
|
"Verify yourself & others to keep your chats safe": "Confirme a sua conta e as dos seus contatos, para manter suas conversas seguras",
|
||||||
"Other users may not trust it": "Outras(os) usuárias(os) podem não confiar nela",
|
"Other users may not trust it": "Outras(os) usuárias(os) podem não confiar nela",
|
||||||
"New login. Was this you?": "Novo login. Foi você?",
|
"New login. Was this you?": "Novo login. Foi você?",
|
||||||
"Verify the new login accessing your account: %(name)s": "Verifique o novo login na sua conta: %(name)s",
|
"Verify the new login accessing your account: %(name)s": "Verifique o novo login na sua conta: %(name)s",
|
||||||
|
@ -1323,7 +1323,7 @@
|
||||||
"%(senderName)s: %(message)s": "%(senderName)s: %(message)s",
|
"%(senderName)s: %(message)s": "%(senderName)s: %(message)s",
|
||||||
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
|
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
|
||||||
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
|
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
|
||||||
"New spinner design": "Novo design do spinner",
|
"New spinner design": "Nova aparência do símbolo de carregamento",
|
||||||
"Multiple integration managers": "Múltiplos gestores de integrações",
|
"Multiple integration managers": "Múltiplos gestores de integrações",
|
||||||
"Try out new ways to ignore people (experimental)": "Tente novas maneiras de bloquear pessoas (experimental)",
|
"Try out new ways to ignore people (experimental)": "Tente novas maneiras de bloquear pessoas (experimental)",
|
||||||
"Support adding custom themes": "Permite adicionar temas personalizados",
|
"Support adding custom themes": "Permite adicionar temas personalizados",
|
||||||
|
@ -1332,12 +1332,12 @@
|
||||||
"Font size": "Tamanho da fonte",
|
"Font size": "Tamanho da fonte",
|
||||||
"Use custom size": "Usar tamanho personalizado",
|
"Use custom size": "Usar tamanho personalizado",
|
||||||
"Use a more compact ‘Modern’ layout": "Usar um layout mais compacto 'Moderno'",
|
"Use a more compact ‘Modern’ layout": "Usar um layout mais compacto 'Moderno'",
|
||||||
"Show typing notifications": "Mostrar notificações de digitação",
|
"Show typing notifications": "Mostrar quando alguém estiver digitando",
|
||||||
"Match system theme": "Se adaptar ao tema do sistema",
|
"Match system theme": "Se adaptar ao tema do sistema",
|
||||||
"Use a system font": "Usar uma fonte do sistema",
|
"Use a system font": "Usar uma fonte do sistema",
|
||||||
"System font name": "Nome da fonte do sistema",
|
"System font name": "Nome da fonte do sistema",
|
||||||
"Never send encrypted messages to unverified sessions from this session": "Nunca envie mensagens criptografadas para sessões não verificadas desta sessão",
|
"Never send encrypted messages to unverified sessions from this session": "Nunca envie mensagens criptografadas a partir desta sessão para sessões não confirmadas",
|
||||||
"Never send encrypted messages to unverified sessions in this room from this session": "Nunca envie mensagens criptografadas para sessões não verificadas nesta sala, desta sessão",
|
"Never send encrypted messages to unverified sessions in this room from this session": "Nunca envie mensagens criptografadas a partir desta sessão para sessões não confirmadas nessa sala",
|
||||||
"Order rooms by name": "Ordenar salas por nome",
|
"Order rooms by name": "Ordenar salas por nome",
|
||||||
"Show rooms with unread notifications first": "Mostrar primeiro as salas com notificações não lidas",
|
"Show rooms with unread notifications first": "Mostrar primeiro as salas com notificações não lidas",
|
||||||
"Show shortcuts to recently viewed rooms above the room list": "Mostrar atalhos para salas recentemente visualizadas acima da lista de salas",
|
"Show shortcuts to recently viewed rooms above the room list": "Mostrar atalhos para salas recentemente visualizadas acima da lista de salas",
|
||||||
|
@ -1358,7 +1358,7 @@
|
||||||
"Incoming voice call": "Recebendo chamada de voz",
|
"Incoming voice call": "Recebendo chamada de voz",
|
||||||
"Incoming video call": "Recebendo chamada de vídeo",
|
"Incoming video call": "Recebendo chamada de vídeo",
|
||||||
"Incoming call": "Recebendo chamada",
|
"Incoming call": "Recebendo chamada",
|
||||||
"Verify this session by completing one of the following:": "Verifique esta sessão completando um dos seguintes:",
|
"Verify this session by completing one of the following:": "Confirme esta sessão completando um dos seguintes:",
|
||||||
"Scan this unique code": "Escaneie este código único",
|
"Scan this unique code": "Escaneie este código único",
|
||||||
"or": "ou",
|
"or": "ou",
|
||||||
"Compare unique emoji": "Comparar emojis únicos",
|
"Compare unique emoji": "Comparar emojis únicos",
|
||||||
|
@ -1366,9 +1366,9 @@
|
||||||
"Start": "Iniciar",
|
"Start": "Iniciar",
|
||||||
"Confirm the emoji below are displayed on both sessions, in the same order:": "Confirme que os emojis abaixo estão sendo exibidos nas duas sessões, na mesma ordem:",
|
"Confirm the emoji below are displayed on both sessions, in the same order:": "Confirme que os emojis abaixo estão sendo exibidos nas duas sessões, na mesma ordem:",
|
||||||
"Verify this session by confirming the following number appears on its screen.": "Verifique esta sessão confirmando que o seguinte número aparece na sua tela.",
|
"Verify this session by confirming the following number appears on its screen.": "Verifique esta sessão confirmando que o seguinte número aparece na sua tela.",
|
||||||
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Aguardando a outra sessão, %(deviceName)s (%(deviceId)s), verificar…",
|
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Aguardando a outra sessão, %(deviceName)s (%(deviceId)s), confirmar…",
|
||||||
"Waiting for your other session to verify…": "Aguardando a outra sessão verificar…",
|
"Waiting for your other session to verify…": "Aguardando a outra sessão confirmar…",
|
||||||
"Waiting for %(displayName)s to verify…": "Aguardando %(displayName)s verificar…",
|
"Waiting for %(displayName)s to verify…": "Aguardando %(displayName)s confirmar…",
|
||||||
"Cancelling…": "Cancelando…",
|
"Cancelling…": "Cancelando…",
|
||||||
"They match": "São coincidentes",
|
"They match": "São coincidentes",
|
||||||
"They don't match": "Elas não são correspondentes",
|
"They don't match": "Elas não são correspondentes",
|
||||||
|
@ -1405,7 +1405,7 @@
|
||||||
"Session backup key:": "Chave de cópia (backup) da sessão:",
|
"Session backup key:": "Chave de cópia (backup) da sessão:",
|
||||||
"Secret storage public key:": "Chave pública do armazenamento secreto:",
|
"Secret storage public key:": "Chave pública do armazenamento secreto:",
|
||||||
"in account data": "nos dados de conta",
|
"in account data": "nos dados de conta",
|
||||||
"Homeserver feature support:": "Funcionalidades suportadas pelo servidor:",
|
"Homeserver feature support:": "Recursos suportados pelo servidor:",
|
||||||
"exists": "existe",
|
"exists": "existe",
|
||||||
"Your homeserver does not support session management.": "Seu servidor não suporta gerenciamento de sessões.",
|
"Your homeserver does not support session management.": "Seu servidor não suporta gerenciamento de sessões.",
|
||||||
"Unable to load session list": "Não foi possível carregar a lista de sessões",
|
"Unable to load session list": "Não foi possível carregar a lista de sessões",
|
||||||
|
@ -1420,15 +1420,15 @@
|
||||||
"Delete %(count)s sessions|one": "Apagar %(count)s sessão",
|
"Delete %(count)s sessions|one": "Apagar %(count)s sessão",
|
||||||
"ID": "ID",
|
"ID": "ID",
|
||||||
"Public Name": "Nome público",
|
"Public Name": "Nome público",
|
||||||
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verificar individualmente cada sessão usada por um usuário para marcá-la como confiável, em vez de confiar em aparelhos autoverificados.",
|
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifique individualmente cada sessão usada por um usuário para marcá-la como confiável, em vez de confirmar em aparelhos autoverificados.",
|
||||||
"Securely cache encrypted messages locally for them to appear in search results, using ": "Armazene mensagens criptografadas localmente para que elas apareçam nas buscas, usando· ",
|
"Securely cache encrypted messages locally for them to appear in search results, using ": "Armazene mensagens criptografadas localmente para que elas apareçam nas buscas, usando· ",
|
||||||
" to store messages from ": " para armazenar mensagens de ",
|
" to store messages from ": " para armazenar mensagens de ",
|
||||||
"rooms.": "salas.",
|
"rooms.": "salas.",
|
||||||
"Manage": "Gerenciar",
|
"Manage": "Gerenciar",
|
||||||
"Securely cache encrypted messages locally for them to appear in search results.": "Armazene mensagens criptografadas de forma segura localmente para que possam aparecer nos resultados das buscas.",
|
"Securely cache encrypted messages locally for them to appear in search results.": "Armazene mensagens criptografadas de forma segura localmente para que possam aparecer nos resultados das buscas.",
|
||||||
"Enable": "Ativar",
|
"Enable": "Ativar",
|
||||||
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with <nativeLink>search components added</nativeLink>.": "%(brand)s não está com alguns dos componentes necessários para armazenar com segurança mensagens criptografadas localmente. Se você quer fazer testes com esta funcionalidade, construa uma versão Desktop do %(brand)s com <nativeLink>componentes de busca ativos</nativeLink>.",
|
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with <nativeLink>search components added</nativeLink>.": "%(brand)s precisa de componentes adicionais para pesquisar as mensagens criptografadas armazenadas localmente. Se quiser testar esse recurso, construa uma versão do %(brand)s para Computador com <nativeLink>componentes de busca ativados</nativeLink>.",
|
||||||
"%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use <desktopLink>%(brand)s Desktop</desktopLink> for encrypted messages to appear in search results.": "%(brand)s não consegue armazenar de forma segura as mensagens criptografadas localmente enquanto funciona em um navegador web. Use <desktopLink>%(brand)s Desktop</desktopLink> para que mensagens criptografadas sejam exibidas nos resultados de buscas.",
|
"%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use <desktopLink>%(brand)s Desktop</desktopLink> for encrypted messages to appear in search results.": "%(brand)s não consegue pesquisar as mensagens criptografadas armazenadas localmente em um navegador de internet. Use o <desktopLink>%(brand)s para Computador</desktopLink> para que as mensagens criptografadas sejam exibidas nos resultados de buscas.",
|
||||||
"Connecting to integration manager...": "Conectando ao gestor de integrações...",
|
"Connecting to integration manager...": "Conectando ao gestor de integrações...",
|
||||||
"Cannot connect to integration manager": "Não foi possível conectar ao gerenciador de integrações",
|
"Cannot connect to integration manager": "Não foi possível conectar ao gerenciador de integrações",
|
||||||
"The integration manager is offline or it cannot reach your homeserver.": "Ou o gerenciador de integrações está desconectado, ou ele não conseguiu acessar o seu servidor.",
|
"The integration manager is offline or it cannot reach your homeserver.": "Ou o gerenciador de integrações está desconectado, ou ele não conseguiu acessar o seu servidor.",
|
||||||
|
@ -1439,14 +1439,14 @@
|
||||||
"not stored": "não armazenado",
|
"not stored": "não armazenado",
|
||||||
"Backup has a <validity>valid</validity> signature from this user": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> deste(a) usuário(a)",
|
"Backup has a <validity>valid</validity> signature from this user": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> deste(a) usuário(a)",
|
||||||
"Backup has a <validity>invalid</validity> signature from this user": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> deste(a) usuário(a)",
|
"Backup has a <validity>invalid</validity> signature from this user": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> deste(a) usuário(a)",
|
||||||
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de um(a) usuário <verify>desconhecido</verify> com ID %(deviceId)s",
|
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de um usuário <verify>desconhecido</verify> com ID %(deviceId)s",
|
||||||
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de uma sessão <verify>desconhecida</verify> com ID %(deviceId)s",
|
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de uma sessão <verify>desconhecida</verify> com ID %(deviceId)s",
|
||||||
"Backup has a <validity>valid</validity> signature from this session": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> desta sessão",
|
"Backup has a <validity>valid</validity> signature from this session": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> desta sessão",
|
||||||
"Backup has an <validity>invalid</validity> signature from this session": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> desta sessão",
|
"Backup has an <validity>invalid</validity> signature from this session": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> desta sessão",
|
||||||
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> session <device></device>": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> da sessão <verify>verificada</verify> <device></device>",
|
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> session <device></device>": "A cópia de segurança (backup) tem uma assinatura <validity>válida</validity> da sessão <verify>confirmada</verify> <device></device>",
|
||||||
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> session <device></device>": "A cópia de segurança tem uma assinatura <validity>válida</validity> de uma sessão <verify>não verificada</verify> <device></device>",
|
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> session <device></device>": "A cópia de segurança tem uma assinatura <validity>válida</validity> de uma sessão <verify>não confirmada</verify> <device></device>",
|
||||||
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> session <device></device>": "A cópia de segurança tem uma assinatura <validity>inválida</validity> de uma sessão <verify>verificada</verify> <device></device>",
|
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> session <device></device>": "A cópia de segurança tem uma assinatura <validity>inválida</validity> de uma sessão <verify>confirmada</verify> <device></device>",
|
||||||
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> session <device></device>": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> de uma sessão <verify>não verificada</verify> <device></device>",
|
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> session <device></device>": "A cópia de segurança (backup) tem uma assinatura <validity>inválida</validity> de uma sessão <verify>não confirmada</verify> <device></device>",
|
||||||
"Backup is not signed by any of your sessions": "A cópia de segurança (backup) não foi assinada por nenhuma de suas sessões",
|
"Backup is not signed by any of your sessions": "A cópia de segurança (backup) não foi assinada por nenhuma de suas sessões",
|
||||||
"This backup is trusted because it has been restored on this session": "Esta cópia de segurança (backup) é confiável, pois foi restaurada nesta sessão",
|
"This backup is trusted because it has been restored on this session": "Esta cópia de segurança (backup) é confiável, pois foi restaurada nesta sessão",
|
||||||
"Backup key stored: ": "Chave de segurança (backup) armazenada: ",
|
"Backup key stored: ": "Chave de segurança (backup) armazenada: ",
|
||||||
|
@ -1464,15 +1464,15 @@
|
||||||
"Encryption": "Criptografia",
|
"Encryption": "Criptografia",
|
||||||
"Once enabled, encryption cannot be disabled.": "Uma vez ativada, a criptografia não poderá ser desativada.",
|
"Once enabled, encryption cannot be disabled.": "Uma vez ativada, a criptografia não poderá ser desativada.",
|
||||||
"Encrypted": "Criptografada",
|
"Encrypted": "Criptografada",
|
||||||
"Click the link in the email you received to verify and then click continue again.": "Clique no link no e-mail que você recebeu para verificar e então clique novamente em continuar.",
|
"Click the link in the email you received to verify and then click continue again.": "Clique no link no e-mail que você recebeu para confirmar e então clique novamente em continuar.",
|
||||||
"Verify the link in your inbox": "Verifique o link na sua caixa de e-mails",
|
"Verify the link in your inbox": "Verifique o link na sua caixa de e-mails",
|
||||||
"This room is end-to-end encrypted": "Esta sala é criptografada de ponta a ponta",
|
"This room is end-to-end encrypted": "Esta sala é criptografada de ponta a ponta",
|
||||||
"Your key share request has been sent - please check your other sessions for key share requests.": "Sua solicitação de compartilhamento de chaves foi enviada - por favor, verifique a existência de solicitações de compartilhamento de chaves em suas outras sessões .",
|
"Your key share request has been sent - please check your other sessions for key share requests.": "Sua solicitação de compartilhamento de chaves foi enviada - por favor, confirme a existência de solicitações de compartilhamento de chaves em suas outras sessões.",
|
||||||
"Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Solicitações de compartilhamento de chaves são enviadas para suas outras sessões automaticamente. Se você recusou ou ignorou a solicitação de compartilhamento de chaves em suas outras sessões, clique aqui para solicitar as chaves para esta sessão novamente.",
|
"Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Solicitações de compartilhamento de chaves são enviadas para suas outras sessões automaticamente. Se você recusou ou ignorou a solicitação de compartilhamento de chaves em suas outras sessões, clique aqui para solicitar as chaves para esta sessão novamente.",
|
||||||
"If your other sessions do not have the key for this message you will not be able to decrypt them.": "Se suas outras sessões não possuem a chave para esta mensagem, você não será capaz de descriptografá-la.",
|
"If your other sessions do not have the key for this message you will not be able to decrypt them.": "Se suas outras sessões não possuem a chave para esta mensagem, você não será capaz de descriptografá-la.",
|
||||||
"<requestLink>Re-request encryption keys</requestLink> from your other sessions.": "<requestLink>Solicitar novamente as chaves de criptografia</requestLink> das suas outras sessões.",
|
"<requestLink>Re-request encryption keys</requestLink> from your other sessions.": "<requestLink>Solicitar novamente as chaves de criptografia</requestLink> das suas outras sessões.",
|
||||||
"This message cannot be decrypted": "Esta mensagem não pode ser descriptografada",
|
"This message cannot be decrypted": "Esta mensagem não pode ser descriptografada",
|
||||||
"Encrypted by an unverified session": "Criptografada por uma sessão não verificada",
|
"Encrypted by an unverified session": "Criptografada por uma sessão não confirmada",
|
||||||
"Unencrypted": "Descriptografada",
|
"Unencrypted": "Descriptografada",
|
||||||
"Encrypted by a deleted session": "Criptografada por uma sessão já apagada",
|
"Encrypted by a deleted session": "Criptografada por uma sessão já apagada",
|
||||||
"The authenticity of this encrypted message can't be guaranteed on this device.": "A autenticidade desta mensagem criptografada não pode ser garantida neste aparelho.",
|
"The authenticity of this encrypted message can't be guaranteed on this device.": "A autenticidade desta mensagem criptografada não pode ser garantida neste aparelho.",
|
||||||
|
@ -1484,29 +1484,29 @@
|
||||||
"Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "As mensagens nesta sala estão protegidas com a criptografia de ponta a ponta. Apenas você e a(s) demais pessoa(s) desta sala têm a chave para ler estas mensagens.",
|
"Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "As mensagens nesta sala estão protegidas com a criptografia de ponta a ponta. Apenas você e a(s) demais pessoa(s) desta sala têm a chave para ler estas mensagens.",
|
||||||
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Atualizar esta sala irá fechar a instância atual da sala e criar uma sala atualizada com o mesmo nome.",
|
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Atualizar esta sala irá fechar a instância atual da sala e criar uma sala atualizada com o mesmo nome.",
|
||||||
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Dica: Inicie sua mensagem com <code>//</code> para iniciar com uma barra.",
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Dica: Inicie sua mensagem com <code>//</code> para iniciar com uma barra.",
|
||||||
"Start Verification": "Iniciar verificação",
|
"Start Verification": "Iniciar confirmação",
|
||||||
"Messages in this room are end-to-end encrypted.": "As mensagens nesta sala estão criptografadas de ponta a ponta.",
|
"Messages in this room are end-to-end encrypted.": "As mensagens nesta sala estão criptografadas de ponta a ponta.",
|
||||||
"Messages in this room are not end-to-end encrypted.": "As mensagens nesta sala não estão criptografadas de ponta a ponta.",
|
"Messages in this room are not end-to-end encrypted.": "As mensagens nesta sala não estão criptografadas de ponta a ponta.",
|
||||||
"In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Em salas criptografadas, suas mensagens estão seguras e apenas você e a pessoa que a recebe têm as chaves únicas que permitem a sua leitura.",
|
"In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Em salas criptografadas, suas mensagens estão seguras e apenas você e a pessoa que a recebe têm as chaves únicas que permitem a sua leitura.",
|
||||||
"Verify User": "Verificar usuária(o)",
|
"Verify User": "Confirmar usuário",
|
||||||
"For extra security, verify this user by checking a one-time code on both of your devices.": "Para maior segurança, verifique esta(e) usuária(o) verificando um código único em ambos aparelhos.",
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "Para maior segurança, confirme este usuário comparando um código único em ambos os aparelhos.",
|
||||||
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Você apagará para todos as %(count)s mensagens de %(user)s na sala. Isso não pode ser desfeito. Deseja continuar?",
|
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Você apagará para todos as %(count)s mensagens de %(user)s na sala. Isso não pode ser desfeito. Deseja continuar?",
|
||||||
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Você está a ponto de remover 1 mensagem de %(user)s. Isso não poderá ser desfeito. Quer continuar?",
|
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Você está a ponto de remover 1 mensagem de %(user)s. Isso não poderá ser desfeito. Quer continuar?",
|
||||||
"This client does not support end-to-end encryption.": "A sua versão do aplicativo não suporta a criptografia de ponta a ponta.",
|
"This client does not support end-to-end encryption.": "A sua versão do aplicativo não suporta a criptografia de ponta a ponta.",
|
||||||
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você está tentando verificar não permite escanear QR code ou verificação via emojis, que é o que %(brand)s permite. Tente um cliente diferente.",
|
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você deseja confirmar não é compatível com o escaneamento de código QR ou a confirmação via emojis do %(brand)s. Tente confirmar a partir de outro aplicativo do Element.",
|
||||||
"Verify by scanning": "Verificar através de QR Code",
|
"Verify by scanning": "Confirmar através de QR Code",
|
||||||
"If you can't scan the code above, verify by comparing unique emoji.": "Se você não consegue escanear o código acima, verifique comparando os emojis únicos.",
|
"If you can't scan the code above, verify by comparing unique emoji.": "Se você não consegue escanear o código acima, confirme comparando emojis únicos.",
|
||||||
"Verify by comparing unique emoji.": "Verificar comparando emoji único.",
|
"Verify by comparing unique emoji.": "Confirmar comparando emojis únicos.",
|
||||||
"Verify by emoji": "Verificar por emoji",
|
"Verify by emoji": "Confirmar por emojis",
|
||||||
"Verify all users in a room to ensure it's secure.": "Verificar todas(os) as(os) usuárias(os) em uma sala para se certificar que ela é segura.",
|
"Verify all users in a room to ensure it's secure.": "Verifique todos os usuários em uma sala para se certificar de que ela está segura.",
|
||||||
"In encrypted rooms, verify all users to ensure it’s secure.": "Em salas criptografadas, verificar todas(os) as(os) usuárias(os) para garantir que elas são seguras.",
|
"In encrypted rooms, verify all users to ensure it’s secure.": "Em salas criptografadas, verifique todos os usuários para garantir que a sala está segura.",
|
||||||
"Start verification again from the notification.": "Iniciar verificação novamente, após a notificação.",
|
"Start verification again from the notification.": "Iniciar a confirmação novamente, após a notificação.",
|
||||||
"Start verification again from their profile.": "Iniciar a verificação novamente a partir do perfil deste usuário.",
|
"Start verification again from their profile.": "Iniciar a confirmação novamente, a partir do perfil deste usuário.",
|
||||||
"Encryption enabled": "Criptografia ativada",
|
"Encryption enabled": "Criptografia ativada",
|
||||||
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "As mensagens nesta sala estão criptografadas de ponta a ponta. Lembre-se de verificar este usuário no perfil dele/dela.",
|
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "As mensagens nesta sala estão criptografadas de ponta a ponta. Lembre-se de confirmar este usuário no perfil dele/dela.",
|
||||||
"Encryption not enabled": "Criptografia desativada",
|
"Encryption not enabled": "Criptografia desativada",
|
||||||
"The encryption used by this room isn't supported.": "A criptografia usada nesta sala não é suportada.",
|
"The encryption used by this room isn't supported.": "A criptografia usada nesta sala não é suportada.",
|
||||||
"%(name)s wants to verify": "%(name)s deseja verificar",
|
"%(name)s wants to verify": "%(name)s solicita confirmação",
|
||||||
"Smileys & People": "Sorrisos e pessoas",
|
"Smileys & People": "Sorrisos e pessoas",
|
||||||
"Widgets do not use message encryption.": "Widgets não usam criptografia de mensagens.",
|
"Widgets do not use message encryption.": "Widgets não usam criptografia de mensagens.",
|
||||||
"Please <newIssueLink>create a new issue</newIssueLink> on GitHub so that we can investigate this bug.": "Por favor, <newIssueLink>crie um novo bilhete de erro</newIssueLink> no GitHub para que possamos investigar esta falha.",
|
"Please <newIssueLink>create a new issue</newIssueLink> on GitHub so that we can investigate this bug.": "Por favor, <newIssueLink>crie um novo bilhete de erro</newIssueLink> no GitHub para que possamos investigar esta falha.",
|
||||||
|
@ -1520,9 +1520,9 @@
|
||||||
"Create a private room": "Criar uma sala privada",
|
"Create a private room": "Criar uma sala privada",
|
||||||
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Impedir usuários de outros servidores na rede Matrix de entrarem nesta sala (Essa configuração não pode ser alterada posteriormente!)",
|
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Impedir usuários de outros servidores na rede Matrix de entrarem nesta sala (Essa configuração não pode ser alterada posteriormente!)",
|
||||||
"You've previously used a newer version of %(brand)s with this session. To use this version again with end to end encryption, you will need to sign out and back in again.": "Você já usou uma versão mais recente do %(brand)s nesta sessão. Para usar esta versão novamente com a criptografia de ponta a ponta, você terá que se desconectar e entrar novamente.",
|
"You've previously used a newer version of %(brand)s with this session. To use this version again with end to end encryption, you will need to sign out and back in again.": "Você já usou uma versão mais recente do %(brand)s nesta sessão. Para usar esta versão novamente com a criptografia de ponta a ponta, você terá que se desconectar e entrar novamente.",
|
||||||
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifique este usuário para torná-lo confiável. Confiar nos usuários fornece segurança adicional ao trocar mensagens criptografadas de ponta a ponta.",
|
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Confirme este usuário para torná-lo confiável. Confiar nos usuários fornece segurança adicional ao trocar mensagens criptografadas de ponta a ponta.",
|
||||||
"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.": "Verifique este aparelho para torná-lo confiável. Confiar neste aparelho fornecerá segurança adicional para você e aos outros ao trocarem mensagens criptografadas de ponta a ponta.",
|
"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.": "Confirme este aparelho para torná-lo confiável. Confiar neste aparelho fornecerá segurança adicional para você e aos outros ao trocarem mensagens criptografadas de ponta a ponta.",
|
||||||
"We couldn't create your DM. Please check the users you want to invite and try again.": "Não conseguimos criar sua mensagem direta. Por favor, verifique as(os) usuárias(os) que você quer convidar e tente novamente.",
|
"We couldn't create your DM. Please check the users you want to invite and try again.": "Não conseguimos criar sua mensagem direta. Por favor, verifique os usuários que você deseja convidar e tente novamente.",
|
||||||
"Start a conversation with someone using their name, username (like <userId/>) or email address.": "Comece uma conversa com alguém usando o seu respectivo nome e sobrenome, nome de usuário (por exemplo: <userId/>) ou endereço de e-mail.",
|
"Start a conversation with someone using their name, username (like <userId/>) or email address.": "Comece uma conversa com alguém usando o seu respectivo nome e sobrenome, nome de usuário (por exemplo: <userId/>) ou endereço de e-mail.",
|
||||||
"a new master key signature": "uma nova chave mestra de assinatura",
|
"a new master key signature": "uma nova chave mestra de assinatura",
|
||||||
"a new cross-signing key signature": "uma nova chave de autoverificação",
|
"a new cross-signing key signature": "uma nova chave de autoverificação",
|
||||||
|
@ -1530,9 +1530,9 @@
|
||||||
"I don't want my encrypted messages": "Não quero minhas mensagens criptografadas",
|
"I don't want my encrypted messages": "Não quero minhas mensagens criptografadas",
|
||||||
"You'll lose access to your encrypted messages": "Você perderá acesso às suas mensagens criptografadas",
|
"You'll lose access to your encrypted messages": "Você perderá acesso às suas mensagens criptografadas",
|
||||||
"Session key": "Chave da sessão",
|
"Session key": "Chave da sessão",
|
||||||
"Verify session": "Verificar sessão",
|
"Verify session": "Confirmar sessão",
|
||||||
"We recommend you change your password and recovery key in Settings immediately": "Nós recomendamos que você altere imediatamente sua senha e chave de recuperação nas Configurações",
|
"We recommend you change your password and recovery key in Settings immediately": "Nós recomendamos que você altere imediatamente sua senha e chave de recuperação nas Configurações",
|
||||||
"Use this session to verify your new one, granting it access to encrypted messages:": "Use esta sessão para verificar a sua nova sessão, dando a ela acesso às mensagens criptografadas:",
|
"Use this session to verify your new one, granting it access to encrypted messages:": "Use esta sessão para confirmar a sua nova sessão, dando a ela acesso às mensagens criptografadas:",
|
||||||
"You’re already signed in and good to go here, but you can also grab the latest versions of the app on all platforms at <a>element.io/get-started</a>.": "Você já está logada(o) e pode começar a usar à vontade, mas você também pode buscar pelas últimas versões do app em todas as plataformas em <a>element.io/get-started</a>.",
|
"You’re already signed in and good to go here, but you can also grab the latest versions of the app on all platforms at <a>element.io/get-started</a>.": "Você já está logada(o) e pode começar a usar à vontade, mas você também pode buscar pelas últimas versões do app em todas as plataformas em <a>element.io/get-started</a>.",
|
||||||
"Go to Element": "Ir a Element",
|
"Go to Element": "Ir a Element",
|
||||||
"We’re excited to announce Riot is now Element!": "Estamos muito felizes de anunciar que agora Riot é Element!",
|
"We’re excited to announce Riot is now Element!": "Estamos muito felizes de anunciar que agora Riot é Element!",
|
||||||
|
@ -1541,18 +1541,18 @@
|
||||||
"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 esta mensagem enviará o seu 'event ID' único para o/a administrador/a do seu Homeserver. Se as mensagens nesta sala são criptografadas, o/a administrador/a não conseguirá ler o texto da mensagem nem ver nenhuma imagem ou arquivo.",
|
"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 esta mensagem enviará o seu 'event ID' único para o/a administrador/a do seu Homeserver. Se as mensagens nesta sala são criptografadas, o/a administrador/a não conseguirá ler o texto da mensagem nem ver nenhuma imagem ou arquivo.",
|
||||||
"Sign out and remove encryption keys?": "Fazer logout e remover as chaves de criptografia?",
|
"Sign out and remove encryption keys?": "Fazer logout e remover as chaves de criptografia?",
|
||||||
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Alguns dados de sessão, incluindo chaves de mensagens criptografadas, estão faltando. Faça logout e entre novamente para resolver isso, restaurando as chaves do backup.",
|
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Alguns dados de sessão, incluindo chaves de mensagens criptografadas, estão faltando. Faça logout e entre novamente para resolver isso, restaurando as chaves do backup.",
|
||||||
"Verify other session": "Verificar outra sessão",
|
"Verify other session": "Confirmar outra sessão",
|
||||||
"A widget would like to verify your identity": "Um Widget quer verificar sua identidade",
|
"A widget would like to verify your identity": "Um widget deseja confirmar sua identidade",
|
||||||
"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.": "Um widget localizado em %(widgetUrl)s deseja verificar sua identidade. Permitindo isso, o widget poderá verificar sua ID de usuário, mas não poderá realizar nenhuma ação em seu nome.",
|
"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.": "Um widget localizado em %(widgetUrl)s deseja confirmar sua identidade. Permitindo isso, o widget poderá verificar sua ID de usuário, mas não poderá realizar nenhuma ação em seu nome.",
|
||||||
"Wrong Recovery Key": "Chave de recuperação errada",
|
"Wrong Recovery Key": "Chave de recuperação errada",
|
||||||
"Invalid Recovery Key": "Chave de recuperação inválida",
|
"Invalid Recovery Key": "Chave de recuperação inválida",
|
||||||
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Não foi possível acessar o armazenamento secreto. Por favor, verifique que você entrou com a frase de recuperação correta.",
|
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Não foi possível acessar o armazenamento secreto. Por favor, verifique que você digitou a frase de recuperação correta.",
|
||||||
"Enter your Security Phrase or <button>Use your Security Key</button> to continue.": "Entre com sua Frase de Segurança ou <button>use sua Chave de Segurança</button> para continuar.",
|
"Enter your Security Phrase or <button>Use your Security Key</button> to continue.": "Entre com sua Frase de Segurança ou <button>use sua Chave de Segurança</button> para continuar.",
|
||||||
"Security Key": "Chave de Segurança",
|
"Security Key": "Chave de Segurança",
|
||||||
"Use your Security Key to continue.": "Use sua Chave de Segurança para continuar.",
|
"Use your Security Key to continue.": "Use sua Chave de Segurança para continuar.",
|
||||||
"Recovery key mismatch": "A chave de segurança não corresponde à correta",
|
"Recovery key mismatch": "Chave de recuperação incorreta",
|
||||||
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "O backup não pôde ser descriptografado com esta chave de recuperação: por favor, verifique se você entrou com a chave de recuperação correta.",
|
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "O backup não pôde ser descriptografado com esta chave de recuperação: por favor, verifique se você digitou a chave de recuperação correta.",
|
||||||
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "O backup não pôde ser descriptografado com esta frase de recuperação: por favor, verifique se você entrou com a frase de recuperação correta.",
|
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "O backup não pôde ser descriptografado com esta frase de recuperação: por favor, verifique se você digitou a frase de recuperação correta.",
|
||||||
"<b>Warning</b>: you should only set up key backup from a trusted computer.": "<b>Atenção</b>: você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.",
|
"<b>Warning</b>: you should only set up key backup from a trusted computer.": "<b>Atenção</b>: você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.",
|
||||||
"Enter recovery key": "Digite a chave de recuperação",
|
"Enter recovery key": "Digite a chave de recuperação",
|
||||||
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Atenção</b>: Você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.",
|
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Atenção</b>: Você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.",
|
||||||
|
@ -1564,20 +1564,20 @@
|
||||||
"Welcome to %(appName)s": "Bem-vinda/o ao %(appName)s",
|
"Welcome to %(appName)s": "Bem-vinda/o ao %(appName)s",
|
||||||
"Liberate your communication": "Liberte sua comunicação",
|
"Liberate your communication": "Liberte sua comunicação",
|
||||||
"Send a Direct Message": "Enviar uma mensagem",
|
"Send a Direct Message": "Enviar uma mensagem",
|
||||||
"Explore Public Rooms": "Explore as salas públicas",
|
"Explore Public Rooms": "Explorar salas públicas",
|
||||||
"Create a Group Chat": "Criar um chat de grupo",
|
"Create a Group Chat": "Criar um chat de grupo",
|
||||||
"Explore rooms": "Explorar salas",
|
"Explore rooms": "Explorar salas",
|
||||||
"Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Detectamos uma versão mais antiga do %(brand)s. Isso fará com que a criptografia de ponta a ponta não funcione corretamente. As mensagens criptografadas de ponta a ponta trocadas recentemente, enquanto você usava a versão mais antiga, talvez não sejam descriptografáveis na nova versão. Isso também poderá fazer com que as mensagens trocadas nesta sessão falhem na mais atual. Se você tiver problemas, desconecte-se e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves.",
|
"Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Detectamos uma versão mais antiga do %(brand)s. Isso fará com que a criptografia de ponta a ponta não funcione corretamente. As mensagens criptografadas de ponta a ponta trocadas recentemente, enquanto você usava a versão mais antiga, talvez não sejam descriptografáveis na nova versão. Isso também poderá fazer com que as mensagens trocadas nesta sessão falhem na mais atual. Se você tiver problemas, desconecte-se e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves.",
|
||||||
"%(creator)s created and configured the room.": "%(creator)s criou e configurou esta sala.",
|
"%(creator)s created and configured the room.": "%(creator)s criou e configurou esta sala.",
|
||||||
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "Se você não conseguir encontrar a sala que está procurando, peça um convite para a sala ou <a>Crie uma nova sala</a>.",
|
"If you can't find the room you're looking for, ask for an invite or <a>Create a new room</a>.": "Se você não conseguir encontrar a sala que está procurando, peça um convite para a sala ou <a>Crie uma nova sala</a>.",
|
||||||
"Verify this login": "Verificar este login",
|
"Verify this login": "Confirmar este login",
|
||||||
"Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Alterar a sua senha redefinirá todas as chaves de criptografia de ponta a ponta existentes em todas as suas sessões, tornando o histórico de mensagens criptografadas ilegível. Faça uma cópia (backup) das suas chaves, ou exporte as chaves de outra sessão antes de alterar a sua senha.",
|
"Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Alterar a sua senha redefinirá todas as chaves de criptografia de ponta a ponta existentes em todas as suas sessões, tornando o histórico de mensagens criptografadas ilegível. Faça uma cópia (backup) das suas chaves, ou exporte as chaves de outra sessão antes de alterar a sua senha.",
|
||||||
"Create account": "Criar conta",
|
"Create account": "Criar conta",
|
||||||
"Create your account": "Criar sua conta",
|
"Create your account": "Criar sua conta",
|
||||||
"Use Recovery Key or Passphrase": "Use a chave de recuperação, ou a frase de recuperação",
|
"Use Recovery Key or Passphrase": "Use a chave de recuperação, ou a frase de recuperação",
|
||||||
"Use Recovery Key": "Use a chave de recuperação",
|
"Use Recovery Key": "Usar a chave de recuperação",
|
||||||
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirme sua identidade através da verificação deste login em qualquer uma de suas outras sessões, garantindo a elas acesso a mensagens criptografadas.",
|
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirme sua identidade através da confirmação deste login em qualquer uma de suas outras sessões, garantindo a elas acesso a mensagens criptografadas.",
|
||||||
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sua nova sessão está agora verificada. Ela tem acesso às suas mensagens criptografadas, e outras(os) usuárias(os) poderão ver esta sessão como confiável.",
|
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sua nova sessão está agora confirmada. Ela tem acesso às suas mensagens criptografadas, e outros usuários poderão ver esta sessão como confiável.",
|
||||||
"Without completing security on this session, it won’t have access to encrypted messages.": "Sem completar os procedimentos de segurança nesta sessão, você não terá acesso a mensagens criptografadas.",
|
"Without completing security on this session, it won’t have access to encrypted messages.": "Sem completar os procedimentos de segurança nesta sessão, você não terá acesso a mensagens criptografadas.",
|
||||||
"Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Recupere acesso à sua conta e restaure as chaves de criptografia armazenadas nesta sessão. Sem elas, você não conseguirá ler todas as suas mensagens seguras em nenhuma sessão.",
|
"Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Recupere acesso à sua conta e restaure as chaves de criptografia armazenadas nesta sessão. Sem elas, você não conseguirá ler todas as suas mensagens seguras em nenhuma sessão.",
|
||||||
"Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados nesta sessão. Apague-os quando tiver finalizado esta sessão, ou se quer entrar com outra conta.",
|
"Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados nesta sessão. Apague-os quando tiver finalizado esta sessão, ou se quer entrar com outra conta.",
|
||||||
|
@ -1588,7 +1588,7 @@
|
||||||
"We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "Nós geramos uma Chave de Segurança para você. Por favor, guarde-a em um lugar seguro, como um gerenciador de senhas ou um cofre.",
|
"We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "Nós geramos uma Chave de Segurança para você. Por favor, guarde-a em um lugar seguro, como um gerenciador de senhas ou um cofre.",
|
||||||
"Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Use uma frase secreta que apenas você conhece, e opcionalmente salve uma Chave de Segurança para usar como cópia de segurança (backup).",
|
"Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Use uma frase secreta que apenas você conhece, e opcionalmente salve uma Chave de Segurança para usar como cópia de segurança (backup).",
|
||||||
"Restore your key backup to upgrade your encryption": "Restaurar a sua cópia segura (backup) de chaves para atualizar a sua criptografia",
|
"Restore your key backup to upgrade your encryption": "Restaurar a sua cópia segura (backup) de chaves para atualizar a sua criptografia",
|
||||||
"Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Atualize esta sessão para permitir que ela verifique outras sessões, dando a elas acesso às mensagens criptografadas e marcando-as como confiáveis para as(os) demais usuárias(os).",
|
"Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Atualize esta sessão para permitir que ela confirme outras sessões, dando a elas acesso às mensagens criptografadas e marcando-as como confiáveis para os seus contatos.",
|
||||||
"Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Guarde sua Chave de Segurança em algum lugar seguro, como por exemplo um gestor de senhas ou um cofre, já que esta chave é a proteção para seus dados criptografados.",
|
"Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Guarde sua Chave de Segurança em algum lugar seguro, como por exemplo um gestor de senhas ou um cofre, já que esta chave é a proteção para seus dados criptografados.",
|
||||||
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Se você cancelar agora, poderá perder mensagens e dados criptografados se você perder acesso aos seus logins atuais.",
|
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Se você cancelar agora, poderá perder mensagens e dados criptografados se você perder acesso aos seus logins atuais.",
|
||||||
"Upgrade your encryption": "Atualizar sua criptografia",
|
"Upgrade your encryption": "Atualizar sua criptografia",
|
||||||
|
@ -1608,7 +1608,7 @@
|
||||||
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Esta sessão detectou que sua frase e chave de recuperação para Mensagens Seguras foram removidas.",
|
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Esta sessão detectou que sua frase e chave de recuperação para Mensagens Seguras foram removidas.",
|
||||||
"If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Se você fez isso acidentalmente, você pode configurar Mensagens Seguras nesta sessão, o que vai re-criptografar o histórico de mensagens desta sessão com um novo método de recuperação.",
|
"If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Se você fez isso acidentalmente, você pode configurar Mensagens Seguras nesta sessão, o que vai re-criptografar o histórico de mensagens desta sessão com um novo método de recuperação.",
|
||||||
"If disabled, messages from encrypted rooms won't appear in search results.": "Se desativado, as mensagens de salas criptografadas não aparecerão em resultados de buscas.",
|
"If disabled, messages from encrypted rooms won't appear in search results.": "Se desativado, as mensagens de salas criptografadas não aparecerão em resultados de buscas.",
|
||||||
"%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s está armazenando de forma segura as mensagens criptografadas localmente, para que possam aparecer em resultados das buscas:",
|
"%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s está armazenando de forma segura as mensagens criptografadas localmente, para que possam aparecer nos resultados das buscas:",
|
||||||
"%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s de %(totalRooms)s",
|
"%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s de %(totalRooms)s",
|
||||||
"Jump to start/end of the composer": "Pule para o início/fim do compositor",
|
"Jump to start/end of the composer": "Pule para o início/fim do compositor",
|
||||||
"Click the button below to confirm adding this phone number.": "Clique no botão abaixo para confirmar a adição deste número de telefone.",
|
"Click the button below to confirm adding this phone number.": "Clique no botão abaixo para confirmar a adição deste número de telefone.",
|
||||||
|
@ -1620,7 +1620,7 @@
|
||||||
"Leave Room": "Sair da sala",
|
"Leave Room": "Sair da sala",
|
||||||
"Forget Room": "Esquecer Sala",
|
"Forget Room": "Esquecer Sala",
|
||||||
"Favourited": "Favoritado",
|
"Favourited": "Favoritado",
|
||||||
"You cancelled verifying %(name)s": "Você cancelou a verificação do %(name)s",
|
"You cancelled verifying %(name)s": "Você cancelou a confirmação de %(name)s",
|
||||||
"You accepted": "Você aceitou",
|
"You accepted": "Você aceitou",
|
||||||
"%(name)s accepted": "%(name)s aceitou",
|
"%(name)s accepted": "%(name)s aceitou",
|
||||||
"You declined": "Você recusou",
|
"You declined": "Você recusou",
|
||||||
|
@ -1629,7 +1629,7 @@
|
||||||
"%(name)s cancelled": "%(name)s cancelou",
|
"%(name)s cancelled": "%(name)s cancelou",
|
||||||
"Accepting …": "Aceitando…",
|
"Accepting …": "Aceitando…",
|
||||||
"Declining …": "Recusando…",
|
"Declining …": "Recusando…",
|
||||||
"You sent a verification request": "Você enviou uma solicitação de verificação",
|
"You sent a verification request": "Você enviou uma solicitação de confirmação",
|
||||||
"Show all": "Mostrar tudo",
|
"Show all": "Mostrar tudo",
|
||||||
"Reactions": "Reações",
|
"Reactions": "Reações",
|
||||||
"<reactors/><reactedWith> reacted with %(content)s</reactedWith>": "<reactors/><reactedWith> reagiu com %(content)s</reactedWith>",
|
"<reactors/><reactedWith> reacted with %(content)s</reactedWith>": "<reactors/><reactedWith> reagiu com %(content)s</reactedWith>",
|
||||||
|
@ -1697,7 +1697,7 @@
|
||||||
"Confirm account deactivation": "Confirmar desativação da conta",
|
"Confirm account deactivation": "Confirmar desativação da conta",
|
||||||
"Server did not return valid authentication information.": "O servidor não retornou informações de autenticação válidas.",
|
"Server did not return valid authentication information.": "O servidor não retornou informações de autenticação válidas.",
|
||||||
"View Servers in Room": "Ver Servidores na Sala",
|
"View Servers in Room": "Ver Servidores na Sala",
|
||||||
"Verification Requests": "Solicitações de verificação",
|
"Verification Requests": "Solicitações de confirmação",
|
||||||
"Integrations are disabled": "As integrações estão desativadas",
|
"Integrations are disabled": "As integrações estão desativadas",
|
||||||
"Integrations not allowed": "As integrações não estão permitidas",
|
"Integrations not allowed": "As integrações não estão permitidas",
|
||||||
"End": "Fim",
|
"End": "Fim",
|
||||||
|
@ -1724,11 +1724,11 @@
|
||||||
"Other published addresses:": "Outros endereços publicados:",
|
"Other published addresses:": "Outros endereços publicados:",
|
||||||
"New published address (e.g. #alias:server)": "Novo endereço publicado (por exemplo, #apelido:server)",
|
"New published address (e.g. #alias:server)": "Novo endereço publicado (por exemplo, #apelido:server)",
|
||||||
"Local Addresses": "Endereços locais",
|
"Local Addresses": "Endereços locais",
|
||||||
"%(name)s cancelled verifying": "%(name)s cancelou a verificação",
|
"%(name)s cancelled verifying": "%(name)s cancelou a confirmação",
|
||||||
"Your display name": "Seu nome e sobrenome",
|
"Your display name": "Seu nome e sobrenome",
|
||||||
"Your avatar URL": "Link da sua foto de perfil",
|
"Your avatar URL": "Link da sua foto de perfil",
|
||||||
"Your user ID": "Sua ID de usuário",
|
"Your user ID": "Sua ID de usuário",
|
||||||
"%(brand)s URL": "Link de %(brand)s",
|
"%(brand)s URL": "Link do %(brand)s",
|
||||||
"Using this widget may share data <helpIcon /> with %(widgetDomain)s & your Integration Manager.": "Se você usar esse widget, os dados poderão ser compartilhados <helpIcon /> com %(widgetDomain)s & seu Gerenciador de Integrações.",
|
"Using this widget may share data <helpIcon /> with %(widgetDomain)s & your Integration Manager.": "Se você usar esse widget, os dados poderão ser compartilhados <helpIcon /> com %(widgetDomain)s & seu Gerenciador de Integrações.",
|
||||||
"Using this widget may share data <helpIcon /> with %(widgetDomain)s.": "Se você usar esse widget, os dados <helpIcon /> poderão ser compartilhados com %(widgetDomain)s.",
|
"Using this widget may share data <helpIcon /> with %(widgetDomain)s.": "Se você usar esse widget, os dados <helpIcon /> 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|other": "%(severalUsers)s não fizeram alterações %(count)s vezes",
|
||||||
|
@ -1747,8 +1747,8 @@
|
||||||
"Topic (optional)": "Descrição (opcional)",
|
"Topic (optional)": "Descrição (opcional)",
|
||||||
"There was a problem communicating with the server. Please try again.": "Ocorreu um problema na comunicação com o servidor. Por favor, tente novamente.",
|
"There was a problem communicating with the server. Please try again.": "Ocorreu um problema na comunicação com o servidor. Por favor, tente novamente.",
|
||||||
"Server did not require any authentication": "O servidor não exigiu autenticação",
|
"Server did not require any authentication": "O servidor não exigiu autenticação",
|
||||||
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Se você verificar esse usuário, a sessão será marcada como confiável para você e para ele.",
|
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Se você confirmar esse usuário, a sessão será marcada como confiável para você e para ele.",
|
||||||
"Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verificar este aparelho o marcará como confiável, e os usuários que confirmaram com você também confiarão neste aparelho.",
|
"Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Confirmar este aparelho o marcará como confiável para você e para os usuários que se confirmaram com você.",
|
||||||
"Keep going...": "Continue...",
|
"Keep going...": "Continue...",
|
||||||
"The username field must not be blank.": "O campo do nome de usuário não pode ficar em branco.",
|
"The username field must not be blank.": "O campo do nome de usuário não pode ficar em branco.",
|
||||||
"Username": "Nome de usuário",
|
"Username": "Nome de usuário",
|
||||||
|
@ -1767,7 +1767,7 @@
|
||||||
"You cannot sign in to your account. Please contact your homeserver admin for more information.": "Você não pôde se conectar na sua conta. Entre em contato com o administrador do servidor para obter mais informações.",
|
"You cannot sign in to your account. Please contact your homeserver admin for more information.": "Você não pôde se conectar na sua conta. Entre em contato com o administrador do servidor para obter mais informações.",
|
||||||
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirme a adição deste número de telefone usando o Login Único para provar sua identidade.",
|
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirme a adição deste número de telefone usando o Login Único para provar sua identidade.",
|
||||||
"Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Use um servidor de identidade para convidar por e-mail. Clique em continuar para usar o servidor de identidade padrão (%(defaultIdentityServerName)s) ou gerencie nas Configurações.",
|
"Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Use um servidor de identidade para convidar por e-mail. Clique em continuar para usar o servidor de identidade padrão (%(defaultIdentityServerName)s) ou gerencie nas Configurações.",
|
||||||
"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 cliente que não seja %(brand)s. Você não pode ajustar essas opções no %(brand)s, mas elas ainda se aplicam.",
|
"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",
|
"Enable audible notifications for this session": "Ativar o som de notificações nesta sessão",
|
||||||
"Display Name": "Nome e sobrenome",
|
"Display Name": "Nome e sobrenome",
|
||||||
"Identity Server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS",
|
"Identity Server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS",
|
||||||
|
@ -1797,7 +1797,7 @@
|
||||||
"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.",
|
"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.",
|
"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.",
|
||||||
"Do not use an identity server": "Não usar um servidor de identidade",
|
"Do not use an identity server": "Não usar um servidor de identidade",
|
||||||
"Enter a new identity server": "Digitar um novo servidor de identidade",
|
"Enter a new identity server": "Digite um novo servidor de identidade",
|
||||||
"Change": "Alterar",
|
"Change": "Alterar",
|
||||||
"Manage integrations": "Gerenciar integrações",
|
"Manage integrations": "Gerenciar integrações",
|
||||||
"New version available. <a>Update now.</a>": "Nova versão disponível. <a>Atualize agora.</a>",
|
"New version available. <a>Update now.</a>": "Nova versão disponível. <a>Atualize agora.</a>",
|
||||||
|
@ -1813,9 +1813,9 @@
|
||||||
"Message layout": "Aparência da mensagem",
|
"Message layout": "Aparência da mensagem",
|
||||||
"Compact": "Compacto",
|
"Compact": "Compacto",
|
||||||
"Modern": "Moderno",
|
"Modern": "Moderno",
|
||||||
"Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Defina o nome de uma fonte instalada no seu sistema e %(brand)s tentará usá-la.",
|
"Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Defina o nome de uma fonte instalada no seu sistema e o %(brand)s tentará usá-la.",
|
||||||
"Customise your appearance": "Personalize sua aparência",
|
"Customise your appearance": "Personalize sua aparência",
|
||||||
"Appearance Settings only affect this %(brand)s session.": "As Configurações de aparência afetam apenas esta sessão do %(brand)s.",
|
"Appearance Settings only affect this %(brand)s session.": "As configurações de aparência afetam apenas esta sessão do %(brand)s.",
|
||||||
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações pop-up em outras sessões até fazer login novamente nelas",
|
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações pop-up em outras sessões até fazer login novamente nelas",
|
||||||
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Concorde com os Termos de Serviço do servidor de identidade (%(serverName)s), para que você possa ser descoberto por endereço de e-mail ou por número de celular.",
|
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Concorde com os Termos de Serviço do servidor de identidade (%(serverName)s), para que você possa ser descoberto por endereço de e-mail ou por número de celular.",
|
||||||
"Discovery": "Contatos",
|
"Discovery": "Contatos",
|
||||||
|
@ -1852,10 +1852,10 @@
|
||||||
"You can still join it because this is a public room.": "Você ainda pode entrar, porque esta é uma sala pública.",
|
"You can still join it because this is a public room.": "Você ainda pode entrar, porque esta é uma sala pública.",
|
||||||
"Join the discussion": "Participar da discussão",
|
"Join the discussion": "Participar da discussão",
|
||||||
"This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Este convite para %(roomName)s foi enviado para %(email)s, que não está associado à sua conta",
|
"This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Este convite para %(roomName)s foi enviado para %(email)s, que não está associado à sua conta",
|
||||||
"Link this email with your account in Settings to receive invites directly in %(brand)s.": "Vincule esse e-mail à sua conta em Configurações, para receber convites diretamente em %(brand)s.",
|
"Link this email with your account in Settings to receive invites directly in %(brand)s.": "Vincule esse e-mail à sua conta em Configurações, para receber convites diretamente no %(brand)s.",
|
||||||
"This invite to %(roomName)s was sent to %(email)s": "Este convite para %(roomName)s foi enviado para %(email)s",
|
"This invite to %(roomName)s was sent to %(email)s": "Este convite para %(roomName)s foi enviado para %(email)s",
|
||||||
"Use an identity server in Settings to receive invites directly in %(brand)s.": "Use um servidor de identidade em Configurações para receber convites diretamente em %(brand)s.",
|
"Use an identity server in Settings to receive invites directly in %(brand)s.": "Use um servidor de identidade em Configurações para receber convites diretamente no %(brand)s.",
|
||||||
"Share this email in Settings to receive invites directly in %(brand)s.": "Compartilhe este e-mail em Configurações para receber convites diretamente em %(brand)s.",
|
"Share this email in Settings to receive invites directly in %(brand)s.": "Compartilhe este e-mail em Configurações para receber convites diretamente no %(brand)s.",
|
||||||
"Do you want to chat with %(user)s?": "Deseja conversar com %(user)s?",
|
"Do you want to chat with %(user)s?": "Deseja conversar com %(user)s?",
|
||||||
"<userName/> wants to chat": "<userName/> quer conversar",
|
"<userName/> wants to chat": "<userName/> quer conversar",
|
||||||
"Do you want to join %(roomName)s?": "Deseja se juntar a %(roomName)s?",
|
"Do you want to join %(roomName)s?": "Deseja se juntar a %(roomName)s?",
|
||||||
|
@ -1867,9 +1867,9 @@
|
||||||
"Securely back up your keys to avoid losing them. <a>Learn more.</a>": "Faça backup de suas chaves com segurança para evitar perdê-las. <a>Saiba mais.</a>",
|
"Securely back up your keys to avoid losing them. <a>Learn more.</a>": "Faça backup de suas chaves com segurança para evitar perdê-las. <a>Saiba mais.</a>",
|
||||||
"Not now": "Agora não",
|
"Not now": "Agora não",
|
||||||
"Don't ask me again": "Não pergunte novamente",
|
"Don't ask me again": "Não pergunte novamente",
|
||||||
"Appearance": "Mostrar",
|
"Appearance": "Aparência",
|
||||||
"Show rooms with unread messages first": "Salas não lidas primeiro",
|
"Show rooms with unread messages first": "Mostrar salas não lidas em primeiro",
|
||||||
"Show previews of messages": "Pré-visualizações de mensagens",
|
"Show previews of messages": "Mostrar pré-visualizações de mensagens",
|
||||||
"Sort by": "Ordenar por",
|
"Sort by": "Ordenar por",
|
||||||
"Activity": "Atividade recente",
|
"Activity": "Atividade recente",
|
||||||
"A-Z": "A-Z",
|
"A-Z": "A-Z",
|
||||||
|
@ -1954,25 +1954,25 @@
|
||||||
"Ban users": "Banir usuários",
|
"Ban users": "Banir usuários",
|
||||||
"Remove messages": "Apagar mensagens dos outros",
|
"Remove messages": "Apagar mensagens dos outros",
|
||||||
"Notify everyone": "Notificar todos",
|
"Notify everyone": "Notificar todos",
|
||||||
"Your email address hasn't been verified yet": "Seu endereço de e-mail ainda não foi verificado",
|
"Your email address hasn't been verified yet": "Seu endereço de e-mail ainda não foi confirmado",
|
||||||
"Revoke": "Revogar",
|
"Revoke": "Revogar",
|
||||||
"Share": "Compartilhar",
|
"Share": "Compartilhar",
|
||||||
"Unable to revoke sharing for phone number": "Não foi possível revogar o compartilhamento do número de celular",
|
"Unable to revoke sharing for phone number": "Não foi possível revogar o compartilhamento do número de celular",
|
||||||
"Unable to share phone number": "Não foi possível compartilhar o número de celular",
|
"Unable to share phone number": "Não foi possível compartilhar o número de celular",
|
||||||
"Please enter verification code sent via text.": "Digite o código de verificação enviado por mensagem de texto.",
|
"Please enter verification code sent via text.": "Digite o código de confirmação enviado por mensagem de texto.",
|
||||||
"Remove %(email)s?": "Remover %(email)s?",
|
"Remove %(email)s?": "Remover %(email)s?",
|
||||||
"Remove %(phone)s?": "Remover %(phone)s?",
|
"Remove %(phone)s?": "Remover %(phone)s?",
|
||||||
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Digite o código de verificação enviado por mensagem de texto para +%(msisdn)s.",
|
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Digite o código de confirmação enviado por mensagem de texto para +%(msisdn)s.",
|
||||||
"This user has not verified all of their sessions.": "Este usuário não verificou todas as próprias sessões.",
|
"This user has not verified all of their sessions.": "Este usuário não confirmou todas as próprias sessões.",
|
||||||
"You have not verified this user.": "Você não verificou este usuário.",
|
"You have not verified this user.": "Você não confirmou este usuário.",
|
||||||
"You have verified this user. This user has verified all of their sessions.": "Você confirmou este usuário. Este usuário verificou todas as próprias sessões.",
|
"You have verified this user. This user has verified all of their sessions.": "Você confirmou este usuário. Este usuário confirmou todas as próprias sessões.",
|
||||||
"Someone is using an unknown session": "Alguém está usando uma sessão desconhecida",
|
"Someone is using an unknown session": "Alguém está usando uma sessão desconhecida",
|
||||||
"Everyone in this room is verified": "Todos nesta sala estão verificados",
|
"Everyone in this room is verified": "Todos nesta sala estão confirmados",
|
||||||
"Edit message": "Editar mensagem",
|
"Edit message": "Editar mensagem",
|
||||||
"Mod": "Moderador",
|
"Mod": "Moderador",
|
||||||
"Scroll to most recent messages": "Ir para as mensagens mais recentes",
|
"Scroll to most recent messages": "Ir para as mensagens mais recentes",
|
||||||
"Close preview": "Fechar a visualização",
|
"Close preview": "Fechar a visualização",
|
||||||
"Send a reply…": "Enviar uma resposta…",
|
"Send a reply…": "Digite sua resposta…",
|
||||||
"Send a message…": "Digite uma mensagem…",
|
"Send a message…": "Digite uma mensagem…",
|
||||||
"Bold": "Negrito",
|
"Bold": "Negrito",
|
||||||
"Italics": "Itálico",
|
"Italics": "Itálico",
|
||||||
|
@ -2003,9 +2003,9 @@
|
||||||
"Your homeserver": "Seu servidor local",
|
"Your homeserver": "Seu servidor local",
|
||||||
"Trusted": "Confiável",
|
"Trusted": "Confiável",
|
||||||
"Not trusted": "Não confiável",
|
"Not trusted": "Não confiável",
|
||||||
"%(count)s verified sessions|other": "%(count)s sessões verificadas",
|
"%(count)s verified sessions|other": "%(count)s sessões confirmadas",
|
||||||
"%(count)s verified sessions|one": "1 sessão verificada",
|
"%(count)s verified sessions|one": "1 sessão confirmada",
|
||||||
"Hide verified sessions": "Esconder sessões verificadas",
|
"Hide verified sessions": "Esconder sessões confirmadas",
|
||||||
"%(count)s sessions|other": "%(count)s sessões",
|
"%(count)s sessions|other": "%(count)s sessões",
|
||||||
"%(count)s sessions|one": "%(count)s sessão",
|
"%(count)s sessions|one": "%(count)s sessão",
|
||||||
"Hide sessions": "Esconder sessões",
|
"Hide sessions": "Esconder sessões",
|
||||||
|
@ -2019,22 +2019,22 @@
|
||||||
"Deactivate user": "Desativar usuário",
|
"Deactivate user": "Desativar usuário",
|
||||||
"Failed to deactivate user": "Falha ao desativar o usuário",
|
"Failed to deactivate user": "Falha ao desativar o usuário",
|
||||||
"Security": "Segurança",
|
"Security": "Segurança",
|
||||||
"You've successfully verified your device!": "Você verificou o seu aparelho com êxito!",
|
"You've successfully verified your device!": "Você confirmou o seu aparelho com êxito!",
|
||||||
"Verification timed out.": "O tempo de verificação se esgotou.",
|
"Verification timed out.": "O tempo de confirmação se esgotou.",
|
||||||
"You cancelled verification on your other session.": "Você cancelou a verificação em sua outra sessão.",
|
"You cancelled verification on your other session.": "Você cancelou a confirmação em sua outra sessão.",
|
||||||
"%(displayName)s cancelled verification.": "%(displayName)s cancelou a verificação.",
|
"%(displayName)s cancelled verification.": "%(displayName)s cancelou a confirmação.",
|
||||||
"You cancelled verification.": "Você cancelou a verificação.",
|
"You cancelled verification.": "Você cancelou a confirmação.",
|
||||||
"Verification cancelled": "Verificação cancelada",
|
"Verification cancelled": "Confirmação cancelada",
|
||||||
"Compare emoji": "Compare os emojis",
|
"Compare emoji": "Compare os emojis",
|
||||||
"Show image": "Mostrar imagem",
|
"Show image": "Mostrar imagem",
|
||||||
"You have ignored this user, so their message is hidden. <a>Show anyways.</a>": "Você bloqueou este usuário, portanto, a mensagem dele foi escondida. <a>Mostrar mesmo assim.</a>",
|
"You have ignored this user, so their message is hidden. <a>Show anyways.</a>": "Você bloqueou este usuário, portanto, a mensagem dele foi escondida. <a>Mostrar mesmo assim.</a>",
|
||||||
"You verified %(name)s": "Você verificou %(name)s",
|
"You verified %(name)s": "Você confirmou %(name)s",
|
||||||
"Use an identity server to invite by email. <default>Use the default (%(defaultIdentityServerName)s)</default> or manage in <settings>Settings</settings>.": "Use um servidor de identidade para convidar por e-mail. <default>Use o padrão (%(defaultIdentityServerName)s)</default> ou um servidor personalizado em <settings>Configurações</settings>.",
|
"Use an identity server to invite by email. <default>Use the default (%(defaultIdentityServerName)s)</default> or manage in <settings>Settings</settings>.": "Use um servidor de identidade para convidar por e-mail. <default>Use o padrão (%(defaultIdentityServerName)s)</default> ou um servidor personalizado em <settings>Configurações</settings>.",
|
||||||
"Use an identity server to invite by email. Manage in <settings>Settings</settings>.": "Use um servidor de identidade para convidar por e-mail. Gerencie o servidor em <settings>Configurações</settings>.",
|
"Use an identity server to invite by email. Manage in <settings>Settings</settings>.": "Use um servidor de identidade para convidar por e-mail. Gerencie o servidor em <settings>Configurações</settings>.",
|
||||||
"Destroy cross-signing keys?": "Destruir chaves autoverificadas?",
|
"Destroy cross-signing keys?": "Destruir chaves autoverificadas?",
|
||||||
"Waiting for partner to confirm...": "Aguardando seu contato confirmar...",
|
"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.",
|
"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 um 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",
|
"Confirm to continue": "Confirme para continuar",
|
||||||
"Click the button below to confirm your identity.": "Clique no botão abaixo para confirmar sua identidade.",
|
"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",
|
"Failed to invite the following users to chat: %(csvUsers)s": "Falha ao convidar os seguintes usuários para a conversa: %(csvUsers)s",
|
||||||
|
@ -2076,7 +2076,7 @@
|
||||||
"Upload %(count)s other files|one": "Enviar %(count)s outros arquivos",
|
"Upload %(count)s other files|one": "Enviar %(count)s outros arquivos",
|
||||||
"Cancel All": "Cancelar tudo",
|
"Cancel All": "Cancelar tudo",
|
||||||
"Upload Error": "Erro no envio",
|
"Upload Error": "Erro no envio",
|
||||||
"Verification Request": "Solicitação de verificação",
|
"Verification Request": "Solicitação de confirmação",
|
||||||
"Remember my selection for this widget": "Lembrar minha escolha para este widget",
|
"Remember my selection for this widget": "Lembrar minha escolha para este widget",
|
||||||
"Deny": "Rejeitar",
|
"Deny": "Rejeitar",
|
||||||
"Wrong file type": "Tipo errado de arquivo",
|
"Wrong file type": "Tipo errado de arquivo",
|
||||||
|
@ -2125,7 +2125,7 @@
|
||||||
"Feedback": "Fale conosco",
|
"Feedback": "Fale conosco",
|
||||||
"User menu": "Menu do usuário",
|
"User menu": "Menu do usuário",
|
||||||
"Could not load user profile": "Não foi possível carregar o perfil do usuário",
|
"Could not load user profile": "Não foi possível carregar o perfil do usuário",
|
||||||
"Session verified": "Sessão verificada",
|
"Session verified": "Sessão confirmada",
|
||||||
"Your Matrix account on %(serverName)s": "Sua conta Matrix em %(serverName)s",
|
"Your Matrix account on %(serverName)s": "Sua conta Matrix em %(serverName)s",
|
||||||
"Your Matrix account on <underlinedServerName />": "Sua conta Matrix em <underlinedServerName />",
|
"Your Matrix account on <underlinedServerName />": "Sua conta Matrix em <underlinedServerName />",
|
||||||
"No identity server is configured: add one in server settings to reset your password.": "Nenhum servidor de identidade está configurado: adicione um nas configurações do servidor para redefinir sua senha.",
|
"No identity server is configured: add one in server settings to reset your password.": "Nenhum servidor de identidade está configurado: adicione um nas configurações do servidor para redefinir sua senha.",
|
||||||
|
@ -2164,7 +2164,7 @@
|
||||||
"Unable to revoke sharing for email address": "Não foi possível revogar o compartilhamento do endereço de e-mail",
|
"Unable to revoke sharing for email address": "Não foi possível revogar o compartilhamento do endereço de e-mail",
|
||||||
"Unable to share email address": "Não foi possível compartilhar o endereço de e-mail",
|
"Unable to share email address": "Não foi possível compartilhar o endereço de e-mail",
|
||||||
"Direct message": "Enviar mensagem",
|
"Direct message": "Enviar mensagem",
|
||||||
"Incoming Verification Request": "Recebendo solicitação de verificação",
|
"Incoming Verification Request": "Recebendo solicitação de confirmação",
|
||||||
"Recently Direct Messaged": "Conversas recentes",
|
"Recently Direct Messaged": "Conversas recentes",
|
||||||
"Direct Messages": "Conversas",
|
"Direct Messages": "Conversas",
|
||||||
"Your account is not secure": "Sua conta não está segura",
|
"Your account is not secure": "Sua conta não está segura",
|
||||||
|
@ -2193,7 +2193,7 @@
|
||||||
"Reload": "Recarregar",
|
"Reload": "Recarregar",
|
||||||
"Take picture": "Tirar uma foto",
|
"Take picture": "Tirar uma foto",
|
||||||
"Country Dropdown": "Selecione o país",
|
"Country Dropdown": "Selecione o país",
|
||||||
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Você pode usar as opções personalizadas do servidor para entrar em outros servidores Matrix especificando um endereço de servidor local diferente. Isso permite que você use %(brand)s com uma conta Matrix existente em um servidor local diferente.",
|
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Você pode usar as opções personalizadas do servidor para entrar em outros servidores Matrix especificando um endereço de servidor local diferente. Isso permite que você use o %(brand)s com uma conta Matrix existente em um servidor local diferente.",
|
||||||
"No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nenhum servidor de identidade está configurado, portanto você não pode adicionar um endereço de e-mail para redefinir sua senha no futuro.",
|
"No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nenhum servidor de identidade está configurado, portanto você não pode adicionar um endereço de e-mail para redefinir sua senha no futuro.",
|
||||||
"Enter your custom identity server URL <a>What does this mean?</a>": "Digite o endereço do servidor de identidade personalizado <a>O que isso significa?</a>",
|
"Enter your custom identity server URL <a>What does this mean?</a>": "Digite o endereço do servidor de identidade personalizado <a>O que isso significa?</a>",
|
||||||
"Join millions for free on the largest public server": "Junte-se a milhões de pessoas gratuitamente no maior servidor público",
|
"Join millions for free on the largest public server": "Junte-se a milhões de pessoas gratuitamente no maior servidor público",
|
||||||
|
@ -2209,7 +2209,7 @@
|
||||||
"Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Alterações em quem pode ler o histórico de conversas aplica-se apenas para mensagens futuras nesta sala. A visibilidade do histórico existente não será alterada.",
|
"Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Alterações em quem pode ler o histórico de conversas aplica-se apenas para mensagens futuras nesta sala. A visibilidade do histórico existente não será alterada.",
|
||||||
"Ask %(displayName)s to scan your code:": "Peça para %(displayName)s escanear o seu código:",
|
"Ask %(displayName)s to scan your code:": "Peça para %(displayName)s escanear o seu código:",
|
||||||
"Almost there! Is %(displayName)s showing the same shield?": "Quase lá! Este escudo também aparece para %(displayName)s?",
|
"Almost there! Is %(displayName)s showing the same shield?": "Quase lá! Este escudo também aparece para %(displayName)s?",
|
||||||
"You've successfully verified %(displayName)s!": "Você verificou %(displayName)s com sucesso!",
|
"You've successfully verified %(displayName)s!": "Você confirmou %(displayName)s com sucesso!",
|
||||||
"Confirm this user's session by comparing the following with their User Settings:": "Confirme a sessão deste usuário comparando o seguinte com as configurações deste usuário:",
|
"Confirm this user's session by comparing the following with their User Settings:": "Confirme a sessão deste usuário comparando o seguinte com as configurações deste usuário:",
|
||||||
"Report Content to Your Homeserver Administrator": "Denunciar conteúdo ao administrador do seu servidor principal",
|
"Report Content to Your Homeserver Administrator": "Denunciar conteúdo ao administrador do seu servidor principal",
|
||||||
"Cross-signing": "Autoverificação",
|
"Cross-signing": "Autoverificação",
|
||||||
|
@ -2217,7 +2217,7 @@
|
||||||
"Error updating flair": "Falha ao atualizar o ícone",
|
"Error updating flair": "Falha ao atualizar o ícone",
|
||||||
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Ocorreu um erro ao atualizar o ícone nesta sala. O servidor pode não permitir ou ocorreu um erro temporário.",
|
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Ocorreu um erro ao atualizar o ícone nesta sala. O servidor pode não permitir ou ocorreu um erro temporário.",
|
||||||
"Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Desativar este usuário irá desconectá-lo e impedi-lo de fazer o login novamente. Além disso, ele sairá de todas as salas em que estiver. Esta ação não pode ser revertida. Tem certeza de que deseja desativar este usuário?",
|
"Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Desativar este usuário irá desconectá-lo e impedi-lo de fazer o login novamente. Além disso, ele sairá de todas as salas em que estiver. Esta ação não pode ser revertida. Tem certeza de que deseja desativar este usuário?",
|
||||||
"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.": "Apagar chaves de autoverificação é permanente. Qualquer pessoa com quem você fez a verificação receberá alertas de segurança. Não é aconselhável fazer isso, a menos que você tenha perdido todos os aparelhos nos quais fez a autoverificação.",
|
"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.": "Apagar chaves de autoverificação é permanente. Qualquer pessoa com quem você se confirmou receberá alertas de segurança. Não é aconselhável fazer isso, a menos que você tenha perdido todos os aparelhos nos quais fez a autoverificação.",
|
||||||
"Clear cross-signing keys": "Limpar chaves autoverificadas",
|
"Clear cross-signing keys": "Limpar chaves autoverificadas",
|
||||||
"a device cross-signing signature": "um aparelho autoverificado",
|
"a device cross-signing signature": "um aparelho autoverificado",
|
||||||
"Homeserver URL does not appear to be a valid Matrix homeserver": "O endereço do servidor local não parece indicar um servidor local válido na Matrix",
|
"Homeserver URL does not appear to be a valid Matrix homeserver": "O endereço do servidor local não parece indicar um servidor local válido na Matrix",
|
||||||
|
@ -2235,7 +2235,7 @@
|
||||||
"No other published addresses yet, add one below": "Nenhum endereço publicado ainda, adicione um abaixo",
|
"No other published addresses yet, add one below": "Nenhum endereço publicado ainda, adicione um abaixo",
|
||||||
"Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Defina endereços para esta sala, de modo que os usuários possam encontrar esta sala em seu servidor local (%(localDomain)s)",
|
"Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Defina endereços para esta sala, de modo que os usuários possam encontrar esta sala em seu servidor local (%(localDomain)s)",
|
||||||
"One of the following may be compromised:": "Um dos seguintes pode estar comprometido:",
|
"One of the following may be compromised:": "Um dos seguintes pode estar comprometido:",
|
||||||
"The homeserver the user you’re verifying is connected to": "O servidor local no qual o usuário que você está verificando está conectado",
|
"The homeserver the user you’re verifying is connected to": "O servidor local no qual o usuário que você está confirmando está conectado",
|
||||||
"Yours, or the other users’ internet connection": "A sua conexão de internet ou a dos outros usuários",
|
"Yours, or the other users’ internet connection": "A sua conexão de internet ou a dos outros usuários",
|
||||||
"Yours, or the other users’ session": "A sua sessão ou a dos outros usuários",
|
"Yours, or the other users’ session": "A sua sessão ou a dos outros usuários",
|
||||||
"Got it": "Ok, entendi",
|
"Got it": "Ok, entendi",
|
||||||
|
@ -2278,5 +2278,10 @@
|
||||||
"Enter a security phrase only you know, as it’s used to safeguard your data. To be secure, you shouldn’t re-use your account password.": "Digite uma frase de segurança que só você conheça, usada para proteger segredos em seu servidor.",
|
"Enter a security phrase only you know, as it’s used to safeguard your data. To be secure, you shouldn’t re-use your account password.": "Digite uma frase de segurança que só você conheça, usada para proteger segredos em seu servidor.",
|
||||||
"Use a different passphrase?": "Usar uma frase secreta diferente?",
|
"Use a different passphrase?": "Usar uma frase secreta diferente?",
|
||||||
"Enter your recovery passphrase a second time to confirm it.": "Digite sua senha de recuperação uma segunda vez para confirmá-la.",
|
"Enter your recovery passphrase a second time to confirm it.": "Digite sua senha de recuperação uma segunda vez para confirmá-la.",
|
||||||
"Confirm your recovery passphrase": "Confirme a sua frase de recuperação"
|
"Confirm your recovery passphrase": "Confirme a sua frase de recuperação",
|
||||||
|
"Page Up": "Page Up",
|
||||||
|
"Page Down": "Page Down",
|
||||||
|
"You've successfully verified %(deviceName)s (%(deviceId)s)!": "Você confirmou %(deviceName)s (%(deviceId)s) com êxito!",
|
||||||
|
"Verified": "Confirmado",
|
||||||
|
"Close dialog or context menu": "Fechar caixa de diálogo ou menu"
|
||||||
}
|
}
|
||||||
|
|
|
@ -975,7 +975,7 @@
|
||||||
"Developer options": "Параметры разработчика",
|
"Developer options": "Параметры разработчика",
|
||||||
"General": "Общие",
|
"General": "Общие",
|
||||||
"Set a new account password...": "Установить новый пароль учётной записи...",
|
"Set a new account password...": "Установить новый пароль учётной записи...",
|
||||||
"Legal": "Законный",
|
"Legal": "Правовая информация",
|
||||||
"Room avatar": "Аватар комнаты",
|
"Room avatar": "Аватар комнаты",
|
||||||
"The following users may not exist": "Следующих пользователей может не существовать",
|
"The following users may not exist": "Следующих пользователей может не существовать",
|
||||||
"Invite anyway and never warn me again": "Пригласить и больше не предупреждать",
|
"Invite anyway and never warn me again": "Пригласить и больше не предупреждать",
|
||||||
|
@ -1590,7 +1590,7 @@
|
||||||
"Error subscribing to list": "Ошибка при подписке на список",
|
"Error subscribing to list": "Ошибка при подписке на список",
|
||||||
"Error upgrading room": "Ошибка обновления комнаты",
|
"Error upgrading room": "Ошибка обновления комнаты",
|
||||||
"Match system theme": "Тема системы",
|
"Match system theme": "Тема системы",
|
||||||
"Show tray icon and minimize window to it on close": "Показать иконку в панели задач и свернуть окно при закрытии",
|
"Show tray icon and minimize window to it on close": "Показать иконку в трее и сворачивать окно при закрытии",
|
||||||
"Show typing notifications": "Показывать уведомления о наборе",
|
"Show typing notifications": "Показывать уведомления о наборе",
|
||||||
"Delete %(count)s sessions|other": "Удалить %(count)s сессий",
|
"Delete %(count)s sessions|other": "Удалить %(count)s сессий",
|
||||||
"Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии",
|
"Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии",
|
||||||
|
@ -2405,5 +2405,20 @@
|
||||||
"You’re all caught up": "Нет непрочитанных сообщений",
|
"You’re all caught up": "Нет непрочитанных сообщений",
|
||||||
"You have no visible notifications in this room.": "Нет видимых уведомлений в этой комнате.",
|
"You have no visible notifications in this room.": "Нет видимых уведомлений в этой комнате.",
|
||||||
"%(brand)s Android": "%(brand)s Android",
|
"%(brand)s Android": "%(brand)s Android",
|
||||||
"Master private key:": "Приватный мастер-ключ:"
|
"Master private key:": "Приватный мастер-ключ:",
|
||||||
|
"Show message previews for reactions in DMs": "Показывать превью сообщений для реакций в ЛС",
|
||||||
|
"Show message previews for reactions in all rooms": "Показывать предварительный просмотр сообщений для реакций во всех комнатах",
|
||||||
|
"Explore public rooms": "Просмотреть публичные комнаты",
|
||||||
|
"Uploading logs": "Загрузка журналов",
|
||||||
|
"Downloading logs": "Скачивание журналов",
|
||||||
|
"Can't see what you’re looking for?": "Не видите то, что ищете?",
|
||||||
|
"Explore all public rooms": "Просмотреть все публичные комнаты",
|
||||||
|
"%(count)s results|other": "%(count)s результатов",
|
||||||
|
"Preparing to download logs": "Подготовка к загрузке журналов",
|
||||||
|
"Download logs": "Скачать журналы",
|
||||||
|
"Unexpected server error trying to leave the room": "Неожиданная ошибка сервера при попытке покинуть комнату",
|
||||||
|
"Error leaving room": "Ошибка при выходе из комнаты",
|
||||||
|
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Прототипы сообщества v2. Требуется совместимый домашний сервер. Очень экспериментально - используйте с осторожностью.",
|
||||||
|
"Explore rooms in %(communityName)s": "Посмотреть комнаты в %(communityName)s",
|
||||||
|
"Set up Secure Backup": "Настроить безопасное резервное копирование"
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue