Merge branch 'develop' into improve-image-view

Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
Šimon Brandner 2021-01-23 08:12:32 +01:00
commit e2abbf9a7c
No known key found for this signature in database
GPG Key ID: 9760693FDD98A790
124 changed files with 7875 additions and 986 deletions

View File

@ -1,3 +1,63 @@
Changes in [3.12.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.12.0) (2021-01-18)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.12.0-rc.1...v3.12.0)
* Upgrade to JS SDK 9.5.0
* Fix incoming call box on dark theme
[\#5543](https://github.com/matrix-org/matrix-react-sdk/pull/5543)
Changes in [3.12.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.12.0-rc.1) (2021-01-13)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.1...v3.12.0-rc.1)
* Upgrade to JS SDK 9.5.0-rc.1
* Fix soft crash on soft logout page
[\#5539](https://github.com/matrix-org/matrix-react-sdk/pull/5539)
* Translations update from Weblate
[\#5538](https://github.com/matrix-org/matrix-react-sdk/pull/5538)
* Run TypeScript tests
[\#5537](https://github.com/matrix-org/matrix-react-sdk/pull/5537)
* Add a basic widget explorer to devtools (per-room)
[\#5528](https://github.com/matrix-org/matrix-react-sdk/pull/5528)
* Add <input type="password"> to security key field
[\#5534](https://github.com/matrix-org/matrix-react-sdk/pull/5534)
* Fix avatar upload prompt/tooltip floating wrong and permissions
[\#5526](https://github.com/matrix-org/matrix-react-sdk/pull/5526)
* Add a dialpad UI for PSTN lookup
[\#5523](https://github.com/matrix-org/matrix-react-sdk/pull/5523)
* Basic call transfer initiation support
[\#5494](https://github.com/matrix-org/matrix-react-sdk/pull/5494)
* Fix #15988
[\#5524](https://github.com/matrix-org/matrix-react-sdk/pull/5524)
* Bump node-notifier from 8.0.0 to 8.0.1
[\#5520](https://github.com/matrix-org/matrix-react-sdk/pull/5520)
* Use TypeScript source for development, swap to build during release
[\#5503](https://github.com/matrix-org/matrix-react-sdk/pull/5503)
* Look for emoji in the body that will be displayed
[\#5517](https://github.com/matrix-org/matrix-react-sdk/pull/5517)
* Bump ini from 1.3.5 to 1.3.7
[\#5486](https://github.com/matrix-org/matrix-react-sdk/pull/5486)
* Recognise `*.element.io` links as Element permalinks
[\#5514](https://github.com/matrix-org/matrix-react-sdk/pull/5514)
* Fixes for call UI
[\#5509](https://github.com/matrix-org/matrix-react-sdk/pull/5509)
* Add a snowfall chat effect (with /snowfall command)
[\#5511](https://github.com/matrix-org/matrix-react-sdk/pull/5511)
* fireworks effect
[\#5507](https://github.com/matrix-org/matrix-react-sdk/pull/5507)
* Don't play call end sound for calls that never started
[\#5506](https://github.com/matrix-org/matrix-react-sdk/pull/5506)
* Add /tableflip slash command
[\#5485](https://github.com/matrix-org/matrix-react-sdk/pull/5485)
* Import from src in IncomingCallBox.tsx
[\#5504](https://github.com/matrix-org/matrix-react-sdk/pull/5504)
* Social Login support both https and mxc icons
[\#5499](https://github.com/matrix-org/matrix-react-sdk/pull/5499)
* Fix padding in confirmation email registration prompt
[\#5501](https://github.com/matrix-org/matrix-react-sdk/pull/5501)
* Fix room list help prompt alignment
[\#5500](https://github.com/matrix-org/matrix-react-sdk/pull/5500)
Changes in [3.11.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.1) (2020-12-21)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0...v3.11.1)

60
docs/widget-layouts.md Normal file
View File

@ -0,0 +1,60 @@
# Widget layout support
Rooms can have a default widget layout to auto-pin certain widgets, make the container different
sizes, etc. These are defined through the `io.element.widgets.layout` state event (empty state key).
Full example content:
```json5
{
"widgets": {
"first-widget-id": {
"container": "top",
"index": 0,
"width": 60,
"height": 40
},
"second-widget-id": {
"container": "right"
}
}
}
```
As shown, there are two containers possible for widgets. These containers have different behaviour
and interpret the other options differently.
## `top` container
This is the "App Drawer" or any pinned widgets in a room. This is by far the most versatile container
though does introduce potential usability issues upon members of the room (widgets take up space and
therefore fewer messages can be shown).
The `index` for a widget determines which order the widgets show up in from left to right. Widgets
without an `index` will show up as the rightmost widgets. Tiebreaks (same `index` or multiple defined
without an `index`) are resolved by comparing widget IDs. A maximum of 3 widgets can be in the top
container - any which exceed this will be ignored (placed into the `right` container). Smaller numbers
represent leftmost widgets.
The `width` is relative width within the container in percentage points. This will be clamped to a
range of 0-100 (inclusive). The widgets will attempt to scale to relative proportions when more than
100% space is allocated. For example, if 3 widgets are defined at 40% width each then the client will
attempt to show them at 33% width each.
Note that the client may impose minimum widths on the widgets, such as a 10% minimum to avoid pinning
hidden widgets. In general, widgets defined in the 30-70% range each will be free of these restrictions.
The `height` is not in fact applied per-widget but is recorded per-widget for potential future
capabilities in future containers. The top container will take the tallest `height` and use that for
the height of the whole container, and thus all widgets in that container. The `height` is relative
to the container, like with `width`, meaning that 100% will consume as much space as the client is
willing to sacrifice to the widget container. Like with `width`, the client may impose minimums to avoid
the container being uselessly small. Heights in the 30-100% range are generally acceptable. The height
is also clamped to be within 0-100, inclusive.
## `right` container
This is the default container and has no special configuration. Widgets which overflow from the top
container will be put in this container instead. Putting a widget in the right container does not
automatically show it - it only mentions that widgets should not be in another container.
The behaviour of this container may change in the future.

View File

@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
"version": "3.11.1",
"version": "3.12.0",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@ -27,11 +27,12 @@
"matrix-gen-i18n": "scripts/gen-i18n.js",
"matrix-prune-i18n": "scripts/prune-i18n.js"
},
"main": "./lib/index.js",
"typings": "./lib/index.d.ts",
"main": "./src/index.js",
"matrix_src_main": "./src/index.js",
"matrix_lib_main": "./lib/index.js",
"matrix_lib_typings": "./lib/index.d.ts",
"scripts": {
"prepare": "yarn build",
"prepublishOnly": "yarn build",
"i18n": "matrix-gen-i18n",
"prunei18n": "matrix-prune-i18n",
"diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && ./scripts/gen-i18n.js && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json",
@ -81,7 +82,7 @@
"linkifyjs": "^2.1.9",
"lodash": "^4.17.19",
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
"matrix-widget-api": "^0.1.0-beta.10",
"matrix-widget-api": "0.1.0-beta.11",
"minimist": "^1.2.5",
"pako": "^1.0.11",
"parse5": "^5.1.1",
@ -127,6 +128,7 @@
"@types/classnames": "^2.2.10",
"@types/counterpart": "^0.18.1",
"@types/flux": "^3.1.9",
"@types/jest": "^26.0.20",
"@types/linkifyjs": "^2.1.3",
"@types/lodash": "^4.14.158",
"@types/modernizr": "^3.5.3",
@ -171,7 +173,7 @@
"jest": {
"testEnvironment": "./__test-utils__/environment.js",
"testMatch": [
"<rootDir>/test/**/*-test.js"
"<rootDir>/test/**/*-test.[jt]s"
],
"setupFiles": [
"jest-canvas-mock"

View File

@ -236,4 +236,7 @@
@import "./views/verification/_VerificationShowSas.scss";
@import "./views/voip/_CallContainer.scss";
@import "./views/voip/_CallView.scss";
@import "./views/voip/_DialPad.scss";
@import "./views/voip/_DialPadContextMenu.scss";
@import "./views/voip/_DialPadModal.scss";
@import "./views/voip/_VideoFeed.scss";

View File

@ -180,6 +180,11 @@ $groupFilterPanelWidth: 56px; // only applies in this file, used for calculation
.mx_LeftPanel_roomListContainer {
width: 68px;
.mx_LeftPanel_userHeader {
flex-direction: row;
justify-content: center;
}
.mx_LeftPanel_filterContainer {
// Organize the flexbox into a centered column layout
flex-direction: column;

View File

@ -119,14 +119,10 @@ limitations under the License.
}
&.mx_UserMenu_minimized {
.mx_UserMenu_userHeader {
.mx_UserMenu_row {
justify-content: center;
}
padding-right: 0px;
.mx_UserMenu_userAvatarContainer {
margin-right: 0;
}
.mx_UserMenu_userAvatarContainer {
margin-right: 0px;
}
}
}

View File

@ -89,24 +89,18 @@ limitations under the License.
}
}
.mx_showMore {
display: block;
text-align: left;
margin-top: 10px;
}
.metadata {
color: $muted-fg-color;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 0;
}
.metadata.visible {
overflow-y: visible;
text-overflow: ellipsis;
white-space: normal;
padding: 0;
> li {
padding: 0;
border: 0;
}
}
}
}

View File

@ -18,6 +18,16 @@ limitations under the License.
position: relative;
width: min-content;
// this isn't a floating tooltip so override some things to not need to bother with z-index and floating
.mx_Tooltip {
display: inline-block;
position: absolute;
z-index: unset;
width: max-content;
left: 72px;
top: 0;
}
&::before, &::after {
content: '';
position: absolute;

View File

@ -16,8 +16,15 @@ limitations under the License.
.mx_SSOButtons {
display: flex;
flex-wrap: wrap;
justify-content: center;
.mx_SSOButtons_row {
& + .mx_SSOButtons_row {
margin-top: 16px;
}
}
.mx_SSOButton {
position: relative;
width: 100%;
@ -36,6 +43,8 @@ limitations under the License.
box-sizing: border-box;
width: 50px; // 48px + 1px border on all sides
height: 50px; // 48px + 1px border on all sides
min-width: 50px; // prevent crushing by the flexbox
padding: 12px;
> img {
left: 12px;
@ -43,7 +52,7 @@ limitations under the License.
}
& + .mx_SSOButton_mini {
margin-left: 24px;
margin-left: 16px;
}
}
}

View File

@ -24,26 +24,45 @@ $MiniAppTileHeight: 200px;
flex-direction: column;
overflow: hidden;
.mx_AppsContainer_resizerHandleContainer {
width: 100%;
height: 10px;
margin-top: -3px; // move it up so the interactions are slightly more comfortable
display: block;
position: relative;
}
.mx_AppsContainer_resizerHandle {
cursor: ns-resize;
border-radius: 3px;
// Override styles from library
width: unset !important;
height: 4px !important;
// Override styles from library, making the whole area the target area
width: 100% !important;
height: 100% !important;
// This is positioned directly below frame
position: absolute;
bottom: -8px !important; // override from library
bottom: 0 !important; // override from library
// Together, these make the bar 64px wide
// These are also overridden from the library
left: calc(50% - 32px) !important;
right: calc(50% - 32px) !important;
// We then render the pill handle in an ::after to keep it in the handle's
// area without being a massive line across the screen
&::after {
content: '';
position: absolute;
border-radius: 3px;
// The combination of these two should make the pill 4px high
top: 6px;
bottom: 0;
// Together, these make the bar 64px wide
// These are also overridden from the library
left: calc(50% - 32px);
right: calc(50% - 32px);
}
}
&:hover {
.mx_AppsContainer_resizerHandle {
.mx_AppsContainer_resizerHandle::after {
opacity: 0.8;
background: $primary-fg-color;
}

View File

@ -24,6 +24,9 @@ limitations under the License.
.mx_RoomList_iconExplore::before {
mask-image: url('$(res)/img/element-icons/roomlist/explore.svg');
}
.mx_RoomList_iconDialpad::before {
mask-image: url('$(res)/img/element-icons/roomlist/dialpad.svg');
}
.mx_RoomList_explorePrompt {
margin: 4px 12px 4px;

View File

@ -14,6 +14,12 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
.mx_ProfileSettings_controls_topic {
& > textarea {
resize: vertical;
}
}
.mx_ProfileSettings_profile {
display: flex;
}

View File

@ -46,7 +46,7 @@ limitations under the License.
.mx_IncomingCallBox {
min-width: 250px;
background-color: $secondary-accent-color;
background-color: $voipcall-plinth-color;
padding: 8px;
box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08);
border-radius: 8px;

View File

@ -310,8 +310,14 @@ limitations under the License.
}
}
// Makes the alignment correct
.mx_CallView_callControls_nothing {
.mx_CallView_callControls_dialpad {
margin-right: auto;
&::before {
background-image: url('$(res)/img/voip/dialpad.svg');
}
}
.mx_CallView_callControls_button_dialpad_hidden {
margin-right: auto;
cursor: initial;
}

View File

@ -0,0 +1,62 @@
/*
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_DialPad {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
.mx_DialPad_button {
width: 40px;
height: 40px;
background-color: $theme-button-bg-color;
border-radius: 40px;
font-size: 18px;
font-weight: 600;
text-align: center;
vertical-align: middle;
line-height: 40px;
}
.mx_DialPad_deleteButton, .mx_DialPad_dialButton {
&::before {
content: '';
display: inline-block;
height: 40px;
width: 40px;
vertical-align: middle;
mask-repeat: no-repeat;
mask-size: 20px;
mask-position: center;
background-color: $primary-bg-color;
}
}
.mx_DialPad_deleteButton {
background-color: $notice-primary-color;
&::before {
mask-image: url('$(res)/img/element-icons/call/delete.svg');
mask-position: 9px; // delete icon is right-heavy so have to be slightly to the left to look centered
}
}
.mx_DialPad_dialButton {
background-color: $accent-color;
&::before {
mask-image: url('$(res)/img/element-icons/call/voice-call.svg');
}
}

View File

@ -0,0 +1,47 @@
/*
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_DialPadContextMenu_header {
margin-top: 12px;
margin-left: 12px;
margin-right: 12px;
}
.mx_DialPadContextMenu_title {
color: $muted-fg-color;
font-size: 12px;
font-weight: 600;
}
.mx_DialPadContextMenu_dialled {
height: 1em;
font-size: 18px;
font-weight: 600;
}
.mx_DialPadContextMenu_dialPad {
margin: 16px;
}
.mx_DialPadContextMenu_horizSep {
position: relative;
&::before {
content: '';
position: absolute;
width: 100%;
border-bottom: 1px solid $input-darker-bg-color;
}
}

View File

@ -0,0 +1,74 @@
/*
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_Dialog_dialPadWrapper .mx_Dialog {
padding: 0px;
}
.mx_DialPadModal {
width: 192px;
height: 368px;
}
.mx_DialPadModal_header {
margin-top: 12px;
margin-left: 12px;
margin-right: 12px;
}
.mx_DialPadModal_title {
color: $muted-fg-color;
font-size: 12px;
font-weight: 600;
}
.mx_DialPadModal_cancel {
float: right;
mask: url('$(res)/img/feather-customised/cancel.svg');
mask-repeat: no-repeat;
mask-position: center;
mask-size: cover;
width: 14px;
height: 14px;
background-color: $dialog-close-fg-color;
cursor: pointer;
}
.mx_DialPadModal_field {
border: none;
margin: 0px;
}
.mx_DialPadModal_field input {
font-size: 18px;
font-weight: 600;
}
.mx_DialPadModal_dialPad {
margin-left: 16px;
margin-right: 16px;
margin-top: 16px;
}
.mx_DialPadModal_horizSep {
position: relative;
&::before {
content: '';
position: absolute;
width: 100%;
border-bottom: 1px solid $input-darker-bg-color;
}
}

View File

@ -0,0 +1,10 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M18.3333 2.49951H5.83333C5.25833 2.49951 4.80833 2.79118 4.50833 3.23285L0 9.99951L4.50833 16.7578C4.80833 17.1995 5.25833 17.4995 5.83333 17.4995H18.3333C19.25 17.4995 20 16.7495 20 15.8328V4.16618C20 3.24951 19.25 2.49951 18.3333 2.49951ZM15.8333 12.9912L14.6583 14.1662L11.6667 11.1745L8.675 14.1662L7.5 12.9912L10.4917 9.99951L7.5 7.00784L8.675 5.83284L11.6667 8.82451L14.6583 5.83284L15.8333 7.00784L12.8417 9.99951L15.8333 12.9912Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 692 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.99999 15.8335C9.08333 15.8335 8.33333 16.5835 8.33333 17.5002C8.33333 18.4168 9.08333 19.1668 9.99999 19.1668C10.9167 19.1668 11.6667 18.4168 11.6667 17.5002C11.6667 16.5835 10.9167 15.8335 9.99999 15.8335ZM4.99999 0.833496C4.08333 0.833496 3.33333 1.5835 3.33333 2.50016C3.33333 3.41683 4.08333 4.16683 4.99999 4.16683C5.91666 4.16683 6.66666 3.41683 6.66666 2.50016C6.66666 1.5835 5.91666 0.833496 4.99999 0.833496ZM4.99999 5.8335C4.08333 5.8335 3.33333 6.5835 3.33333 7.50016C3.33333 8.41683 4.08333 9.16683 4.99999 9.16683C5.91666 9.16683 6.66666 8.41683 6.66666 7.50016C6.66666 6.5835 5.91666 5.8335 4.99999 5.8335ZM4.99999 10.8335C4.08333 10.8335 3.33333 11.5835 3.33333 12.5002C3.33333 13.4168 4.08333 14.1668 4.99999 14.1668C5.91666 14.1668 6.66666 13.4168 6.66666 12.5002C6.66666 11.5835 5.91666 10.8335 4.99999 10.8335ZM15 4.16683C15.9167 4.16683 16.6667 3.41683 16.6667 2.50016C16.6667 1.5835 15.9167 0.833496 15 0.833496C14.0833 0.833496 13.3333 1.5835 13.3333 2.50016C13.3333 3.41683 14.0833 4.16683 15 4.16683ZM9.99999 10.8335C9.08333 10.8335 8.33333 11.5835 8.33333 12.5002C8.33333 13.4168 9.08333 14.1668 9.99999 14.1668C10.9167 14.1668 11.6667 13.4168 11.6667 12.5002C11.6667 11.5835 10.9167 10.8335 9.99999 10.8335ZM15 10.8335C14.0833 10.8335 13.3333 11.5835 13.3333 12.5002C13.3333 13.4168 14.0833 14.1668 15 14.1668C15.9167 14.1668 16.6667 13.4168 16.6667 12.5002C16.6667 11.5835 15.9167 10.8335 15 10.8335ZM15 5.8335C14.0833 5.8335 13.3333 6.5835 13.3333 7.50016C13.3333 8.41683 14.0833 9.16683 15 9.16683C15.9167 9.16683 16.6667 8.41683 16.6667 7.50016C16.6667 6.5835 15.9167 5.8335 15 5.8335ZM9.99999 5.8335C9.08333 5.8335 8.33333 6.5835 8.33333 7.50016C8.33333 8.41683 9.08333 9.16683 9.99999 9.16683C10.9167 9.16683 11.6667 8.41683 11.6667 7.50016C11.6667 6.5835 10.9167 5.8335 9.99999 5.8335ZM9.99999 0.833496C9.08333 0.833496 8.33333 1.5835 8.33333 2.50016C8.33333 3.41683 9.08333 4.16683 9.99999 4.16683C10.9167 4.16683 11.6667 3.41683 11.6667 2.50016C11.6667 1.5835 10.9167 0.833496 9.99999 0.833496Z" fill="#8D99A5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

17
res/img/voip/dialpad.svg Normal file
View File

@ -0,0 +1,17 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d)">
<circle cx="24" cy="20" r="20" fill="white"/>
</g>
<path d="M24 25.8335C23.0833 25.8335 22.3333 26.5835 22.3333 27.5002C22.3333 28.4168 23.0833 29.1668 24 29.1668C24.9167 29.1668 25.6667 28.4168 25.6667 27.5002C25.6667 26.5835 24.9167 25.8335 24 25.8335ZM19 10.8335C18.0833 10.8335 17.3333 11.5835 17.3333 12.5002C17.3333 13.4168 18.0833 14.1668 19 14.1668C19.9167 14.1668 20.6667 13.4168 20.6667 12.5002C20.6667 11.5835 19.9167 10.8335 19 10.8335ZM19 15.8335C18.0833 15.8335 17.3333 16.5835 17.3333 17.5002C17.3333 18.4168 18.0833 19.1668 19 19.1668C19.9167 19.1668 20.6667 18.4168 20.6667 17.5002C20.6667 16.5835 19.9167 15.8335 19 15.8335ZM19 20.8335C18.0833 20.8335 17.3333 21.5835 17.3333 22.5002C17.3333 23.4168 18.0833 24.1668 19 24.1668C19.9167 24.1668 20.6667 23.4168 20.6667 22.5002C20.6667 21.5835 19.9167 20.8335 19 20.8335ZM29 14.1668C29.9167 14.1668 30.6667 13.4168 30.6667 12.5002C30.6667 11.5835 29.9167 10.8335 29 10.8335C28.0833 10.8335 27.3333 11.5835 27.3333 12.5002C27.3333 13.4168 28.0833 14.1668 29 14.1668ZM24 20.8335C23.0833 20.8335 22.3333 21.5835 22.3333 22.5002C22.3333 23.4168 23.0833 24.1668 24 24.1668C24.9167 24.1668 25.6667 23.4168 25.6667 22.5002C25.6667 21.5835 24.9167 20.8335 24 20.8335ZM29 20.8335C28.0833 20.8335 27.3333 21.5835 27.3333 22.5002C27.3333 23.4168 28.0833 24.1668 29 24.1668C29.9167 24.1668 30.6667 23.4168 30.6667 22.5002C30.6667 21.5835 29.9167 20.8335 29 20.8335ZM29 15.8335C28.0833 15.8335 27.3333 16.5835 27.3333 17.5002C27.3333 18.4168 28.0833 19.1668 29 19.1668C29.9167 19.1668 30.6667 18.4168 30.6667 17.5002C30.6667 16.5835 29.9167 15.8335 29 15.8335ZM24 15.8335C23.0833 15.8335 22.3333 16.5835 22.3333 17.5002C22.3333 18.4168 23.0833 19.1668 24 19.1668C24.9167 19.1668 25.6667 18.4168 25.6667 17.5002C25.6667 16.5835 24.9167 15.8335 24 15.8335ZM24 10.8335C23.0833 10.8335 22.3333 11.5835 22.3333 12.5002C22.3333 13.4168 23.0833 14.1668 24 14.1668C24.9167 14.1668 25.6667 13.4168 25.6667 12.5002C25.6667 11.5835 24.9167 10.8335 24 10.8335Z" fill="#737D8C"/>
<defs>
<filter id="filter0_d" x="0" y="0" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="2"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -7,7 +7,6 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk
pushd matrix-js-sdk
yarn link
yarn install $@
yarn build
popd
yarn link matrix-js-sdk

View File

@ -20,6 +20,7 @@ popd
yarn link matrix-js-sdk
yarn link
yarn install
yarn reskindex
# Finally, set up element-web
scripts/fetchdep.sh vector-im element-web

View File

@ -1,29 +1,30 @@
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var glob = require('glob');
var args = require('minimist')(process.argv);
var chokidar = require('chokidar');
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const util = require('util');
const args = require('minimist')(process.argv);
const chokidar = require('chokidar');
var componentIndex = path.join('src', 'component-index.js');
var componentIndexTmp = componentIndex+".tmp";
var componentsDir = path.join('src', 'components');
var componentJsGlob = '**/*.js';
var componentTsGlob = '**/*.tsx';
var prevFiles = [];
const componentIndex = path.join('src', 'component-index.js');
const componentIndexTmp = componentIndex+".tmp";
const componentsDir = path.join('src', 'components');
const componentJsGlob = '**/*.js';
const componentTsGlob = '**/*.tsx';
let prevFiles = [];
function reskindex() {
var jsFiles = glob.sync(componentJsGlob, {cwd: componentsDir}).sort();
var tsFiles = glob.sync(componentTsGlob, {cwd: componentsDir}).sort();
var files = [...tsFiles, ...jsFiles];
async function reskindex() {
const jsFiles = glob.sync(componentJsGlob, {cwd: componentsDir}).sort();
const tsFiles = glob.sync(componentTsGlob, {cwd: componentsDir}).sort();
const files = [...tsFiles, ...jsFiles];
if (!filesHaveChanged(files, prevFiles)) {
return;
}
prevFiles = files;
var header = args.h || args.header;
const header = args.h || args.header;
var strm = fs.createWriteStream(componentIndexTmp);
const strm = fs.createWriteStream(componentIndexTmp);
if (header) {
strm.write(fs.readFileSync(header));
@ -38,11 +39,11 @@ function reskindex() {
strm.write(" */\n\n");
strm.write("let components = {};\n");
for (var i = 0; i < files.length; ++i) {
var file = files[i].replace('.js', '').replace('.tsx', '');
for (let i = 0; i < files.length; ++i) {
const file = files[i].replace('.js', '').replace('.tsx', '');
var moduleName = (file.replace(/\//g, '.'));
var importName = moduleName.replace(/\./g, "$");
const moduleName = (file.replace(/\//g, '.'));
const importName = moduleName.replace(/\./g, "$");
strm.write("import " + importName + " from './components/" + file + "';\n");
strm.write(importName + " && (components['"+moduleName+"'] = " + importName + ");");
@ -51,9 +52,10 @@ function reskindex() {
}
strm.write("export {components};\n");
strm.end();
// Ensure the file has been fully written to disk before proceeding
await util.promisify(strm.end);
fs.rename(componentIndexTmp, componentIndex, function(err) {
if(err) {
if (err) {
console.error("Error moving new index into place: " + err);
} else {
console.log('Reskindex: completed');
@ -67,7 +69,7 @@ function filesHaveChanged(files, prevFiles) {
return true;
}
// Check for name changes
for (var i = 0; i < files.length; i++) {
for (let i = 0; i < files.length; i++) {
if (prevFiles[i] !== files[i]) {
return true;
}
@ -81,7 +83,7 @@ if (!args.w) {
return;
}
var watchDebouncer = null;
let watchDebouncer = null;
chokidar.watch(path.join(componentsDir, componentJsGlob)).on('all', (event, path) => {
if (path === componentIndex) return;
if (watchDebouncer) clearTimeout(watchDebouncer);

View File

@ -36,6 +36,7 @@ import {Analytics} from "../Analytics";
import CountlyAnalytics from "../CountlyAnalytics";
import UserActivity from "../UserActivity";
import {ModalWidgetStore} from "../stores/ModalWidgetStore";
import { WidgetLayoutStore } from "../stores/widgets/WidgetLayoutStore";
declare global {
interface Window {
@ -59,6 +60,7 @@ declare global {
mxNotifier: typeof Notifier;
mxRightPanelStore: RightPanelStore;
mxWidgetStore: WidgetStore;
mxWidgetLayoutStore: WidgetLayoutStore;
mxCallHandler: CallHandler;
mxAnalytics: Analytics;
mxCountlyAnalytics: typeof CountlyAnalytics;

View File

@ -82,6 +82,10 @@ import CountlyAnalytics from "./CountlyAnalytics";
import {UIFeature} from "./settings/UIFeature";
import { CallError } from "matrix-js-sdk/src/webrtc/call";
import { logger } from 'matrix-js-sdk/src/logger';
import { Action } from './dispatcher/actions';
import { roomForVirtualRoom, getOrCreateVirtualRoomForRoom } from './VoipUserMapper';
const CHECK_PSTN_SUPPORT_ATTEMPTS = 3;
enum AudioID {
Ring = 'ringAudio',
@ -119,6 +123,8 @@ export default class CallHandler {
private calls = new Map<string, MatrixCall>(); // roomId -> call
private audioPromises = new Map<AudioID, Promise<void>>();
private dispatcherRef: string = null;
private supportsPstnProtocol = null;
private pstnSupportCheckTimer: NodeJS.Timeout; // number actually because we're in the browser
static sharedInstance() {
if (!window.mxCallHandler) {
@ -128,6 +134,15 @@ export default class CallHandler {
return window.mxCallHandler;
}
/*
* Gets the user-facing room associated with a call (call.roomId may be the call "virtual room"
* if a voip_mxid_translate_pattern is set in the config)
*/
public static roomIdForCall(call: MatrixCall) {
if (!call) return null;
return roomForVirtualRoom(call.roomId) || call.roomId;
}
start() {
this.dispatcherRef = dis.register(this.onAction);
// add empty handlers for media actions, otherwise the media keys
@ -145,6 +160,8 @@ export default class CallHandler {
if (SettingsStore.getValue(UIFeature.Voip)) {
MatrixClientPeg.get().on('Call.incoming', this.onCallIncoming);
}
this.checkForPstnSupport(CHECK_PSTN_SUPPORT_ATTEMPTS);
}
stop() {
@ -158,6 +175,33 @@ export default class CallHandler {
}
}
private async checkForPstnSupport(maxTries) {
try {
const protocols = await MatrixClientPeg.get().getThirdpartyProtocols();
if (protocols['im.vector.protocol.pstn'] !== undefined) {
this.supportsPstnProtocol = protocols['im.vector.protocol.pstn'];
} else if (protocols['m.protocol.pstn'] !== undefined) {
this.supportsPstnProtocol = protocols['m.protocol.pstn'];
} else {
this.supportsPstnProtocol = null;
}
dis.dispatch({action: Action.PstnSupportUpdated});
} catch (e) {
if (maxTries === 1) {
console.log("Failed to check for pstn protocol support and no retries remain: assuming no support", e);
} else {
console.log("Failed to check for pstn protocol support: will retry", e);
this.pstnSupportCheckTimer = setTimeout(() => {
this.checkForPstnSupport(maxTries - 1);
}, 10000);
}
}
}
getSupportsPstnProtocol() {
return this.supportsPstnProtocol;
}
private onCallIncoming = (call) => {
// we dispatch this synchronously to make sure that the event
// handlers on the call are set up immediately (so that if
@ -250,11 +294,15 @@ export default class CallHandler {
// We don't allow placing more than one call per room, but that doesn't mean there
// can't be more than one, eg. in a glare situation. This checks that the given call
// is the call we consider 'the' call for its room.
const callForThisRoom = this.getCallForRoom(call.roomId);
const mappedRoomId = CallHandler.roomIdForCall(call);
const callForThisRoom = this.getCallForRoom(mappedRoomId);
return callForThisRoom && call.callId === callForThisRoom.callId;
}
private setCallListeners(call: MatrixCall) {
const mappedRoomId = CallHandler.roomIdForCall(call);
call.on(CallEvent.Error, (err: CallError) => {
if (!this.matchesCallForThisRoom(call)) return;
@ -284,7 +332,7 @@ export default class CallHandler {
Analytics.trackEvent('voip', 'callHangup');
this.removeCallForRoom(call.roomId);
this.removeCallForRoom(mappedRoomId);
});
call.on(CallEvent.State, (newState: CallState, oldState: CallState) => {
if (!this.matchesCallForThisRoom(call)) return;
@ -309,7 +357,7 @@ export default class CallHandler {
break;
case CallState.Ended:
Analytics.trackEvent('voip', 'callEnded', 'hangupReason', call.hangupReason);
this.removeCallForRoom(call.roomId);
this.removeCallForRoom(mappedRoomId);
if (oldState === CallState.InviteSent && (
call.hangupParty === CallParty.Remote ||
(call.hangupParty === CallParty.Local && call.hangupReason === CallErrorCode.InviteTimeout)
@ -358,7 +406,7 @@ export default class CallHandler {
this.pause(AudioID.Ringback);
}
this.calls.set(newCall.roomId, newCall);
this.calls.set(mappedRoomId, newCall);
this.setCallListeners(newCall);
this.setCallState(newCall, newCall.state);
});
@ -370,13 +418,15 @@ export default class CallHandler {
}
private setCallState(call: MatrixCall, status: CallState) {
const mappedRoomId = CallHandler.roomIdForCall(call);
console.log(
`Call state in ${call.roomId} changed to ${status}`,
`Call state in ${mappedRoomId} changed to ${status}`,
);
dis.dispatch({
action: 'call_state',
room_id: call.roomId,
room_id: mappedRoomId,
state: status,
});
}
@ -443,14 +493,20 @@ export default class CallHandler {
}, null, true);
}
private placeCall(
private async placeCall(
roomId: string, type: PlaceCallType,
localElement: HTMLVideoElement, remoteElement: HTMLVideoElement,
) {
Analytics.trackEvent('voip', 'placeCall', 'type', type);
CountlyAnalytics.instance.trackStartCall(roomId, type === PlaceCallType.Video, false);
const call = createNewMatrixCall(MatrixClientPeg.get(), roomId);
const mappedRoomId = (await getOrCreateVirtualRoomForRoom(roomId)) || roomId;
logger.debug("Mapped real room " + roomId + " to room ID " + mappedRoomId);
const call = createNewMatrixCall(MatrixClientPeg.get(), mappedRoomId);
this.calls.set(roomId, call);
this.setCallListeners(call);
this.setCallAudioElement(call);
@ -552,13 +608,14 @@ export default class CallHandler {
const call = payload.call as MatrixCall;
if (this.getCallForRoom(call.roomId)) {
const mappedRoomId = CallHandler.roomIdForCall(call);
if (this.getCallForRoom(mappedRoomId)) {
// ignore multiple incoming calls to the same room
return;
}
Analytics.trackEvent('voip', 'receiveCall', 'type', call.type);
this.calls.set(call.roomId, call)
this.calls.set(mappedRoomId, call)
this.setCallListeners(call);
}
break;

View File

@ -19,6 +19,7 @@ import * as Roles from './Roles';
import {isValid3pidInvite} from "./RoomInvite";
import SettingsStore from "./settings/SettingsStore";
import {ALL_RULE_TYPES, ROOM_RULE_TYPES, SERVER_RULE_TYPES, USER_RULE_TYPES} from "./mjolnir/BanList";
import {WIDGET_LAYOUT_EVENT_TYPE} from "./stores/widgets/WidgetLayoutStore";
function textForMemberEvent(ev) {
// XXX: SYJS-16 "sender is sometimes null for join messages"
@ -477,6 +478,11 @@ function textForWidgetEvent(event) {
}
}
function textForWidgetLayoutEvent(event) {
const senderName = event.sender?.name || event.getSender();
return _t("%(senderName)s has updated the widget layout", {senderName});
}
function textForMjolnirEvent(event) {
const senderName = event.getSender();
const {entity: prevEntity} = event.getPrevContent();
@ -583,6 +589,7 @@ const stateHandlers = {
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
'im.vector.modular.widgets': textForWidgetEvent,
[WIDGET_LAYOUT_EVENT_TYPE]: textForWidgetLayoutEvent,
};
// Add all the Mjolnir stuff to the renderer

79
src/VoipUserMapper.ts Normal file
View File

@ -0,0 +1,79 @@
/*
Copyright 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { ensureDMExists, findDMForUser } from './createRoom';
import { MatrixClientPeg } from "./MatrixClientPeg";
import DMRoomMap from "./utils/DMRoomMap";
import SdkConfig from "./SdkConfig";
// Functions for mapping users & rooms for the voip_mxid_translate_pattern
// config option
export function voipUserMapperEnabled(): boolean {
return SdkConfig.get()['voip_mxid_translate_pattern'] !== undefined;
}
// only exported for tests
export function userToVirtualUser(userId: string, templateString?: string): string {
if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern'];
if (!templateString) return null;
return templateString.replace('${mxid}', encodeURIComponent(userId).replace(/%/g, '=').toLowerCase());
}
// only exported for tests
export function virtualUserToUser(userId: string, templateString?: string): string {
if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern'];
if (!templateString) return null;
const regexString = templateString.replace('${mxid}', '(.+)');
const match = userId.match('^' + regexString + '$');
if (!match) return null;
return decodeURIComponent(match[1].replace(/=/g, '%'));
}
async function getOrCreateVirtualRoomForUser(userId: string):Promise<string> {
const virtualUser = userToVirtualUser(userId);
if (!virtualUser) return null;
return await ensureDMExists(MatrixClientPeg.get(), virtualUser);
}
export async function getOrCreateVirtualRoomForRoom(roomId: string):Promise<string> {
const user = DMRoomMap.shared().getUserIdForRoomId(roomId);
if (!user) return null;
return getOrCreateVirtualRoomForUser(user);
}
export function roomForVirtualRoom(roomId: string):string {
const virtualUser = DMRoomMap.shared().getUserIdForRoomId(roomId);
if (!virtualUser) return null;
const realUser = virtualUserToUser(virtualUser);
const room = findDMForUser(MatrixClientPeg.get(), realUser);
if (room) {
return room.roomId;
} else {
return null;
}
}
export function isVirtualRoom(roomId: string):boolean {
const virtualUser = DMRoomMap.shared().getUserIdForRoomId(roomId);
if (!virtualUser) return null;
const realUser = virtualUserToUser(virtualUser);
return Boolean(realUser);
}

View File

@ -95,7 +95,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
const blob = new Blob([this._keyBackupInfo.recovery_key], {
type: 'text/plain;charset=us-ascii',
});
FileSaver.saveAs(blob, 'recovery-key.txt');
FileSaver.saveAs(blob, 'security-key.txt');
this.setState({
downloaded: true,
@ -238,7 +238,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
)}</p>
<p>{_t(
"We'll store an encrypted copy of your keys on our server. " +
"Secure your backup with a recovery passphrase.",
"Secure your backup with a Security Phrase.",
)}</p>
<p>{_t("For maximum security, this should be different from your account password.")}</p>
@ -252,10 +252,10 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
onValidate={this._onPassPhraseValidate}
fieldRef={this._passphraseField}
autoFocus={true}
label={_td("Enter a recovery passphrase")}
labelEnterPassword={_td("Enter a recovery passphrase")}
labelStrongPassword={_td("Great! This recovery passphrase looks strong enough.")}
labelAllowedButUnsafe={_td("Great! This recovery passphrase looks strong enough.")}
label={_td("Enter a Security Phrase")}
labelEnterPassword={_td("Enter a Security Phrase")}
labelStrongPassword={_td("Great! This Security Phrase looks strong enough.")}
labelAllowedButUnsafe={_td("Great! This Security Phrase looks strong enough.")}
/>
</div>
</div>
@ -270,7 +270,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
<details>
<summary>{_t("Advanced")}</summary>
<AccessibleButton kind='primary' onClick={this._onSkipPassPhraseClick} >
{_t("Set up with a recovery key")}
{_t("Set up with a Security Key")}
</AccessibleButton>
</details>
</form>;
@ -310,7 +310,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
return <form onSubmit={this._onPassPhraseConfirmNextClick}>
<p>{_t(
"Please enter your recovery passphrase a second time to confirm.",
"Please enter your Security Phrase a second time to confirm.",
)}</p>
<div className="mx_CreateKeyBackupDialog_primaryContainer">
<div className="mx_CreateKeyBackupDialog_passPhraseContainer">
@ -319,7 +319,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
onChange={this._onPassPhraseConfirmChange}
value={this.state.passPhraseConfirm}
className="mx_CreateKeyBackupDialog_passPhraseInput"
placeholder={_t("Repeat your recovery passphrase...")}
placeholder={_t("Repeat your Security Phrase...")}
autoFocus={true}
/>
</div>
@ -338,15 +338,15 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
_renderPhaseShowKey() {
return <div>
<p>{_t(
"Your recovery key is a safety net - you can use it to restore " +
"access to your encrypted messages if you forget your recovery passphrase.",
"Your Security Key is a safety net - you can use it to restore " +
"access to your encrypted messages if you forget your Security Phrase.",
)}</p>
<p>{_t(
"Keep a copy of it somewhere secure, like a password manager or even a safe.",
)}</p>
<div className="mx_CreateKeyBackupDialog_primaryContainer">
<div className="mx_CreateKeyBackupDialog_recoveryKeyHeader">
{_t("Your recovery key")}
{_t("Your Security Key")}
</div>
<div className="mx_CreateKeyBackupDialog_recoveryKeyContainer">
<div className="mx_CreateKeyBackupDialog_recoveryKey">
@ -369,12 +369,12 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
let introText;
if (this.state.copied) {
introText = _t(
"Your recovery key has been <b>copied to your clipboard</b>, paste it to:",
"Your Security Key has been <b>copied to your clipboard</b>, paste it to:",
{}, {b: s => <b>{s}</b>},
);
} else if (this.state.downloaded) {
introText = _t(
"Your recovery key is in your <b>Downloads</b> folder.",
"Your Security Key is in your <b>Downloads</b> folder.",
{}, {b: s => <b>{s}</b>},
);
}
@ -433,14 +433,14 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
_titleForPhase(phase) {
switch (phase) {
case PHASE_PASSPHRASE:
return _t('Secure your backup with a recovery passphrase');
return _t('Secure your backup with a Security Phrase');
case PHASE_PASSPHRASE_CONFIRM:
return _t('Confirm your recovery passphrase');
return _t('Confirm your Security Phrase');
case PHASE_OPTOUT_CONFIRM:
return _t('Warning!');
case PHASE_SHOWKEY:
case PHASE_KEEPITSAFE:
return _t('Make a copy of your recovery key');
return _t('Make a copy of your Security Key');
case PHASE_BACKINGUP:
return _t('Starting backup...');
case PHASE_DONE:

View File

@ -235,7 +235,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
const blob = new Blob([this._recoveryKey.encodedPrivateKey], {
type: 'text/plain;charset=us-ascii',
});
FileSaver.saveAs(blob, 'recovery-key.txt');
FileSaver.saveAs(blob, 'security-key.txt');
this.setState({
downloaded: true,
@ -593,10 +593,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
onValidate={this._onPassPhraseValidate}
fieldRef={this._passphraseField}
autoFocus={true}
label={_td("Enter a recovery passphrase")}
labelEnterPassword={_td("Enter a recovery passphrase")}
labelStrongPassword={_td("Great! This recovery passphrase looks strong enough.")}
labelAllowedButUnsafe={_td("Great! This recovery passphrase looks strong enough.")}
label={_td("Enter a Security Phrase")}
labelEnterPassword={_td("Enter a Security Phrase")}
labelStrongPassword={_td("Great! This Security Phrase looks strong enough.")}
labelAllowedButUnsafe={_td("Great! This Security Phrase looks strong enough.")}
/>
</div>

View File

@ -58,7 +58,7 @@ export default class NewRecoveryMethodDialog extends React.PureComponent {
</span>;
const newMethodDetected = <p>{_t(
"A new recovery passphrase and key for Secure Messages have been detected.",
"A new Security Phrase and key for Secure Messages have been detected.",
)}</p>;
const hackWarning = <p className="warning">{_t(

View File

@ -56,7 +56,7 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent {
>
<div>
<p>{_t(
"This session has detected that your recovery passphrase and key " +
"This session has detected that your Security Phrase and key " +
"for Secure Messages have been removed.",
)}</p>
<p>{_t(

View File

@ -397,7 +397,8 @@ export const toRightOf = (elementRect: DOMRect, chevronOffset = 12) => {
return {left, top, chevronOffset};
};
// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect
// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect,
// and either above or below: wherever there is more space (maybe this should be aboveOrBelowLeftOf?)
export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => {
const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };
@ -416,6 +417,41 @@ export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None
return menuOptions;
};
// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect
// and always above elementRect
export const alwaysAboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => {
const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };
const buttonRight = elementRect.right + window.pageXOffset;
const buttonBottom = elementRect.bottom + window.pageYOffset;
const buttonTop = elementRect.top + window.pageYOffset;
// Align the right edge of the menu to the right edge of the button
menuOptions.right = window.innerWidth - buttonRight;
// Align the menu vertically on whichever side of the button has more space available.
if (buttonBottom < window.innerHeight / 2) {
menuOptions.top = buttonBottom + vPadding;
} else {
menuOptions.bottom = (window.innerHeight - buttonTop) + vPadding;
}
return menuOptions;
};
// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the right of elementRect
// and always above elementRect
export const alwaysAboveRightOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => {
const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };
const buttonLeft = elementRect.left + window.pageXOffset;
const buttonTop = elementRect.top + window.pageYOffset;
// Align the left edge of the menu to the left edge of the button
menuOptions.left = buttonLeft;
// Align the menu vertically above the menu
menuOptions.bottom = (window.innerHeight - buttonTop) + vPadding;
return menuOptions;
};
type ContextMenuTuple<T> = [boolean, RefObject<T>, () => void, () => void, (val: boolean) => void];
export const useContextMenu = <T extends any = HTMLElement>(): ContextMenuTuple<T> => {
const button = useRef<T>(null);

View File

@ -140,7 +140,7 @@ class LoggedInView extends React.Component<IProps, IState> {
protected readonly _matrixClient: MatrixClient;
protected readonly _roomView: React.RefObject<any>;
protected readonly _resizeContainer: React.RefObject<ResizeHandle>;
protected readonly _compactLayoutWatcherRef: string;
protected compactLayoutWatcherRef: string;
protected resizer: Resizer;
constructor(props, context) {
@ -157,18 +157,6 @@ class LoggedInView extends React.Component<IProps, IState> {
CallMediaHandler.loadDevices();
document.addEventListener('keydown', this._onNativeKeyDown, false);
this._updateServerNoticeEvents();
this._matrixClient.on("accountData", this.onAccountData);
this._matrixClient.on("sync", this.onSync);
this._matrixClient.on("RoomState.events", this.onRoomStateEvents);
this._compactLayoutWatcherRef = SettingsStore.watchSetting(
"useCompactLayout", null, this.onCompactLayoutChanged,
);
fixupColorFonts();
this._roomView = React.createRef();
@ -176,6 +164,24 @@ class LoggedInView extends React.Component<IProps, IState> {
}
componentDidMount() {
document.addEventListener('keydown', this._onNativeKeyDown, false);
this._updateServerNoticeEvents();
this._matrixClient.on("accountData", this.onAccountData);
this._matrixClient.on("sync", this.onSync);
// Call `onSync` with the current state as well
this.onSync(
this._matrixClient.getSyncState(),
null,
this._matrixClient.getSyncStateData(),
);
this._matrixClient.on("RoomState.events", this.onRoomStateEvents);
this.compactLayoutWatcherRef = SettingsStore.watchSetting(
"useCompactLayout", null, this.onCompactLayoutChanged,
);
this.resizer = this._createResizer();
this.resizer.attach();
this._loadResizerPreferences();
@ -186,7 +192,7 @@ class LoggedInView extends React.Component<IProps, IState> {
this._matrixClient.removeListener("accountData", this.onAccountData);
this._matrixClient.removeListener("sync", this.onSync);
this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents);
SettingsStore.unwatchSetting(this._compactLayoutWatcherRef);
SettingsStore.unwatchSetting(this.compactLayoutWatcherRef);
this.resizer.detach();
}

View File

@ -80,6 +80,7 @@ import CreateCommunityPrototypeDialog from "../views/dialogs/CreateCommunityProt
import ThreepidInviteStore, { IThreepidInvite, IThreepidInviteWireFormat } from "../../stores/ThreepidInviteStore";
import {UIFeature} from "../../settings/UIFeature";
import { CommunityPrototypeStore } from "../../stores/CommunityPrototypeStore";
import DialPadModal from "../views/voip/DialPadModal";
/** constants for MatrixChat.state.view */
export enum Views {
@ -703,6 +704,9 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
this.state.resizeNotifier.notifyLeftHandleResized();
});
break;
case Action.OpenDialPad:
Modal.createTrackedDialog('Dial pad', '', DialPadModal, {}, "mx_Dialog_dialPadWrapper");
break;
case 'on_logged_in':
if (
!Lifecycle.isSoftLogout() &&

View File

@ -39,7 +39,7 @@ class NotificationPanel extends React.Component {
const emptyState = (<div className="mx_RightPanel_empty mx_NotificationPanel_empty">
<h2>{_t('Youre all caught up')}</h2>
<p>{_t('You have no visible notifications in this room.')}</p>
<p>{_t('You have no visible notifications.')}</p>
</div>);
let content;

View File

@ -487,7 +487,11 @@ export default class RoomDirectory extends React.Component {
let previewButton;
let joinOrViewButton;
if (room.world_readable && !hasJoinedRoom) {
// Element Web currently does not allow guests to join rooms, so we
// instead show them preview buttons for all rooms. If the room is not
// world readable, a modal will appear asking you to register first. If
// it is readable, the preview appears as normal.
if (!hasJoinedRoom && (room.world_readable || isGuest)) {
previewButton = (
<AccessibleButton kind="secondary" onClick={(ev) => this.onPreviewClick(ev, room)}>{_t("Preview")}</AccessibleButton>
);
@ -496,7 +500,7 @@ export default class RoomDirectory extends React.Component {
joinOrViewButton = (
<AccessibleButton kind="secondary" onClick={(ev) => this.onViewClick(ev, room)}>{_t("View")}</AccessibleButton>
);
} else if (!isGuest || room.guest_can_join) {
} else if (!isGuest) {
joinOrViewButton = (
<AccessibleButton kind="primary" onClick={(ev) => this.onJoinClick(ev, room)}>{_t("Join")}</AccessibleButton>
);

View File

@ -21,15 +21,15 @@ limitations under the License.
// - Search results component
// - Drag and drop
import React, {createRef} from 'react';
import React, { createRef } from 'react';
import classNames from 'classnames';
import {Room} from "matrix-js-sdk/src/models/room";
import {MatrixEvent} from "matrix-js-sdk/src/models/event";
import {EventSubscription} from "fbemitter";
import { Room } from "matrix-js-sdk/src/models/room";
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
import { EventSubscription } from "fbemitter";
import shouldHideEvent from '../../shouldHideEvent';
import {_t} from '../../languageHandler';
import {RoomPermalinkCreator} from '../../utils/permalinks/Permalinks';
import { _t } from '../../languageHandler';
import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks';
import ResizeNotifier from '../../utils/ResizeNotifier';
import ContentMessages from '../../ContentMessages';
import Modal from '../../Modal';
@ -40,8 +40,8 @@ import Tinter from '../../Tinter';
import rateLimitedFunc from '../../ratelimitedfunc';
import * as ObjectUtils from '../../ObjectUtils';
import * as Rooms from '../../Rooms';
import eventSearch, {searchPagination} from '../../Searching';
import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, Key} from '../../Keyboard';
import eventSearch, { searchPagination } from '../../Searching';
import { isOnlyCtrlOrCmdIgnoreShiftKeyEvent, Key } from '../../Keyboard';
import MainSplit from './MainSplit';
import RightPanel from './RightPanel';
import RoomViewStore from '../../stores/RoomViewStore';
@ -50,13 +50,13 @@ import WidgetEchoStore from '../../stores/WidgetEchoStore';
import SettingsStore from "../../settings/SettingsStore";
import AccessibleButton from "../views/elements/AccessibleButton";
import RightPanelStore from "../../stores/RightPanelStore";
import {haveTileForEvent} from "../views/rooms/EventTile";
import { haveTileForEvent } from "../views/rooms/EventTile";
import RoomContext from "../../contexts/RoomContext";
import MatrixClientContext from "../../contexts/MatrixClientContext";
import {E2EStatus, shieldStatusForRoom} from '../../utils/ShieldUtils';
import {Action} from "../../dispatcher/actions";
import {SettingLevel} from "../../settings/SettingLevel";
import {IMatrixClientCreds} from "../../MatrixClientPeg";
import { E2EStatus, shieldStatusForRoom } from '../../utils/ShieldUtils';
import { Action } from "../../dispatcher/actions";
import { SettingLevel } from "../../settings/SettingLevel";
import { IMatrixClientCreds } from "../../MatrixClientPeg";
import ScrollPanel from "./ScrollPanel";
import TimelinePanel from "./TimelinePanel";
import ErrorBoundary from "../views/elements/ErrorBoundary";
@ -67,17 +67,18 @@ import RoomUpgradeWarningBar from "../views/rooms/RoomUpgradeWarningBar";
import PinnedEventsPanel from "../views/rooms/PinnedEventsPanel";
import AuxPanel from "../views/rooms/AuxPanel";
import RoomHeader from "../views/rooms/RoomHeader";
import {XOR} from "../../@types/common";
import { XOR } from "../../@types/common";
import { IThreepidInvite } from "../../stores/ThreepidInviteStore";
import EffectsOverlay from "../views/elements/EffectsOverlay";
import {containsEmoji} from '../../effects/utils';
import {CHAT_EFFECTS} from '../../effects';
import { containsEmoji } from '../../effects/utils';
import { CHAT_EFFECTS } from '../../effects';
import { CallState, MatrixCall } from "matrix-js-sdk/src/webrtc/call";
import WidgetStore from "../../stores/WidgetStore";
import {UPDATE_EVENT} from "../../stores/AsyncStore";
import { UPDATE_EVENT } from "../../stores/AsyncStore";
import Notifier from "../../Notifier";
import {showToast as showNotificationsToast} from "../../toasts/DesktopNotificationsToast";
import { showToast as showNotificationsToast } from "../../toasts/DesktopNotificationsToast";
import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore";
import { Container, WidgetLayoutStore } from "../../stores/widgets/WidgetLayoutStore";
const DEBUG = false;
let debuglog = function(msg: string) {};
@ -280,8 +281,9 @@ export default class RoomView extends React.Component<IProps, IState> {
private checkWidgets = (room) => {
this.setState({
hasPinnedWidgets: WidgetStore.instance.getPinnedApps(room.roomId).length > 0,
})
hasPinnedWidgets: WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top).length > 0,
showApps: this.shouldShowApps(room),
});
};
private onReadReceiptsChange = () => {
@ -418,11 +420,17 @@ export default class RoomView extends React.Component<IProps, IState> {
}
private onWidgetEchoStoreUpdate = () => {
if (!this.state.room) return;
this.setState({
hasPinnedWidgets: WidgetLayoutStore.instance.getContainerWidgets(this.state.room, Container.Top).length > 0,
showApps: this.shouldShowApps(this.state.room),
});
};
private onWidgetLayoutChange = () => {
this.onWidgetEchoStoreUpdate(); // we cheat here by calling the thing that matters
};
private setupRoom(room: Room, roomId: string, joining: boolean, shouldPeek: boolean) {
// if this is an unknown room then we're in one of three states:
// - This is a room we can peek into (search engine) (we can /peek)
@ -488,7 +496,7 @@ export default class RoomView extends React.Component<IProps, IState> {
}
private shouldShowApps(room: Room) {
if (!BROWSER_SUPPORTS_SANDBOX) return false;
if (!BROWSER_SUPPORTS_SANDBOX || !room) return false;
// Check if user has previously chosen to hide the app drawer for this
// room. If so, do not show apps
@ -497,7 +505,10 @@ export default class RoomView extends React.Component<IProps, IState> {
// This is confusing, but it means to say that we default to the tray being
// hidden unless the user clicked to open it.
return hideWidgetDrawer === "false";
const isManuallyShown = hideWidgetDrawer === "false";
const widgets = WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top);
return widgets.length > 0 || isManuallyShown;
}
componentDidMount() {
@ -608,6 +619,13 @@ export default class RoomView extends React.Component<IProps, IState> {
WidgetEchoStore.removeListener(UPDATE_EVENT, this.onWidgetEchoStoreUpdate);
WidgetStore.instance.removeListener(UPDATE_EVENT, this.onWidgetStoreUpdate);
if (this.state.room) {
WidgetLayoutStore.instance.off(
WidgetLayoutStore.emissionForRoom(this.state.room),
this.onWidgetLayoutChange,
);
}
if (this.showReadReceiptsWatchRef) {
SettingsStore.unwatchSetting(this.showReadReceiptsWatchRef);
}
@ -835,6 +853,10 @@ export default class RoomView extends React.Component<IProps, IState> {
// called when state.room is first initialised (either at initial load,
// after a successful peek, or after we join the room).
private onRoomLoaded = (room: Room) => {
// Attach a widget store listener only when we get a room
WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(room), this.onWidgetLayoutChange);
this.onWidgetLayoutChange(); // provoke an update
this.calculatePeekRules(room);
this.updatePreviewUrlVisibility(room);
this.loadMembersIfJoined(room);
@ -897,6 +919,15 @@ export default class RoomView extends React.Component<IProps, IState> {
if (!room || room.roomId !== this.state.roomId) {
return;
}
// Detach the listener if the room is changing for some reason
if (this.state.room) {
WidgetLayoutStore.instance.off(
WidgetLayoutStore.emissionForRoom(this.state.room),
this.onWidgetLayoutChange,
);
}
this.setState({
room: room,
}, () => {

View File

@ -120,9 +120,9 @@ export default class SetupEncryptionBody extends React.Component {
const store = SetupEncryptionStore.sharedInstance();
let recoveryKeyPrompt;
if (store.keyInfo && keyHasPassphrase(store.keyInfo)) {
recoveryKeyPrompt = _t("Use Recovery Key or Passphrase");
recoveryKeyPrompt = _t("Use Security Key or Phrase");
} else if (store.keyInfo) {
recoveryKeyPrompt = _t("Use Recovery Key");
recoveryKeyPrompt = _t("Use Security Key");
}
let useRecoveryKeyButton;

View File

@ -72,9 +72,12 @@ export default class SoftLogout extends React.Component {
this._initLogin();
MatrixClientPeg.get().countSessionsNeedingBackup().then(remaining => {
this.setState({keyBackupNeeded: remaining > 0});
});
const cli = MatrixClientPeg.get();
if (cli.isCryptoEnabled()) {
cli.countSessionsNeedingBackup().then(remaining => {
this.setState({ keyBackupNeeded: remaining > 0 });
});
}
}
onClearAll = () => {

View File

@ -20,6 +20,8 @@ import { _t } from '../../../languageHandler';
import { ContextMenu, IProps as IContextMenuProps, MenuItem } from '../../structures/ContextMenu';
import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call';
import CallHandler from '../../../CallHandler';
import InviteDialog, { KIND_CALL_TRANSFER } from '../dialogs/InviteDialog';
import Modal from '../../../Modal';
interface IProps extends IContextMenuProps {
call: MatrixCall;
@ -46,14 +48,30 @@ export default class CallContextMenu extends React.Component<IProps> {
this.props.onFinished();
}
onTransferClick = () => {
Modal.createTrackedDialog(
'Transfer Call', '', InviteDialog, {kind: KIND_CALL_TRANSFER, call: this.props.call},
/*className=*/null, /*isPriority=*/false, /*isStatic=*/true,
);
this.props.onFinished();
}
render() {
const holdUnholdCaption = this.props.call.isRemoteOnHold() ? _t("Resume") : _t("Hold");
const handler = this.props.call.isRemoteOnHold() ? this.onUnholdClick : this.onHoldClick;
let transferItem;
if (this.props.call.opponentCanBeTransferred()) {
transferItem = <MenuItem className="mx_CallContextMenu_item" onClick={this.onTransferClick}>
{_t("Transfer")}
</MenuItem>;
}
return <ContextMenu {...this.props}>
<MenuItem className="mx_CallContextMenu_item" onClick={handler}>
{holdUnholdCaption}
</MenuItem>
{transferItem}
</ContextMenu>;
}
}

View File

@ -0,0 +1,59 @@
/*
Copyright 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import { _t } from '../../../languageHandler';
import { ContextMenu, IProps as IContextMenuProps } from '../../structures/ContextMenu';
import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call';
import Dialpad from '../voip/DialPad';
interface IProps extends IContextMenuProps {
call: MatrixCall;
}
interface IState {
value: string;
}
export default class DialpadContextMenu extends React.Component<IProps, IState> {
constructor(props) {
super(props);
this.state = {
value: '',
}
}
onDigitPress = (digit) => {
this.props.call.sendDtmfDigit(digit);
this.setState({value: this.state.value + digit});
}
render() {
return <ContextMenu {...this.props}>
<div className="mx_DialPadContextMenu_header">
<div>
<span className="mx_DialPadContextMenu_title">{_t("Dial pad")}</span>
</div>
<div className="mx_DialPadContextMenu_dialled">{this.state.value}</div>
</div>
<div className="mx_DialPadContextMenu_horizSep" />
<div className="mx_DialPadContextMenu_dialPad">
<Dialpad onDigitPress={this.onDigitPress} hasDialAndDelete={false} />
</div>
</ContextMenu>;
}
}

View File

@ -20,17 +20,17 @@ import {MatrixCapabilities} from "matrix-widget-api";
import IconizedContextMenu, {IconizedContextMenuOption, IconizedContextMenuOptionList} from "./IconizedContextMenu";
import {ChevronFace} from "../../structures/ContextMenu";
import {_t} from "../../../languageHandler";
import WidgetStore, {IApp} from "../../../stores/WidgetStore";
import {IApp} from "../../../stores/WidgetStore";
import WidgetUtils from "../../../utils/WidgetUtils";
import {WidgetMessagingStore} from "../../../stores/widgets/WidgetMessagingStore";
import RoomContext from "../../../contexts/RoomContext";
import dis from "../../../dispatcher/dispatcher";
import SettingsStore from "../../../settings/SettingsStore";
import {SettingLevel} from "../../../settings/SettingLevel";
import Modal from "../../../Modal";
import QuestionDialog from "../dialogs/QuestionDialog";
import {WidgetType} from "../../../widgets/WidgetType";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore";
interface IProps extends React.ComponentProps<typeof IconizedContextMenu> {
app: IApp;
@ -57,7 +57,7 @@ const WidgetContextMenu: React.FC<IProps> = ({
let unpinButton;
if (showUnpin) {
const onUnpinClick = () => {
WidgetStore.instance.unpinWidget(room.roomId, app.id);
WidgetLayoutStore.instance.moveToContainer(room, app, Container.Right);
onFinished();
};
@ -127,7 +127,8 @@ const WidgetContextMenu: React.FC<IProps> = ({
console.info("Revoking permission for widget to load: " + app.eventId);
const current = SettingsStore.getValue("allowedWidgets", roomId);
current[app.eventId] = false;
SettingsStore.setValue("allowedWidgets", roomId, SettingLevel.ROOM_ACCOUNT, current).catch(err => {
const level = SettingsStore.firstSupportedLevel("allowedWidgets");
SettingsStore.setValue("allowedWidgets", roomId, level, current).catch(err => {
console.error(err);
// We don't really need to do anything about this - the user will just hit the button again.
});
@ -137,13 +138,13 @@ const WidgetContextMenu: React.FC<IProps> = ({
revokeButton = <IconizedContextMenuOption onClick={onRevokeClick} label={_t("Revoke permissions")} />;
}
const pinnedWidgets = WidgetStore.instance.getPinnedApps(roomId);
const pinnedWidgets = WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top);
const widgetIndex = pinnedWidgets.findIndex(widget => widget.id === app.id);
let moveLeftButton;
if (showUnpin && widgetIndex > 0) {
const onClick = () => {
WidgetStore.instance.movePinnedWidget(roomId, app.id, -1);
WidgetLayoutStore.instance.moveWithinContainer(room, Container.Top, app, -1);
onFinished();
};
@ -153,7 +154,7 @@ const WidgetContextMenu: React.FC<IProps> = ({
let moveRightButton;
if (showUnpin && widgetIndex < pinnedWidgets.length - 1) {
const onClick = () => {
WidgetStore.instance.movePinnedWidget(roomId, app.id, 1);
WidgetLayoutStore.instance.moveWithinContainer(room, Container.Top, app, 1);
onFinished();
};

View File

@ -32,6 +32,8 @@ import {
PHASE_STARTED,
PHASE_CANCELLED,
} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
import WidgetStore from "../../../stores/WidgetStore";
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
class GenericEditor extends React.PureComponent {
// static propTypes = {onBack: PropTypes.func.isRequired};
@ -701,6 +703,97 @@ class VerificationExplorer extends React.Component {
}
}
class WidgetExplorer extends React.Component {
static getLabel() {
return _t("Active Widgets");
}
constructor(props) {
super(props);
this.state = {
query: '',
editWidget: null, // set to an IApp when editing
};
}
onWidgetStoreUpdate = () => {
this.forceUpdate();
};
onQueryChange = (query) => {
this.setState({query});
};
onEditWidget = (widget) => {
this.setState({editWidget: widget});
};
onBack = () => {
const widgets = WidgetStore.instance.getApps(this.props.room.roomId);
if (this.state.editWidget && widgets.includes(this.state.editWidget)) {
this.setState({editWidget: null});
} else {
this.props.onBack();
}
};
componentDidMount() {
WidgetStore.instance.on(UPDATE_EVENT, this.onWidgetStoreUpdate);
}
componentWillUnmount() {
WidgetStore.instance.off(UPDATE_EVENT, this.onWidgetStoreUpdate);
}
render() {
const room = this.props.room;
const editWidget = this.state.editWidget;
const widgets = WidgetStore.instance.getApps(room.roomId);
if (editWidget && widgets.includes(editWidget)) {
const allState = Array.from(Array.from(room.currentState.events.values()).map(e => e.values()))
.reduce((p, c) => {p.push(...c); return p;}, []);
const stateEv = allState.find(ev => ev.getId() === editWidget.eventId);
if (!stateEv) { // "should never happen"
return <div>
{_t("There was an error finding this widget.")}
<div className="mx_Dialog_buttons">
<button onClick={this.onBack}>{_t("Back")}</button>
</div>
</div>;
}
return <SendCustomEvent
onBack={this.onBack}
room={room}
forceStateEvent={true}
inputs={{
eventType: stateEv.getType(),
evContent: JSON.stringify(stateEv.getContent(), null, '\t'),
stateKey: stateEv.getStateKey(),
}}
/>;
}
return (<div>
<div className="mx_Dialog_content">
<FilteredList query={this.state.query} onChange={this.onQueryChange}>
{widgets.map(w => {
return <button
className='mx_DevTools_RoomStateExplorer_button'
key={w.url + w.eventId}
onClick={() => this.onEditWidget(w)}
>{w.url}</button>;
})}
</FilteredList>
</div>
<div className="mx_Dialog_buttons">
<button onClick={this.onBack}>{_t("Back")}</button>
</div>
</div>);
}
}
const Entries = [
SendCustomEvent,
RoomStateExplorer,
@ -708,6 +801,7 @@ const Entries = [
AccountDataExplorer,
ServersInRoomList,
VerificationExplorer,
WidgetExplorer,
];
export default class DevtoolsDialog extends React.PureComponent {

View File

@ -41,12 +41,14 @@ import SettingsStore from "../../../settings/SettingsStore";
import {UIFeature} from "../../../settings/UIFeature";
import CountlyAnalytics from "../../../CountlyAnalytics";
import {Room} from "matrix-js-sdk/src/models/room";
import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call';
// we have a number of types defined from the Matrix spec which can't reasonably be altered here.
/* eslint-disable camelcase */
export const KIND_DM = "dm";
export const KIND_INVITE = "invite";
export const KIND_CALL_TRANSFER = "call_transfer";
const INITIAL_ROOMS_SHOWN = 3; // Number of rooms to show at first
const INCREMENT_ROOMS_SHOWN = 5; // Number of rooms to add when 'show more' is clicked
@ -310,6 +312,9 @@ interface IInviteDialogProps {
// The room ID this dialog is for. Only required for KIND_INVITE.
roomId: string,
// The call to transfer. Only required for KIND_CALL_TRANSFER.
call: MatrixCall,
// Initial value to populate the filter with
initialText: string,
}
@ -345,6 +350,8 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
if (props.kind === KIND_INVITE && !props.roomId) {
throw new Error("When using KIND_INVITE a roomId is required for an InviteDialog");
} else if (props.kind === KIND_CALL_TRANSFER && !props.call) {
throw new Error("When using KIND_CALL_TRANSFER a call is required for an InviteDialog");
}
const alreadyInvited = new Set([MatrixClientPeg.get().getUserId(), SdkConfig.get()['welcomeUserId']]);
@ -702,6 +709,29 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
});
};
_transferCall = async () => {
this._convertFilter();
const targets = this._convertFilter();
const targetIds = targets.map(t => t.userId);
if (targetIds.length > 1) {
this.setState({
errorText: _t("A call can only be transferred to a single user."),
});
}
this.setState({busy: true});
try {
await this.props.call.transfer(targetIds[0]);
this.setState({busy: false});
this.props.onFinished();
} catch (e) {
this.setState({
busy: false,
errorText: _t("Failed to transfer call"),
});
}
};
_onKeyDown = (e) => {
if (this.state.busy) return;
const value = e.target.value.trim();
@ -1217,7 +1247,7 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
}
buttonText = _t("Go");
goButtonFn = this._startDm;
} else { // KIND_INVITE
} else if (this.props.kind === KIND_INVITE) {
title = _t("Invite to this room");
if (identityServersEnabled) {
@ -1251,6 +1281,12 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
buttonText = _t("Invite");
goButtonFn = this._inviteUsers;
} else if (this.props.kind === KIND_CALL_TRANSFER) {
title = _t("Transfer");
buttonText = _t("Transfer");
goButtonFn = this._transferCall;
} else {
console.error("Unknown kind of InviteDialog: " + this.props.kind);
}
const hasSelection = this.state.targets.length > 0

View File

@ -47,7 +47,7 @@ export default class NewSessionReviewDialog extends React.PureComponent {
<li>{_t("The internet connection either session is using")}</li>
</ul>
<div>
{_t("We recommend you change your password and recovery key in Settings immediately")}
{_t("We recommend you change your password and Security Key in Settings immediately")}
</div>
</div>,
onFinished: () => this.props.onFinished(false),

View File

@ -151,13 +151,13 @@ export default class ServerPickerDialog extends React.PureComponent<IProps, ISta
const valid = await this.fieldRef.current.validate({ allowEmpty: false });
if (!valid) {
if (!valid && !this.state.defaultChosen) {
this.fieldRef.current.focus();
this.fieldRef.current.validate({ allowEmpty: false, focused: true });
return;
}
this.props.onFinished(this.validatedConf);
this.props.onFinished(this.state.defaultChosen ? this.defaultServer : this.validatedConf);
};
public render() {

View File

@ -199,11 +199,11 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
} else if (this.state.recoveryKeyCorrect) {
return _t("Looks good!");
} else if (this.state.recoveryKeyValid) {
return _t("Wrong Recovery Key");
return _t("Wrong Security Key");
} else if (this.state.recoveryKeyValid === null) {
return '';
} else {
return _t("Invalid Recovery Key");
return _t("Invalid Security Key");
}
}
@ -231,7 +231,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
keyStatus = <div className="mx_AccessSecretStorageDialog_keyStatus">
{"\uD83D\uDC4E "}{_t(
"Unable to access secret storage. " +
"Please verify that you entered the correct recovery passphrase.",
"Please verify that you entered the correct Security Phrase.",
)}
</div>;
} else {
@ -298,7 +298,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
<div className="mx_AccessSecretStorageDialog_recoveryKeyEntry">
<div className="mx_AccessSecretStorageDialog_recoveryKeyEntry_textInput">
<Field
type="text"
type="password"
label={_t('Security Key')}
value={this.state.recoveryKey}
onChange={this._onRecoveryKeyChange}

View File

@ -297,19 +297,19 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
} else if (this.state.restoreError) {
if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) {
if (this.state.restoreType === RESTORE_TYPE_RECOVERYKEY) {
title = _t("Recovery key mismatch");
title = _t("Security Key mismatch");
content = <div>
<p>{_t(
"Backup could not be decrypted with this recovery key: " +
"please verify that you entered the correct recovery key.",
"Backup could not be decrypted with this Security Key: " +
"please verify that you entered the correct Security Key.",
)}</p>
</div>;
} else {
title = _t("Incorrect recovery passphrase");
title = _t("Incorrect Security Phrase");
content = <div>
<p>{_t(
"Backup could not be decrypted with this recovery passphrase: " +
"please verify that you entered the correct recovery passphrase.",
"Backup could not be decrypted with this Security Phrase: " +
"please verify that you entered the correct Security Phrase.",
)}</p>
</div>;
}
@ -342,7 +342,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
} else if (backupHasPassphrase && !this.state.forceRecoveryKey) {
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
title = _t("Enter recovery passphrase");
title = _t("Enter Security Phrase");
content = <div>
<p>{_t(
"<b>Warning</b>: you should only set up key backup " +
@ -351,7 +351,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
)}</p>
<p>{_t(
"Access your secure message history and set up secure " +
"messaging by entering your recovery passphrase.",
"messaging by entering your Security Phrase.",
)}</p>
<form className="mx_RestoreKeyBackupDialog_primaryContainer">
@ -371,8 +371,8 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
/>
</form>
{_t(
"If you've forgotten your recovery passphrase you can "+
"<button1>use your recovery key</button1> or " +
"If you've forgotten your Security Phrase you can "+
"<button1>use your Security Key</button1> or " +
"<button2>set up new recovery options</button2>"
, {}, {
button1: s => <AccessibleButton className="mx_linkButton"
@ -390,7 +390,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
})}
</div>;
} else {
title = _t("Enter recovery key");
title = _t("Enter Security Key");
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
@ -399,11 +399,11 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
keyStatus = <div className="mx_RestoreKeyBackupDialog_keyStatus"></div>;
} else if (this.state.recoveryKeyValid) {
keyStatus = <div className="mx_RestoreKeyBackupDialog_keyStatus">
{"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")}
{"\uD83D\uDC4D "}{_t("This looks like a valid Security Key!")}
</div>;
} else {
keyStatus = <div className="mx_RestoreKeyBackupDialog_keyStatus">
{"\uD83D\uDC4E "}{_t("Not a valid recovery key")}
{"\uD83D\uDC4E "}{_t("Not a valid Security Key")}
</div>;
}
@ -415,7 +415,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
)}</p>
<p>{_t(
"Access your secure message history and set up secure " +
"messaging by entering your recovery key.",
"messaging by entering your Security Key.",
)}</p>
<div className="mx_RestoreKeyBackupDialog_primaryContainer">
@ -434,7 +434,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
/>
</div>
{_t(
"If you've forgotten your recovery key you can "+
"If you've forgotten your Security Key you can "+
"<button>set up new recovery options</button>"
, {}, {
button: s => <AccessibleButton className="mx_linkButton"

View File

@ -33,7 +33,6 @@ import SettingsStore from "../../../settings/SettingsStore";
import {aboveLeftOf, ContextMenuButton} from "../../structures/ContextMenu";
import PersistedElement, {getPersistKey} from "./PersistedElement";
import {WidgetType} from "../../../widgets/WidgetType";
import {SettingLevel} from "../../../settings/SettingLevel";
import {StopGapWidget} from "../../../stores/widgets/StopGapWidget";
import {ElementWidgetActions} from "../../../stores/widgets/ElementWidgetActions";
import {MatrixCapabilities} from "matrix-widget-api";
@ -240,7 +239,8 @@ export default class AppTile extends React.Component {
console.info("Granting permission for widget to load: " + this.props.app.eventId);
const current = SettingsStore.getValue("allowedWidgets", roomId);
current[this.props.app.eventId] = true;
SettingsStore.setValue("allowedWidgets", roomId, SettingLevel.ROOM_ACCOUNT, current).then(() => {
const level = SettingsStore.firstSupportedLevel("allowedWidgets");
SettingsStore.setValue("allowedWidgets", roomId, level, current).then(() => {
this.setState({hasPermissionToLoad: true});
// Fetch a token for the integration manager, now that we're allowed to

View File

@ -124,7 +124,7 @@ export default class EditableItemList extends React.Component {
<Field label={this.props.placeholder} type="text"
autoComplete="off" value={this.props.newItem || ""} onChange={this._onNewItemChanged}
list={this.props.suggestionsListId} />
<AccessibleButton onClick={this._onItemAdded} kind="primary" type="submit">
<AccessibleButton onClick={this._onItemAdded} kind="primary" type="submit" disabled={!this.props.newItem}>
{_t("Add")}
</AccessibleButton>
</form>

View File

@ -15,14 +15,15 @@ limitations under the License.
*/
import React, {useContext, useRef, useState} from 'react';
import {EventType} from 'matrix-js-sdk/src/@types/event';
import classNames from 'classnames';
import AccessibleButton from "./AccessibleButton";
import Tooltip from './Tooltip';
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import {useTimeout} from "../../../hooks/useTimeout";
import Analytics from "../../../Analytics";
import CountlyAnalytics from '../../../CountlyAnalytics';
import RoomContext from "../../../contexts/RoomContext";
export const AVATAR_SIZE = 52;
@ -50,6 +51,11 @@ const MiniAvatarUploader: React.FC<IProps> = ({ hasAvatar, hasAvatarLabel, noAva
const label = (hasAvatar || busy) ? hasAvatarLabel : noAvatarLabel;
const {room} = useContext(RoomContext);
const canSetAvatar = room?.currentState.maySendStateEvent(EventType.RoomAvatar, cli.getUserId());
if (!canSetAvatar) return <React.Fragment>{ children }</React.Fragment>;
const visible = !!label && (hover || show);
return <React.Fragment>
<input
type="file"
@ -82,11 +88,13 @@ const MiniAvatarUploader: React.FC<IProps> = ({ hasAvatar, hasAvatarLabel, noAva
>
{ children }
<Tooltip
label={label}
visible={!!label && (hover || show)}
forceOnRight
/>
<div className={classNames("mx_Tooltip", {
"mx_Tooltip_visible": visible,
"mx_Tooltip_invisible": !visible,
})}>
<div className="mx_Tooltip_chevron" />
{ label }
</div>
</AccessibleButton>
</React.Fragment>;
};

View File

@ -15,13 +15,14 @@ limitations under the License.
*/
import React from "react";
import { chunk } from "lodash";
import classNames from "classnames";
import {MatrixClient} from "matrix-js-sdk/src/client";
import PlatformPeg from "../../../PlatformPeg";
import AccessibleButton from "./AccessibleButton";
import {_t} from "../../../languageHandler";
import {IIdentityProvider, ISSOFlow} from "../../../Login";
import classNames from "classnames";
interface ISSOButtonProps extends Omit<IProps, "flow"> {
idp: IIdentityProvider;
@ -83,6 +84,8 @@ interface IProps {
primary?: boolean;
}
const MAX_PER_ROW = 6;
const SSOButtons: React.FC<IProps> = ({matrixClient, flow, loginType, fragmentAfterLogin, primary}) => {
const providers = flow["org.matrix.msc2858.identity_providers"] || [];
if (providers.length < 2) {
@ -97,17 +100,24 @@ const SSOButtons: React.FC<IProps> = ({matrixClient, flow, loginType, fragmentAf
</div>;
}
const rows = Math.ceil(providers.length / MAX_PER_ROW);
const size = Math.ceil(providers.length / rows);
return <div className="mx_SSOButtons">
{ providers.map(idp => (
<SSOButton
key={idp.id}
matrixClient={matrixClient}
loginType={loginType}
fragmentAfterLogin={fragmentAfterLogin}
idp={idp}
mini={true}
primary={primary}
/>
{ chunk(providers, size).map(chunk => (
<div key={chunk[0].id} className="mx_SSOButtons_row">
{ chunk.map(idp => (
<SSOButton
key={idp.id}
matrixClient={matrixClient}
loginType={loginType}
fragmentAfterLogin={fragmentAfterLogin}
idp={idp}
mini={true}
primary={primary}
/>
)) }
</div>
)) }
</div>;
};

View File

@ -19,6 +19,8 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
import { _t } from "../../../languageHandler";
import WidgetStore from "../../../stores/WidgetStore";
import EventTileBubble from "./EventTileBubble";
import { MatrixClientPeg } from "../../../MatrixClientPeg";
import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore";
interface IProps {
mxEvent: MatrixEvent;
@ -33,9 +35,12 @@ export default class MJitsiWidgetEvent extends React.PureComponent<IProps> {
const url = this.props.mxEvent.getContent()['url'];
const prevUrl = this.props.mxEvent.getPrevContent()['url'];
const senderName = this.props.mxEvent.sender?.name || this.props.mxEvent.getSender();
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
const widgetId = this.props.mxEvent.getStateKey();
const widget = WidgetStore.instance.getRoom(room.roomId).widgets.find(w => w.id === widgetId);
let joinCopy = _t('Join the conference at the top of this room');
if (!WidgetStore.instance.isPinned(this.props.mxEvent.getRoomId(), this.props.mxEvent.getStateKey())) {
if (widget && WidgetLayoutStore.instance.isInContainer(room, widget, Container.Right)) {
joinCopy = _t('Join the conference from the room information card on the right');
}

View File

@ -410,7 +410,10 @@ export default class TextualBody extends React.Component {
ref: this._content,
});
if (this.props.replacingEventId) {
body = [body, this._renderEditedMarker()];
body = <>
{body}
{this._renderEditedMarker()}
</>;
}
if (this.props.highlightLink) {

View File

@ -37,13 +37,14 @@ import SettingsStore from "../../../settings/SettingsStore";
import TextWithTooltip from "../elements/TextWithTooltip";
import WidgetAvatar from "../avatars/WidgetAvatar";
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
import WidgetStore, {IApp, MAX_PINNED} from "../../../stores/WidgetStore";
import WidgetStore, {IApp} from "../../../stores/WidgetStore";
import { E2EStatus } from "../../../utils/ShieldUtils";
import RoomContext from "../../../contexts/RoomContext";
import {UIFeature} from "../../../settings/UIFeature";
import {ChevronFace, ContextMenuTooltipButton, useContextMenu} from "../../structures/ContextMenu";
import WidgetContextMenu from "../context_menus/WidgetContextMenu";
import {useRoomMemberCount} from "../../../hooks/useRoomMembers";
import { Container, MAX_PINNED, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore";
interface IProps {
room: Room;
@ -78,6 +79,7 @@ export const useWidgets = (room: Room) => {
useEffect(updateApps, [room]);
useEventEmitter(WidgetStore.instance, room.roomId, updateApps);
useEventEmitter(WidgetLayoutStore.instance, WidgetLayoutStore.emissionForRoom(room), updateApps);
return apps;
};
@ -102,10 +104,10 @@ const AppRow: React.FC<IAppRowProps> = ({ app, room }) => {
});
};
const isPinned = WidgetStore.instance.isPinned(room.roomId, app.id);
const isPinned = WidgetLayoutStore.instance.isInContainer(room, app, Container.Top);
const togglePin = isPinned
? () => { WidgetStore.instance.unpinWidget(room.roomId, app.id); }
: () => { WidgetStore.instance.pinWidget(room.roomId, app.id); };
? () => { WidgetLayoutStore.instance.moveToContainer(room, app, Container.Right); }
: () => { WidgetLayoutStore.instance.moveToContainer(room, app, Container.Top); };
const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu<HTMLDivElement>();
let contextMenu;
@ -120,7 +122,7 @@ const AppRow: React.FC<IAppRowProps> = ({ app, room }) => {
/>;
}
const cannotPin = !isPinned && !WidgetStore.instance.canPin(room.roomId, app.id);
const cannotPin = !isPinned && !WidgetLayoutStore.instance.canAddToContainer(room, Container.Top);
let pinTitle: string;
if (cannotPin) {
@ -184,9 +186,18 @@ const AppsSection: React.FC<IAppsSectionProps> = ({ room }) => {
}
};
let copyLayoutBtn = null;
if (apps.length > 0 && WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) {
copyLayoutBtn = (
<AccessibleButton kind="link" onClick={() => WidgetLayoutStore.instance.copyLayoutToRoom(room)}>
{ _t("Set my room layout for everyone") }
</AccessibleButton>
);
}
return <Group className="mx_RoomSummaryCard_appsGroup" title={_t("Widgets")}>
{ apps.map(app => <AppRow key={app.id} app={app} room={room} />) }
{ copyLayoutBtn }
<AccessibleButton kind="link" onClick={onManageIntegrations}>
{ apps.length > 0 ? _t("Edit widgets, bridges & bots") : _t("Add widgets, bridges & bots") }
</AccessibleButton>

View File

@ -14,22 +14,22 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import React, {useContext, useEffect} from "react";
import {Room} from "matrix-js-sdk/src/models/room";
import React, { useContext, useEffect } from "react";
import { Room } from "matrix-js-sdk/src/models/room";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import BaseCard from "./BaseCard";
import WidgetUtils from "../../../utils/WidgetUtils";
import AppTile from "../elements/AppTile";
import {_t} from "../../../languageHandler";
import {useWidgets} from "./RoomSummaryCard";
import {RightPanelPhases} from "../../../stores/RightPanelStorePhases";
import { _t } from "../../../languageHandler";
import { useWidgets } from "./RoomSummaryCard";
import { RightPanelPhases } from "../../../stores/RightPanelStorePhases";
import defaultDispatcher from "../../../dispatcher/dispatcher";
import {SetRightPanelPhasePayload} from "../../../dispatcher/payloads/SetRightPanelPhasePayload";
import {Action} from "../../../dispatcher/actions";
import WidgetStore from "../../../stores/WidgetStore";
import {ChevronFace, ContextMenuButton, useContextMenu} from "../../structures/ContextMenu";
import { SetRightPanelPhasePayload } from "../../../dispatcher/payloads/SetRightPanelPhasePayload";
import { Action } from "../../../dispatcher/actions";
import { ChevronFace, ContextMenuButton, useContextMenu } from "../../structures/ContextMenu";
import WidgetContextMenu from "../context_menus/WidgetContextMenu";
import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore";
interface IProps {
room: Room;
@ -42,7 +42,7 @@ const WidgetCard: React.FC<IProps> = ({ room, widgetId, onClose }) => {
const apps = useWidgets(room);
const app = apps.find(a => a.id === widgetId);
const isPinned = app && WidgetStore.instance.isPinned(room.roomId, app.id);
const isPinned = app && WidgetLayoutStore.instance.isInContainer(room, app, Container.Top);
const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu();

View File

@ -120,17 +120,21 @@ export default class RoomProfileSettings extends React.Component {
};
_onDisplayNameChanged = (e) => {
this.setState({
displayName: e.target.value,
enableProfileSave: true,
});
this.setState({displayName: e.target.value});
if (this.state.originalDisplayName === e.target.value) {
this.setState({enableProfileSave: false});
} else {
this.setState({enableProfileSave: true});
}
};
_onTopicChanged = (e) => {
this.setState({
topic: e.target.value,
enableProfileSave: true,
});
this.setState({topic: e.target.value});
if (this.state.originalTopic === e.target.value) {
this.setState({enableProfileSave: false});
} else {
this.setState({enableProfileSave: true});
}
};
_onAvatarChanged = (e) => {
@ -158,31 +162,10 @@ export default class RoomProfileSettings extends React.Component {
render() {
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
const AvatarSetting = sdk.getComponent('settings.AvatarSetting');
return (
<form
onSubmit={this._saveProfile}
autoComplete="off"
noValidate={true}
className="mx_ProfileSettings_profileForm"
>
<input type="file" ref={this._avatarUpload} className="mx_ProfileSettings_avatarUpload"
onChange={this._onAvatarChanged} accept="image/*" />
<div className="mx_ProfileSettings_profile">
<div className="mx_ProfileSettings_controls">
<Field label={_t("Room Name")}
type="text" value={this.state.displayName} autoComplete="off"
onChange={this._onDisplayNameChanged} disabled={!this.state.canSetName} />
<Field id="profileTopic" label={_t("Room Topic")} disabled={!this.state.canSetTopic}
type="text" value={this.state.topic} autoComplete="off"
onChange={this._onTopicChanged} element="textarea" />
</div>
<AvatarSetting
avatarUrl={this.state.avatarUrl}
avatarName={this.state.displayName || this.props.roomId}
avatarAltText={_t("Room avatar")}
uploadAvatar={this.state.canSetAvatar ? this._uploadAvatar : undefined}
removeAvatar={this.state.canSetAvatar ? this._removeAvatar : undefined} />
</div>
let profileSettingsButtons;
if (this.state.canSetTopic && this.state.canSetName) {
profileSettingsButtons = (
<div className="mx_ProfileSettings_buttons">
<AccessibleButton
onClick={this._clearProfile}
@ -199,6 +182,35 @@ export default class RoomProfileSettings extends React.Component {
{_t("Save")}
</AccessibleButton>
</div>
);
}
return (
<form
onSubmit={this._saveProfile}
autoComplete="off"
noValidate={true}
className="mx_ProfileSettings_profileForm"
>
<input type="file" ref={this._avatarUpload} className="mx_ProfileSettings_avatarUpload"
onChange={this._onAvatarChanged} accept="image/*" />
<div className="mx_ProfileSettings_profile">
<div className="mx_ProfileSettings_controls">
<Field label={_t("Room Name")}
type="text" value={this.state.displayName} autoComplete="off"
onChange={this._onDisplayNameChanged} disabled={!this.state.canSetName} />
<Field className="mx_ProfileSettings_controls_topic" id="profileTopic" label={_t("Room Topic")} disabled={!this.state.canSetTopic}
type="text" value={this.state.topic} autoComplete="off"
onChange={this._onTopicChanged} element="textarea" />
</div>
<AvatarSetting
avatarUrl={this.state.avatarUrl}
avatarName={this.state.displayName || this.props.roomId}
avatarAltText={_t("Room avatar")}
uploadAvatar={this.state.canSetAvatar ? this._uploadAvatar : undefined}
removeAvatar={this.state.canSetAvatar ? this._removeAvatar : undefined} />
</div>
{ profileSettingsButtons }
</form>
);
}

View File

@ -28,12 +28,13 @@ import WidgetUtils from '../../../utils/WidgetUtils';
import WidgetEchoStore from "../../../stores/WidgetEchoStore";
import {IntegrationManagers} from "../../../integrations/IntegrationManagers";
import SettingsStore from "../../../settings/SettingsStore";
import {useLocalStorageState} from "../../../hooks/useLocalStorageState";
import ResizeNotifier from "../../../utils/ResizeNotifier";
import WidgetStore from "../../../stores/WidgetStore";
import ResizeHandle from "../elements/ResizeHandle";
import Resizer from "../../../resizer/resizer";
import PercentageDistributor from "../../../resizer/distributors/percentage";
import {Container, WidgetLayoutStore} from "../../../stores/widgets/WidgetLayoutStore";
import {clamp, percentageOf, percentageWithin} from "../../../utils/numbers";
import {useStateCallback} from "../../../hooks/useStateCallback";
export default class AppsDrawer extends React.Component {
static propTypes = {
@ -62,13 +63,13 @@ export default class AppsDrawer extends React.Component {
componentDidMount() {
ScalarMessaging.startListening();
WidgetStore.instance.on(this.props.room.roomId, this._updateApps);
WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(this.props.room), this._updateApps);
this.dispatcherRef = dis.register(this.onAction);
}
componentWillUnmount() {
ScalarMessaging.stopListening();
WidgetStore.instance.off(this.props.room.roomId, this._updateApps);
WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.props.room), this._updateApps);
if (this.dispatcherRef) dis.unregister(this.dispatcherRef);
if (this._resizeContainer) {
this.resizer.detach();
@ -102,11 +103,10 @@ export default class AppsDrawer extends React.Component {
},
onResizeStop: () => {
this._resizeContainer.classList.remove("mx_AppsDrawer_resizing");
// persist to localStorage
localStorage.setItem(this._getStorageKey(), JSON.stringify([
this.state.apps.map(app => app.id),
...this.state.apps.slice(1).map((_, i) => this.resizer.forHandleAt(i).size),
]));
WidgetLayoutStore.instance.setResizerDistributions(
this.props.room, Container.Top,
this.state.apps.slice(1).map((_, i) => this.resizer.forHandleAt(i).size),
);
},
};
// pass a truthy container for now, we won't call attach until we update it
@ -128,8 +128,6 @@ export default class AppsDrawer extends React.Component {
this._loadResizerPreferences();
};
_getStorageKey = () => `mx_apps_drawer-${this.props.room.roomId}`;
_getAppsHash = (apps) => apps.map(app => app.id).join("~");
componentDidUpdate(prevProps, prevState) {
@ -147,24 +145,16 @@ export default class AppsDrawer extends React.Component {
};
_loadResizerPreferences = () => {
try {
const [[...lastIds], ...sizes] = JSON.parse(localStorage.getItem(this._getStorageKey()));
// Every app was included in the last split, reuse the last sizes
if (this.state.apps.length <= lastIds.length && this.state.apps.every((app, i) => lastIds[i] === app.id)) {
sizes.forEach((size, i) => {
const distributor = this.resizer.forHandleAt(i);
if (distributor) {
distributor.size = size;
distributor.finish();
}
});
return;
}
} catch (e) {
// this is expected
}
if (this.state.apps) {
const distributions = WidgetLayoutStore.instance.getResizerDistributions(this.props.room, Container.Top);
if (this.state.apps && (this.state.apps.length - 1) === distributions.length) {
distributions.forEach((size, i) => {
const distributor = this.resizer.forHandleAt(i);
if (distributor) {
distributor.size = size;
distributor.finish();
}
});
} else if (this.state.apps) {
const distributors = this.resizer.getDistributors();
distributors.forEach(d => d.item.clearSize());
distributors.forEach(d => d.start());
@ -190,7 +180,7 @@ export default class AppsDrawer extends React.Component {
}
};
_getApps = () => WidgetStore.instance.getPinnedApps(this.props.room.roomId);
_getApps = () => WidgetLayoutStore.instance.getContainerWidgets(this.props.room, Container.Top);
_updateApps = () => {
this.setState({
@ -248,10 +238,11 @@ export default class AppsDrawer extends React.Component {
return (
<div className={classes}>
<PersistentVResizer
id={"apps-drawer_" + this.props.room.roomId}
room={this.props.room}
minHeight={100}
maxHeight={this.props.maxHeight ? this.props.maxHeight - 50 : undefined}
handleClass="mx_AppsContainer_resizerHandle"
handleWrapperClass="mx_AppsContainer_resizerHandleContainer"
className="mx_AppsContainer_resizer"
resizeNotifier={this.props.resizeNotifier}
>
@ -272,7 +263,7 @@ export default class AppsDrawer extends React.Component {
}
const PersistentVResizer = ({
id,
room,
minHeight,
maxHeight,
className,
@ -281,7 +272,24 @@ const PersistentVResizer = ({
resizeNotifier,
children,
}) => {
const [height, setHeight] = useLocalStorageState("pvr_" + id, 280); // old fixed height was 273px
let defaultHeight = WidgetLayoutStore.instance.getContainerHeight(room, Container.Top);
// Arbitrary defaults to avoid NaN problems. 100 px or 3/4 of the visible window.
if (!minHeight) minHeight = 100;
if (!maxHeight) maxHeight = (window.innerHeight / 4) * 3;
// Convert from percentage to height. Note that the default height is 280px.
if (defaultHeight) {
defaultHeight = clamp(defaultHeight, 0, 100);
defaultHeight = percentageWithin(defaultHeight / 100, minHeight, maxHeight);
} else {
defaultHeight = 280;
}
const [height, setHeight] = useStateCallback(defaultHeight, newHeight => {
newHeight = percentageOf(newHeight, minHeight, maxHeight) * 100;
WidgetLayoutStore.instance.setContainerHeight(room, Container.Top, newHeight);
});
return <Resizable
size={{height: Math.min(height, maxHeight)}}

View File

@ -37,6 +37,7 @@ import {E2E_STATE} from "./E2EIcon";
import {toRem} from "../../../utils/units";
import {WidgetType} from "../../../widgets/WidgetType";
import RoomAvatar from "../avatars/RoomAvatar";
import {WIDGET_LAYOUT_EVENT_TYPE} from "../../../stores/widgets/WidgetLayoutStore";
const eventTileTypes = {
'm.room.message': 'messages.MessageEvent',
@ -65,6 +66,7 @@ const stateEventTileTypes = {
'm.room.server_acl': 'messages.TextualEvent',
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
'im.vector.modular.widgets': 'messages.TextualEvent',
[WIDGET_LAYOUT_EVENT_TYPE]: 'messages.TextualEvent',
'm.room.tombstone': 'messages.TextualEvent',
'm.room.join_rules': 'messages.TextualEvent',
'm.room.guest_access': 'messages.TextualEvent',

View File

@ -109,9 +109,12 @@ function HangupButton(props) {
dis.dispatch({
action,
// hangup the call for this room, which may not be the room in props
// (e.g. conferences which will hangup the 1:1 room instead)
room_id: call.roomId,
// hangup the call for this room. NB. We use the room in props as the room ID
// as call.roomId may be the 'virtual room', and the dispatch actions always
// use the user-facing room (there was a time when we deliberately used
// call.roomId and *not* props.roomId, but that was for the old
// style Freeswitch conference calls and those times are gone.)
room_id: props.roomId,
});
};

View File

@ -46,6 +46,7 @@ import { objectShallowClone, objectWithOnly } from "../../../utils/objects";
import { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../context_menus/IconizedContextMenu";
import AccessibleButton from "../elements/AccessibleButton";
import { CommunityPrototypeStore } from "../../../stores/CommunityPrototypeStore";
import CallHandler from "../../../CallHandler";
interface IProps {
onKeyDown: (ev: React.KeyboardEvent) => void;
@ -89,10 +90,44 @@ interface ITagAesthetics {
defaultHidden: boolean;
}
const TAG_AESTHETICS: {
interface ITagAestheticsMap {
// @ts-ignore - TS wants this to be a string but we know better
[tagId: TagID]: ITagAesthetics;
} = {
}
// If we have no dialer support, we just show the create chat dialog
const dmOnAddRoom = (dispatcher?: Dispatcher<ActionPayload>) => {
(dispatcher || defaultDispatcher).dispatch({action: 'view_create_chat'});
};
// If we have dialer support, show a context menu so the user can pick between
// the dialer and the create chat dialog
const dmAddRoomContextMenu = (onFinished: () => void) => {
return <IconizedContextMenuOptionList first>
<IconizedContextMenuOption
label={_t("Start a Conversation")}
iconClassName="mx_RoomList_iconPlus"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
onFinished();
defaultDispatcher.dispatch({action: "view_create_chat"});
}}
/>
<IconizedContextMenuOption
label={_t("Open dial pad")}
iconClassName="mx_RoomList_iconDialpad"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
onFinished();
defaultDispatcher.fire(Action.OpenDialPad);
}}
/>
</IconizedContextMenuOptionList>;
};
const TAG_AESTHETICS: ITagAestheticsMap = {
[DefaultTagID.Invite]: {
sectionLabel: _td("Invites"),
isInvite: true,
@ -108,9 +143,8 @@ const TAG_AESTHETICS: {
isInvite: false,
defaultHidden: false,
addRoomLabel: _td("Start chat"),
onAddRoom: (dispatcher?: Dispatcher<ActionPayload>) => {
(dispatcher || defaultDispatcher).dispatch({action: 'view_create_chat'});
},
// Either onAddRoom or addRoomContextMenu are set depending on whether we
// have dialer support.
},
[DefaultTagID.Untagged]: {
sectionLabel: _td("Rooms"),
@ -178,6 +212,7 @@ function customTagAesthetics(tagId: TagID): ITagAesthetics {
export default class RoomList extends React.PureComponent<IProps, IState> {
private dispatcherRef;
private customTagStoreRef;
private tagAesthetics: ITagAestheticsMap;
constructor(props: IProps) {
super(props);
@ -187,6 +222,10 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
isNameFiltering: !!RoomListStore.instance.getFirstNameFilterCondition(),
};
// shallow-copy from the template as we need to make modifications to it
this.tagAesthetics = objectShallowClone(TAG_AESTHETICS);
this.updateDmAddRoomAction();
this.dispatcherRef = defaultDispatcher.register(this.onAction);
}
@ -202,6 +241,17 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
if (this.customTagStoreRef) this.customTagStoreRef.remove();
}
private updateDmAddRoomAction() {
const dmTagAesthetics = objectShallowClone(TAG_AESTHETICS[DefaultTagID.DM]);
if (CallHandler.sharedInstance().getSupportsPstnProtocol()) {
dmTagAesthetics.addRoomContextMenu = dmAddRoomContextMenu;
} else {
dmTagAesthetics.onAddRoom = dmOnAddRoom;
}
this.tagAesthetics[DefaultTagID.DM] = dmTagAesthetics;
}
private onAction = (payload: ActionPayload) => {
if (payload.action === Action.ViewRoomDelta) {
const viewRoomDeltaPayload = payload as ViewRoomDeltaPayload;
@ -214,6 +264,9 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
show_room_tile: true, // to make sure the room gets scrolled into view
});
}
} else if (payload.action === Action.PstnSupportUpdated) {
this.updateDmAddRoomAction();
this.updateLists();
}
};
@ -355,7 +408,7 @@ export default class RoomList extends React.PureComponent<IProps, IState> {
const aesthetics: ITagAesthetics = isCustomTag(orderedTagId)
? customTagAesthetics(orderedTagId)
: TAG_AESTHETICS[orderedTagId];
: this.tagAesthetics[orderedTagId];
if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`);
components.push(<RoomSublist

View File

@ -29,7 +29,7 @@ import ActiveRoomObserver from "../../../ActiveRoomObserver";
import { _t } from "../../../languageHandler";
import { ChevronFace, ContextMenuTooltipButton } from "../../structures/ContextMenu";
import { DefaultTagID, TagID } from "../../../stores/room-list/models";
import { MessagePreviewStore, ROOM_PREVIEW_CHANGED } from "../../../stores/room-list/MessagePreviewStore";
import { MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore";
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
import { ALL_MESSAGES, ALL_MESSAGES_LOUD, MENTIONS_ONLY, MUTE } from "../../../RoomNotifs";
import { MatrixClientPeg } from "../../../MatrixClientPeg";
@ -51,7 +51,6 @@ import IconizedContextMenu, {
IconizedContextMenuRadio,
} from "../context_menus/IconizedContextMenu";
import { CommunityPrototypeStore, IRoomProfile } from "../../../stores/CommunityPrototypeStore";
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
interface IProps {
room: Room;
@ -99,12 +98,18 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate);
this.dispatcherRef = defaultDispatcher.register(this.onAction);
MessagePreviewStore.instance.on(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged);
MessagePreviewStore.instance.on(
MessagePreviewStore.getPreviewChangedEventName(this.props.room),
this.onRoomPreviewChanged,
);
this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room);
this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
this.roomProps = EchoChamber.forRoom(this.props.room);
this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
CommunityPrototypeStore.instance.on(UPDATE_EVENT, this.onCommunityUpdate);
CommunityPrototypeStore.instance.on(
CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId),
this.onCommunityUpdate,
);
}
private onNotificationUpdate = () => {
@ -128,6 +133,24 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) {
this.setState({messagePreview: this.generatePreview()});
}
if (prevProps.room?.roomId !== this.props.room?.roomId) {
MessagePreviewStore.instance.off(
MessagePreviewStore.getPreviewChangedEventName(prevProps.room),
this.onRoomPreviewChanged,
);
MessagePreviewStore.instance.on(
MessagePreviewStore.getPreviewChangedEventName(this.props.room),
this.onRoomPreviewChanged,
);
CommunityPrototypeStore.instance.off(
CommunityPrototypeStore.getUpdateEventName(prevProps.room?.roomId),
this.onCommunityUpdate,
);
CommunityPrototypeStore.instance.on(
CommunityPrototypeStore.getUpdateEventName(this.props.room?.roomId),
this.onCommunityUpdate,
);
}
}
public componentDidMount() {
@ -140,11 +163,17 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
public componentWillUnmount() {
if (this.props.room) {
ActiveRoomObserver.removeListener(this.props.room.roomId, this.onActiveRoomUpdate);
MessagePreviewStore.instance.off(
MessagePreviewStore.getPreviewChangedEventName(this.props.room),
this.onRoomPreviewChanged,
);
CommunityPrototypeStore.instance.off(
CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId),
this.onCommunityUpdate,
);
}
defaultDispatcher.unregister(this.dispatcherRef);
MessagePreviewStore.instance.off(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged);
this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
CommunityPrototypeStore.instance.off(UPDATE_EVENT, this.onCommunityUpdate);
}
private onAction = (payload: ActionPayload) => {

View File

@ -65,7 +65,7 @@ const AvatarSetting = ({avatarUrl, avatarAltText, avatarName, uploadAvatar, remo
const avatarClasses = classNames({
"mx_AvatarSetting_avatar": true,
"mx_AvatarSetting_avatar_hovering": isHovering,
"mx_AvatarSetting_avatar_hovering": isHovering && uploadAvatar,
});
return <div className={avatarClasses}>
{avatarElement}

View File

@ -1,115 +0,0 @@
/*
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 PropTypes from 'prop-types';
import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo";
import {_t} from "../../../languageHandler";
import {MatrixClientPeg} from "../../../MatrixClientPeg";
import Pill from "../elements/Pill";
import {makeUserPermalink} from "../../../utils/permalinks/Permalinks";
import BaseAvatar from "../avatars/BaseAvatar";
import AccessibleButton from "../elements/AccessibleButton";
import {replaceableComponent} from "../../../utils/replaceableComponent";
import SettingsStore from "../../../settings/SettingsStore";
@replaceableComponent("views.settings.BridgeTile")
export default class BridgeTile extends React.PureComponent {
static propTypes = {
ev: PropTypes.object.isRequired,
room: PropTypes.object.isRequired,
}
state = {
visible: false,
}
_toggleVisible() {
this.setState({
visible: !this.state.visible,
});
}
render() {
const content = this.props.ev.getContent();
const { channel, network, protocol } = content;
const protocolName = protocol.displayname || protocol.id;
const channelName = channel.displayname || channel.id;
const networkName = network ? network.displayname || network.id : protocolName;
let creator = null;
if (content.creator) {
creator = _t("This bridge was provisioned by <user />.", {}, {
user: <Pill
type={Pill.TYPE_USER_MENTION}
room={this.props.room}
url={makeUserPermalink(content.creator)}
shouldShowPillAvatar={SettingsStore.getValue("Pill.shouldShowPillAvatar")}
/>,
});
}
const bot = _t("This bridge is managed by <user />.", {}, {
user: <Pill
type={Pill.TYPE_USER_MENTION}
room={this.props.room}
url={makeUserPermalink(this.props.ev.getSender())}
shouldShowPillAvatar={SettingsStore.getValue("Pill.shouldShowPillAvatar")}
/>,
});
let networkIcon;
if (protocol.avatar) {
const avatarUrl = getHttpUriForMxc(
MatrixClientPeg.get().getHomeserverUrl(),
protocol.avatar, 64, 64, "crop",
);
networkIcon = <BaseAvatar className="protocol-icon"
width={48}
height={48}
resizeMethod='crop'
name={ protocolName }
idName={ protocolName }
url={ avatarUrl }
/>;
} else {
networkIcon = <div class="noProtocolIcon"></div>;
}
const id = this.props.ev.getId();
const metadataClassname = "metadata" + (this.state.visible ? " visible" : "");
return (<li key={id}>
<div className="column-icon">
{networkIcon}
</div>
<div className="column-data">
<h3>{protocolName}</h3>
<p className="workspace-channel-details">
<span>{_t("Workspace: %(networkName)s", {networkName})}</span>
<span className="channel">{_t("Channel: %(channelName)s", {channelName})}</span>
</p>
<p className={metadataClassname}>
{creator} {bot}
</p>
<AccessibleButton className="mx_showMore" kind="secondary" onClick={this._toggleVisible.bind(this)}>
{ this.state.visible ? _t("Show less") : _t("Show more") }
</AccessibleButton>
</div>
</li>);
}
}

View File

@ -0,0 +1,167 @@
/*
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 PropTypes from 'prop-types';
import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo";
import {_t} from "../../../languageHandler";
import {MatrixClientPeg} from "../../../MatrixClientPeg";
import Pill from "../elements/Pill";
import {makeUserPermalink} from "../../../utils/permalinks/Permalinks";
import BaseAvatar from "../avatars/BaseAvatar";
import SettingsStore from "../../../settings/SettingsStore";
import {MatrixEvent} from "matrix-js-sdk/src/models/event";
import { Room } from "matrix-js-sdk/src/models/room";
import { isUrlPermitted } from '../../../HtmlUtils';
interface IProps {
ev: MatrixEvent;
room: Room;
}
/**
* This should match https://github.com/matrix-org/matrix-doc/blob/hs/msc-bridge-inf/proposals/2346-bridge-info-state-event.md#mbridge
*/
interface IBridgeStateEvent {
bridgebot: string;
creator?: string;
protocol: {
id: string;
displayname?: string;
// eslint-disable-next-line camelcase
avatar_url?: string;
// eslint-disable-next-line camelcase
external_url?: string;
};
network?: {
id: string;
displayname?: string;
// eslint-disable-next-line camelcase
avatar_url?: string;
// eslint-disable-next-line camelcase
external_url?: string;
};
channel: {
id: string;
displayname?: string;
// eslint-disable-next-line camelcase
avatar_url?: string;
// eslint-disable-next-line camelcase
external_url?: string;
};
}
export default class BridgeTile extends React.PureComponent<IProps> {
static propTypes = {
ev: PropTypes.object.isRequired,
room: PropTypes.object.isRequired,
}
render() {
const content: IBridgeStateEvent = this.props.ev.getContent();
// Validate
if (!content.channel?.id || !content.protocol?.id) {
console.warn(`Bridge info event ${this.props.ev.getId()} has missing content. Tile will not render`);
return null;
}
if (!content.bridgebot) {
// Bridgebot was not required previously, so in order to not break rooms we are allowing
// the sender to be used in place. When the proposal is merged, this should be removed.
console.warn(`Bridge info event ${this.props.ev.getId()} does not provide a 'bridgebot' key which`
+ "is deprecated behaviour. Using sender for now.");
content.bridgebot = this.props.ev.getSender();
}
const { channel, network, protocol } = content;
const protocolName = protocol.displayname || protocol.id;
const channelName = channel.displayname || channel.id;
let creator = null;
if (content.creator) {
creator = <li>{_t("This bridge was provisioned by <user />.", {}, {
user: () => <Pill
type={Pill.TYPE_USER_MENTION}
room={this.props.room}
url={makeUserPermalink(content.creator)}
shouldShowPillAvatar={SettingsStore.getValue("Pill.shouldShowPillAvatar")}
/>,
})}</li>;
}
const bot = <li>{_t("This bridge is managed by <user />.", {}, {
user: () => <Pill
type={Pill.TYPE_USER_MENTION}
room={this.props.room}
url={makeUserPermalink(content.bridgebot)}
shouldShowPillAvatar={SettingsStore.getValue("Pill.shouldShowPillAvatar")}
/>,
})}</li>;
let networkIcon;
if (protocol.avatar_url) {
const avatarUrl = getHttpUriForMxc(
MatrixClientPeg.get().getHomeserverUrl(),
protocol.avatar_url, 64, 64, "crop",
);
networkIcon = <BaseAvatar className="protocol-icon"
width={48}
height={48}
resizeMethod='crop'
name={ protocolName }
idName={ protocolName }
url={ avatarUrl }
/>;
} else {
networkIcon = <div className="noProtocolIcon"></div>;
}
let networkItem = null;
if (network) {
const networkName = network.displayname || network.id;
let networkLink = <span>{networkName}</span>;
if (typeof network.external_url === "string" && isUrlPermitted(network.external_url)) {
networkLink = <a href={network.external_url} target="_blank" rel="noreferrer noopener">{networkName}</a>
}
networkItem = _t("Workspace: <networkLink/>", {}, {
networkLink: () => networkLink,
});
}
let channelLink = <span>{channelName}</span>;
if (typeof channel.external_url === "string" && isUrlPermitted(channel.external_url)) {
channelLink = <a href={channel.external_url} target="_blank" rel="noreferrer noopener">{channelName}</a>
}
const id = this.props.ev.getId();
return (<li key={id}>
<div className="column-icon">
{networkIcon}
</div>
<div className="column-data">
<h3>{protocolName}</h3>
<p className="workspace-channel-details">
{networkItem}
<span className="channel">{_t("Channel: <channelLink/>", {}, {
channelLink: () => channelLink,
})}</span>
</p>
<ul className="metadata">
{creator} {bot}
</ul>
</div>
</li>);
}
}

View File

@ -424,7 +424,7 @@ export default class SecureBackupPanel extends React.PureComponent {
<p>{_t(
"Back up your encryption keys with your account data in case you " +
"lose access to your sessions. Your keys will be secured with a " +
"unique Recovery Key.",
"unique Security Key.",
)}</p>
{statusDescription}
<details>

View File

@ -27,9 +27,10 @@ import { CallEvent } from 'matrix-js-sdk/src/webrtc/call';
import classNames from 'classnames';
import AccessibleButton from '../elements/AccessibleButton';
import {isOnlyCtrlOrCmdKeyEvent, Key} from '../../../Keyboard';
import {aboveLeftOf, ChevronFace, ContextMenuButton} from '../../structures/ContextMenu';
import {alwaysAboveLeftOf, alwaysAboveRightOf, ChevronFace, ContextMenuButton} from '../../structures/ContextMenu';
import CallContextMenu from '../context_menus/CallContextMenu';
import { avatarUrlForMember } from '../../../Avatar';
import DialpadContextMenu from '../context_menus/DialpadContextMenu';
interface IProps {
// The call for us to display
@ -60,6 +61,7 @@ interface IState {
callState: CallState,
controlsVisible: boolean,
showMoreMenu: boolean,
showDialpad: boolean,
}
function getFullScreenElement() {
@ -102,6 +104,7 @@ export default class CallView extends React.Component<IProps, IState> {
private dispatcherRef: string;
private contentRef = createRef<HTMLDivElement>();
private controlsHideTimer: number = null;
private dialpadButton = createRef<HTMLDivElement>();
private contextMenuButton = createRef<HTMLDivElement>();
constructor(props: IProps) {
@ -115,6 +118,7 @@ export default class CallView extends React.Component<IProps, IState> {
callState: this.props.call.state,
controlsVisible: true,
showMoreMenu: false,
showDialpad: false,
}
this.updateCallListeners(null, this.props.call);
@ -208,9 +212,10 @@ export default class CallView extends React.Component<IProps, IState> {
};
private onExpandClick = () => {
const userFacingRoomId = CallHandler.roomIdForCall(this.props.call);
dis.dispatch({
action: 'view_room',
room_id: this.props.call.roomId,
room_id: userFacingRoomId,
});
};
@ -226,7 +231,7 @@ export default class CallView extends React.Component<IProps, IState> {
}
private showControls() {
if (this.state.showMoreMenu) return;
if (this.state.showMoreMenu || this.state.showDialpad) return;
if (!this.state.controlsVisible) {
this.setState({
@ -239,6 +244,29 @@ export default class CallView extends React.Component<IProps, IState> {
this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY);
}
private onDialpadClick = () => {
if (!this.state.showDialpad) {
if (this.controlsHideTimer) {
clearTimeout(this.controlsHideTimer);
this.controlsHideTimer = null;
}
this.setState({
showDialpad: true,
controlsVisible: true,
});
} else {
if (this.controlsHideTimer !== null) {
clearTimeout(this.controlsHideTimer);
}
this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY);
this.setState({
showDialpad: false,
});
}
}
private onMicMuteClick = () => {
const newVal = !this.state.micMuted;
@ -265,6 +293,13 @@ export default class CallView extends React.Component<IProps, IState> {
});
}
private closeDialpad = () => {
this.setState({
showDialpad: false,
});
this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY);
}
private closeContextMenu = () => {
this.setState({
showMoreMenu: false,
@ -306,37 +341,52 @@ export default class CallView extends React.Component<IProps, IState> {
};
private onRoomAvatarClick = () => {
const userFacingRoomId = CallHandler.roomIdForCall(this.props.call);
dis.dispatch({
action: 'view_room',
room_id: this.props.call.roomId,
room_id: userFacingRoomId,
});
}
private onSecondaryRoomAvatarClick = () => {
const userFacingRoomId = CallHandler.roomIdForCall(this.props.secondaryCall);
dis.dispatch({
action: 'view_room',
room_id: this.props.secondaryCall.roomId,
room_id: userFacingRoomId,
});
}
private onCallResumeClick = () => {
CallHandler.sharedInstance().setActiveCallRoomId(this.props.call.roomId);
}
private onSecondaryCallResumeClick = () => {
CallHandler.sharedInstance().setActiveCallRoomId(this.props.secondaryCall.roomId);
const userFacingRoomId = CallHandler.roomIdForCall(this.props.call);
CallHandler.sharedInstance().setActiveCallRoomId(userFacingRoomId);
}
public render() {
const client = MatrixClientPeg.get();
const callRoom = client.getRoom(this.props.call.roomId);
const secCallRoom = this.props.secondaryCall ? client.getRoom(this.props.secondaryCall.roomId) : null;
const callRoomId = CallHandler.roomIdForCall(this.props.call);
const secondaryCallRoomId = CallHandler.roomIdForCall(this.props.secondaryCall);
const callRoom = client.getRoom(callRoomId);
const secCallRoom = this.props.secondaryCall ? client.getRoom(secondaryCallRoomId) : null;
let dialPad;
let contextMenu;
if (this.state.showDialpad) {
dialPad = <DialpadContextMenu
{...alwaysAboveRightOf(
this.dialpadButton.current.getBoundingClientRect(),
ChevronFace.None,
CONTEXT_MENU_VPADDING,
)}
onFinished={this.closeDialpad}
call={this.props.call}
/>;
}
if (this.state.showMoreMenu) {
contextMenu = <CallContextMenu
{...aboveLeftOf(
{...alwaysAboveLeftOf(
this.contextMenuButton.current.getBoundingClientRect(),
ChevronFace.None,
CONTEXT_MENU_VPADDING,
@ -384,8 +434,15 @@ export default class CallView extends React.Component<IProps, IState> {
onClick={this.onVidMuteClick}
/> : null;
// The 'more' button actions are only relevant in a connected call
// The dial pad & 'more' button actions are only relevant in a connected call
// When not connected, we have to put something there to make the flexbox alignment correct
const dialpadButton = this.state.callState === CallState.Connected ? <ContextMenuButton
className="mx_CallView_callControls_button mx_CallView_callControls_dialpad"
inputRef={this.dialpadButton}
onClick={this.onDialpadClick}
isExpanded={this.state.showDialpad}
/> : <div className="mx_CallView_callControls_button mx_CallView_callControls_button_dialpad_hidden" />;
const contextMenuButton = this.state.callState === CallState.Connected ? <ContextMenuButton
className="mx_CallView_callControls_button mx_CallView_callControls_button_more"
onClick={this.onMoreClick}
@ -396,7 +453,7 @@ export default class CallView extends React.Component<IProps, IState> {
// in the near future, the dial pad button will go on the left. For now, it's the nothing button
// because something needs to have margin-right: auto to make the alignment correct.
const callControls = <div className={callControlsClasses}>
<div className="mx_CallView_callControls_button mx_CallView_callControls_nothing" />
{dialpadButton}
<AccessibleButton
className={micClasses}
onClick={this.onMicMuteClick}
@ -406,7 +463,7 @@ export default class CallView extends React.Component<IProps, IState> {
onClick={() => {
dis.dispatch({
action: 'hangup',
room_id: this.props.call.roomId,
room_id: callRoomId,
});
}}
/>
@ -558,6 +615,7 @@ export default class CallView extends React.Component<IProps, IState> {
return <div className={"mx_CallView " + myClassName}>
{header}
{contentView}
{dialPad}
{contextMenu}
</div>;
}

View 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 * as React from "react";
import AccessibleButton from "../elements/AccessibleButton";
const BUTTONS = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'];
enum DialPadButtonKind {
Digit,
Delete,
Dial,
}
interface IButtonProps {
kind: DialPadButtonKind;
digit?: string;
onButtonPress: (string) => void;
}
class DialPadButton extends React.PureComponent<IButtonProps> {
onClick = () => {
this.props.onButtonPress(this.props.digit);
}
render() {
switch (this.props.kind) {
case DialPadButtonKind.Digit:
return <AccessibleButton className="mx_DialPad_button" onClick={this.onClick}>
{this.props.digit}
</AccessibleButton>;
case DialPadButtonKind.Delete:
return <AccessibleButton className="mx_DialPad_button mx_DialPad_deleteButton"
onClick={this.onClick}
/>;
case DialPadButtonKind.Dial:
return <AccessibleButton className="mx_DialPad_button mx_DialPad_dialButton" onClick={this.onClick} />;
}
}
}
interface IProps {
onDigitPress: (string) => void;
hasDialAndDelete: boolean;
onDeletePress?: (string) => void;
onDialPress?: (string) => void;
}
export default class Dialpad extends React.PureComponent<IProps> {
render() {
const buttonNodes = [];
for (const button of BUTTONS) {
buttonNodes.push(<DialPadButton key={button} kind={DialPadButtonKind.Digit}
digit={button} onButtonPress={this.props.onDigitPress}
/>);
}
if (this.props.hasDialAndDelete) {
buttonNodes.push(<DialPadButton key="del" kind={DialPadButtonKind.Delete}
onButtonPress={this.props.onDeletePress}
/>);
buttonNodes.push(<DialPadButton key="dial" kind={DialPadButtonKind.Dial}
onButtonPress={this.props.onDialPress}
/>);
}
return <div className="mx_DialPad">
{buttonNodes}
</div>;
}
}

View File

@ -0,0 +1,112 @@
/*
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 * as React from "react";
import { ensureDMExists } from "../../../createRoom";
import { _t } from "../../../languageHandler";
import { MatrixClientPeg } from "../../../MatrixClientPeg";
import AccessibleButton from "../elements/AccessibleButton";
import Field from "../elements/Field";
import DialPad from './DialPad';
import dis from '../../../dispatcher/dispatcher';
import Modal from "../../../Modal";
import ErrorDialog from "../../views/dialogs/ErrorDialog";
interface IProps {
onFinished: (boolean) => void;
}
interface IState {
value: string;
}
export default class DialpadModal extends React.PureComponent<IProps, IState> {
constructor(props) {
super(props);
this.state = {
value: '',
}
}
onCancelClick = () => {
this.props.onFinished(false);
}
onChange = (ev) => {
this.setState({value: ev.target.value});
}
onFormSubmit = (ev) => {
ev.preventDefault();
this.onDialPress();
}
onDigitPress = (digit) => {
this.setState({value: this.state.value + digit});
}
onDeletePress = () => {
if (this.state.value.length === 0) return;
this.setState({value: this.state.value.slice(0, -1)});
}
onDialPress = async () => {
const results = await MatrixClientPeg.get().getThirdpartyUser('im.vector.protocol.pstn', {
'm.id.phone': this.state.value,
});
if (!results || results.length === 0 || !results[0].userid) {
Modal.createTrackedDialog('', '', ErrorDialog, {
title: _t("Unable to look up phone number"),
description: _t("There was an error looking up the phone number"),
});
}
const userId = results[0].userid;
const roomId = await ensureDMExists(MatrixClientPeg.get(), userId);
dis.dispatch({
action: 'view_room',
room_id: roomId,
});
this.props.onFinished(true);
}
render() {
return <div className="mx_DialPadModal">
<div className="mx_DialPadModal_header">
<div>
<span className="mx_DialPadModal_title">{_t("Dial pad")}</span>
<AccessibleButton className="mx_DialPadModal_cancel" onClick={this.onCancelClick} />
</div>
<form onSubmit={this.onFormSubmit}>
<Field className="mx_DialPadModal_field" id="dialpad_number"
value={this.state.value} autoFocus={true}
onChange={this.onChange}
/>
</form>
</div>
<div className="mx_DialPadModal_horizSep" />
<div className="mx_DialPadModal_dialPad">
<DialPad hasDialAndDelete={true}
onDigitPress={this.onDigitPress}
onDeletePress={this.onDeletePress}
onDialPress={this.onDialPress}
/>
</div>
</div>;
}
}

View File

@ -70,7 +70,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
e.stopPropagation();
dis.dispatch({
action: 'answer',
room_id: this.state.incomingCall.roomId,
room_id: CallHandler.roomIdForCall(this.state.incomingCall),
});
};
@ -78,7 +78,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
e.stopPropagation();
dis.dispatch({
action: 'reject',
room_id: this.state.incomingCall.roomId,
room_id: CallHandler.roomIdForCall(this.state.incomingCall),
});
};
@ -89,7 +89,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
let room = null;
if (this.state.incomingCall) {
room = MatrixClientPeg.get().getRoom(this.state.incomingCall.roomId);
room = MatrixClientPeg.get().getRoom(CallHandler.roomIdForCall(this.state.incomingCall));
}
const caller = room ? room.name : _t("Unknown caller");

View File

@ -94,4 +94,16 @@ export enum Action {
* Trigged after the phase of the right panel is set. Should be used with AfterRightPanelPhaseChangePayload.
*/
AfterRightPanelPhaseChange = "after_right_panel_phase_change",
/**
* Opens the modal dial pad
*/
OpenDialPad = "open_dial_pad",
/**
* Fired when CallHandler has checked for PSTN protocol support
* payload: none
* XXX: Is an action the right thing for this?
*/
PstnSupportUpdated = "pstn_support_updated",
}

View File

@ -18,12 +18,12 @@ import {useEffect, useState} from "react";
import SettingsStore from '../settings/SettingsStore';
// Hook to fetch the value of a setting and dynamically update when it changes
export const useSettingValue = (settingName: string, roomId: string = null, excludeDefault = false) => {
const [value, setValue] = useState(SettingsStore.getValue(settingName, roomId, excludeDefault));
export const useSettingValue = <T>(settingName: string, roomId: string = null, excludeDefault = false) => {
const [value, setValue] = useState(SettingsStore.getValue<T>(settingName, roomId, excludeDefault));
useEffect(() => {
const ref = SettingsStore.watchSetting(settingName, roomId, () => {
setValue(SettingsStore.getValue(settingName, roomId, excludeDefault));
setValue(SettingsStore.getValue<T>(settingName, roomId, excludeDefault));
});
// clean-up
return () => {

View File

@ -0,0 +1,28 @@
/*
Copyright 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import {Dispatch, SetStateAction, useState} from "react";
// Hook to simplify interactions with a store-backed state values
// Returns value and method to change the state value
export const useStateCallback = <T>(initialValue: T, callback: (v: T) => void): [T, Dispatch<SetStateAction<T>>] => {
const [value, setValue] = useState(initialValue);
const interceptSetValue = (newVal: T) => {
setValue(newVal);
callback(newVal);
};
return [value, interceptSetValue];
};

View File

@ -241,7 +241,7 @@
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nelze se připojit k domovskému serveru přes HTTP, pokud je v adresním řádku HTTPS. Buď použijte HTTPS, nebo <a>povolte nezabezpečené skripty</a>.",
"Click here to fix": "Pro opravu klepněte zde",
"Click to mute video": "Klepněte pro zakázání videa",
"click to reveal": "pro odhlení klepněte",
"click to reveal": "klepněte pro odhalení",
"Click to unmute video": "Klepněte pro povolení videa",
"Click to unmute audio": "Klepněte pro povolení zvuku",
"Displays action": "Zobrazí akci",
@ -764,7 +764,7 @@
"Demote": "Degradovat",
"Share Link to User": "Sdílet odkaz na uživatele",
"Send an encrypted reply…": "Odeslat šifrovanou odpověď …",
"Send an encrypted message…": "Odeslat šifrovanou zprávu …",
"Send an encrypted message…": "Odeslat šifrovanou zprávu…",
"Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) viděl %(dateTime)s",
"Replying": "Odpovídá",
"Share room": "Sdílet místnost",
@ -1263,7 +1263,7 @@
"You can still join it because this is a public room.": "I přesto můžete vstoupit, protože tato místnost je veřejná.",
"Join the discussion": "Zapojit se do diskuze",
"Try to join anyway": "Stejně se pokusit vstoupit",
"Do you want to chat with %(user)s?": "Chcete si povídat s uživatelem %(user)s?",
"Do you want to chat with %(user)s?": "Chcete si povídat s %(user)s?",
"Do you want to join %(roomName)s?": "Chcete vstoupit do místnosti %(roomName)s?",
"<userName/> invited you": "Uživatel <userName/> vás pozval",
"You're previewing %(roomName)s. Want to join it?": "Nahlížíte do místnosti %(roomName)s. Chcete do ní vstoupit?",
@ -1519,11 +1519,11 @@
"Show all": "Zobrazit vše",
"Edited at %(date)s. Click to view edits.": "Upraveno v %(date)s. Klinutím zobrazíte změny.",
"Frequently Used": "Často používané",
"Smileys & People": "Obličeje & Lidé",
"Animals & Nature": "Zvířata & Příroda",
"Food & Drink": "Jídlo & Nápoje",
"Smileys & People": "Obličeje a lidé",
"Animals & Nature": "Zvířata a příroda",
"Food & Drink": "Jídlo a nápoje",
"Activities": "Aktivity",
"Travel & Places": "Cestování & Místa",
"Travel & Places": "Cestování a místa",
"Objects": "Objekty",
"Symbols": "Symboly",
"Flags": "Vlajky",
@ -1755,7 +1755,7 @@
"This bridge is managed by <user />.": "Toto propojení spravuje <user />.",
"Workspace: %(networkName)s": "Pracovní oblast: %(networkName)s",
"Channel: %(channelName)s": "Kanál: %(channelName)s",
"Show less": "Skrýt detaily",
"Show less": "Zobrazit méně",
"Show more": "Více",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.",
"Cross-signing and secret storage are enabled.": "Cross-signing a bezpečné úložiště jsou zapnuté.",
@ -1801,7 +1801,7 @@
"Session key:": "Klíč relace:",
"Message search": "Vyhledávání ve zprávách",
"Cross-signing": "Cross-signing",
"A session's public name is visible to people you communicate with": "Lidé, se kterými komunikujete, mohou veřejný název zobrazit",
"A session's public name is visible to people you communicate with": "Lidé, se kterými komunikujete, mohou zobrazit veřejný název",
"This room is bridging messages to the following platforms. <a>Learn more.</a>": "Tato místnost je propojena s následujícími platformami. <a>Více informací</a>",
"This room isnt bridging messages to any platforms. <a>Learn more.</a>": "Tato místnost není propojená s žádnými dalšími platformami. <a>Více informací.</a>",
"Bridges": "Propojení",
@ -1820,7 +1820,7 @@
"Encrypted by a deleted session": "Šifrované smazanou relací",
"Invite only": "Pouze na pozvání",
"Send a reply…": "Odpovědět…",
"Send a message…": "Napsat zprávu…",
"Send a message…": "Odeslat zprávu…",
"Direct Messages": "Přímé zprávy",
"Reject & Ignore user": "Odmítnout & ignorovat uživatele",
"Unknown Command": "Neznámý příkaz",
@ -2180,7 +2180,7 @@
"%(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ě.",
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototyp skupin 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",
@ -2251,9 +2251,9 @@
"Feedback": "Zpětná vazba",
"Feedback sent": "Zpětná vazba byla odeslána",
"Security & privacy": "Zabezpečení",
"All settings": "Nastavení",
"All settings": "Všechna nastavení",
"Start a conversation with someone using their name, email address or username (like <userId/>).": "Napište jméno nebo emailovou adresu uživatele se kterým chcete začít konverzaci (např. <userId/>).",
"Start a new chat": "Založit nový chat",
"Start a new chat": "Založit novou konverzaci",
"Which officially provided instance you are using, if any": "Kterou oficiální instanci Riot.im používáte (a jestli vůbec)",
"Change the topic of this room": "Změnit téma této místnosti",
"%(senderName)s declined the call.": "%(senderName)s odmítl/a hovor.",
@ -2326,13 +2326,13 @@
"Upload a file": "Nahrát soubor",
"You've reached the maximum number of simultaneous calls.": "Dosáhli jste maximálního počtu souběžných hovorů.",
"Too Many Calls": "Přiliš mnoho hovorů",
"Community and user menu": "Nabídka komunity a uživatele",
"Community and user menu": "Nabídka skupiny a uživatele",
"User menu": "Uživatelská nabídka",
"Switch theme": "Přepnout téma",
"Switch to dark mode": "Přepnout do tmavého režimu",
"Switch to light mode": "Přepnout do světlého režimu",
"User settings": "Uživatelská nastavení",
"Community settings": "Nastavení komunity",
"Community settings": "Nastavení skupiny",
"Confirm your recovery passphrase": "Potvrďte vaši frázi pro obnovení",
"Repeat your recovery passphrase...": "Opakujte přístupovou frázi pro obnovení...",
"Please enter your recovery passphrase a second time to confirm.": "Potvrďte prosím podruhé svou frázi pro obnovení.",
@ -2357,8 +2357,8 @@
"Delete the room address %(alias)s and remove %(name)s from the directory?": "Smazat adresu místnosti %(alias)s a odebrat %(name)s z adresáře?",
"Self-verification request": "Požadavek na sebeověření",
"%(creator)s created this DM.": "%(creator)s vytvořil tuto přímou zprávu.",
"You do not have permission to create rooms in this community.": "Nemáte oprávnění k vytváření místností v této komunitě.",
"Cannot create rooms in this community": "V této komunitě nelze vytvořit místnosti",
"You do not have permission to create rooms in this community.": "Nemáte oprávnění k vytváření místností v této skupině.",
"Cannot create rooms in this community": "V této skupině nelze vytvořit místnosti",
"Great, that'll help people know it's you": "Skvělé, to pomůže lidem zjistit, že jste to vy",
"Add a photo so people know it's you.": "Přidejte fotku, aby lidé věděli, že jste to vy.",
"Explore Public Rooms": "Prozkoumat veřejné místnosti",
@ -2399,10 +2399,10 @@
"Invite by email": "Pozvat emailem",
"Comment": "Komentář",
"Add comment": "Přidat komentář",
"Update community": "Aktualizovat komunitu",
"Update community": "Aktualizovat skupinu",
"Create a room in %(communityName)s": "Vytvořit místnost v %(communityName)s",
"Your server requires encryption to be enabled in private rooms.": "Váš server vyžaduje povolení šifrování v soukromých místnostech.",
"An image will help people identify your community.": "Obrázek pomůže lidem identifikovat vaši komunitu.",
"An image will help people identify your community.": "Obrázek pomůže lidem identifikovat vaši skupinu.",
"Invite people to join %(communityName)s": "Pozvat lidi do %(communityName)s",
"Send %(count)s invites|one": "Poslat %(count)s pozvánku",
"Send %(count)s invites|other": "Poslat %(count)s pozvánek",
@ -2421,7 +2421,7 @@
"Use email to optionally be discoverable by existing contacts.": "Pomocí e-mailu můžete být volitelně viditelní pro existující kontakty.",
"Use email or phone to optionally be discoverable by existing contacts.": "Použijte e-mail nebo telefon, abyste byli volitelně viditelní pro stávající kontakty.",
"Sign in with SSO": "Přihlásit pomocí SSO",
"Create community": "Vytvořit komunitu",
"Create community": "Vytvořit skupinu",
"Add an email to be able to reset your password.": "Přidejte email, abyste mohli obnovit své heslo.",
"That phone number doesn't look quite right, please check and try again": "Toto telefonní číslo nevypadá úplně správně, zkontrolujte ho a zkuste to znovu",
"Forgot password?": "Zapomenuté heslo?",
@ -2435,7 +2435,7 @@
"Successfully restored %(sessionCount)s keys": "Úspěšně obnoveno %(sessionCount)s klíčů",
"Keys restored": "Klíče byly obnoveny",
"You're all caught up.": "Vše vyřízeno.",
"There was an error updating your community. The server is unable to process your request.": "Při aktualizaci komunity došlo k chybě. Server nemůže zpracovat váš požadavek.",
"There was an error updating your community. The server is unable to process your request.": "Při aktualizaci skupiny došlo k chybě. Server nemůže zpracovat váš požadavek.",
"There are two ways you can provide feedback and help us improve %(brand)s.": "Jsou dva způsoby, jak můžete poskytnout zpětnou vazbu a pomoci nám vylepšit %(brand)s.",
"Rate %(brand)s": "Ohodnotit %(brand)s",
"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.": "V této relaci jste již dříve používali novější verzi %(brand)s. Chcete-li tuto verzi znovu použít s šifrováním, budete se muset odhlásit a znovu přihlásit.",
@ -2446,7 +2446,7 @@
"This version of %(brand)s does not support searching encrypted messages": "Tato verze %(brand)s nepodporuje hledání v šifrovaných zprávách",
"Information": "Informace",
"%(count)s results|one": "%(count)s výsledek",
"Explore community rooms": "Prozkoumat místnosti komunity",
"Explore community rooms": "Prozkoumat místnosti skupin",
"Role": "Role",
"Madagascar": "Madagaskar",
"Macedonia": "Makedonie",
@ -2751,5 +2751,158 @@
"Unable to query secret storage status": "Nelze zjistit stav úložiště klíčů",
"Update %(brand)s": "Aktualizovat %(brand)s",
"You can also set up Secure Backup & manage your keys in Settings.": "Zabezpečené zálohování a správu klíčů můžete také nastavit v Nastavení.",
"Set a Security Phrase": "Nastavit bezpečnostní frázi"
"Set a Security Phrase": "Nastavit bezpečnostní frázi",
"Use this when referencing your community to others. The community ID cannot be changed.": "Použijte toto, když odkazujete svou skupinu na ostatní. ID skupiny nelze změnit.",
"Please go into as much detail as you like, so we can track down the problem.": "Udejte prosím co nejvíce podrobností, abychom mohli problém vystopovat.",
"Start a conversation with someone using their name or username (like <userId/>).": "Začněte konverzaci s někým pomocí jeho jména nebo uživatelského jména (například <userId />).",
"Tell us below how you feel about %(brand)s so far.": "Níže se podělte s vašimi zkušenostmi s %(brand)s.",
"%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s nastavil seznam přístupů serveru pro tuto místnost.",
"What's the name of your community or team?": "Jak se jmenuje vaše skupina nebo tým?",
"Invite someone using their name, username (like <userId/>) or <a>share this room</a>.": "Pozvěte někoho pomocí svého jména, uživatelského jména (například <userId />) nebo <a>sdílejte tuto místnost</a>.",
"Confirm by comparing the following with the User Settings in your other session:": "Potvrďte porovnáním následujícího s uživatelským nastavením v jiné relaci:",
"Data on this screen is shared with %(widgetDomain)s": "Data na této obrazovce jsou sdílena s %(widgetDomain)s",
"Just a heads up, if you don't add an email and forget your password, you could <b>permanently lose access to your account</b>.": "Jen upozornění, pokud nepřidáte e-mail a zapomenete heslo, můžete <b>trvale ztratit přístup ke svému účtu</b>.",
"Your area is experiencing difficulties connecting to the internet.": "Ve vaší oblasti dochází k problémům s připojením k internetu.",
"A connection error occurred while trying to contact the server.": "Při pokusu o kontakt se serverem došlo k chybě připojení.",
"The server is not configured to indicate what the problem is (CORS).": "Server není nakonfigurován tak, aby indikoval, v čem je problém (CORS).",
"Recent changes that have not yet been received": "Nedávné změny, které dosud nebyly přijaty",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Nelze získat přístup k úložišti klíčů. Ověřte, zda jste zadali správnou přístupovou frázi pro obnovení.",
"Enter your Security Phrase or <button>Use your Security Key</button> to continue.": "Pokračujte zadáním bezpečnostní fráze nebo <button>použijte váš bezpečnostní klíč</button> pro pokračování.",
"Restoring keys from backup": "Obnovení klíčů ze zálohy",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Zálohu nebylo možné dešifrovat pomocí této přístupové fráze pro obnovení: ověřte, zda jste zadali správnou přístupovou frázi pro obnovení.",
"%(completed)s of %(total)s keys restored": "Obnoveno %(completed)s z %(total)s klíčů",
"Store your Security Key somewhere safe, like a password manager or a safe, as its used to safeguard your encrypted data.": "Uložte bezpečnostní klíč někam na bezpečné místo, například do správce hesel nebo do trezoru, který slouží k ochraně vašich šifrovaných dat.",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Váš klíč pro obnovení je bezpečnostní sítí - můžete jej použít k obnovení přístupu k šifrovaným zprávám, pokud zapomenete přístupovou frázi pro obnovení.",
"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.": "Byla zjištěna data ze starší verze %(brand)s. To bude mít za následek nefunkčnost end-to-end kryptografie ve starší verzi. End-to-end šifrované zprávy vyměněné nedávno při používání starší verze nemusí být v této verzi dešifrovatelné. To může také způsobit selhání zpráv vyměňovaných s touto verzí. Pokud narazíte na problémy, odhlaste se a znovu se přihlaste. Chcete-li zachovat historii zpráv, exportujte a znovu importujte klíče.",
"Failed to find the general chat for this community": "Nepodařilo se najít obecný chat pro tuto skupinu",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Na náš server uložíme zašifrovanou kopii vašich klíčů. Zabezpečte zálohu pomocí přístupové fráze pro obnovení.",
"Enter your recovery passphrase a second time to confirm it.": "Zadejte podruhé přístupovou frázi pro obnovení a potvrďte ji.",
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Pokud nyní nebudete pokračovat, můžete ztratit šifrované zprávy a data, pokud ztratíte přístup ke svým přihlašovacím údajům.",
"Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Zprávy v této místnosti jsou šifrovány end-to-end. Když se lidé připojí, můžete je ověřit v jejich profilu, stačí klepnout na jejich avatara.",
"Revoke permissions": "Odvolat oprávnění",
"Continuing without email": "Pokračuje se bez e-mailu",
"You can change this later if needed.": "V případě potřeby to můžete později změnit.",
"Video conference started by %(senderName)s": "Videokonferenci byla zahájena uživatelem %(senderName)s",
"Video conference updated by %(senderName)s": "Videokonference byla aktualizována uživatelem %(senderName)s",
"Video conference ended by %(senderName)s": "Videokonference byla ukončena uživatelem %(senderName)s",
"Unpin": "Odepnout",
"Fill Screen": "Vyplnit obrazovku",
"Voice Call": "Hlasový hovor",
"Video Call": "Videohovor",
"%(senderName)s ended the call": "Uživatel %(senderName)s ukončil hovor",
"You ended the call": "Ukončili jste hovor",
"New version of %(brand)s is available": "K dispozici je nová verze %(brand)s",
"Error leaving room": "Při opouštění místnosti došlo k chybě",
"See messages posted to your active room": "Zobrazit zprávy odeslané do vaší aktivní místnosti",
"See messages posted to this room": "Zobrazit zprávy odeslané do této místnosti",
"See when the avatar changes in your active room": "Podívejte se, kdy se změní avatar ve vaší aktivní místnosti",
"Change the avatar of your active room": "Změňte avatar vaší aktivní místnosti",
"See when the avatar changes in this room": "Podívejte se, kdy se změní avatar v této místnosti",
"Change the avatar of this room": "Změňte avatar této místnosti",
"See when the name changes in your active room": "Podívejte se, kdy se ve vaší aktivní místnosti změní název",
"Change the name of your active room": "Změňte název své aktivní místnosti",
"Change the name of this room": "Změňte název této místnosti",
"A browser extension is preventing the request.": "Rozšíření prohlížeče brání požadavku.",
"Your firewall or anti-virus is blocking the request.": "Váš firewall nebo antivirový program blokuje požadavek.",
"The server (%(serverName)s) took too long to respond.": "Serveru (%(serverName)s) trvalo příliš dlouho, než odpověděl.",
"Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Váš server neodpovídá na některé vaše požadavky. Níže jsou některé z nejpravděpodobnějších důvodů.",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even add images with Matrix URLs <img src=\"mxc://url\" />\n</p>\n": "<h1>HTML pro vaši stránku skupiny</h1>\n<p>\n Pomocí popisu můžete představit nové členy skupiny nebo distribuovat\n některé důležité <a href=\"foo\">odkazy</a>\n</p>\n<p>\n Můžete dokonce přidat obrázky pomocí Matrix URL <img src=\"mxc://url\" />\n</p>\n",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Soukromé místnosti lze najít a připojit se do nich pouze na pozvání. Veřejné místnosti může najít a připojit se do nich kdokoli v této skupině.",
"Community ID: +<localpart />:%(domain)s": "ID skupiny: +<localpart />:%(domain)s",
"The operation could not be completed": "Operace nemohla být dokončena",
"Failed to save your profile": "Váš profil se nepodařilo uložit",
"%(peerName)s held the call": "%(peerName)s podržel hovor",
"You held the call <a>Resume</a>": "Podrželi jste hovor <a>Pokračovat</a>",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Můžete použít vlastní volbu serveru a přihlásit se k jiným Matrix serverům zadáním adresy URL domovského serveru. To vám umožní používat Element s existujícím Matrix účtem na jiném domovském serveru.",
"Unpin a widget to view it in this panel": "Odepněte widget, aby mohl být zobrazen v tomto panelu",
"You can only pin up to %(count)s widgets|other": "Můžete připnout až %(count)s widgetů",
"Edit widgets, bridges & bots": "Upravujte widgety, mosty a boty",
"a device cross-signing signature": "zařízení používající cross-signing podpis",
"This widget would like to:": "Tento widget by chtěl:",
"Modal Widget": "Modální widget",
"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.": "Toto můžete deaktivovat, pokud bude místnost použita pro spolupráci s externími týmy, které mají svůj vlastní domovský server. Toto nelze později změnit.",
"Join the conference from the room information card on the right": "Připojte se ke konferenci z informační karty místnosti napravo",
"Join the conference at the top of this room": "Připojte se ke konferenci v horní části této místnosti",
"There are advanced notifications which are not shown here.": "Existují pokročilá oznámení, která se zde nezobrazují.",
"Enable advanced debugging for the room list": "Povolit pokročilé ladění pro seznam místností",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Bezpečně uloží zašifrované zprávy v místním úložišti, aby se mohly objevit ve výsledcích vyhledávání, využívá se %(size)s k ukládání zpráv z %(rooms)s místnosti.",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Bezpečně uloží zašifrované zprávy v místním úložišti, aby se mohly objevit ve výsledcích vyhledávání, využívá se %(size)s k ukládání zpráv z %(rooms)s místností.",
"You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Možná jste je nakonfigurovali v jiném klientovi než %(brand)s. Nelze je zobrazit v %(brand)s, ale stále platí.",
"well formed": "ve správném tvaru",
"There was an error creating your community. The name may be taken or the server is unable to process your request.": "Při vytváření vaší skupiny došlo k chybě. Název může být již obsazen nebo server nemůže zpracovat váš požadavek.",
"See <b>%(eventType)s</b> events posted to this room": "Zobrazit události <b>%(eventType)s</b> zveřejněné v této místnosti",
"Send stickers to your active room as you": "Poslat nálepky do vaší aktivní místnosti jako vy",
"Send stickers to this room as you": "Poslat samolepky jako vy do této místnosti",
"Change the topic of your active room": "Změnit téma vaší aktivní místnosti",
"Change which room you're viewing": "Změnit kterou místnost si prohlížíte",
"Send stickers into your active room": "Poslat nálepky do vaší aktivní místnosti",
"Send stickers into this room": "Poslat nálepky do této místnosti",
"Send messages as you in this room": "Poslat zprávy jako vy v této místnosti",
"Send messages as you in your active room": "Poslat zprávy jako vy ve vaší aktivní místnosti",
"Send text messages as you in this room": "Poslat textové zprávy jako vy v této místnosti",
"Send text messages as you in your active room": "Poslat textové zprávy jako vy ve vaší aktivní místnosti",
"See text messages posted to this room": "Podívat se na textové zprávy odeslané do této místnosti",
"See text messages posted to your active room": "Podívat se na textové zprávy odeslané do vaší aktivní místnosti",
"Send images as you in this room": "Poslat obrázky jako vy v této místnosti",
"Send images as you in your active room": "Poslat obrázky jako vy ve vaší aktivní místnosti",
"See images posted to this room": "Podívat se na obrázky zveřejněné v této místnosti",
"See images posted to your active room": "Podívat se na obrázky zveřejněné ve vaší aktivní místnosti",
"Send videos as you in this room": "Poslat videa jako vy v této místnosti",
"Send videos as you in your active room": "Podívat se na videa jako vy ve vaší aktivní místnosti",
"See videos posted to this room": "Podívat se na videa zveřejněná v této místnosti",
"See videos posted to your active room": "Podívat se na videa zveřejněná ve vaší aktivní místnosti",
"Send general files as you in this room": "Poslat obecné soubory jako vy v této místnosti",
"Send general files as you in your active room": "Poslat obecné soubory jako vy ve vaší aktivní místnosti",
"See general files posted to this room": "Prohlédnout obecné soubory zveřejněné v této místnosti",
"See general files posted to your active room": "Prohlédnout obecné soubory zveřejněné ve vaší aktivní místnosti",
"Send <b>%(msgtype)s</b> messages as you in this room": "Poslat zprávy <b>%(msgtype)s</b> jako vy v této místnosti",
"Send <b>%(msgtype)s</b> messages as you in your active room": "Poslat zprávy <b>%(msgtype)s</b> jako vy ve vašá aktivní místnosti",
"See <b>%(msgtype)s</b> messages posted to this room": "Prohlédnout zprávy <b>%(msgtype)s</b> zveřejněné v této místnosti",
"See <b>%(msgtype)s</b> messages posted to your active room": "Prohlédnout zprávy <b>%(msgtype)s</b> zveřejněné ve vaší aktivní místnosti",
"Render LaTeX maths in messages": "Ve zprávách vykreslit matematické výrazy LaTeXu",
"New spinner design": "Nový design ukazatele zpracování",
"Show message previews for reactions in DMs": "Zobrazit náhledy zpráv pro reakce v přímých zprávách",
"Show message previews for reactions in all rooms": "Zobrazit náhledy zpráv pro reakce ve všech místnostech",
"Sends the given message with confetti": "Pošle zprávu s konfetami",
"sends confetti": "pošle konfety",
"Sends the given message with fireworks": "Pošle zprávu s ohňostrojem",
"sends fireworks": "pošle ohňostroj",
"The <b>%(capability)s</b> capability": "Schopnost <b>%(capability)s</b>",
"See <b>%(eventType)s</b> events posted to your active room": "Zobrazit události <b>%(eventType)s</b> odeslané do vaší aktivní místnosti",
"Send <b>%(eventType)s</b> events as you in your active room": "Poslat události <b>%(eventType)s</b> jako vy ve vaší aktivní místnosti",
"Send <b>%(eventType)s</b> events as you in this room": "Poslat události <b>%(eventType)s</b> jako vy v této místnosti",
"with an empty state key": "s prázdným stavovým klíčem",
"with state key %(stateKey)s": "se stavovým klíčem %(stateKey)s",
"User signing private key:": "Podpisový klíč uživatele:",
"Self signing private key:": "Vlastní podpisový klíč:",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Vloží ┬──┬ ( ゜-゜ノ) na začátek zprávy",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Vloží (╯°□°)╯︵ ┻━┻ na začátek zprávy",
"Remain on your screen while running": "Při běhu zůstává na obrazovce",
"Remain on your screen when viewing another room, when running": "Při prohlížení jiné místnosti zůstává při běhu na obrazovce",
"%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s změnil seznam přístupů serveru pro tuto místnost.",
"Offline encrypted messaging using dehydrated devices": "Offline šifrovaná komunikace pomocí dehydrovaných zařízení",
"See emotes posted to your active room": "Prohlédněte si emoji zveřejněné ve vaší aktivní místnosti",
"See emotes posted to this room": "Prohlédněte si emoji zveřejněné v této místnosti",
"Send emotes as you in your active room": "Poslat emoji jako vy ve své aktivní místnosti",
"Send emotes as you in this room": "Poslat emoji jako vy v této místnosti",
"See when anyone posts a sticker to your active room": "Podívejte se, kdy někdo zveřejní nálepku ve vaší aktivní místnosti",
"See when a sticker is posted in this room": "Podívejte se, kdy je zveřejněna nálepka v této místnosti",
"See when the name changes in this room": "Podívejte se, kdy se změní název v této místnosti",
"See when the topic changes in your active room": "Podívejte se, kdy se změní téma ve vaší aktivní místnosti",
"See when the topic changes in this room": "Podívejte se, kdy se změní téma v této místnosti",
"%(name)s on hold": "%(name)s podržen",
"You held the call <a>Switch</a>": "Podrželi jste hovor <a>Přepnout</a>",
"sends snowfall": "pošle sněžení",
"Sends the given message with snowfall": "Pošle zprávu se sněžením",
"You have no visible notifications.": "Nejsou dostupná žádná oznámení.",
"Transfer": "Přepojit",
"Failed to transfer call": "Hovor se nepodařilo přepojit",
"A call can only be transferred to a single user.": "Hovor lze přepojit pouze jednomu uživateli.",
"There was an error finding this widget.": "Při hledání tohoto widgetu došlo k chybě.",
"Active Widgets": "Aktivní widgety",
"Open dial pad": "Otevřít číselník",
"Start a Conversation": "Zahájit konverzaci",
"Dial pad": "Číselník",
"There was an error looking up the phone number": "Při vyhledávání telefonního čísla došlo k chybě",
"Unable to look up phone number": "Nelze nalézt telefonní číslo"
}

View File

@ -18,7 +18,7 @@
"Kicks user with given id": "Smider bruger med givet id ud",
"Changes your display nickname": "Ændrer dit viste navn",
"Searches DuckDuckGo for results": "Søger på DuckDuckGo efter resultater",
"Commands": "kommandoer",
"Commands": "Kommandoer",
"Emoji": "Emoji",
"Sign in": "Log ind",
"Warning!": "Advarsel!",
@ -69,7 +69,7 @@
"World readable": "Læselig af alle",
"Guests can join": "Gæster kan deltage",
"No rooms to show": "Ingen rum at vise",
"This email address is already in use": "Denne emailadresse er allerede i brug",
"This email address is already in use": "Denne email adresse er allerede i brug",
"This phone number is already in use": "Dette telefonnummer er allerede i brug",
"Failed to verify email address: make sure you clicked the link in the email": "Kunne ikke bekræfte emailaddressen: vær sikker på at klikke på linket i emailen",
"Call Timeout": "Opkalds Timeout",
@ -536,5 +536,87 @@
"%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s opdaterede den regel der banner rum som matcher %(glob)s på grund af %(reason)s",
"%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s opdaterede den regel der banner servere der matcher %(glob)s på grund af %(reason)s",
"%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s opdaterede en ban-regel der matcher %(glob)s på grund af %(reason)s",
"Explore rooms": "Udforsk rum"
"Explore rooms": "Udforsk rum",
"Verification code": "Verifikationskode",
"Who can access this room?": "Hvem kan tilgå dette rum?",
"Encrypted": "Krypteret",
"Once enabled, encryption cannot be disabled.": "Efter aktivering er det ikke muligt at slå kryptering fra.",
"Security & Privacy": "Sikkerhed & Privatliv",
"Who can read history?": "Hvem kan læse historikken?",
"Enable encryption?": "Aktiver kryptering?",
"Only people who have been invited": "Kun folk som er blevet inviteret",
"Add a User": "Tilføj en bruger",
"Everyone": "Alle",
"Description": "Beskrivelse",
"Create a Group Chat": "Opret en gruppechat",
"Explore Public Rooms": "Udforsk offentlige rum",
"Send a Direct Message": "Send en Direkte Besked",
"Permissions": "Tilladelser",
"Headphones": "Hovedtelefoner",
"Show more": "Vis mere",
"Show less": "Vis mindre",
"Passwords don't match": "Adgangskoderne matcher ikke",
"Confirm password": "Bekræft adgangskode",
"Reset": "Nulstil",
"No": "Nej",
"Enter password": "Indtast adgangskode",
"Add a new server": "Tilføj en ny server",
"Matrix": "Matrix",
"Remove server": "Fjern server",
"Change notification settings": "Skift notifikations indstillinger",
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
"%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s",
"%(senderName)s: %(message)s": "%(senderName)s: %(message)s",
"* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s",
"%(senderName)s is calling": "%(senderName)s ringer",
"Waiting for answer": "Venter på svar",
"%(senderName)s started a call": "%(senderName)s startede et opkald",
"You started a call": "Du startede et opkald",
"Verified!": "Bekræftet!",
"Video Call": "Video Opkald",
"Accept": "Accepter",
"Decline": "Afvis",
"Save": "Gem",
"Profile picture": "Profil billede",
"Categories": "Kategorier",
"Checking server": "Tjekker server",
"You're signed out": "Du er logget ud",
"Change Password": "Skift adgangskode",
"Current password": "Nuværende adgangskode",
"Theme added!": "Tema tilføjet!",
"The other party declined the call.": "Den anden part afviste opkaldet.",
"Comment": "Kommentar",
"or": "eller",
"%(brand)s Android": "%(brand)s Android",
"%(brand)s iOS": "%(brand)s iOS",
"Privacy": "Privatliv",
"Please enter a name for the room": "Indtast et navn for rummet",
"No results": "Ingen resultater",
"Disable": "Deaktiver",
"Profile": "Profil",
"Local address": "Lokal adresse",
"This room has no local addresses": "Dette rum har ingen lokal adresse",
"The conversation continues here.": "Samtalen fortsætter her.",
"Send a message…": "Send en besked…",
"Send an encrypted message…": "Send en krypteret besked…",
"Send a reply…": "Besvar…",
"Message deleted on %(date)s": "Besked slettet d. %(date)s",
"Message deleted by %(name)s": "Besked slettet af %(name)s",
"Message deleted": "Besked slettet",
"Theme": "Tema",
"France": "Frankrig",
"Finland": "Finland",
"Egypt": "Egypten",
"Denmark": "Danmark",
"Cuba": "Cuba",
"China": "Kina",
"Canada": "Canada",
"End conference": "Afslut konference",
"Too Many Calls": "For mange opkald",
"Permission is granted to use the webcam": "Tilladelse er givet til brug af webcam",
"Unable to access webcam / microphone": "Kan ikke tilgå webcam / mikrofon",
"Unable to access microphone": "Kan ikke tilgå mikrofonen",
"The call could not be established": "Opkaldet kunne ikke etableres",
"Call Declined": "Opkald afvist",
"Folder": "Mappe"
}

View File

@ -149,7 +149,7 @@
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".",
"/ddg is not a command": "/ddg ist kein Kommando",
"/ddg is not a command": "/ddg ist kein Befehl",
"%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.",
"Failed to send request.": "Anfrage konnte nicht gesendet werden.",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s",
@ -177,7 +177,7 @@
"%(senderName)s set a profile picture.": "%(senderName)s hat ein Profilbild gesetzt.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.",
"This room is not recognised.": "Dieser Raum wurde nicht erkannt.",
"To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.",
"To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Ergebnisse der Autovervollständigung und benutze dann die TAB-Taste zum Durchblättern.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben.",
"Usage": "Verwendung",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.",
@ -197,7 +197,7 @@
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Es kann keine Verbindung zum Heimserver via HTTP aufgebaut werden, wenn die Adresszeile des Browsers eine HTTPS-URL enthält. Entweder HTTPS verwenden oder alternativ <a>unsichere Skripte erlauben</a>.",
"Click to mute audio": "Klicke um den Ton stumm zu stellen",
"Click to mute video": "Klicken, um das Video stummzuschalten",
"Command error": "Befehlsfehler",
"Command error": "Fehler im Befehl",
"Decrypt %(text)s": "%(text)s entschlüsseln",
"Disinvite": "Einladung zurückziehen",
"Download %(text)s": "%(text)s herunterladen",
@ -1189,7 +1189,7 @@
"Unable to query for supported registration methods.": "Konnte unterstützte Registrierungsmethoden nicht abrufen.",
"Bulk options": "Sammeloptionen",
"Join millions for free on the largest public server": "Schließe dich kostenlos auf dem größten öffentlichen Server Millionen von Menschen an",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Fügt ¯\\_(ツ)_/¯ vor einer Klartextnachricht ein",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Stellt ¯\\_(ツ)_/¯ einer Klartextnachricht voran",
"Changes your display nickname in the current room only": "Ändert den Anzeigenamen ausschließlich für den aktuellen Raum",
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktivierte Abzeichen der Gruppen %(groups)s für diesen Raum.",
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s deaktivierte Abzeichen der Gruppen %(groups)s in diesem Raum.",
@ -1333,7 +1333,7 @@
"Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du dem/r Besitzer*in des Servers vertraust.",
"Trust": "Vertrauen",
"Custom (%(level)s)": "Benutzerdefinierte (%(level)s)",
"Sends a message as plain text, without interpreting it as markdown": "Verschickt eine Nachricht in reinem Textformat, ohne sie in Markdown zu formatieren",
"Sends a message as plain text, without interpreting it as markdown": "Verschickt eine Nachricht in Rohtext, ohne sie als Markdown darzustellen",
"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)",
"Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)",
@ -1630,10 +1630,10 @@
"Your recovery key": "Dein Wiederherstellungsschlüssel",
"Copy": "In Zwischenablage kopieren",
"Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel",
"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 als Markdown zu darzustellen",
"Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen",
"Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteten Räumen über der Raumliste anzeigen",
"Use Single Sign On to continue": "Benutze Single Sign-On um fortzufahren",
"Use Single Sign On to continue": "Single-Sign-On zum Fortfahren nutzen",
"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",
"Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse",
@ -2950,5 +2950,34 @@
"Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen weil nicht auf das Mikrofon zugegriffen werden konnte. Stelle sicher, dass das Mikrofon richtig eingesteckt und eingerichtet ist.",
"Call failed because no webcam or microphone could not be accessed. Check that:": "Der Anruf ist fehlgeschlagen weil nicht auf das Mikrofon oder die Webcam zugegriffen werden konnte. Stelle sicher, dass:",
"Unable to access webcam / microphone": "Auf Webcam / Mikrofon konnte nicht zugegriffen werden",
"Unable to access microphone": "Es konnte nicht auf das Mikrofon zugegriffen werden"
"Unable to access microphone": "Es konnte nicht auf das Mikrofon zugegriffen werden",
"Host account on": "Benutzer*innenkonto betreiben an",
"Hold": "Halten",
"Resume": "Fortsetzen",
"We call the places where you can host your account homeservers.": "Den Ort, an dem du dein Benutzer*innenkonto betreibst, nennen wir „Heimserver“.",
"Invalid URL": "Ungültiger Link",
"Unable to validate homeserver": "Überprüfung des Heimservers nicht möglich",
"%(name)s paused": "%(name)s hat pausiert",
"%(peerName)s held the call": "%(peerName)s hält den Anruf",
"You held the call <a>Resume</a>": "Du hältst den Anruf <a>Fortsetzen</a>",
"sends fireworks": "sendet Feuerwerk",
"Sends the given message with fireworks": "Sendet die gewählte Nachricht mit Feuerwerk",
"sends confetti": "sendet Konfetti",
"Sends the given message with confetti": "Sendet die gewählte Nachricht ohne Konfetti",
"Show chat effects": "Chat-Effekte anzeigen",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Stellt ┬──┬ ( ゜-゜ノ) einer Klartextnachricht voran",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Stellt (╯°□°)╯︵ ┻━┻ einer Klartextnachricht voran",
"Effects": "Effekte",
"You've reached the maximum number of simultaneous calls.": "Du hast die maximale Anzahl gleichzeitiger Anrufe erreicht.",
"Too Many Calls": "Zu viele Anrufe",
"Call failed because webcam or microphone could not be accessed. Check that:": "Der Anruf ist fehlgeschlagen, weil nicht auf die Webcam oder der das Mikrofon zugegriffen werden konnte. Prüfe nach, ob:",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen, weil nicht auf das Mikrofon zugegriffen werden konnte. Prüfe noch einmal nach, ob das Mikrofon eingesteckt und richtig eingestellt ist.",
"You have no visible notifications.": "Du hast keine sichtbaren Benachrichtigungen.",
"%(name)s on hold": "%(name)s wird gehalten",
"You held the call <a>Switch</a>": "Du hältst den Anruf <a>Wechseln</a>",
"sends snowfall": "sendet Schneeflocken",
"Sends the given message with snowfall": "Sendet die gewählte Nachricht mit Schneeflocken",
"Transfer": "Übertragen",
"Failed to transfer call": "Anruf-Übertragung fehlgeschlagen",
"A call can only be transferred to a single user.": "Ein Anruf kann nur auf einen einzelnen Nutzer übertragen werden."
}

View File

@ -604,5 +604,9 @@
"Sets the room name": "Θέτει το θέμα του δωματίου",
"Use an identity server": "Χρησιμοποιήστε ένα διακομιστή ταυτοτήτων",
"Your %(brand)s is misconfigured": "Οι παράμετροι του %(brand)s σας είναι λανθασμένα ρυθμισμένοι",
"Explore rooms": "Εξερευνήστε δωμάτια"
"Explore rooms": "Εξερευνήστε δωμάτια",
"Whether you're using %(brand)s as an installed Progressive Web App": "Εάν χρησιμοπιείται %(brand)s σαν εγκατεστημένο Progressive Web App",
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ενα χρησιμοποιείται το %(brand)s σε συσκευή αφής",
"Click the button below to confirm adding this phone number.": "Πιέστε το κουμπί από κάτω για να επιβεβαίωσετε την προσθήκη του τηλεφωνικού αριθμού.",
"Confirm": "Επιβεβαίωση"
}

View File

@ -548,6 +548,7 @@
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s",
"%(senderName)s has updated the widget layout": "%(senderName)s has updated the widget layout",
"%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s removed the rule banning users matching %(glob)s",
"%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s removed the rule banning rooms matching %(glob)s",
"%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s removed the rule banning servers matching %(glob)s",
@ -584,6 +585,7 @@
"Send stickers into this room": "Send stickers into this room",
"Send stickers into your active room": "Send stickers into your active room",
"Change which room you're viewing": "Change which room you're viewing",
"Change which room, message, or user you're viewing": "Change which room, message, or user you're viewing",
"Change the topic of this room": "Change the topic of this room",
"See when the topic changes in this room": "See when the topic changes in this room",
"Change the topic of your active room": "Change the topic of your active room",
@ -861,6 +863,9 @@
"Fill Screen": "Fill Screen",
"Return to call": "Return to call",
"%(name)s on hold": "%(name)s on hold",
"Unable to look up phone number": "Unable to look up phone number",
"There was an error looking up the phone number": "There was an error looking up the phone number",
"Dial pad": "Dial pad",
"Unknown caller": "Unknown caller",
"Incoming voice call": "Incoming voice call",
"Incoming video call": "Incoming video call",
@ -962,10 +967,8 @@
"Upload": "Upload",
"This bridge was provisioned by <user />.": "This bridge was provisioned by <user />.",
"This bridge is managed by <user />.": "This bridge is managed by <user />.",
"Workspace: %(networkName)s": "Workspace: %(networkName)s",
"Channel: %(channelName)s": "Channel: %(channelName)s",
"Show less": "Show less",
"Show more": "Show more",
"Workspace: <networkLink/>": "Workspace: <networkLink/>",
"Channel: <channelLink/>": "Channel: <channelLink/>",
"Failed to upload profile picture!": "Failed to upload profile picture!",
"Upload new:": "Upload new:",
"No display name": "No display name",
@ -1087,7 +1090,7 @@
"Back up your keys before signing out to avoid losing them.": "Back up your keys before signing out to avoid losing them.",
"well formed": "well formed",
"unexpected type": "unexpected type",
"Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.",
"Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key.": "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key.",
"Backup key stored:": "Backup key stored:",
"not stored": "not stored",
"Backup key cached:": "Backup key cached:",
@ -1459,6 +1462,8 @@
"Hide Widgets": "Hide Widgets",
"Show Widgets": "Show Widgets",
"Search": "Search",
"Start a Conversation": "Start a Conversation",
"Open dial pad": "Open dial pad",
"Invites": "Invites",
"Favourites": "Favourites",
"People": "People",
@ -1527,6 +1532,7 @@
"Jump to first invite.": "Jump to first invite.",
"Show %(count)s more|other": "Show %(count)s more",
"Show %(count)s more|one": "Show %(count)s more",
"Show less": "Show less",
"Use default": "Use default",
"All messages": "All messages",
"Mentions & Keywords": "Mentions & Keywords",
@ -1589,6 +1595,7 @@
"New published address (e.g. #alias:server)": "New published address (e.g. #alias:server)",
"Local Addresses": "Local Addresses",
"Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)",
"Show more": "Show more",
"Error updating flair": "Error updating flair",
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.",
"Invalid community ID": "Invalid community ID",
@ -1629,6 +1636,7 @@
"Unpin": "Unpin",
"Unpin a widget to view it in this panel": "Unpin a widget to view it in this panel",
"Options": "Options",
"Set my room layout for everyone": "Set my room layout for everyone",
"Widgets": "Widgets",
"Edit widgets, bridges & bots": "Edit widgets, bridges & bots",
"Add widgets, bridges & bots": "Add widgets, bridges & bots",
@ -2045,6 +2053,8 @@
"Explore Account Data": "Explore Account Data",
"View Servers in Room": "View Servers in Room",
"Verification Requests": "Verification Requests",
"Active Widgets": "Active Widgets",
"There was an error finding this widget.": "There was an error finding this widget.",
"Toolbox": "Toolbox",
"Developer Tools": "Developer Tools",
"There was an error updating your community. The server is unable to process your request.": "There was an error updating your community. The server is unable to process your request.",
@ -2080,6 +2090,8 @@
"We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.",
"Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.",
"We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.",
"A call can only be transferred to a single user.": "A call can only be transferred to a single user.",
"Failed to transfer call": "Failed to transfer call",
"Failed to find the following users": "Failed to find the following users",
"The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s",
"Recent Conversations": "Recent Conversations",
@ -2093,6 +2105,7 @@
"Go": "Go",
"Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.",
"Invite someone using their name, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, username (like <userId/>) or <a>share this room</a>.",
"Transfer": "Transfer",
"a new master key signature": "a new master key signature",
"a new cross-signing key signature": "a new cross-signing key signature",
"a device cross-signing signature": "a device cross-signing signature",
@ -2130,7 +2143,7 @@
"Your password": "Your password",
"This session, or the other session": "This session, or the other session",
"The internet connection either session is using": "The internet connection either session is using",
"We recommend you change your password and recovery key in Settings immediately": "We recommend you change your password and recovery key in Settings immediately",
"We recommend you change your password and Security Key in Settings immediately": "We recommend you change your password and Security Key in Settings immediately",
"New session": "New session",
"Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:",
"If you didnt sign in to this session, your account may be compromised.": "If you didnt sign in to this session, your account may be compromised.",
@ -2238,10 +2251,10 @@
"Deny": "Deny",
"Wrong file type": "Wrong file type",
"Looks good!": "Looks good!",
"Wrong Recovery Key": "Wrong Recovery Key",
"Invalid Recovery Key": "Invalid Recovery Key",
"Wrong Security Key": "Wrong Security Key",
"Invalid Security Key": "Invalid Security Key",
"Security Phrase": "Security Phrase",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.",
"Unable to access secret storage. Please verify that you entered the correct Security Phrase.": "Unable to access secret storage. Please verify that you entered the correct Security Phrase.",
"Enter your Security Phrase or <button>Use your Security Key</button> to continue.": "Enter your Security Phrase or <button>Use your Security Key</button> to continue.",
"Security Key": "Security Key",
"Use your Security Key to continue.": "Use your Security Key to continue.",
@ -2256,25 +2269,25 @@
"Fetching keys from server...": "Fetching keys from server...",
"%(completed)s of %(total)s keys restored": "%(completed)s of %(total)s keys restored",
"Unable to load backup status": "Unable to load backup status",
"Recovery key mismatch": "Recovery key mismatch",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.",
"Incorrect recovery passphrase": "Incorrect recovery passphrase",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.",
"Security Key mismatch": "Security Key mismatch",
"Backup could not be decrypted with this Security Key: please verify that you entered the correct Security Key.": "Backup could not be decrypted with this Security Key: please verify that you entered the correct Security Key.",
"Incorrect Security Phrase": "Incorrect Security Phrase",
"Backup could not be decrypted with this Security Phrase: please verify that you entered the correct Security Phrase.": "Backup could not be decrypted with this Security Phrase: please verify that you entered the correct Security Phrase.",
"Unable to restore backup": "Unable to restore backup",
"No backup found!": "No backup found!",
"Keys restored": "Keys restored",
"Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!",
"Successfully restored %(sessionCount)s keys": "Successfully restored %(sessionCount)s keys",
"Enter recovery passphrase": "Enter recovery passphrase",
"Enter Security Phrase": "Enter Security Phrase",
"<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 passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>",
"Enter recovery key": "Enter recovery key",
"This looks like a valid recovery key!": "This looks like a valid recovery key!",
"Not a valid recovery key": "Not a valid recovery key",
"Access your secure message history and set up secure messaging by entering your Security Phrase.": "Access your secure message history and set up secure messaging by entering your Security Phrase.",
"If you've forgotten your Security Phrase you can <button1>use your Security Key</button1> or <button2>set up new recovery options</button2>": "If you've forgotten your Security Phrase you can <button1>use your Security Key</button1> or <button2>set up new recovery options</button2>",
"Enter Security Key": "Enter Security Key",
"This looks like a valid Security Key!": "This looks like a valid Security Key!",
"Not a valid Security Key": "Not a valid Security Key",
"<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.",
"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>",
"Access your secure message history and set up secure messaging by entering your Security Key.": "Access your secure message history and set up secure messaging by entering your Security Key.",
"If you've forgotten your Security Key you can <button>set up new recovery options</button>": "If you've forgotten your Security Key you can <button>set up new recovery options</button>",
"Resume": "Resume",
"Hold": "Hold",
"Reject invitation": "Reject invitation",
@ -2434,7 +2447,7 @@
"Create a new community": "Create a new community",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.",
"Youre all caught up": "Youre all caught up",
"You have no visible notifications in this room.": "You have no visible notifications in this room.",
"You have no visible notifications.": "You have no visible notifications.",
"%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.",
"%(brand)s failed to get the public room list.": "%(brand)s failed to get the public room list.",
"The homeserver may be unavailable or overloaded.": "The homeserver may be unavailable or overloaded.",
@ -2551,8 +2564,8 @@
"Create account": "Create account",
"Host account on": "Host account on",
"Decide where your account is hosted": "Decide where your account is hosted",
"Use Recovery Key or Passphrase": "Use Recovery Key or Passphrase",
"Use Recovery Key": "Use Recovery Key",
"Use Security Key or Phrase": "Use Security Key or Phrase",
"Use Security Key": "Use Security Key",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.",
"This requires the latest %(brand)s on your other devices:": "This requires the latest %(brand)s on your other devices:",
"%(brand)s Web": "%(brand)s Web",
@ -2587,38 +2600,37 @@
"Room Autocomplete": "Room Autocomplete",
"Users": "Users",
"User Autocomplete": "User Autocomplete",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.": "We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.",
"For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.",
"Enter a recovery passphrase": "Enter a recovery passphrase",
"Great! This recovery passphrase looks strong enough.": "Great! This recovery passphrase looks strong enough.",
"Set up with a recovery key": "Set up with a recovery key",
"Enter a Security Phrase": "Enter a Security Phrase",
"Great! This Security Phrase looks strong enough.": "Great! This Security Phrase looks strong enough.",
"Set up with a Security Key": "Set up with a Security Key",
"That matches!": "That matches!",
"Use a different passphrase?": "Use a different passphrase?",
"That doesn't match.": "That doesn't match.",
"Go back to set it again.": "Go back to set it again.",
"Please enter your recovery passphrase a second time to confirm.": "Please enter your recovery passphrase a second time to confirm.",
"Repeat your recovery passphrase...": "Repeat your recovery passphrase...",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.",
"Please enter your Security Phrase a second time to confirm.": "Please enter your Security Phrase a second time to confirm.",
"Repeat your Security Phrase...": "Repeat your Security Phrase...",
"Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.": "Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.",
"Keep a copy of it somewhere secure, like a password manager or even a safe.": "Keep a copy of it somewhere secure, like a password manager or even a safe.",
"Your recovery key": "Your recovery key",
"Your recovery key has been <b>copied to your clipboard</b>, paste it to:": "Your recovery key has been <b>copied to your clipboard</b>, paste it to:",
"Your recovery key is in your <b>Downloads</b> folder.": "Your recovery key is in your <b>Downloads</b> folder.",
"Your Security Key": "Your Security Key",
"Your Security Key has been <b>copied to your clipboard</b>, paste it to:": "Your Security Key has been <b>copied to your clipboard</b>, paste it to:",
"Your Security Key is in your <b>Downloads</b> folder.": "Your Security Key is in your <b>Downloads</b> folder.",
"<b>Print it</b> and store it somewhere safe": "<b>Print it</b> and store it somewhere safe",
"<b>Save it</b> on a USB key or backup drive": "<b>Save it</b> on a USB key or backup drive",
"<b>Copy it</b> to your personal cloud storage": "<b>Copy it</b> to your personal cloud storage",
"Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).",
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.",
"Set up Secure Message Recovery": "Set up Secure Message Recovery",
"Secure your backup with a recovery passphrase": "Secure your backup with a recovery passphrase",
"Confirm your recovery passphrase": "Confirm your recovery passphrase",
"Make a copy of your recovery key": "Make a copy of your recovery key",
"Secure your backup with a Security Phrase": "Secure your backup with a Security Phrase",
"Confirm your Security Phrase": "Confirm your Security Phrase",
"Make a copy of your Security Key": "Make a copy of your Security Key",
"Starting backup...": "Starting backup...",
"Success!": "Success!",
"Create key backup": "Create key backup",
"Unable to create key backup": "Unable to create key backup",
"Generate a Security Key": "Generate a Security Key",
"Well generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "Well generate a Security Key for you to store somewhere safe, like a password manager or a safe.",
"Enter a Security Phrase": "Enter a Security Phrase",
"Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Use a secret phrase only you know, and optionally save a Security Key to use for backup.",
"Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.",
"Enter your account password to confirm the upgrade:": "Enter your account password to confirm the upgrade:",
@ -2628,6 +2640,7 @@
"Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.",
"Enter a security phrase only you know, as its used to safeguard your data. To be secure, you shouldnt re-use your account password.": "Enter a security phrase only you know, as its used to safeguard your data. To be secure, you shouldnt re-use your account password.",
"Enter your recovery passphrase a second time to confirm it.": "Enter your recovery passphrase a second time to confirm it.",
"Confirm your recovery passphrase": "Confirm your recovery passphrase",
"Store your Security Key somewhere safe, like a password manager or a safe, as its used to safeguard your encrypted data.": "Store your Security Key somewhere safe, like a password manager or a safe, as its used to safeguard your encrypted data.",
"Unable to query secret storage status": "Unable to query secret storage status",
"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.",
@ -2652,13 +2665,13 @@
"File to import": "File to import",
"Import": "Import",
"New Recovery Method": "New Recovery Method",
"A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.",
"A new Security Phrase and key for Secure Messages have been detected.": "A new Security Phrase and key for Secure Messages have been detected.",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.",
"This session is encrypting history using the new recovery method.": "This session is encrypting history using the new recovery method.",
"Go to Settings": "Go to Settings",
"Set up Secure Messages": "Set up Secure Messages",
"Recovery Method Removed": "Recovery Method Removed",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and key for Secure Messages have been removed.",
"This session has detected that your Security Phrase and key for Secure Messages have been removed.": "This session has detected that your Security Phrase and key for Secure Messages have been removed.",
"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.": "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.",
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.",
"If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.",

View File

@ -655,9 +655,9 @@
"Messages in one-to-one chats": "Mesaĝoj en duopaj babiloj",
"Unavailable": "Nedisponebla",
"View Decrypted Source": "Vidi malĉifritan fonton",
"Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn",
"Failed to update keywords": "Malsukcesis ĝisdatigi la ĉefvortojn",
"remove %(name)s from the directory.": "forigi %(name)s de la katalogo.",
"Notifications on the following keywords follow rules which cant be displayed here:": "La sciigoj de la jenaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:",
"Notifications on the following keywords follow rules which cant be displayed here:": "La sciigoj de la jenaj ĉefvortoj obeas regulojn kiuj ne povas esti montrataj ĉi tie:",
"Please set a password!": "Bonvolu agordi pasvorton!",
"You have successfully set a password!": "Vi sukcese agordis pasvorton!",
"An error occurred whilst saving your email notification preferences.": "Konservo de agordoj pri retpoŝtaj sciigoj eraris.",
@ -671,10 +671,10 @@
"Collecting app version information": "Kolektante informon pri versio de la aplikaĵo",
"Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto",
"Invite to this community": "Inviti al tiu ĉi komunumo",
"Messages containing <span>keywords</span>": "Mesaĝoj enhavantaj <span>ŝlosilovortojn</span>",
"Messages containing <span>keywords</span>": "Mesaĝoj enhavantaj <span>ĉefvortojn</span>",
"Error saving email notification preferences": "Konservo de preferoj pri retpoŝtaj sciigoj eraris",
"Tuesday": "Mardo",
"Enter keywords separated by a comma:": "Entajpu ŝlosilvortojn apartigitajn per komoj:",
"Enter keywords separated by a comma:": "Entajpu ĉefvortojn apartigitajn per komoj:",
"Search…": "Serĉi…",
"You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!",
"Remove %(name)s from the directory?": "Ĉu forigi %(name)s de la katalogo?",
@ -708,7 +708,7 @@
"What's new?": "Kio novas?",
"Notify me for anything else": "Sciigu min pri ĉio alia",
"When I'm invited to a room": "Kiam mi estas invitita al ĉambro",
"Keywords": "Ŝlosilvortoj",
"Keywords": "Ĉefvortoj",
"Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas",
"Notify for all other messages/rooms": "Sciigu min por ĉiuj aliaj mesaĝoj/ĉambroj",
"Unable to look up room ID from server": "Ne povas akiri ĉambran identigilon de la servilo",
@ -2072,7 +2072,7 @@
"Invalid theme schema.": "Nevalida skemo de haŭto.",
"Mod": "Reguligisto",
"In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "En ĉifritaj ĉambroj, viaj mesaĝoj estas sekurigitaj, kaj nur vi kaj la ricevanto havas la unikajn malĉifrajn ŝlosilojn.",
"Verify all users in a room to ensure it's secure.": "Kontroli ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.",
"Verify all users in a room to ensure it's secure.": "Kontrolu ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.",
"In encrypted rooms, verify all users to ensure its secure.": "En ĉifritaj ĉambroj, kontroli ĉiujn uzantojn por certigi, ke ili sekuras.",
"Verified": "Kontrolita",
"Verification cancelled": "Kontrolo nuliĝis",
@ -2329,7 +2329,7 @@
"Show %(count)s more|other": "Montri %(count)s pliajn",
"Show %(count)s more|one": "Montri %(count)s plian",
"Use default": "Uzi implicitan",
"Mentions & Keywords": "Mencioj kaj ŝlosilvortoj",
"Mentions & Keywords": "Mencioj kaj ĉefvortoj",
"Notification options": "Elektebloj pri sciigoj",
"Favourited": "Elstarigita",
"Leave Room": "Foriri de ĉambro",
@ -2697,5 +2697,167 @@
"Caribbean Netherlands": "Kariba Nederlando",
"Burkina Faso": "Burkino",
"Bouvet Island": "Buvet-Insulo",
"Anguilla": "Angvilo"
"Anguilla": "Angvilo",
"%(name)s on hold": "%(name)s estas paŭzigita",
"Return to call": "Reveni al voko",
"Fill Screen": "Plenigi ekranon",
"Voice Call": "Voĉvoko",
"Video Call": "Vidvoko",
"%(peerName)s held the call": "%(peerName)s paŭzigis la vokon",
"You held the call <a>Resume</a>": "Vi paŭzigis la vokon <a>Daŭrigi</a>",
"You held the call <a>Switch</a>": "Vi paŭzigis la vokon <a>Baskuli</a>",
"Render LaTeX maths in messages": "Bildigi matematikon de Lateĥo en mesaĝoj",
"%(senderName)s ended the call": "%(senderName)s finis la vokon",
"You ended the call": "Vi finis la vokon",
"New version of %(brand)s is available": "Nova versio de %(brand)s disponeblas",
"Update %(brand)s": "Ĝisdatigi %(brand)s",
"Enable desktop notifications": "Ŝalti labortablajn sciigojn",
"See <b>%(msgtype)s</b> messages posted to your active room": "Vidi mesaĝojn de speco <b>%(msgtype)s</b> afiŝitajn al via aktiva ĉambro",
"See <b>%(msgtype)s</b> messages posted to this room": "Vidi mesaĝojn de speco <b>%(msgtype)s</b> afiŝitajn al ĉi tiu ĉambro",
"Send <b>%(msgtype)s</b> messages as you in your active room": "Sendi mesaĝojn de speco <b>%(msgtype)s</b> kiel vi en via aktiva ĉambro",
"Send <b>%(msgtype)s</b> messages as you in this room": "Sendi mesaĝojn de speco <b>%(msgtype)s</b> kiel vi en ĉi tiu ĉambro",
"See general files posted to your active room": "Sendi ĝeneralajn dosierojn afiŝitajn al via aktiva ĉambro",
"See general files posted to this room": "Sendi ĝeneralajn dosierojn afiŝitajn al ĉi tiu ĉambro",
"Send general files as you in your active room": "Sendi ĝeneralajn dosierojn kiel vi en via aktiva ĉambro",
"Send general files as you in this room": "Sendi ĝeneralajn dosierojn kiel vi en ĉi tiu ĉambro",
"See videos posted to your active room": "Vidi filmojn afiŝitajn al via aktiva ĉambro",
"See videos posted to this room": "Vidi filmojn afiŝitajn al ĉi tiu ĉambro",
"Send videos as you in your active room": "Sendi filmojn kiel vi en via aktiva ĉambro",
"Send videos as you in this room": "Sendi filmojn kiel vi en ĉi tiu ĉambro",
"See images posted to your active room": "Vidi bildojn afiŝitajn al via aktiva ĉambro",
"See images posted to this room": "Vidi bildojn afiŝitajn al ĉi tiu ĉambro",
"Send images as you in your active room": "Sendi bildojn kiel vi en via aktiva ĉambro",
"Send images as you in this room": "Sendi bildojn kiel vi en ĉi tiu ĉambro",
"The <b>%(capability)s</b> capability": "La kapablo <b>%(capability)s</b>",
"See <b>%(eventType)s</b> events posted to your active room": "Vidi eventojn de speco <b>%(eventType)s</b> afiŝitajn al via aktiva ĉambro",
"Send <b>%(eventType)s</b> events as you in your active room": "Sendi eventojn de speco <b>%(eventType)s</b> kiel vi en via aktiva ĉambro",
"See <b>%(eventType)s</b> events posted to this room": "Vidi eventojn de speco <b>%(eventType)s</b> afiŝitajn al ĉi tiu ĉambro",
"Send <b>%(eventType)s</b> events as you in this room": "Sendi eventojn de speco <b>%(eventType)s</b> kiel vi en ĉi tiu ĉambro",
"See messages posted to your active room": "Vidi mesaĝojn senditajn al via aktiva ĉambro",
"See messages posted to this room": "Vidi mesaĝojn senditajn al ĉi tiu ĉambro",
"Send messages as you in your active room": "Sendi mesaĝojn kiel vi en via aktiva ĉambro",
"Send messages as you in this room": "Sendi mesaĝojn kiel vi en ĉi tiu ĉambro",
"See when anyone posts a sticker to your active room": "Vidi ies ajn afiŝojn de glumarkoj al via aktiva ĉambro",
"Send stickers to your active room as you": "Sendi glumarkojn al via aktiva ĉambro kiel vi",
"See when a sticker is posted in this room": "Vidi afiŝojn de glumarkoj en ĉi tiu ĉambro",
"Send stickers to this room as you": "Sendi glumarkojn al ĉi tiu ĉambro kiel vi",
"See when the avatar changes in your active room": "Vidi ŝanĝojn de bildo de ĉambro en via aktiva ĉambro",
"Change the avatar of your active room": "Ŝanĝi la bildon de via aktiva ĉambro",
"See when the avatar changes in this room": "Vidi ŝanĝojn de bildo de ĉambro en ĉi tiu ĉambro",
"Change the avatar of this room": "Ŝanĝi la bildon de ĉi tiu ĉambro",
"See when the name changes in your active room": "Vidi ŝanĝojn de nomo en via aktiva ĉambro",
"Change the name of your active room": "Ŝanĝi la nomon de via aktiva ĉambro",
"See when the name changes in this room": "Vidi ŝanĝojn de nomo en ĉi tiu ĉambro",
"Change the name of this room": "Ŝanĝi la nomon de ĉi tiu ĉambro",
"See when the topic changes in your active room": "Vidi ŝanĝojn de temo en via aktiva ĉambro",
"Change the topic of your active room": "Ŝanĝi la temon de via aktiva ĉambro",
"See when the topic changes in this room": "Vidi ŝanĝojn de temo en ĉi tiu ĉambro",
"Change the topic of this room": "Ŝanĝi la temon de ĉi tiu ĉambro",
"Change which room you're viewing": "Ŝanĝi la vidatan ĉambron",
"Send stickers into your active room": "Sendi glumarkojn al via aktiva ĉambro",
"Send stickers into this room": "Sendi glumarkojn al ĉi tiu ĉambro",
"Takes the call in the current room off hold": "Malpaŭzigas la vokon en la nuna ĉambro",
"Places the call in the current room on hold": "Paŭzigas la vokon en la nuna ĉambro",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Antaŭmetas ┬──┬ ( ゜-゜ノ) al platteksta mesaĝo",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antaŭmetas (╯°□°)╯︵ ┻━┻ al platteksta mesaĝo",
"Effects": "Efektoj",
"Zimbabwe": "Zimbabvo",
"Zambia": "Zambio",
"Yemen": "Jemeno",
"Western Sahara": "Okcidenta Saharo",
"Wallis & Futuna": "Valiso kaj Futuno",
"Vietnam": "Vjetnamujo",
"Venezuela": "Venezuelo",
"Vatican City": "Vatikano",
"Vanuatu": "Vanuatuo",
"Uruguay": "Urugvajo",
"U.S. Virgin Islands": "Usonaj Virgulininsuloj",
"Tuvalu": "Tuvalo",
"Turks & Caicos Islands": "Turkoj kaj Kajkoj",
"Turkmenistan": "Turkmenujo",
"Trinidad & Tobago": "Trinidado kaj Tobago",
"Switzerland": "Svisujo",
"Sweden": "Svedujo",
"Swaziland": "Svaziujo",
"Svalbard & Jan Mayen": "Svalbardo kaj Janmajeno",
"Suriname": "Surinamo",
"Sudan": "Sudano",
"St. Vincent & Grenadines": "Sankt-Vincento kaj Grenadinoj",
"St. Pierre & Miquelon": "Sankt-Pjero kaj Mikelono",
"St. Martin": "Sankt-Marteno",
"St. Lucia": "Sankt-Lucio",
"St. Kitts & Nevis": "Sankt-Kito kaj Neviso",
"St. Barthélemy": "Sankt-Bartolomeo",
"St. Helena": "Sankt-Heleno",
"South Sudan": "Sud-Sudano",
"South Georgia & South Sandwich Islands": "Sud-Georgio kaj Sud-Sandviĉinsuloj",
"Sint Maarten": "Sint-Marteno",
"Réunion": "Reunio",
"Pitcairn Islands": "Pitkernaj insuloj",
"Northern Mariana Islands": "Nord-Marianoj",
"Norfolk Island": "Norfolkinsulo",
"Nicaragua": "Nikaragvo",
"Mongolia": "Mongolujo",
"Monaco": "Monako",
"Moldova": "Moldavujo",
"Micronesia": "Mikronezio",
"Mexico": "Meksiko",
"Mayotte": "Majoto",
"Mauritius": "Maŭricio",
"Mauritania": "Maŭritanio",
"Martinique": "Martiniko",
"Marshall Islands": "Marŝaloj",
"Malawi": "Malavio",
"Madagascar": "Madagaskaro",
"Macedonia": "Makedonujo",
"Macau": "Makao",
"Libya": "Libio",
"Liberia": "Liberio",
"Lesotho": "Lesoto",
"Lebanon": "Libano",
"Kuwait": "Kuvajto",
"Kiribati": "Kiribato",
"Jordan": "Jordanio",
"Jersey": "Ĵerzejo",
"Heard & McDonald Islands": "Insuloj de Herdo kaj Makdonaldo",
"Guyana": "Gujano",
"Guinea-Bissau": "Gvineo-Bisaŭo",
"Guinea": "Gvineo",
"Guernsey": "Gernezejo",
"Guam": "Gvamo",
"Guadeloupe": "Gvadelupo",
"Ghana": "Ganao",
"Georgia": "Kartvelujo",
"Gambia": "Gambio",
"Gabon": "Gabono",
"French Southern Territories": "Francaj sudaj teritorioj",
"French Polynesia": "Franca Polinezio",
"Congo - Kinshasa": "Demokratia respubliko Kongo (Kinŝasa)",
"Congo - Brazzaville": "Respubliko Kongo (Brazavila)",
"British Indian Ocean Territory": "Brita hindoceana teritorio",
"Tonga": "Tongo",
"Tokelau": "Tokelao",
"Togo": "Togolando",
"Timor-Leste": "Orienta Timoro",
"Thailand": "Tajujo",
"Tanzania": "Tanzanio",
"Taiwan": "Tajvano",
"São Tomé & Príncipe": "Santomeo kaj Principeo",
"Syria": "Sirio",
"French Guiana": "Franca Gujano",
"Faroe Islands": "Ferooj",
"Falkland Islands": "Falklandoj",
"Djibouti": "Ĝibutio",
"Curaçao": "Kuracao",
"Cocos (Keeling) Islands": "Kokosinsuloj",
"Cayman Islands": "Kajmaninsuloj",
"You've reached the maximum number of simultaneous calls.": "Vi atingis la maksimuman nombron de samtempaj vokoj.",
"Too Many Calls": "Tro multaj vokoj",
"No other application is using the webcam": "Neniu alia aplikaĵo uzas la retfilmilon",
"Permission is granted to use the webcam": "Permeso uzi la retfilmilon estas donita",
"A microphone and webcam are plugged in and set up correctly": "Mikrofono kaj retfilmilo estas ĝuste konektitaj kaj agorditaj",
"Call failed because webcam or microphone could not be accessed. Check that:": "Voko malsukcesis, ĉar retfilmilo aŭ mikrofono ne povis uziĝi. Kontrolu, ke:",
"Unable to access webcam / microphone": "Ne povas aliri retfilmilon / mikrofonon",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Voko malsukcesis, ĉar mikrofono ne estis uzebla. Kontrolu, ĉu mikrofono estas ĝuste konektita kaj agordita.",
"Unable to access microphone": "Ne povas aliri mikrofonon"
}

View File

@ -62,7 +62,7 @@
"Voice call": "Häälkõne",
"Video call": "Videokõne",
"Hangup": "Katkesta kõne",
"Upload file": "Lae fail üles",
"Upload file": "Laadi fail üles",
"Send an encrypted reply…": "Saada krüptitud vastus…",
"Send a reply…": "Saada vastus…",
"Send an encrypted message…": "Saada krüptitud sõnum…",
@ -105,7 +105,7 @@
"expand": "laienda",
"Communities": "Kogukonnad",
"You cannot delete this image. (%(code)s)": "Sa ei saa seda pilti eemaldada, (%(code)s)",
"Uploaded on %(date)s by %(user)s": "Üles laetud %(date)s %(user)s poolt",
"Uploaded on %(date)s by %(user)s": "Üles laaditud %(date)s %(user)s poolt",
"Rotate Left": "Pööra vasakule",
"Rotate counter-clockwise": "Pööra vastupäeva",
"Rotate Right": "Pööra paremale",
@ -157,7 +157,7 @@
"Remove from community": "Eemalda kogukonnast",
"Remove this user from community?": "Kas eemaldan selle kasutaja kogukonnast?",
"Failed to remove user from community": "Kasutaja eemaldamine kogukonnast ebaõnnestus",
"Failed to load group members": "Grupi liikmete laadimine ebaõnnestus",
"Failed to load group members": "Grupi liikmete laadimine ei õnnestunud",
"Filter community members": "Filtreeri kogukonna liikmeid",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Kas sa soovid eemaldada %(roomName)s jututoa %(groupId)s kogukonnast?",
"Removing a room from the community will also remove it from the community page.": "Eemaldades jututoa kogukonnast eemaldad selle ka kogukonna lehelt.",
@ -172,11 +172,11 @@
"%(networkName)s rooms": "%(networkName)s jututoad",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Kas sa oled kindel et soovid eemaldada (kustutada) seda sündmust? Pane tähele, et see muutus võib tagasi pöörduda, kui muudad hiljem jututoa nime või teema nime.",
"Sign out and remove encryption keys?": "Logi välja ja eemalda krüptimisvõtmed?",
"Upload files (%(current)s of %(total)s)": "Lae failid üles (%(current)s / %(total)s)",
"Upload files": "Lae failid üles",
"Upload files (%(current)s of %(total)s)": "Laadin faile üles (%(current)s / %(total)s)",
"Upload files": "Laadi failid üles",
"These files are <b>too large</b> to upload. The file size limit is %(limit)s.": "Need failid on üleslaadimiseks <b>liiga suured</b>. Failisuuruse piir on %(limit)s.",
"Some files are <b>too large</b> to be uploaded. The file size limit is %(limit)s.": "Mõned failid on üleslaadimiseks <b>liiga suured</b>. Failisuuruse piir on %(limit)s.",
"Upload %(count)s other files|other": "Lae üles %(count)s muud faili",
"Upload %(count)s other files|other": "Laadi üles %(count)s muud faili",
"Unable to reject invite": "Ei õnnestu kutset tagasi lükata",
"Resend": "Saada uuesti",
"Resend edit": "Saada muudetud sõnum uuesti",
@ -222,7 +222,7 @@
"Remove %(name)s from the directory?": "Eemalda %(name)s kataloogist?",
"Remove from Directory": "Eemalda kataloogist",
"remove %(name)s from the directory.": "eemalda %(name)s kataloogist.",
"You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laed faile üles. Kas sa kindlasti soovid väljuda?",
"You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laadid faile üles. Kas sa kindlasti soovid väljuda?",
"Failed to set direct chat tag": "Otsevestluse sildi lisamine ei õnnestunud",
"Failed to remove tag %(tagName)s from room": "Sildi %(tagName)s eemaldamine jututoast ebaõnnestus",
"Calls": "Kõned",
@ -322,7 +322,7 @@
"Attachment": "Manus",
"Error decrypting attachment": "Viga manuse dekrüptimisel",
"Decrypt %(text)s": "Dekrüpti %(text)s",
"Download %(text)s": "Lae alla %(text)s",
"Download %(text)s": "Laadi alla %(text)s",
"Invalid file%(extra)s": "Vigane fail %(extra)s",
"Error decrypting image": "Viga pildi dekrüptimisel",
"Show image": "Näita pilti",
@ -416,7 +416,7 @@
"System Alerts": "Süsteemi teated",
"This room": "See jututuba",
"Joining room …": "Liitun jututoaga …",
"Loading …": "Laen …",
"Loading …": "Laadin …",
"e.g. %(exampleValue)s": "näiteks %(exampleValue)s",
"Could not find user in room": "Jututoast ei leidnud kasutajat",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Näita ajatempleid 12-tunnises vormingus (näiteks 2:30pl)",
@ -468,7 +468,7 @@
"Search…": "Otsi…",
"Cancel search": "Tühista otsing",
"Search failed": "Otsing ebaõnnestus",
"Server may be unavailable, overloaded, or search timed out :(": "Server kas pole leitav, on üle koormatud või otsing aegus :(",
"Server may be unavailable, overloaded, or search timed out :(": "Server kas pole leitav, on ülekoormatud või otsing aegus :(",
"No more results": "Rohkem otsingutulemusi pole",
"%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "Otsingus kasutamiseks %(brand)s puhverdab turvaliselt kohalikku arvutisse krüptitud sõnumeid:",
"%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s'il puudub luba sulle teavituste kuvamiseks - palun kontrolli oma brauseri seadistusi",
@ -584,10 +584,10 @@
"You have verified this user. This user has verified all of their sessions.": "Sa oled selle kasutaja verifitseerinud. See kasutaja on verifitseerinud kõik nende sessioonid.",
"Someone is using an unknown session": "Keegi kasutab tundmatut sessiooni",
"This event could not be displayed": "Seda sündmust ei õnnestunud kuvada",
"Downloading update...": "Laen alla uuendust...",
"Download this file": "Lae see fail alla",
"Downloading update...": "Laadin alla uuendust...",
"Download this file": "Laadi see fail alla",
"You can now close this window or <a>log in</a> to your new account.": "Sa võid nüüd sulgeda selle akna või <a>logida sisse</a> oma uuele kontole.",
"Download": "Lae alla",
"Download": "Laadi alla",
"Your recovery key is in your <b>Downloads</b> folder.": "Sinu taastevõti on sinu <b>Allalaadimised</b> kasutas.",
"Disable": "Lülita välja",
"Not currently indexing messages for any room.": "Mitte ainsamagi jututoa sõnumeid hetkel ei indekseerita.",
@ -619,7 +619,7 @@
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s muutis jututoa vana nime %(oldRoomName)s uueks nimeks %(newRoomName)s.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s muutis jututoa nimeks %(roomName)s.",
"Show info about bridges in room settings": "Näita jututoa seadistustes teavet sõnumisildade kohta",
"Upload": "Lae üles",
"Upload": "Laadi üles",
"Save": "Salvesta",
"General": "Üldist",
"Notifications": "Teavitused",
@ -701,7 +701,7 @@
"Show display name changes": "Näita kuvatava nime muutusi",
"Match system theme": "Kasuta süsteemset teemat",
"Messages containing my display name": "Sõnumid, mis sisaldavad minu kuvatavat nime",
"Failed to upload profile picture!": "Profiilipildi üleslaadimine ebaõnnestus!",
"Failed to upload profile picture!": "Profiilipildi üleslaadimine ei õnnestunud!",
"No display name": "Kuvatav nimi puudub",
"New passwords don't match": "Uued salasõnad ei klapi",
"Passwords can't be empty": "Salasõna ei saa olla tühi",
@ -920,9 +920,9 @@
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Üritasin laadida teatud hetke selle jututoa ajajoonelt, kuid sul ei ole õigusi selle sõnumi nägemiseks.",
"Failed to load timeline position": "Asukoha laadimine ajajoonel ei õnnestunud",
"Guest": "Külaline",
"Uploading %(filename)s and %(count)s others|other": "Laen üles %(filename)s ning %(count)s muud faili",
"Uploading %(filename)s and %(count)s others|zero": "Laen üles %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Laen üles %(filename)s ning veel %(count)s faili",
"Uploading %(filename)s and %(count)s others|other": "Laadin üles %(filename)s ning %(count)s muud faili",
"Uploading %(filename)s and %(count)s others|zero": "Laadin üles %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Laadin üles %(filename)s ning veel %(count)s faili",
"Verify this login": "Verifitseeri see sisselogimissessioon",
"Session verified": "Sessioon on verifitseeritud",
"Failed to send email": "E-kirja saatmine ebaõnnestus",
@ -974,7 +974,7 @@
"You have no visible notifications": "Sul ei ole nähtavaid teavitusi",
"%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s'il ei õnnestunud koduserverist laadida toetatud protokollide loendit. Toetamaks kolmandate osapoolte võrke võib koduserver olla liiga vana.",
"%(brand)s failed to get the public room list.": "%(brand)s'il ei õnnestunud laadida avalike jututubade loendit.",
"The homeserver may be unavailable or overloaded.": "Koduserver pole kas saadaval või on üle koormatud.",
"The homeserver may be unavailable or overloaded.": "Koduserver pole kas saadaval või on ülekoormatud.",
"Room not found": "Jututuba ei leidunud",
"Preview": "Eelvaade",
"View": "Näita",
@ -1011,7 +1011,7 @@
"Everyone": "Kes iganes soovib",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Sinu kogukonnal on puudu pikk kirjeldus, mis pole muud, kui lihtne HTML-leht, mida kuvatakse liikmetele.<br />Klõpsi siia ja loo selline leht!",
"Long Description (HTML)": "Pikk kirjeldus (HTML)",
"Upload avatar": "Lae üles profiilipilt ehk avatar",
"Upload avatar": "Laadi üles profiilipilt ehk avatar",
"Description": "Kirjeldus",
"Community %(groupId)s not found": "%(groupId)s kogukonda ei leidunud",
"This homeserver does not support communities": "See koduserver ei toeta kogukondade funktsionaalsust",
@ -1030,7 +1030,7 @@
"Click here to fix": "Parandamiseks klõpsi siia",
"Server error": "Serveri viga",
"Command error": "Käsu viga",
"Server unavailable, overloaded, or something else went wrong.": "Kas server pole saadaval, on üle koormatud või midagi muud läks viltu.",
"Server unavailable, overloaded, or something else went wrong.": "Server pole kas saadaval, on ülekoormatud või midagi muud läks viltu.",
"Unknown Command": "Tundmatu käsk",
"Unrecognised command: %(commandText)s": "Tundmatu käsk: %(commandText)s",
"Send as message": "Saada sõnumina",
@ -1054,7 +1054,7 @@
"Rejecting invite …": "Hülgan kutset …",
"Join the conversation with an account": "Liitu vestlusega kasutades oma kontot",
"Sign Up": "Registreeru",
"Loading room preview": "Laen jututoa eelvaadet",
"Loading room preview": "Laadin jututoa eelvaadet",
"You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s müksas sind välja jututoast %(roomName)s",
"Reason: %(reason)s": "Põhjus: %(reason)s",
"Forget this room": "Unusta see jututuba",
@ -1177,13 +1177,13 @@
"Recently Direct Messaged": "Viimased otsesõnumite saajad",
"Invite someone using their name, username (like <userId/>), email address or <a>share this room</a>.": "Kutsu kedagi tema nime, kasutajanime (nagu <userId/>), e-posti aadressi alusel või <a>jaga seda jututuba</a>.",
"Upload completed": "Üleslaadimine valmis",
"%(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 kasutab varasemaga võrreldes 3-5 korda vähem mälu, sest laeb teavet kasutajate kohta vaid siis, kui vaja. Palun oota hetke, kuni sünkroniseerime andmeid serveriga!",
"%(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 kasutab varasemaga võrreldes 3-5 korda vähem mälu, sest laadib teavet kasutajate kohta vaid siis, kui vaja. Palun oota hetke, kuni sünkroniseerime andmeid serveriga!",
"Updating %(brand)s": "Uuendan rakendust %(brand)s",
"I don't want my encrypted messages": "Ma ei soovi oma krüptitud sõnumeid",
"Manually export keys": "Ekspordi võtmed käsitsi",
"You'll lose access to your encrypted messages": "Sa kaotad ligipääsu oma krüptitud sõnumitele",
"Are you sure you want to sign out?": "Kas sa oled kindel, et soovid välja logida?",
"Upload %(count)s other files|one": "Lae üles %(count)s muu fail",
"Upload %(count)s other files|one": "Laadi üles %(count)s muu fail",
"Cancel All": "Tühista kõik",
"Upload Error": "Üleslaadimise viga",
"Verify other session": "Verifitseeri teine sessioon",
@ -1275,7 +1275,7 @@
"Your password has been reset.": "Sinu salasõna on muudetud.",
"Dismiss read marker and jump to bottom": "Ära arvesta loetud sõnumite järjehoidjat ning mine kõige lõppu",
"Jump to oldest unread message": "Mine vanima lugemata sõnumi juurde",
"Upload a file": "Lae fail üles",
"Upload a file": "Laadi fail üles",
"Read Marker lifetime (ms)": "Lugemise markeri iga (ms)",
"Unignore": "Lõpeta eiramine",
"<not supported>": "<ei ole toetatud>",
@ -1289,7 +1289,7 @@
"Key backup": "Võtmete varundus",
"Cross-signing": "Risttunnustamine",
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members to the new version of the room.</i> We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "<b>Hoiatus</b>: Jututoa versiooni uuendamine <i>ei koli jututoa liikmeid automaatselt uude jututoa olekusse.</i> Vanas jututoa versioonis saab olema viide uuele versioonile ning kõik liikmed peavad seda viidet klõpsama.",
"Uploaded sound": "Üleslaetud heli",
"Uploaded sound": "Üleslaaditud heli",
"Sounds": "Helid",
"Notification sound": "Teavitusheli",
"Reset": "Taasta algolek",
@ -1326,7 +1326,7 @@
"The file '%(fileName)s' failed to upload.": "Faili '%(fileName)s' üleslaadimine ei õnnestunud.",
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Faili '%(fileName)s' suurus ületab serveris seadistatud üleslaadimise piiri",
"Upload Failed": "Üleslaadimine ei õnnestunud",
"Server may be unavailable, overloaded, or you hit a bug.": "Server kas pole võrgus või on üle koormatud, aga võib-olla oled komistanud süsteemivea otsa.",
"Server may be unavailable, overloaded, or you hit a bug.": "Server kas pole võrgus või on ülekoormatud, aga võib-olla oled hoopis komistanud süsteemivea otsa.",
"The server does not support the room version specified.": "See server ei toeta antud jututoa versiooni.",
"Failure to create room": "Jututoa loomine ei õnnestunud",
"If you cancel now, you won't complete verifying the other user.": "Kui sa katkestad nüüd, siis sul jääb teise kasutaja verifitseerimine lõpetamata.",
@ -1370,7 +1370,7 @@
"Ensure you have a stable internet connection, or get in touch with the server admin": "Palun kontrolli, kas sul on toimiv internetiühendus ning kui on, siis küsi abi koduserveri haldajalt",
"Your %(brand)s is misconfigured": "Sinu %(brand)s'i seadistused on paigast ära",
"Your homeserver does not support session management.": "Sinu koduserver ei toeta sessioonide haldust.",
"Unable to load session list": "Sessioonide laadimine ei õnnestunud",
"Unable to load session list": "Sessioonide loendi laadimine ei õnnestunud",
"Identity server URL does not appear to be a valid identity server": "Isikutuvastusserveri aadress ei tundu viitama kehtivale isikutuvastusserverile",
"Looks good!": "Tundub õige!",
"Use Recovery Key or Passphrase": "Kasuta taastevõtit või paroolifraasi",
@ -1579,8 +1579,8 @@
"You can now return to your account after signing out, and sign in on other devices.": "Nüüd sa saad peale väljalogimist pöörduda tagasi oma konto juurde või logida sisse muudest seadmetest.",
"Remember, you can always set an email address in user settings if you change your mind.": "Jäta meelde, et sa saad alati hiljem määrata kasutajaseadetest oma e-posti aadressi.",
"Use bots, bridges, widgets and sticker packs": "Kasuta roboteid, sõnumisildu, vidinaid või kleepsupakke",
"Upload all": "Lae kõik üles",
"This file is <b>too large</b> to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "See fail on üleslaadimiseks <b>liiga suur</b>. Üleslaetavate failide mahupiir on %(limit)s, kuid selle faili suurus on %(sizeOfThisFile)s.",
"Upload all": "Laadi kõik üles",
"This file is <b>too large</b> to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "See fail on üleslaadimiseks <b>liiga suur</b>. Üleslaaditavate failide mahupiir on %(limit)s, kuid selle faili suurus on %(sizeOfThisFile)s.",
"Appearance": "Välimus",
"Enter recovery passphrase": "Sisesta taastamise paroolifraas",
"For security, this session has been signed out. Please sign in again.": "Turvalisusega seotud põhjustel on see sessioon välja logitud. Palun logi uuesti sisse.",
@ -1751,7 +1751,7 @@
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s lahkusid ja liitusid uuesti",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s lahkus ja liitus uuesti %(count)s korda",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s lahkus ja liitus uuesti",
"To use it, just wait for autocomplete results to load and tab through them.": "Selle kasutamiseks oota, kuni automaatne sõnalõpetus laeb kõik valikud ja sa saad nad läbi lapata.",
"To use it, just wait for autocomplete results to load and tab through them.": "Selle kasutamiseks oota, kuni automaatne sõnalõpetus laadib kõik valikud ja sa saad nad läbi lapata.",
"Bans user with given id": "Keela ligipääs antud tunnusega kasutajale",
"Unbans user with given ID": "Taasta ligipääs antud tunnusega kasutajale",
"Ignores a user, hiding their messages from you": "Eirab kasutajat peites kõik tema sõnumid sinu eest",
@ -1806,7 +1806,7 @@
"This bridge is managed by <user />.": "Seda võrgusilda haldab <user />.",
"Workspace: %(networkName)s": "Tööruum: %(networkName)s",
"Channel: %(channelName)s": "Kanal: %(channelName)s",
"Upload new:": "Lae üles uus:",
"Upload new:": "Laadi üles uus:",
"Export E2E room keys": "Ekspordi jututubade läbiva krüptimise võtmed",
"Your homeserver does not support cross-signing.": "Sinu koduserver ei toeta risttunnustamist.",
"Cross-signing and secret storage are enabled.": "Risttunnustamine ja turvahoidla on kasutusel.",
@ -1843,7 +1843,7 @@
"Legal": "Juriidiline teave",
"Credits": "Tänuavaldused",
"Bug reporting": "Vigadest teatamine",
"Clear cache and reload": "Tühjenda puhver ja lae uuesti",
"Clear cache and reload": "Tühjenda puhver ja laadi uuesti",
"FAQ": "Korduma kippuvad küsimused",
"Versions": "Versioonid",
"%(brand)s version:": "%(brand)s'i versioon:",
@ -1905,7 +1905,7 @@
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (õigused %(powerLevelNumber)s)",
"Emoji picker": "Emoji'de valija",
"No pinned messages.": "Klammerdatud sõnumeid ei ole.",
"Loading...": "Laen...",
"Loading...": "Laadin...",
"Pinned Messages": "Klammerdatud sõnumid",
"Unpin Message": "Eemalda sõnumi klammerdus",
"No recently visited rooms": "Hiljuti külastatud jututubasid ei leidu",
@ -2414,13 +2414,13 @@
"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",
"Uploading logs": "Laadin logisid üles",
"Downloading logs": "Laadin logisid alla",
"Can't see what youre 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",
"Download logs": "Laadi 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.",
@ -2972,5 +2972,24 @@
"You held the call <a>Resume</a>": "Sa panid kõne ootele. <a>Jätka kõnet</a>",
"You've reached the maximum number of simultaneous calls.": "Oled jõudnud suurima lubatud samaaegsete kõnede arvuni.",
"%(name)s paused": "%(name)s peatas ajutiselt kõne",
"Too Many Calls": "Liiga palju kõnesid"
"Too Many Calls": "Liiga palju kõnesid",
"sends fireworks": "saadab ilutulestiku",
"Sends the given message with fireworks": "Lisab sellele sõnumile ilutulestiku",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Lisab vormindamata sõnumi ette ┬──┬ ( ゜-゜ノ)",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisab vormindamata sõnumi ette (╯°□°)╯︵ ┻━┻",
"You held the call <a>Switch</a>": "Sa panid kõne ootele <a>Lülita tagasi</a>",
"%(name)s on hold": "%(name)s on ootel",
"sends snowfall": "saadab lumesaju",
"Sends the given message with snowfall": "Saadab antud sõnumi koos lumesajuga",
"You have no visible notifications.": "Sul pole nähtavaid teavitusi.",
"Transfer": "Suuna kõne edasi",
"Failed to transfer call": "Kõne edasisuunamine ei õnnestunud",
"A call can only be transferred to a single user.": "Kõnet on võimalik edasi suunata vaid ühele kasutajale.",
"There was an error finding this widget.": "Selle vidina leidmisel tekkis viga.",
"Active Widgets": "Kasutusel vidinad",
"Open dial pad": "Ava numbriklahvistik",
"Start a Conversation": "Alusta vestlust",
"Dial pad": "Numbriklahvistik",
"There was an error looking up the phone number": "Telefoninumbri otsimisel tekkis viga",
"Unable to look up phone number": "Telefoninumbrit ei õnnestu leida"
}

View File

@ -76,7 +76,7 @@
"Custom": "Mukautettu",
"Custom level": "Mukautettu taso",
"/ddg is not a command": "/ddg ei ole komento",
"Deactivate Account": "Deaktivoi tili",
"Deactivate Account": "Poista tili pysyvästi",
"Decline": "Hylkää",
"Default": "Oletus",
"Disinvite": "Peru kutsu",
@ -391,7 +391,7 @@
"You are no longer ignoring %(userId)s": "Huomioit jälleen käyttäjän %(userId)s",
"%(senderName)s removed their profile picture.": "%(senderName)s poisti profiilikuvansa.",
"%(senderName)s set a profile picture.": "%(senderName)s asetti profiilikuvan.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevan huonehistorian näkyväksi kaikille huoneen jäsenille heidän kutsumisestaan alkaen.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, heidän liittymisestään alkaen.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille.",
@ -1030,7 +1030,7 @@
"Thumbs up": "Peukut ylös",
"We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Lähetimme sinulle sähköpostin osoitteesi vahvistamiseksi. Noudata sähköpostissa olevia ohjeita, ja klikkaa sen jälkeen alla olevaa painiketta.",
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Oletko varma? Et voi lukea salattuja viestejäsi, mikäli avaimesi eivät ole kunnolla varmuuskopioituna.",
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Salatut viestit turvataan kahdenkeskisellä salauksella. Vain sinä ja viestien vastaanottaja(t) omaavat avaimet näiden viestien lukemiseen.",
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Salatut viestit turvataan päästä päähän -salauksella. Vain sinä ja viestien vastaanottaja(t) omaavat avaimet näiden viestien lukemiseen.",
"Unable to load key backup status": "Avainten varmuuskopionnin tilan lukeminen epäonnistui",
"Back up your keys before signing out to avoid losing them.": "Varmuuskopioi avaimesi ennen kuin kirjaudut ulos välttääksesi avainten menetyksen.",
"Backing up %(sessionsRemaining)s keys...": "Varmuuskopioidaan %(sessionsRemaining)s avainta…",
@ -1099,7 +1099,7 @@
"An error ocurred whilst trying to remove the widget from the room": "Poistaessa sovelmaa huoneesta tapahtui virhe",
"Minimize apps": "Pienennä sovellukset",
"Popout widget": "Avaa sovelma omassa ikkunassaan",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Lisää ¯\\_(ツ)_/¯ viestin alkuun",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Lisää ¯\\_(ツ)_/¯ viestin alkuun",
"User %(userId)s is already in the room": "Käyttäjä %(userId)s on jo huoneessa",
"The user must be unbanned before they can be invited.": "Käyttäjän porttikielto täytyy poistaa ennen kutsumista.",
"<a>Upgrade</a> to your own domain": "<a>Päivitä</a> omaan verkkotunnukseen",
@ -1135,8 +1135,8 @@
"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>": "Tämä tekee tilistäsi lopullisesti käyttökelvottoman. Et voi kirjautua sisään, eikä kukaan voi rekisteröidä samaa käyttäjätunnusta. Tilisi poistuu kaikista huoneista, joihin se on liittynyt, ja tilisi tiedot poistetaan identiteettipalvelimeltasi. <b>Tämä toimenpidettä ei voi kumota.</b>",
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Tilisi poistaminen käytöstä <b>ei oletuksena saa meitä unohtamaan lähettämiäsi viestejä.</b> Jos haluaisit meidän unohtavan viestisi, rastita alla oleva ruutu.",
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Viestien näkyvyys Matrixissa on samantapainen kuin sähköpostissa. Vaikka se, että unohdamme viestisi, tarkoittaa, ettei viestejäsi jaeta enää uusille tai rekisteröitymättömille käyttäjille, käyttäjät, jotka ovat jo saaneet viestisi pystyvät lukemaan jatkossakin omaa kopiotaan viesteistäsi.",
"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)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tilini poistetaan käytöstä (<b>Varoitus:</b> tämä saa tulevat käyttäjät näkemään epätäydellisen version keskusteluista)",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi osapuolten välistä salausta.",
"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)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tilini poistetaan (<b>Varoitus:</b> tämä saa tulevat käyttäjät näkemään epätäydellisen version keskusteluista)",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi päästä päähän -salausta.",
"Waiting for partner to confirm...": "Odotetaan, että toinen osapuoli varmistaa...",
"Incoming Verification Request": "Saapuva varmennuspyyntö",
"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.": "Olet aikaisemmin käytttänyt %(brand)sia laitteella %(host)s, jossa oli jäsenten laiska lataus käytössä. Tässä versiossa laiska lataus on pois käytöstä. Koska paikallinen välimuisti ei ole yhteensopiva näiden kahden asetuksen välillä, %(brand)sin täytyy synkronoida tilisi tiedot uudelleen.",
@ -1232,7 +1232,7 @@
"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.": "Sovelma osoitteessa %(widgetUrl)s haluaisi todentaa henkilöllisyytesi. Jos sallit tämän, sovelma pystyy todentamaan käyttäjätunnuksesi, muttei voi toimia nimissäsi.",
"Remember my selection for this widget": "Muista valintani tälle sovelmalle",
"Deny": "Kiellä",
"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.": "Tunnistimme dataa, joka on lähtöisin vanhasta %(brand)sin versiosta. Tämä aiheuttaa toimintahäiriöitä osapuolten välisessä salauksessa vanhassa versiossa. Viestejä, jotka on salattu osapuolten välisellä salauksella vanhalla versiolla, ei välttämättä voida purkaa tällä versiolla. Tämä voi myös aiheuttaa epäonnistumisia viestien välityksessä tämän version kanssa. Jos kohtaat ongelmia, kirjaudu ulos ja takaisin sisään. Säilyttääksesi viestihistoriasi, vie salausavaimesi ja tuo ne uudelleen.",
"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.": "Tunnistimme dataa, joka on lähtöisin vanhasta %(brand)sin versiosta. Tämä aiheuttaa toimintahäiriöitä päästä päähän -salauksessa vanhassa versiossa. Viestejä, jotka on salattu päästä päähän -salauksella vanhalla versiolla, ei välttämättä voida purkaa tällä versiolla. Tämä voi myös aiheuttaa epäonnistumisia viestien välityksessä tämän version kanssa. Jos kohtaat ongelmia, kirjaudu ulos ja takaisin sisään. Säilyttääksesi viestihistoriasi, vie salausavaimesi ja tuo ne uudelleen.",
"%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s epäonnistui protokollalistan hakemisessa kotipalvelimelta. Kotipalvelin saattaa olla liian vanha tukeakseen kolmannen osapuolen verkkoja.",
"%(brand)s failed to get the public room list.": "%(brand)s ei onnistunut hakemaan julkista huoneluetteloa.",
"The homeserver may be unavailable or overloaded.": "Kotipalvelin saattaa olla saavuttamattomissa tai ylikuormitettuna.",
@ -1250,7 +1250,7 @@
"If you don't want to set this up now, you can later in Settings.": "Jos et halua ottaa tätä käyttöön nyt, voit tehdä sen myöhemmin asetuksissa.",
"Set up": "Ota käyttöön",
"New Recovery Method": "Uusi palautustapa",
"A new recovery passphrase and key for Secure Messages have been detected.": "Uusi palautuksen salalause ja avain salatuille viesteille on löydetty.",
"A new recovery passphrase and key for Secure Messages have been detected.": "Uusi palautuksen salasana ja avain salatuille viesteille on löydetty.",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jos et ottanut käyttöön uutta palautustapaa, hyökkääjä saattaa yrittää käyttää tiliäsi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi.",
"Set up Secure Messages": "Ota käyttöön salatut viestit",
"Recovery Method Removed": "Palautustapa poistettu",
@ -1431,11 +1431,11 @@
"Terms of service not accepted or the identity server is invalid.": "Käyttöehtoja ei ole hyväksytty tai identiteettipalvelin ei ole kelvollinen.",
"Enter a new identity server": "Syötä uusi identiteettipalvelin",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Hyväksy identiteettipalvelimen (%(serverName)s) käyttöehdot (Terms of Service), jotta sinut voi löytää sähköpostiosoitteen tai puhelinnumeron perusteella.",
"Deactivate account": "Deaktivoi tili",
"Deactivate account": "Poista tili pysyvästi",
"Remove %(email)s?": "Poista %(email)s?",
"Remove %(phone)s?": "Poista %(phone)s?",
"Command Help": "Komento-ohje",
"This account has been deactivated.": "Tämä tili on deaktivoitu.",
"This account has been deactivated.": "Tämä tili on poistettu.",
"Sends a message as plain text, without interpreting it as markdown": "Lähettää viestin pelkkänä tekstinä, tulkitsematta sitä markdownina",
"You do not have the required permissions to use this command.": "Sinulla ei ole vaadittavia oikeuksia tämän komennon käyttämiseksi.",
"Use an identity server": "Käytä identiteettipalvelinta",
@ -1467,7 +1467,7 @@
"Strikethrough": "Yliviivattu",
"Code block": "Ohjelmakoodia",
"This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Kutsu huoneeseen %(roomName)s lähetettiin osoitteeseen %(email)s, joka ei ole yhteydessä tiliisi",
"Filter": "Suodata",
"Filter": "Haku",
"Filter rooms…": "Suodata huoneita…",
"Changes the avatar of the current room": "Vaihtaa nykyisen huoneen kuvan",
"Error changing power level requirement": "Virhe muutettaessa oikeustasovaatimusta",
@ -1492,9 +1492,9 @@
"Explore rooms": "Selaa huoneita",
"ID": "Tunnus",
"Unable to revoke sharing for phone number": "Puhelinnumeron jakamista ei voi kumota",
"Deactivate user?": "Deaktivoi käyttäjä?",
"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?": "Käyttäjän deaktivoiminen kirjaa hänet ulos ja estää häntä kirjautumasta takaisin sisään. Lisäksi hän poistuu kaikista huoneista, joissa hän on. Tätä toimintoa ei voi kumota. Oletko varma, että haluat deaktivoida tämän käyttäjän?",
"Deactivate user": "Deaktivoi käyttäjä",
"Deactivate user?": "Poista käyttäjä pysyvästi?",
"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?": "Käyttäjän poistaminen kirjaa hänet ulos ja estää häntä kirjautumasta takaisin sisään. Lisäksi hän poistuu kaikista huoneista, joissa hän on. Tätä toimintoa ei voi kumota. Oletko varma, että haluat pysyvästi poistaa tämän käyttäjän?",
"Deactivate user": "Poista käyttäjä pysyvästi",
"Link this email with your account in Settings to receive invites directly in %(brand)s.": "Linkitä tämä sähköposti tilisi kanssa asetuksissa, jotta voit saada kutsuja suoraan %(brand)sissa.",
"e.g. my-room": "esim. oma-huone",
"Please enter a name for the room": "Syötä huoneelle nimi",
@ -1541,7 +1541,7 @@
"Jump to first invite.": "Siirry ensimmäiseen kutsuun.",
"DuckDuckGo Results": "DuckDuckGo-tulokset",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Tekstiviesti on lähetetty numeroon +%(msisdn)s. Syötä siinä oleva varmistuskoodi.",
"Failed to deactivate user": "Käyttäjän deaktivointi epäonnistui",
"Failed to deactivate user": "Käyttäjän poistaminen epäonnistui",
"Hide advanced": "Piilota edistyneet",
"Show advanced": "Näytä edistyneet",
"Document": "Asiakirja",
@ -1632,9 +1632,9 @@
"Failed to connect to integration manager": "Yhdistäminen integraatioiden lähteeseen epäonnistui",
"Trusted": "Luotettu",
"Not trusted": "Ei-luotettu",
"This client does not support end-to-end encryption.": "Tämä asiakasohjelma ei tue osapuolten välistä salausta.",
"Messages in this room are not end-to-end encrypted.": "Tämän huoneen viestit eivät ole salattuja.",
"Messages in this room are end-to-end encrypted.": "Tämän huoneen viestit ovat salattuja.",
"This client does not support end-to-end encryption.": "Tämä asiakasohjelma ei tue päästä päähän -salausta.",
"Messages in this room are not end-to-end encrypted.": "Tämän huoneen viestit eivät ole päästä päähän -salattuja.",
"Messages in this room are end-to-end encrypted.": "Tämän huoneen viestit ovat päästä päähän -salattuja.",
"Verify": "Varmenna",
"You have ignored this user, so their message is hidden. <a>Show anyways.</a>": "Olet jättänyt tämän käyttäjän huomiotta, joten hänen viestit ovat piilotettu. <a>Näytä käyttäjän viestit.</a>",
"You verified %(name)s": "Varmensit käyttäjän %(name)s",
@ -1739,7 +1739,7 @@
"Lock": "Lukko",
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Käytätkö %(brand)sia laitteella, jossa kosketus on ensisijainen syöttömekanismi",
"Whether you're using %(brand)s as an installed Progressive Web App": "Käytätkö %(brand)sia asennettuna PWA:na (Progressive Web App)",
"Cancel entering passphrase?": "Peruuta salalauseen syöttäminen?",
"Cancel entering passphrase?": "Peruuta salasanan syöttäminen?",
"Encryption upgrade available": "Salauksen päivitys saatavilla",
"a few seconds ago": "muutama sekunti sitten",
"about a minute ago": "noin minuutti sitten",
@ -1808,7 +1808,7 @@
"Suggestions": "Ehdotukset",
"Your account is not secure": "Tilisi ei ole turvallinen",
"Your password": "Salasanasi",
"Incorrect recovery passphrase": "Virheellinen palautuksen salalause",
"Incorrect recovery passphrase": "Virheellinen palautussalasana",
"Enter recovery passphrase": "Syötä palautuksen salalause",
"Enter recovery key": "Syötä palautusavain",
"Confirm your identity by entering your account password below.": "Vahvista henkilöllisyytesi syöttämällä tilisi salasana alle.",
@ -1829,7 +1829,7 @@
"Use your account or create a new one to continue.": "Käytä tiliäsi tai luo uusi jatkaaksesi.",
"Create Account": "Luo tili",
"Session already verified!": "Istunto on jo vahvistettu!",
"WARNING: Session already verified, but keys do NOT MATCH!": "VAROITUS: Istunto on jo vahvistettu, mutta avaimet EIVÄT VASTAA!",
"WARNING: Session already verified, but keys do NOT MATCH!": "VAROITUS: Istunto on jo vahvistettu, mutta avaimet EIVÄT TÄSMÄÄ!",
"Not Trusted": "Ei luotettu",
"Ask this user to verify their session, or manually verify it below.": "Pyydä tätä käyttäjää vahvistamaan istuntonsa, tai vahvista se manuaalisesti alla.",
"a few seconds from now": "muutama sekunti sitten",
@ -1846,13 +1846,13 @@
"If you cancel now, you won't complete verifying your other session.": "Jos peruutat nyt, toista istuntoasi ei varmenneta.",
"Setting up keys": "Otetaan avaimet käyttöön",
"Verifies a user, session, and pubkey tuple": "Varmentaa käyttäjän, istunnon ja julkiset avaimet",
"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!": "VAROITUS: AVAIMEN VARMENTAMINEN EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s istunnon allekirjoitusavain on ”%(fprint)s”, mikä ei täsmää annettuun avaimeen ”%(fingerprint)s”. Tämä voi tarkoittaa, että yhteyksiänne peukaloidaan!",
"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!": "VAROITUS: AVAIMEN VARMENTAMINEN EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s istunnon allekirjoitusavain on ”%(fprint)s”, mikä ei täsmää annettuun avaimeen ”%(fingerprint)s”. Tämä voi tarkoittaa, että viestintäänne siepataan!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Antamasi allekirjoitusavain täsmää käyttäjältä %(userId)s saamaasi istunnon %(deviceId)s allekirjoitusavaimeen. Istunto on varmennettu.",
"Displays information about a user": "Näyttää tietoa käyttäjästä",
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s vaihtoi huoneen nimen %(oldRoomName)s nimeksi %(newRoomName)s.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s lisäsi vaihtoehtoisia osoitteita %(addresses)s tälle huoneelle.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s lisäsi vaihtoehtoiset osoitteet %(addresses)s tälle huoneelle.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s lisäsi vaihtoehtoisen osoitteen %(addresses)s tälle huoneelle.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s poisti vaihtoehtoisia osoitteita %(addresses)s tältä huoneelta.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s poisti vaihtoehtoiset osoitteet %(addresses)s tältä huoneelta.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s poisti vaihtoehtoisen osoitteitteen %(addresses)s tältä huoneelta.",
"%(senderName)s changed the alternative addresses for this room.": "%(senderName)s muutti tämän huoneen vaihtoehtoisia osoitteita.",
"%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s muutti tämän huoneen pää- sekä vaihtoehtoisia osoitteita.",
@ -1956,7 +1956,7 @@
"Liberate your communication": "Vapauta viestintäsi",
"Send a Direct Message": "Lähetä yksityisviesti",
"Explore Public Rooms": "Selaa julkisia huoneita",
"Create a Group Chat": "Luo ryhmä",
"Create a Group Chat": "Luo huone",
"Super": "Super",
"Cancel replying to a message": "Peruuta viestiin vastaaminen",
"Jump to room search": "Siirry huonehakuun",
@ -2018,7 +2018,7 @@
"Waiting for your other session to verify…": "odotetaan toista istuntoasi varmennukseen…",
"Verify all your sessions to ensure your account & messages are safe": "Varmenna kaikki istuntosi varmistaaksesi, että tunnuksesi ja viestisi ovat turvassa",
"Verify the new login accessing your account: %(name)s": "Varmenna uusi tunnuksellesi sisäänkirjautunut taho: %(name)s",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Tällä hetkellä salasanan vaihtaminen nollaa kaikki osapuolten välisen salauksen avaimet kaikissa istunnoissa, tehden salatusta keskusteluhistoriasta lukukelvotonta, ellet ensin vie kaikkia huoneavaimiasi ja tuo niitä salasanan vaihtamisen jäkeen takaisin. Tulevaisuudessa tämä tulee toimimaan paremmin.",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Tällä hetkellä salasanan vaihtaminen nollaa kaikki päästä päähän -salauksen avaimet kaikissa istunnoissa, tehden salatusta keskusteluhistoriasta lukukelvotonta, ellet ensin vie kaikkia huoneavaimiasi ja tuo niitä salasanan vaihtamisen jäkeen takaisin. Tulevaisuudessa tämä tulee toimimaan paremmin.",
"Your homeserver does not support cross-signing.": "Kotipalvelimesi ei tue ristiinvarmennusta.",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Tunnuksellasi on ristiinvarmennuksen identiteetti salaisessa tallennustilassa, mutta tämä istunto ei vielä luota siihen.",
"Reset cross-signing and secret storage": "Nollaa ristivarmennus ja salavarasto",
@ -2046,7 +2046,7 @@
"This user has not verified all of their sessions.": "Tämä käyttäjä ei ole varmentanut kaikkia istuntojaan.",
"You have not verified this user.": "Et ole varmentanut tätä käyttäjää.",
"You have verified this user. This user has verified all of their sessions.": "Olet varmentanut tämän käyttäjän. Tämä käyttäjä on varmentanut kaikki istuntonsa.",
"This room is end-to-end encrypted": "Tämä huone käyttää osapuolten välistä salausta",
"This room is end-to-end encrypted": "Tämä huone käyttää päästä päähän -salausta",
"Everyone in this room is verified": "Kaikki tämän huoneen käyttäjät on varmennettu",
"Your key share request has been sent - please check your other sessions for key share requests.": "Avainten jakopyyntösi on lähetetty. Tarkista muut istuntosi avainten jakopyyntöjen varalta.",
"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.": "Avainten jakopyynnöt lähetetään muille istunnoillesi automaattisesti. Jos hylkäsit tai jätit huomiotta avainten jakopyynnön toisessa istunnossasi, klikkaa tästä pyytääksesi avaimia uudelleen.",
@ -2096,11 +2096,11 @@
"Destroy cross-signing keys?": "Tuhoa ristiinvarmennuksen avaimet?",
"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.": "Ristiinvarmennuksen avainten tuhoamista ei voi kumota. Jokainen, jonka olet varmentanut, tulee näkemään turvallisuushälytyksiä. Et todennäköisesti halua tehdä tätä, ellet ole hukannut kaikkia laitteitasi, joista pystyit ristiinvarmentamaan.",
"Clear cross-signing keys": "Tyhjennä ristiinvarmennuksen avaimet",
"Enable end-to-end encryption": "Ota osapuolten välinen salaus käyttöön",
"Enable end-to-end encryption": "Ota päästä päähän -salaus käyttöön",
"Session key": "Istunnon tunnus",
"Verification Requests": "Varmennuspyynnöt",
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Tämän käyttäjän varmentaminen merkitsee hänen istuntonsa luotetuksi, ja myös merkkaa sinun istuntosi luotetuksi hänen laitteissaan.",
"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.": "Varmenna tämä laite merkataksesi se luotetuksi. Tähän laitteeseen luottaminen antaa sinulle ja muille käyttäjille ylimääräistä mielenrauhaa, kun käytätte osapuolten välistä salausta.",
"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.": "Varmenna tämä laite merkitäksesi sen luotetuksi. Tähän laitteeseen luottaminen antaa sinulle ja muille käyttäjille lisää mielenrauhaa, kun käytätte päästä päähän -salausta.",
"Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Tämän laitteen varmentaminen merkkaa sen luotetuksi, ja sinut varmentaneet käyttäjät luottavat automaattisesti tähän laitteeseen.",
"Confirm to continue": "Haluan jatkaa",
"Click the button below to confirm your identity.": "Paina alapuolella olevaa painiketta varmistaaksesi identiteettisi.",
@ -2253,15 +2253,15 @@
"Error leaving room": "Virhe poistuessa huoneesta",
"Unexpected server error trying to leave the room": "Huoneesta poistuessa tapahtui odottamaton palvelinvirhe",
"%(senderName)s declined the call.": "%(senderName)s hylkäsi puhelun.",
"(an error occurred)": "(virhe tapahtui)",
"(an error occurred)": "(tapahtui virhe)",
"(their device couldn't start the camera / microphone)": "(hänen laitteensa ei voinut käynnistää kameraa tai mikrofonia)",
"(connection failed)": "(yhteys katkesi)",
"🎉 All servers are banned from participating! This room can no longer be used.": "Kaikki palvelimet ovat saaneet porttikiellon huoneeseen! Tätä huonetta ei voi enää käyttää.",
"Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Lisää hymiön ( ͡° ͜ʖ ͡°) viestin alkuun",
"Are you sure you want to cancel entering passphrase?": "Haluatko varmasti peruuttaa salalauseen syöttämisen?",
"Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Lisää ( ͡° ͜ʖ ͡°) viestin alkuun",
"Are you sure you want to cancel entering passphrase?": "Haluatko varmasti peruuttaa salasanan syöttämisen?",
"The call was answered on another device.": "Puheluun vastattiin toisessa laitteessa.",
"Answered Elsewhere": "Vastattu muualla",
"The call could not be established": "Puhelua ei voitu aloittaa",
"The call could not be established": "Puhelua ei voitu muodostaa",
"The other party declined the call.": "Toinen osapuoli hylkäsi puhelun.",
"Call Declined": "Puhelu hylätty",
"%(brand)s Android": "%(brand)s Android",
@ -2341,7 +2341,7 @@
"Enter phone number": "Syötä puhelinnumero",
"Now, let's help you get started": "Autetaanpa sinut alkuun",
"delete the address.": "poista osoite.",
"Filter rooms and people": "Suodata huoneita ja ihmisiä",
"Filter rooms and people": "Hae huoneita ja ihmisiä",
"Go to Home View": "Siirry kotinäkymään",
"Community and user menu": "Yhteisö- ja käyttäjävalikko",
"Decline All": "Kieltäydy kaikista",
@ -2699,12 +2699,138 @@
"Use the <a>Desktop app</a> to see all encrypted files": "Voit tarkastella kaikkia salattuja tiedostoja <a>työpöytäsovelluksella</a>",
"Use the <a>Desktop app</a> to search encrypted messages": "Käytä salattuja viestejä <a>työpöytäsovelluksella</a>",
"Ignored attempt to disable encryption": "Ohitettu yritys poistaa salaus käytöstä",
"Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Tässä olevat viestit on päästä-päähän -salattu. Vahvista %(displayName)s heidät - napauta heidän profiilikuvia.",
"Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Tämän huoneen viestit on päästä-päähän -salattu. Kun ihmisiä liittyy, voit vahvistaa heidät heidän profiilista, napauta vain heidän profiilikuvaa.",
"Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Tässä olevat viestit on päästä päähän -salattu. Vahvista %(displayName)s profiilistaan napauttamalla profiilikuvaa.",
"Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Tämän huoneen viestit on päästä päähän -salattu. Kun ihmisiä liittyy, heidät voi vahvistaa profiilistaan profiilikuvaa napauttamalla.",
"Unpin a widget to view it in this panel": "Irrota sovelma, jotta voit tarkastella sitä tässä paneelissa",
"You can only pin up to %(count)s widgets|other": "Voit kiinnittää enintään %(count)s sovelmaa",
"Favourited": "Suositut",
"Use the + to make a new room or explore existing ones below": "Luo uusi huone tai tutustu alla oleviin + -painikeella",
"%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s asetti palvelimen pääsyhallintaluetteloon tämän huoneen.",
"%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s muutti palvelimen pääsyhallintaluetteloa tälle huoneelle."
"%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s muutti palvelimen pääsyhallintaluetteloa tälle huoneelle.",
"Expand room list section": "Laajenna huoneluettelon osa",
"Collapse room list section": "Supista huoneluettelon osa",
"Use a different passphrase?": "Käytä eri salalausetta?",
"Already have an account? <a>Sign in here</a>": "Onko sinulla jo tili? <a>Kirjaudu tästä</a>",
"There was a problem communicating with the homeserver, please try again later.": "Yhteydessä kotipalvelimeen ilmeni ongelma, yritä myöhemmin uudelleen.",
"This widget would like to:": "Tämä sovelma haluaa:",
"Learn more": "Lue lisää",
"Other homeserver": "Muu kotipalvelin",
"Matrix.org is the biggest public homeserver in the world, so its a good place for many.": "Matrix.org on maailman suurin kotipalvelin, joten se on hyvä paikka monille.",
"Specify a homeserver": "Määritä kotipalvelin",
"The server has denied your request.": "Palvelin eväsi pyyntösi.",
"Just a heads up, if you don't add an email and forget your password, you could <b>permanently lose access to your account</b>.": "Huomio: jos et lisää sähköpostia ja unohdat salasanasi, saatat <b>menettää pääsyn tiliisi pysyvästi</b>.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Yksityiset huoneet ovat löydettävissä ja liityttävissä vain kutsulla. Julkiset huoneet ovat kenen tahansa tämän yhteisön jäsenen löydettävissä ja liityttävissä.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Yksityiset huoneet ovat löydettävissä ja liityttävissä vain kutsulla. Julkiset huoneet ovat kenen tahansa löydettävissä ja liityttävissä.",
"Homeserver": "Kotipalvelin",
"Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Palvelimesi ylläpitäjä on poistanut päästä päähän -salauksen oletuksena käytöstä yksityisissä huoneissa ja yksityisviesteissä.",
"%(peerName)s held the call": "%(peerName)s piti puhelua pidossa",
"Send general files as you in your active room": "Lähetä aktiiviseen huoneeseesi yleisiä tiedostoja itsenäsi",
"Send general files as you in this room": "Lähetä tähän huoneeseen yleisiä tiedostoja itsenäsi",
"Send videos as you in your active room": "Lähetä aktiiviseen huoneeseesi videoita itsenäsi",
"Send videos as you in this room": "Lähetä tähän huoneeseen videoita itsenäsi",
"Send images as you in your active room": "Lähetä aktiiviseen huoneeseesi kuvia itsenäsi",
"Send images as you in this room": "Lähetä tähän huoneeseen kuvia itsenäsi",
"Send text messages as you in your active room": "Lähetä aktiiviseen huoneeseesi tekstiviestejä itsenäsi",
"Send text messages as you in this room": "Lähetä tähän huoneeseen tekstiviestejä itsenäsi",
"Send messages as you in your active room": "Lähetä aktiiviseen huoneeseesi viestejä itsenäsi",
"Send messages as you in this room": "Lähetä tähän huoneeseen viestejä itsenäsi",
"Show message previews for reactions in DMs": "Näytä reaktioille esikatselu yksityisviesteissä",
"Show message previews for reactions in all rooms": "Näytä reaktioille esikatselu kaikissa huoneissa",
"New spinner design": "Uusi kehrääjä tyyli",
"Render LaTeX maths in messages": "Suorita LaTeX-matematiikkaa viesteissä",
"* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s",
"Downloading logs": "Ladataan lokeja",
"Uploading logs": "Lähetetään lokeja",
"Show chat effects": "Näytä keskustelutehosteet",
"Enable advanced debugging for the room list": "Ota huoneluettelon edistynyt virheenkorjaus käyttöön",
"A connection error occurred while trying to contact the server.": "Yhteysvirhe yritettäessä ottaa yhteyttä palvelimeen.",
"The <b>%(capability)s</b> capability": "<b>%(capability)s</b>-ominaisuus",
"See when the avatar changes in this room": "Katso, milloin nimi vaihtuu tässä huoneessa",
"See when the name changes in your active room": "Katso, milloin nimi muuttuu aktiivisessa huoneessa",
"If disabled, messages from encrypted rooms won't appear in search results.": "Jos ei ole käytössä, salattujen huoneiden viestejä ei näytetä hakutuloksissa.",
"Jump to start/end of the composer": "Siirry kirjoittimen alkuun/loppuun",
"Dismiss read marker and jump to bottom": "Hylkää lukumerkki ja hyppää pohjaan",
"Toggle the top left menu": "Vaihda vasemman yläkulman valikkoa",
"New? <a>Create account</a>": "Uusi? <a>Luo tili</a>",
"Continuing without email": "Jatka ilman sähköpostia",
"Invite by email": "Kutsu sähköpostilla",
"Report a bug": "Raportoi virheestä",
"Invalid Recovery Key": "Virheellinen palautusavain",
"Confirm Security Phrase": "Vahvista turvalauseke",
"Upload a file": "Lähetä tiedosto",
"Confirm encryption setup": "Vahvista salauksen asetukset",
"Verify other session": "Vahvista toinen istunto",
"Confirm account deactivation": "Vahvista tilin deaktivointi",
"Toggle right panel": "Vaihda oikea paneeli",
"Navigate composer history": "Selaa kirjoittimen historiaa",
"a key signature": "avaimen allekirjoitus",
"Homeserver feature support:": "Kotipalvelimen ominaisuuksien tuki:",
"Create key backup": "Luo avaimen varmuuskopio",
"Recovery key mismatch": "Palautusavain ei täsmää",
"%(name)s paused": "%(name)s keskeytetty",
"Invalid URL": "Virheellinen URL",
"Reason (optional)": "Syy (valinnainen)",
"Fill Screen": "Täytä näyttö",
"Send feedback": "Lähetä palautetta",
"Rate %(brand)s": "Arvioi %(brand)s",
"%(brand)s Desktop": "%(brand)s Desktop",
"%(brand)s Web": "%(brand)s Web",
"Security Phrase": "Turvalauseke",
"Security Key": "Turva-avain",
"Verify session": "Vahvista istunto",
"Hold": "Pidä",
"Resume": "Jatka",
"Comment": "Kommentti",
"Navigation": "Navigointi",
"Manage": "Hallitse",
"Remain on your screen when viewing another room, when running": "Pysy ruudulla katsellessasi huonetta, kun se on käynnissä",
"Remain on your screen while running": "Pysy ruudulla käynnissä olon ajan",
"Move autocomplete selection up/down": "Siirrä automaattisen täydennyksen valintaa ylös/alas",
"sends snowfall": "lähetä lumisadetta",
"Sends the given message with snowfall": "Lähetä viesti lumisateen kera",
"Sends the given message with fireworks": "Lähettää viestin ilotulitteiden kera",
"sends confetti": "lähetä konfettia",
"Sends the given message with confetti": "Lähettää viestin konfettien kera",
"sends fireworks": "lähetä ilotulitus",
"You held the call <a>Switch</a>": "Puhelu pidossa <a>Vaihda</a>",
"You held the call <a>Resume</a>": "Puhelu pidossa <a>Jatka</a>",
"%(name)s on hold": "%(name)s on pidossa",
"Please verify the room ID or address and try again.": "Tarkista huonetunnus ja yritä uudelleen.",
"Use this when referencing your community to others. The community ID cannot be changed.": "Käytä tätä, kun kutsut muita yhteisöösi. Yhteisötunnusta ei voi muuttaa.",
"Community ID: +<localpart />:%(domain)s": "Yhteisötunnus: +<localpart />:%(domain)s",
"Are you sure you want to deactivate your account? This is irreversible.": "Haluatko varmasti poistaa tilisi pysyvästi?",
"Data on this screen is shared with %(widgetDomain)s": "Tällä näytöllä olevia tietoja jaetaan %(widgetDomain)s:n kanssa",
"A browser extension is preventing the request.": "Selainlaajennus estää pyynnön.",
"Approve widget permissions": "Hyväksy sovelman käyttöoikeudet",
"You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Olet kirjautunut ulos kaikista istunnoista, etkä enää saa push-ilmoituksia. Ota ilmoitukset uudelleen käyttöön kirjautumalla uudelleen kullekin laitteelle.",
"That username already exists, please try another.": "Antamasi käyttäjänimi on varattu, kokeile toista.",
"Continue with %(ssoButtons)s": "Jatka %(ssoButtons)slla",
"%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Tai %(usernamePassword)s",
"Host account on": "Isännöi tiliä osoitteessa",
"Decide where your account is hosted": "Päätä, missä tiliäsi isännöidään",
"Your new session is now verified. Other users will see it as trusted.": "Uusi istuntosi on vahvistettu. Muut käyttäjät näkevät sen luotettavana.",
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Uusi istuntosi on vahvistettu. Sillä on nyt pääsy salattuihin viesteihisi, ja muut käyttäjät näkevät sen luotettavana.",
"Enter a recovery passphrase": "Syötä palautuksen salasana",
"Great! This recovery passphrase looks strong enough.": "Hienoa! Tämä palautuksen salasana näyttää riittävän vahvalta.",
"Please enter your recovery passphrase a second time to confirm.": "Vahvista antamalla palautuksen salasana uudelleen.",
"Repeat your recovery passphrase...": "Toista palautuksen salasana...",
"Enter a security phrase only you know, as its used to safeguard your data. To be secure, you shouldnt re-use your account password.": "Syötä salasana, jonka tiedät vain sinä, koska sitä käytetään tietojesi suojaamiseen. Turvallisuuden takaamiseksi älä käytä samaa salasanaa muualla.",
"Enter your recovery passphrase a second time to confirm it.": "Vahvista antamalla palautuksen salasana uudelleen.",
"Message downloading sleep time(ms)": "Viestin lataamisen odotusaika(ms)",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Lisää ┬──┬ ( ゜-゜ノ) viestin alkuun",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisää (╯°□°)╯︵ ┻━┻ viestin alkuun",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Salaisen tallenustilan avaaminen epäonnistui. Varmista, että syötit oikean palautuksen salasanan.",
"Enter a Security Phrase": "Kirjoita turvalauseke",
"Set a Security Phrase": "Aseta turvalauseke",
"Unable to query secret storage status": "Salaisen tallennustilan tilaa ei voi kysellä",
"If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Jos peruutat nyt, voit menettää salattuja viestejä ja tietoja, jos menetät pääsyn kirjautumistietoihisi.",
"You can also set up Secure Backup & manage your keys in Settings.": "Voit myös ottaa käyttöön suojatun varmuuskopioinnin ja hallita avaimia asetuksista.",
"Save your Security Key": "Tallenna turva-avain",
"This session is encrypting history using the new recovery method.": "Tämä istunto salaa historiansa käyttäen uutta palautustapaa.",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Tämä istunto on havainnut, että palauttamisen salauslause ja salattujen viestien avain on poistettu.",
"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.": "Jos teit tämän vahingossa, voit ottaa käyttöön turvalliset viestit tälle istunnolle, se salaa tämän istunnon viestihistorian uudella palautustavalla.",
"Close dialog or context menu": "Sulje valintaikkuna tai pikavalikko",
"%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s tallentaa turvallisesti salattuja viestejä välimuistiin, jotta ne näkyvät hakutuloksissa:",
"Navigate recent messages to edit": "Voit muokata viimeisimpiä viestejä",
"Clear room list filter field": "Tyhjennä huoneluettelon suodatinkenttä"
}

View File

@ -2545,5 +2545,308 @@
"You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Vous devriez l'activer si le salon n'est utilisé que pour collaborer avec des équipes internes sur votre serveur d'accueil. Ce ne peut pas être changé plus tard.",
"Your server requires encryption to be enabled in private rooms.": "Votre serveur requiert d'activer le chiffrement dans les salons privés.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui dans cette communauté.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui."
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui.",
"Start a new chat": "Commencer une nouvelle discussion",
"Add a photo so people know it's you.": "Ajoutez une photo pour que les gens savent que c'est vous",
"%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s ou %(usernamePassword)s",
"Decide where your account is hosted": "Décidez où votre compte est hébergé",
"Go to Home View": "Revenir à la page d'accueil",
"Use Ctrl + Enter to send a message": "Utilisez Ctrl + Entrée pour envoyer un message",
"%(senderName)s ended the call": "%(senderName)s a terminé l'appel",
"You ended the call": "Vous avez terminé l'appel",
"%(creator)s created this DM.": "%(creator)s a envoyé ce DM.",
"Now, let's help you get started": "Maintenant, commençons à vous initier",
"Welcome %(name)s": "Bienvenue %(name)s",
"Filter rooms and people": "Filtrer des salons et personnes",
"Got an account? <a>Sign in</a>": "Vous avez un compte? <a>Connectez-vous</a>",
"New here? <a>Create an account</a>": "Nouveau ici? <a>Créez un compte</a>",
"There was a problem communicating with the homeserver, please try again later.": "Il y a eu un problème lors de la communication avec le serveur d'accueil, veuillez réessayer ultérieurement.",
"New? <a>Create account</a>": "Nouveau? <a>Créez un compte</a>",
"That username already exists, please try another.": "Ce nom d'utilisateur existe déjà, essayez-en un autre.",
"Already have an account? <a>Sign in here</a>": "Vous avez déjà un compte? <a>Connectez-vous ici</a>",
"Algeria": "Algérie",
"Albania": "Albanie",
"Åland Islands": "Îles Åland",
"Afghanistan": "Afghanistan",
"United States": "États-Unis",
"United Kingdom": "Royaume-Uni",
"You've reached the maximum number of simultaneous calls.": "Vous avez atteint le nombre maximum d'appels en simultané.",
"No other application is using the webcam": "Aucune autre application n'est en train d'utiliser la caméra",
"A microphone and webcam are plugged in and set up correctly": "Un microphone et une caméra sont branchées et bien configurées",
"Unable to access webcam / microphone": "Impossible d'accéder à la caméra ou microphone",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "La fonction a échoué car le microphone n'a pas pu être accédé. Vérifiez qu'un microphone est branché et bien configuré.",
"Unable to access microphone": "Impossible d'accéder au microphone",
"Belgium": "Belgique",
"Belarus": "Biélorussie",
"Barbados": "Barbade",
"Bangladesh": "Bangladesh",
"Bahrain": "Bahreïn",
"Bahamas": "Les Bahamas",
"Azerbaijan": "Azerbaïdjan",
"Austria": "Autriche",
"Australia": "Australie",
"Aruba": "Aruba",
"Armenia": "Arménie",
"Argentina": "Argentine",
"Antigua & Barbuda": "Antigue-et-Barbude",
"Antarctica": "Antarctique",
"Anguilla": "Anguilla",
"Angola": "République d'Angola",
"Andorra": "Andorre",
"American Samoa": "Samoa américaines",
"Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.": "Invitez quelqu'un via leur nom, e-mail ou nom d'utilisateur (p. ex. <userId/>) ou <a>partagez ce salon</a>.",
"Start a conversation with someone using their name, email address or username (like <userId/>).": "Commencer une conversation avec quelqu'un via leur nom, e-mail ou nom d'utilisateur (comme par exemple <userId/>).",
"Too Many Calls": "Trop d'appels",
"Permission is granted to use the webcam": "Permission accordée pour l'utilisation de la webcam",
"Call failed because webcam or microphone could not be accessed. Check that:": "La fonction a échoué car la webcam ou le microphone ne pouvait pas être accédé. Vérifiez que:",
"Send stickers to this room as you": "Envoyer des stickers dans ce salon en tant que vous",
"Zambia": "Zambie",
"Yemen": "Yémen",
"Western Sahara": "Sahara occidental",
"Wallis & Futuna": "Wallis-et-Futuna",
"Vietnam": "Viêt Nam",
"Venezuela": "Vénézuéla",
"Vatican City": "Vatican",
"Vanuatu": "Vanuatu",
"Uzbekistan": "Ouzbékistan",
"Uruguay": "Uruguay",
"United Arab Emirates": "Émirats arabes unis",
"Ukraine": "Ukraine",
"Uganda": "Ouganda",
"U.S. Virgin Islands": "Îles Vierges des États-Unis",
"Tuvalu": "Tuvalu",
"Turks & Caicos Islands": "Îles Turques-et-Caïques",
"Turkmenistan": "Turkménistan",
"Turkey": "Turquie",
"Tunisia": "Tunisie",
"Trinidad & Tobago": "Trinité-et-Tobago",
"Tonga": "Tonga",
"Tokelau": "Tokelau",
"Togo": "Togo",
"Timor-Leste": "Timor oriental",
"Thailand": "Thaïlande",
"Tanzania": "Tanzanie",
"Tajikistan": "Tadjikistan",
"Taiwan": "Taïwan",
"São Tomé & Príncipe": "Sao Tomé-et-Principe",
"Syria": "Syrie",
"Switzerland": "Suisse",
"Sweden": "Suède",
"Swaziland": "Eswatini",
"Svalbard & Jan Mayen": "Svalbard et Jan Mayen",
"Suriname": "Suriname",
"Sudan": "Soudan",
"St. Vincent & Grenadines": "Saint-Vincent-et-les-Grenadines",
"St. Pierre & Miquelon": "Saint-Pierre-et-Miquelon",
"St. Martin": "Saint-Martin (Antilles françaises)",
"St. Lucia": "Sainte-Lucie",
"St. Kitts & Nevis": "Saint-Christophe-et-Niévès",
"St. Helena": "Île Sainte-Hélène",
"St. Barthélemy": "Saint-Barthélemy",
"Sri Lanka": "Sri Lanka",
"Spain": "Espagne",
"South Sudan": "Soudan du Sud",
"South Korea": "Corée du Sud",
"South Georgia & South Sandwich Islands": "Géorgie du Sud-et-les îles Sandwich du Sud",
"South Africa": "Afrique du Sud",
"Somalia": "Somalie",
"Solomon Islands": "Îles Salomon",
"Slovenia": "Slovénie",
"Slovakia": "Slovaquie",
"Sint Maarten": "Saint-Martin (royaume des Pays-Bas)",
"Singapore": "Singapour",
"Sierra Leone": "Sierra Leone",
"Seychelles": "Seychelles",
"Serbia": "Serbie",
"Senegal": "Sénégal",
"Saudi Arabia": "Arabie saoudite",
"San Marino": "Saint-Marin",
"Samoa": "Samoa",
"Réunion": "La Réunion",
"Rwanda": "Rwanda",
"Russia": "Russie",
"Romania": "Roumanie",
"Qatar": "Qatar",
"Puerto Rico": "Porto Rico",
"Portugal": "Portugal",
"Poland": "Pologne",
"Pitcairn Islands": "Îles Pitcairn",
"Philippines": "Philippines",
"Peru": "Pérou",
"Paraguay": "Paraguay",
"Papua New Guinea": "Papouasie-Nouvelle-Guinée",
"Panama": "Panama",
"Palestine": "Palestine",
"Palau": "Palaos",
"Pakistan": "Pakistan",
"Oman": "Oman",
"Norway": "Norvège",
"Northern Mariana Islands": "Îles Mariannes du Nord",
"North Korea": "Corée du Nord",
"Norfolk Island": "Île Norfolk",
"Niue": "Niue",
"Nigeria": "Nigéria",
"Niger": "Niger",
"Nicaragua": "Nicaragua",
"New Zealand": "Nouvelle-Zélande",
"New Caledonia": "Nouvelle-Calédonie",
"Netherlands": "Pays-Bas",
"Nepal": "Népal",
"Nauru": "Nauru",
"Namibia": "Namibie",
"Myanmar": "Birmanie",
"Mozambique": "Mozambique",
"Morocco": "Maroc",
"Montserrat": "Montserrat",
"Montenegro": "Monténégro",
"Mongolia": "Mongolie",
"Monaco": "Monaco",
"Moldova": "Moldavie",
"Micronesia": "États fédérés de Micronésie",
"Mexico": "Mexico",
"Mayotte": "Mayotte",
"Mauritius": "République de Maurice",
"Mauritania": "Mauritanie",
"Martinique": "Martinique",
"Marshall Islands": "Îles Marshall",
"Malta": "Malte",
"Mali": "Mali",
"Maldives": "Maldives",
"Malaysia": "Malaisie",
"Malawi": "Malawi",
"Madagascar": "Madagascar",
"Macedonia": "Macédoine du Nord",
"Macau": "Macao",
"Benin": "Bénin",
"Host account on": "Héberger le compte sur",
"Belize": "Bélize",
"Luxembourg": "Luxembourg",
"Lithuania": "Lituanie",
"Liechtenstein": "Liechtenstein",
"Libya": "Libye",
"Liberia": "Liberia",
"Lesotho": "Lesotho",
"Lebanon": "Liban",
"Latvia": "Lettonie",
"Laos": "Laos",
"Kyrgyzstan": "Kirghizistan",
"Kuwait": "Koweït",
"Kosovo": "Kosovo",
"Kiribati": "Kiribati",
"Kenya": "Kenya",
"Kazakhstan": "Kazakhstan",
"Jordan": "Jordanie",
"Jersey": "Jersey",
"Japan": "Japon",
"Jamaica": "Jamaïque",
"Italy": "Italie",
"Israel": "Israël",
"Isle of Man": "Île de Man",
"Ireland": "Irlande",
"Iraq": "Irak",
"Iran": "Iran",
"Indonesia": "Indonésie",
"India": "Inde",
"Iceland": "Islande",
"Hungary": "Hongrie",
"Hong Kong": "Hong Kong",
"Honduras": "Honduras",
"Heard & McDonald Islands": "Îles Heard-et-MacDonald",
"Haiti": "Haïti",
"Guyana": "Guyana",
"Guinea-Bissau": "Guinée-Bissau",
"Guinea": "Guinée",
"Guernsey": "Guernesey",
"Guatemala": "Guatemala",
"Guam": "Guam",
"Guadeloupe": "Guadeloupe",
"Grenada": "Grenade",
"Greenland": "Groenland",
"Greece": "Grèce",
"Gibraltar": "Gibraltar",
"Ghana": "Ghana",
"Germany": "Allemagne",
"Georgia": "Géorgie",
"Gambia": "Gambie",
"Gabon": "République gabonaise",
"French Southern Territories": "Terres australes et antarctiques françaises",
"French Polynesia": "Polynésie française",
"French Guiana": "Guyane",
"France": "France",
"Finland": "Finlande",
"Fiji": "Îles Fidji",
"Faroe Islands": "Îles Féroé",
"Falkland Islands": "Îles Malouines (Falkland)",
"Ethiopia": "Éthiopie",
"Estonia": "Estonie",
"Eritrea": "Érythrée",
"Equatorial Guinea": "Guinée équatoriale",
"El Salvador": "Le Salvador",
"Egypt": "Égypte",
"Ecuador": "République de l'Équateur",
"Dominican Republic": "République dominicaine",
"Dominica": "Dominique",
"Djibouti": "Djibouti",
"Denmark": "Danemark",
"Côte dIvoire": "Côte dIvoire (Terre d'Éburnie)",
"Czech Republic": "La République tchèque",
"Cyprus": "Chypre",
"Curaçao": "Curaçao",
"Cuba": "Cuba",
"Croatia": "Croatie",
"Costa Rica": "Costa Rica",
"Cook Islands": "Îles Cook",
"Congo - Kinshasa": "République démocratique du Congo",
"Congo - Brazzaville": "République du Congo",
"Comoros": "Comores",
"Colombia": "Colombia",
"Cocos (Keeling) Islands": "îles Cocos",
"Christmas Island": "île Christmas",
"China": "Chine",
"Chile": "Chili",
"Chad": "Tchad",
"Central African Republic": "République centrafricaine",
"Cayman Islands": "Îles Caïmans",
"Caribbean Netherlands": "Pays-Bas caribéens",
"Cape Verde": "Cap-Vert",
"Canada": "Canada",
"Cameroon": "Cameroun",
"Cambodia": "Cambodge",
"Burundi": "La république du Burundi",
"Burkina Faso": "Burkina Faso",
"Bulgaria": "Bulgarie",
"Brunei": "Brunéi",
"British Virgin Islands": "Îles Vierges britanniques",
"British Indian Ocean Territory": "Territoire britannique de l'océan Indien",
"Brazil": "Brésil",
"Bouvet Island": "Île Bouvet",
"Botswana": "",
"Bosnia": "",
"Bolivia": "",
"Bhutan": "",
"Bermuda": "",
"with state key %(stateKey)s": "avec la ou les clés d'état %(stateKey)s",
"with an empty state key": "avec une clé d'état vide",
"See when anyone posts a sticker to your active room": "Voir quand n'importe qui envoye un sticker dans le salon actuel",
"See when a sticker is posted in this room": "Voir quand un sticker est envoyé dans ce salon",
"See when the avatar changes in your active room": "Voir quand l'avatar change dans le salon actuel",
"Change the avatar of your active room": "Changer l'avatar du salon actuel",
"See when the avatar changes in this room": "Voir quand l'avatar change dans ce salon",
"Change the avatar of this room": "Changer l'avatar de ce salon",
"Send stickers into your active room": "Envoyer des stickers dans le salon actuel",
"See when the topic changes in this room": "Voir quand le sujet change dans ce salon",
"See when the topic changes in your active room": "Voir quand le sujet change dans le salon actuel",
"Change the name of your active room": "Changer le nom du salon actuel",
"See when the name changes in this room": "Traquer quand le nom change dans ce salon",
"Change the name of this room": "Changer le nom de ce salon",
"Change the topic of your active room": "Changer le sujet dans le salon actuel",
"Change the topic of this room": "Changer le sujet de ce salon",
"Send stickers into this room": "Envoyer des stickers dans ce salon",
"Remain on your screen when viewing another room, when running": "Reste sur votre écran quand vous regardez un autre salon lors de l'appel",
"Takes the call in the current room off hold": "Reprends l'appel en cours dans ce salon",
"Places the call in the current room on hold": "Met l'appel en pause dans ce salon",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Ajoute \"(╯°□°)╯︵ ┻━┻\" en préfixe du message",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Ajoute \"┬──┬ ( ゜-゜ノ)\" en préfixe du message",
"Effects": "Effets",
"Zimbabwe": "Zimbabwe"
}

View File

@ -920,7 +920,7 @@
"Messages": "Mensaxes",
"Actions": "Accións",
"Other": "Outro",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Anteponse ¯\\_(ツ)_/¯ a mensaxe en texto plano",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Antecede con ¯\\_(ツ)_/¯ a mensaxe en texto plano",
"Sends a message as plain text, without interpreting it as markdown": "Envía unha mensaxe como texto plano, sen interpretalo como markdown",
"Sends a message as html, without interpreting it as markdown": "Envía unha mensaxe como html, sen interpretalo como markdown",
"Upgrades a room to a new version": "Subir a sala de versión",
@ -2971,5 +2971,24 @@
"You held the call <a>Resume</a>": "Colgaches a chamada, <a>Retomar</a>",
"You've reached the maximum number of simultaneous calls.": "Acadaches o número máximo de chamadas simultáneas.",
"Too Many Calls": "Demasiadas chamadas",
"%(name)s paused": "detido por %(name)s"
"%(name)s paused": "detido por %(name)s",
"sends fireworks": "envía fogos de artificio",
"Sends the given message with fireworks": "Envia a mensaxe dada con fogos de artificio",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Antecede con ┬──┬ ( ゜-゜ノ) a unha mensaxe de texto plano",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antecede con (╯°□°)╯︵ ┻━┻ a unha mensaxe de texto plano",
"%(name)s on hold": "%(name)s agardando",
"You held the call <a>Switch</a>": "Pausaches a chamada <a>Cambiar</a>",
"sends snowfall": "envía neve",
"Sends the given message with snowfall": "Engade neve caendo á mensaxe",
"You have no visible notifications.": "Non tes notificacións visibles.",
"Transfer": "Transferir",
"Failed to transfer call": "Fallou a transferencia da chamada",
"A call can only be transferred to a single user.": "Unha chamada só se pode transferir a unha única usuaria.",
"There was an error finding this widget.": "Houbo un fallo ao buscar o widget.",
"Active Widgets": "Widgets activos",
"Open dial pad": "Abrir marcador",
"Start a Conversation": "Iniciar unha Conversa",
"Dial pad": "Marcador",
"There was an error looking up the phone number": "Houbo un erro buscando o número de teléfono",
"Unable to look up phone number": "Non atopamos o número de teléfono"
}

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
"Custom Server Options": "Egyéni kiszolgálóbeállítások",
"Dismiss": "Eltüntetés",
"Error": "Hiba",
"Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s",
"Failed to forget room %(errCode)s": "A szobát nem sikerült elfelejtetni: %(errCode)s",
"Favourite": "Kedvenc",
"Mute": "Elnémít",
"Notifications": "Értesítések",
@ -116,7 +116,7 @@
"Failed to set display name": "Megjelenítési nevet nem sikerült beállítani",
"Failed to unban": "Kizárás visszavonása sikertelen",
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailben lévő hivatkozásra kattintottál",
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizze, hogy az e-mailben lévő hivatkozásra kattintott-e",
"Failure to create room": "Szoba létrehozása sikertelen",
"Favourites": "Kedvencek",
"Fill screen": "Képernyő kitöltése",
@ -279,8 +279,8 @@
"Who can read history?": "Ki olvashatja a régi üzeneteket?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.",
"You are already in a call.": "Már hívásban vagy.",
"You cannot place a call with yourself.": "Nem hívhatod fel saját magadat.",
"You cannot place VoIP calls in this browser.": "Nem indíthatsz VoIP hívást ebben a böngészőben.",
"You cannot place a call with yourself.": "Nem hívhatja fel saját magát.",
"You cannot place VoIP calls in this browser.": "Nem indíthat VoIP hívást ebben a böngészőben.",
"You do not have permission to post to this room": "Nincs jogod üzenetet küldeni ebbe a szobába",
"You have <a>disabled</a> URL previews by default.": "Az URL előnézet alapból <a>tiltva</a> van.",
"You have <a>enabled</a> URL previews by default.": "Az URL előnézet alapból <a>engedélyezve</a> van.",
@ -292,13 +292,13 @@
"You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?",
"You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.",
"Sun": "v",
"Mon": "h",
"Tue": "k",
"Wed": "sze",
"Thu": "cs",
"Fri": "p",
"Sat": "szo",
"Sun": "Vas",
"Mon": "",
"Tue": "Ke",
"Wed": "Sze",
"Thu": "Csü",
"Fri": "",
"Sat": "Szo",
"Jan": "jan.",
"Feb": "feb.",
"Mar": "már.",
@ -626,12 +626,12 @@
"Learn more about how we use analytics.": "Tudj meg többet arról hogyan használjuk az analitikai adatokat.",
"The information being sent to us to help make %(brand)s better includes:": "Az alábbi információk kerülnek elküldésre, amivel jobbá tehetjük a %(brand)sot:",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Minden azonosításra alkalmas adat, mint a szoba-, felhasználó- vagy csoportazonosítók, eltávolításra kerülnek, mielőtt elküldenénk a kiszolgálónak.",
"The platform you're on": "A platform amit használsz",
"The platform you're on": "A platform amit használ",
"The version of %(brand)s": "%(brand)s verziója",
"Your language of choice": "A használt nyelv",
"Which officially provided instance you are using, if any": "Melyik hivatalosan nyújtott példányt használod",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Használod-e a Richtext módot a szerkesztőben vagy nem",
"Your homeserver's URL": "A Matrix kiszolgálód URL-je",
"Which officially provided instance you are using, if any": "Melyik hivatalos példányt használja",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Használja-e a Richtext módot a szerkesztőben vagy nem",
"Your homeserver's URL": "A ön Matrix kiszolgálója URL-je",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s",
"This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.",
"Community IDs cannot be empty.": "A közösségi azonosító nem lehet üres.",
@ -784,9 +784,9 @@
"Checking for an update...": "Frissítés keresése...",
"Missing roomId.": "Hiányzó szobaazonosító.",
"Popout widget": "Kiugró kisalkalmazás",
"Every page you use in the app": "Minden oldal, amit az alkalmazásban használsz",
"Every page you use in the app": "Minden oldal, amit az alkalmazásban használ",
"e.g. <CurrentPageURL>": "pl.: <CurrentPageURL>",
"Your device resolution": "Eszközöd felbontása",
"Your device resolution": "Eszköz felbontása",
"Always show encryption icons": "Titkosítási ikon folyamatos megjelenítése",
"Send Logs": "Naplók küldése",
"Clear Storage and Sign Out": "Tárhely törlése és kijelentkezés",
@ -833,8 +833,8 @@
"Demote": "Lefokozás",
"This event could not be displayed": "Az eseményt nem lehet megjeleníteni",
"Permission Required": "Jogosultság szükséges",
"You do not have permission to start a conference call in this room": "Nincs jogosultságod konferencia hívást kezdeményezni ebben a szobában",
"A call is currently being placed!": "A hívás indítás alatt van!",
"You do not have permission to start a conference call in this room": "Nincs jogosultsága konferencia hívást kezdeményezni ebben a szobában",
"A call is currently being placed!": "A hívás indítás alatt!",
"Failed to remove widget": "A kisalkalmazás törlése sikertelen",
"An error ocurred whilst trying to remove the widget from the room": "A kisalkalmazás szobából való törlése közben hiba történt",
"System Alerts": "Rendszer figyelmeztetések",
@ -881,7 +881,7 @@
"Incompatible Database": "Nem kompatibilis adatbázis",
"Continue With Encryption Disabled": "Folytatás a titkosítás kikapcsolásával",
"Sign in with single sign-on": "Bejelentkezés „egyszeri bejelentkezéssel”",
"Unable to load! Check your network connectivity and try again.": "A betöltés sikertelen! Ellenőrizd a hálózati kapcsolatot és próbáld újra.",
"Unable to load! Check your network connectivity and try again.": "A betöltés sikertelen! Ellenőrizze a hálózati kapcsolatot és próbálja újra.",
"Delete Backup": "Mentés törlése",
"Unable to load key backup status": "A mentett kulcsok állapotát nem lehet lekérdezni",
"Backup version: ": "Mentés verzió: ",
@ -1069,7 +1069,7 @@
"Homeserver URL": "Matrixszerver URL",
"Identity Server URL": "Azonosítási Szerver URL",
"Free": "Szabad",
"Join millions for free on the largest public server": "Milliók kapcsolódnak ingyen a legnagyobb nyilvános szerveren",
"Join millions for free on the largest public server": "Csatlakozzon több millió felhasználóhoz ingyen a legnagyobb nyilvános szerveren",
"Premium": "Prémium",
"Premium hosting for organisations <a>Learn more</a>": "Prémium üzemeltetés szervezetek részére <a>Tudj meg többet</a>",
"Other": "Más",
@ -1084,7 +1084,7 @@
"Recovery Method Removed": "Visszaállítási eljárás törölve",
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ha nem Ön törölte a visszaállítási módot, akkor egy támadó hozzá akar férni a fiókjához. Azonnal változtassa meg a jelszavát, és állítson be egy visszaállítási módot a Beállításokban.",
"Chat with %(brand)s Bot": "Csevegés a %(brand)s Robottal",
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "A(z) „%(fileName)s” mérete nagyobb mint amekkorát a Matrix-kiszolgáló enged feltölteni",
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "A(z) „%(fileName)s” mérete nagyobb mint amekkorát a Matrix-kiszolgáló megenged feltölteni",
"Gets or sets the room topic": "Lekérdezi vagy beállítja a szoba témáját",
"This room has no topic.": "A szobának nincs témája.",
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s hozzáférhetővé tette a szobát bárkinek, aki ismeri a linket.",
@ -1255,9 +1255,9 @@
"The homeserver may be unavailable or overloaded.": "A Matrix szerver elérhetetlen vagy túlterhelt.",
"You have %(count)s unread notifications in a prior version of this room.|other": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.",
"You have %(count)s unread notifications in a prior version of this room.|one": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használsz-e „morzsákat” (profilképek a szobalista felett)",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használ-e „morzsákat” (profilképek a szobalista felett)",
"Replying With Files": "Válasz fájlokkal",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyelőre nem lehet fájllal válaszolni. Szeretnéd feltölteni a fájlt úgy, hogy az nem egy válasz lesz?",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyelőre nem lehet fájllal válaszolni. Szeretné feltölteni a fájlt úgy, hogy az nem egy válasz lesz?",
"The file '%(fileName)s' failed to upload.": "A(z) „%(fileName)s” fájl feltöltése sikertelen.",
"Rotate counter-clockwise": "Óramutató járásával ellentétesen fordít",
"Rotate clockwise": "Óramutató járásával megegyező irányba fordít",
@ -1382,7 +1382,7 @@
"Changes your avatar in all rooms": "Megváltoztatja a profilképed az összes szobában",
"Removing…": "Eltávolítás…",
"Clear all data": "Minden adat törlése",
"Your homeserver doesn't seem to support this feature.": "A matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.",
"Your homeserver doesn't seem to support this feature.": "A Matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.",
"Resend edit": "Szerkesztés újraküldése",
"Resend %(unsentCount)s reaction(s)": "%(unsentCount)s reakció újraküldése",
"Resend removal": "Törlés újraküldése",
@ -1403,8 +1403,8 @@
"Service": "Szolgáltatás",
"Summary": "Összefoglaló",
"Call failed due to misconfigured server": "A hívás a helytelenül beállított kiszolgáló miatt sikertelen",
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Kérd meg a Matrix-kiszolgálód (<code>%(homeserverDomain)s</code>) adminisztrátorát, hogy a hívások megfelelő működéséhez állítson be egy TURN-kiszolgálót.",
"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.": "Másik lehetőségként használhatod a <code>turn.matrix.org</code> nyilvános kiszolgálót, de ez nem lesz annyira megbízható, és megosztja az IP-címedet a kiszolgálóval. A Beállításokban állíthatod be.",
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Kérje meg a Matrix-kiszolgáló (<code>%(homeserverDomain)s</code>) adminisztrátorát, hogy a hívások megfelelő működéséhez állítson be egy TURN-kiszolgálót.",
"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.": "Másik lehetőségként használhatja a <code>turn.matrix.org</code> nyilvános kiszolgálót, de ez nem lesz annyira megbízható, és megosztja az IP-címét a kiszolgálóval. A Beállításokban állíthatja be.",
"Try using turn.matrix.org": "A turn.matrix.org használatának kipróbálása",
"Messages": "Üzenetek",
"Actions": "Műveletek",
@ -1693,7 +1693,7 @@
"in secret storage": "biztonsági tárolóban",
"Secret storage public key:": "Biztonsági tároló nyilvános kulcs:",
"in account data": "fiók adatokban",
"Cross-signing": "Eszközök közti aláírás",
"Cross-signing": "Eszközök közti hitelesítés",
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Figyelmeztetés</b>: Csak biztonságos számítógépről állíts be kulcs mentést.",
"If you've forgotten your recovery key you can <button>set up new recovery options</button>": "Ha elfelejtetted a visszaállítási kulcsot <button>állíts be új visszaállítási lehetőséget</button>",
"Set up with a recovery key": "Beállítás visszaállítási kulccsal",
@ -1804,7 +1804,7 @@
"Enable": "Engedélyez",
"%(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>.": "A %(brand)sból a titkosított üzenetek biztonságos helyi tárolásához hiányzik néhány dolog. Ha kísérletezni szeretne ezzel a lehetőséggel, akkor fordítson le egy saját %(brand)s Desktopot a <nativeLink>kereső komponens hozzáadásával</nativeLink>.",
"Message search": "Üzenet keresése",
"This room is bridging messages to the following platforms. <a>Learn more.</a>": "Ez a szoba összeköti az üzeneteket a következő platformokkal, <a>tudj meg többet.</a>",
"This room is bridging messages to the following platforms. <a>Learn more.</a>": "Ez a szoba összeköti az üzeneteket a felsorolt platformokkal, <a>tudj meg többet.</a>",
"This room isnt bridging messages to any platforms. <a>Learn more.</a>": "Ez a szoba egy platformmal sem köt össze üzeneteket. <a>Tudj meg többet.</a>",
"Bridges": "Hidak",
"New session": "Új munkamenet",
@ -1940,15 +1940,15 @@
"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.": "Eszközök közti hitelesítési kulcsok törlése végleges. Mindenki akit ezzel hitelesítettél biztonsági figyelmeztetéseket fog látni. Hacsak nem vesztetted el az összes eszközödet amivel eszközök közti hitelesítést tudsz végezni, nem valószínű, hogy ezt szeretnéd tenni.",
"Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése",
"Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló alaphelyzetbe állítása",
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Olyan eszközön használod-e a %(brand)sot, ahol az érintés az elsődleges beviteli mód",
"Whether you're using %(brand)s as an installed Progressive Web App": "Progresszív webalkalmazásként használod-e a %(brand)sot",
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Olyan eszközön használja-e a %(brand)sot, ahol az érintés az elsődleges beviteli mód",
"Whether you're using %(brand)s as an installed Progressive Web App": "Progresszív webalkalmazásként használja-e a %(brand)sot",
"Your user agent": "Felhasználói ügynök",
"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.": "Az ellenőrizni kívánt munkamenet nem támogatja se a QR kód beolvasást se az emodzsi ellenőrzést, amit a %(brand)s támogat. Próbáld meg egy másik klienssel.",
"You declined": "Elutasítottad",
"%(name)s declined": "%(name)s elutasította",
"Cancelling…": "Megszakítás…",
"Your homeserver does not support cross-signing.": "A matrix szervered nem támogatja az eszközök közti hitelesítést.",
"Homeserver feature support:": "Matrix szerver támogatott szolgáltatások:",
"Homeserver feature support:": "Matrix szerver támogatja-e a szolgáltatást:",
"exists": "létezik",
"Accepting…": "Elfogadás…",
"Accepting …": "Elfogadás …",
@ -2077,7 +2077,7 @@
"Space": "Szóköz",
"End": "End",
"Session backup key:": "Munkamenet másolat kulcs:",
"Use Single Sign On to continue": "A folytatáshoz használd az egyszeri bejelentkezést (SSO)",
"Use Single Sign On to continue": "A folytatáshoz használja az egyszeri bejelentkezést (SSO)",
"Single Sign On": "Egyszeri bejelentkezés",
"%(name)s is requesting verification": "%(name)s ellenőrzést kér",
"Sends a message as html, without interpreting it as markdown": "Az üzenet elküldése html szövegként anélkül, hogy „markdown” formázásként értelmezné",
@ -2117,11 +2117,11 @@
"Self-verification request": "Ön ellenőrzés kérése",
"Cancel replying to a message": "Üzenet válasz megszakítása",
"Confirm adding email": "E-mail hozzáadásának megerősítése",
"Click the button below to confirm adding this email address.": "Az e-mail cím hozzáadásának megerősítéséhez kattints a gombra lent.",
"Click the button below to confirm adding this email address.": "Az e-mail cím hozzáadásának megerősítéséhez kattintson a gombra lent.",
"Confirm adding phone number": "Telefonszám hozzáadásának megerősítése",
"Click the button below to confirm adding this phone number.": "Az telefonszám hozzáadásának megerősítéséhez kattints a gombra lent.",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt e-mail címet hozzáadod.",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt telefonszámot hozzáadod.",
"Click the button below to confirm adding this phone number.": "Az telefonszám hozzáadásának megerősítéséhez kattintson a gombra lent.",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Erősítse meg, hogy az egyszeri bejelentkezésnél a személyazonossága bizonyításaként használt e-mail címet hozzáadja.",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Erősítse meg, hogy az egyszeri bejelentkezésnél a személyazonossága bizonyításaként használt telefonszámot hozzáadja.",
"If you cancel now, you won't complete your operation.": "A műveletet nem fejezed be, ha ezt most megszakítod.",
"Failed to set topic": "A téma beállítása sikertelen",
"Command failed": "A parancs sikertelen",
@ -2514,7 +2514,7 @@
"Cannot create rooms in this community": "A közösségben nem lehet szobát készíteni",
"You do not have permission to create rooms in this community.": "A közösségben szoba létrehozásához nincs jogosultságod.",
"End conference": "Konferenciahívás befejezése",
"This will end the conference for everyone. Continue?": "Mindenki számára befejeződik a konferencia. Folytatod?",
"This will end the conference for everyone. Continue?": "Mindenki számára befejeződik a konferencia. Folytatja?",
"Offline encrypted messaging using dehydrated devices": "Kapcsolat nélküli titkosított üzenetküldés tartósított eszközökkel",
"Ignored attempt to disable encryption": "A titkosítás kikapcsolására tett kísérlet figyelmen kívül lett hagyva",
"Join the conference at the top of this room": "Csatlakozz a konferenciához a szoba tetején",
@ -2839,12 +2839,144 @@
"You created this room.": "Te készítetted ezt a szobát.",
"<a>Add a topic</a> to help people know what it is about.": "<a>Állítsd be a szoba témáját</a>, hogy az emberek tudják, hogy miről van itt szó.",
"Topic: %(topic)s ": "Téma: %(topic)s ",
"Send stickers to this room as you": "Ön helyett matricák küldése a szobába",
"Send stickers to this room as you": "Matricák küldése ebbe a szobába saját néven",
"Change the avatar of this room": "A szoba képének megváltoztatása",
"Change the name of this room": "A szoba nevének megváltoztatása",
"Change the topic of your active room": "Az aktív szoba témájának megváltoztatása",
"Change the topic of this room": "A szoba témájának megváltoztatása",
"Change which room you're viewing": "Az ön által nézett szoba megváltoztatása",
"Send stickers into your active room": "Matricák küldése az ön aktív szobájába",
"Send stickers into this room": "Matricák küldése a szobába"
"Send stickers into your active room": "Matricák küldése az aktív szobába",
"Send stickers into this room": "Matricák küldése ebbe a szobába",
"Go to Home View": "Irány a Kezdőképernyő",
"%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s vagy %(usernamePassword)s",
"Continue with %(ssoButtons)s": "Folytatás ezzel: %(ssoButtons)s",
"That username already exists, please try another.": "Ez a felhasználói név már létezik, kérlek próbálj ki egy másikat.",
"New? <a>Create account</a>": "Új vagy? <a>Készíts egy fiókot</a>",
"There was a problem communicating with the homeserver, please try again later.": "A szerverrel való kommunikációval probléma történt, kérlek próbáld újra.",
"New here? <a>Create an account</a>": "Új vagy? <a>Készíts egy fiókot</a>",
"Got an account? <a>Sign in</a>": "Van már fiókod? <a>Jelentkezz be</a>",
"Filter rooms and people": "Szobák és emberek szűrése",
"Forgot password?": "Elfelejtetted a jelszót?",
"That phone number doesn't look quite right, please check and try again": "Ez a telefonszám nem tűnik teljesen helyesnek, kérlek ellenőrizd újra",
"Enter phone number": "Telefonszám megadása",
"Enter email address": "E-mail cím megadása",
"Open the link in the email to continue registration.": "A regisztráció folytatásához nyisd meg a hivatkozást az e-mailben.",
"A confirmation email has been sent to %(emailAddress)s": "Megerősítő e-mail elküldve ide: %(emailAddress)s",
"Hold": "Várakoztat",
"Resume": "Folytatás",
"Decline All": "Mindet elutasít",
"Approve": "Engedélyez",
"This widget would like to:": "A kisalkalmazás ezeket szeretné:",
"Approve widget permissions": "Kisalkalmazás engedélyek elfogadása",
"Sign into your homeserver": "Bejelentkezés a matrix szerveredbe",
"Specify a homeserver": "Matrix szerver megadása",
"Invalid URL": "Érvénytelen URL",
"Unable to validate homeserver": "A matrix szervert nem lehet ellenőrizni",
"Continuing without email": "Folytatás e-mail cím nélkül",
"Reason (optional)": "Ok (opcionális)",
"Continue with %(provider)s": "Folytatás ezzel a szolgáltatóval: %(provider)s",
"Homeserver": "Matrix kiszolgáló",
"Role": "Szerepkör",
"Start a new chat": "Új beszélgetés indítása",
"%(name)s paused": "%(name)s megállítva",
"Return to call": "Visszatérés a híváshoz",
"Fill Screen": "Képernyő kitöltése",
"Voice Call": "Hanghívás",
"Video Call": "Videohívás",
"%(peerName)s held the call": "%(peerName)s várakoztatja a hívást",
"You held the call <a>Resume</a>": "A hívás várakozik, <a>folytatás</a>",
"sends fireworks": "tűzijáték küldése",
"Sends the given message with fireworks": "Az üzenet elküldése tűzijátékkal",
"sends confetti": "konfetti küldése",
"Sends the given message with confetti": "Az üzenet elküldése konfettivel",
"Show chat effects": "Beszélgetés effektek megjelenítése",
"Use Ctrl + Enter to send a message": "Ctrl + Enter használata az üzenet elküldéséhez",
"Use Command + Enter to send a message": "Operációs rendszer billentyű + Enter használata az üzenet küldéséhez",
"Render LaTeX maths in messages": "LaTeX matematikai kifejezések megjelenítése az üzenetekben",
"See <b>%(msgtype)s</b> messages posted to your active room": "<b>%(msgtype)s</b> üzenetek megjelenítése az aktív szobádban",
"See <b>%(msgtype)s</b> messages posted to this room": "<b>%(msgtype)s</b> üzenetek megjelenítése ebben a szobában",
"See general files posted to your active room": "Az aktív szobádba küldött fájlok megjelenítése",
"See general files posted to this room": "Ebbe a szobába küldött fájlok megjelenítése",
"See videos posted to your active room": "Az aktív szobádba küldött videók megjelenítése",
"See videos posted to this room": "Ebbe a szobába küldött videók megjelenítése",
"See images posted to your active room": "Az aktív szobádba küldött képek megjelenítése",
"See images posted to this room": "Ebbe a szobába küldött képek megjelenítése",
"See text messages posted to your active room": "Az aktív szobádba küldött szöveges üzenetek megjelenítése",
"See text messages posted to this room": "Ebbe a szobába küldött szöveges üzenetek megjelenítése",
"See messages posted to your active room": "Az aktív szobádba küldött üzenetek megjelenítése",
"See messages posted to this room": "Ebbe a szobába küldött üzenetek megjelenítése",
"The <b>%(capability)s</b> capability": "<b>%(capability)s</b> képesség",
"See <b>%(eventType)s</b> events posted to your active room": "<b>%(eventType)s</b> események megjelenítése az aktív szobában",
"Send <b>%(eventType)s</b> events as you in your active room": "<b>%(eventType)s</b> események küldése a nevedben az aktív szobába",
"See <b>%(eventType)s</b> events posted to this room": "<b>%(eventType)s</b> események megjelenítése ebben a szobában",
"Send <b>%(eventType)s</b> events as you in this room": "<b>%(eventType)s</b> esemény küldése a nevedben a szobába",
"with state key %(stateKey)s": "ezzel a státusz kulccsal: %(stateKey)s",
"with an empty state key": "üres státusz kulccsal",
"See when anyone posts a sticker to your active room": "Bárki által az aktív szobádba küldött matrica megjelenítése",
"See when a sticker is posted in this room": "Matrica küldésének megjelenítése ebben a szobában",
"See when the avatar changes in your active room": "Profilkép változás megjelenítése az aktív szobában",
"Change the avatar of your active room": "Az aktív szoba profilképének megváltoztatása",
"See when the avatar changes in this room": "Profilkép változás megjelenítése ebben a szobában",
"See when the name changes in your active room": "Név változásának megjelenítése az aktív szobában",
"Change the name of your active room": "Az aktív szoba nevének megváltoztatása",
"See when the name changes in this room": "Név változásának megjelenítése ebben a szobában",
"See when the topic changes in your active room": "Téma változásának megjelenítése az aktív szobában",
"See when the topic changes in this room": "Szoba téma változásának megmutatása",
"Remain on your screen while running": "Maradjon a képernyőn ameddig amíg fut",
"Remain on your screen when viewing another room, when running": "Maradjon a képernyőn ameddig másik szobát nézel, amíg fut",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "┬──┬ ( ゜-゜ノ) -t tesz a szöveg elejére",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "(╯°□°)╯︵ ┻━┻ -t tesz a szöveg elejére",
"Effects": "Effektek",
"You've reached the maximum number of simultaneous calls.": "Elérte az egyidejű hívások maximális számát.",
"Too Many Calls": "Túl sok hívás",
"No other application is using the webcam": "A webkamerát nem használja másik alkalmazás",
"Permission is granted to use the webcam": "A webkamera használatának az engedélye megadva",
"A microphone and webcam are plugged in and set up correctly": "A mikrofon és webkamera csatlakoztatva van és megfelelően be van állítva",
"Unable to access webcam / microphone": "A webkamerát / mikrofont nem lehet használni",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A hívás meghiúsult mert a mikrofont nem lehet használni. Ellenőrizze, hogy csatlakoztatva van-e és megfelelően be van állítva.",
"Unable to access microphone": "A mikrofont nem lehet használni",
"Already have an account? <a>Sign in here</a>": "Van már fiókod? <a>Belépés</a>",
"Use email to optionally be discoverable by existing contacts.": "Az e-mail (nem kötelező) megadása segíthet abban, hogy az ismerőseid megtaláljanak Matrix-on.",
"Use email or phone to optionally be discoverable by existing contacts.": "Az e-mail, vagy telefonszám használatával a jelenlegi ismerőseid is megtalálhatnak.",
"Add an email to be able to reset your password.": "Adj meg egy e-mail címet, hogy vissza tudd állítani a jelszavad.",
"Just a heads up, if you don't add an email and forget your password, you could <b>permanently lose access to your account</b>.": "Csak egy figyelmeztetés, ha nem adsz meg e-mail címet, és elfelejted a jelszavad, <b>véglegesen elveszítheted a fiókodhoz való hozzáférést</b>.",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Megadhatsz egyéni szervert, amit használni szeretnél, a címének beírásával. Ez lehetővé teszi, hogy, ha a fiókod másik szerveren van, be tudj jelentkezni oda.",
"Server Options": "Szerver lehetőségek",
"Learn more": "Tudj meg többet",
"Matrix.org is the biggest public homeserver in the world, so its a good place for many.": "A matrix.org a legnagyobb nyilvános Matrix szerver a világon, és sok felhasználónak megfelelő választás.",
"About homeservers": "A Matrix szerverekről",
"Use your preferred Matrix homeserver if you have one, or host your own.": "Add meg az általad választott Matrix szerver címét, ha van ilyen, vagy üzemeltess egy sajátot!",
"Other homeserver": "Másik Matrix szerver",
"Host account on": "Fiók létrehozása itt:",
"We call the places where you can host your account homeservers.": "Matrix szervereknek nevezzük azokat a helyeket, ahol fiókot lehet létrehozni.",
"Call failed because webcam or microphone could not be accessed. Check that:": "A hívás sikertelen, mert a webkamera, vagy a mikrofon nem érhető el. Ellenőrizze ezt:",
"Decide where your account is hosted": "Döntse el, hol szeretne fiókot létrehozni!",
"Send <b>%(msgtype)s</b> messages as you in your active room": "<b>%(msgtype)s</b> üzenet küldése az aktív szobádba saját néven",
"Send <b>%(msgtype)s</b> messages as you in this room": "<b>%(msgtype)s</b> üzenet küldése ebbe a szobába saját néven",
"Send general files as you in your active room": "Fájlok küldése az aktív szobájába saját néven",
"Send general files as you in this room": "Fájlok küldése ebbe a szobába saját néven",
"Send videos as you in your active room": "Videók küldése az aktív szobájába saját néven",
"Send videos as you in this room": "Videók küldése ebbe a szobába saját néven",
"Send images as you in your active room": "Képek küldése az aktív szobájába saját néven",
"Send images as you in this room": "Képek küldése ebbe a szobába saját néven",
"Send emotes as you in your active room": "Emodzsik küldése az aktív szobájába saját néven",
"Send emotes as you in this room": "Emodzsik küldése ebbe a szobába saját néven",
"Send text messages as you in your active room": "Szöveges üzenetek küldése az aktív szobájába saját néven",
"Send text messages as you in this room": "Szöveges üzenetek küldése ebbe a szobába saját néven",
"Send messages as you in your active room": "Üzenetek küldése az aktív szobájába saját néven",
"Send messages as you in this room": "Üzenetek küldése ebbe a szobába saját néven",
"Send stickers to your active room as you": "Matricák küldése az aktív szobába saját néven",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even add images with Matrix URLs <img src=\"mxc://url\" />\n</p>\n": "<h1>HTML a közössége oldalához</h1>\n<p>\n Az új tagnak a közösség bemutatásához vagy fontos \n <a href=\"foo\">hivatkozások</a> megosztásához a hosszú leírást lehet használni.\n</p>\n<p>\n Képeket Matrix URL-ekkel lehet hozzáadni: <img src=\"mxc://url\" />\n</p>\n",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "A szövegek megjelenítéséhez a keresésekben biztonságosan kell helyileg tárolni a titkosított üzeneteket, ehhez %(size)s méretben tárolódnak az üzenetek %(rooms)s szobából.",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "A szövegek megjelenítéséhez a keresésekben biztonságosan kell helyileg tárolni a titkosított üzeneteket, ehhez %(size)s méretben tárolódnak az üzenetek %(rooms)s szobából.",
"%(name)s on hold": "%(name)s hívás tartva",
"You held the call <a>Switch</a>": "A hívás várakozik, <a>átkapcsolás</a>",
"sends snowfall": "hóesés küldése",
"Sends the given message with snowfall": "Az üzenet elküldése hóeséssel",
"See emotes posted to your active room": "Az aktív szobájába küldött emodzsik megjelenítése",
"See emotes posted to this room": "Ebbe a szobába küldött emodzsik megjelenítése",
"You have no visible notifications.": "Nincsenek látható értesítések.",
"Transfer": "Átadás",
"Failed to transfer call": "A hívás átadása nem sikerült",
"A call can only be transferred to a single user.": "Csak egy felhasználónak lehet átadni a hívást."
}

View File

@ -2971,5 +2971,24 @@
"%(peerName)s held the call": "%(peerName)s ha sospeso la chiamata",
"You held the call <a>Resume</a>": "Hai sospeso la chiamata <a>Riprendi</a>",
"You've reached the maximum number of simultaneous calls.": "Hai raggiungo il numero massimo di chiamate simultanee.",
"Too Many Calls": "Troppe chiamate"
"Too Many Calls": "Troppe chiamate",
"%(name)s on hold": "%(name)s in sospeso",
"You held the call <a>Switch</a>": "Hai sospeso la chiamata <a>Cambia</a>",
"sends snowfall": "invia nevicata",
"Sends the given message with snowfall": "Invia il messaggio con una nevicata",
"sends fireworks": "invia fuochi d'artificio",
"Sends the given message with fireworks": "Invia il messaggio con fuochi d'artificio",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Antepone ┬──┬ ( ゜-゜ノ) ad un messaggio di testo",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo",
"You have no visible notifications.": "Non hai notifiche visibili.",
"Transfer": "Trasferisci",
"Failed to transfer call": "Trasferimento chiamata fallito",
"A call can only be transferred to a single user.": "Una chiamata può essere trasferita solo ad un singolo utente.",
"There was an error finding this widget.": "Si è verificato un errore trovando i widget.",
"Active Widgets": "Widget attivi",
"Open dial pad": "Apri tastierino",
"Start a Conversation": "Inizia una conversazione",
"Dial pad": "Tastierino",
"There was an error looking up the phone number": "Si è verificato un errore nella ricerca del numero di telefono",
"Unable to look up phone number": "Impossibile cercare il numero di telefono"
}

View File

@ -910,7 +910,7 @@
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "ファイル '%(fileName)s' はこのホームサーバのアップロードのサイズ上限を超えています",
"The server does not support the room version specified.": "このサーバは指定された部屋バージョンに対応していません。",
"Name or Matrix ID": "名前またはMatrix ID",
"Identity server has no terms of service": "IDサーバーは利用規約を持っていません",
"Identity server has no terms of service": "ID サーバーは利用規約を持っていません",
"Messages": "メッセージ",
"Actions": "アクション",
"Other": "その他",
@ -1317,7 +1317,7 @@
"Join the discussion": "話し合いに参加",
"%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s はプレビューできません。部屋に参加しますか?",
"Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "他のユーザーがあなたのホームサーバー (%(localDomain)s) を通じてこの部屋を見つけられるよう、アドレスを設定しましょう",
"Enter recovery key": "リカバリキーを入力",
"Enter recovery key": "リカバリキーを入力",
"Verify this login": "このログインを承認",
"Signing In...": "サインイン中...",
"If you've joined lots of rooms, this might take a while": "たくさんの部屋に参加している場合は、時間がかかる可能性があります",
@ -1488,5 +1488,22 @@
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "検索結果を表示させるために、暗号化されたメッセージをローカルに安全にキャッシュしています。現在、%(rooms)s 件の部屋のメッセージの保存に %(size)s を使用中です。",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "検索結果を表示させるために、暗号化されたメッセージをローカルに安全にキャッシュしています。現在、%(rooms)s 件の部屋のメッセージの保存に %(size)s を使用中です。",
"Mentions & Keywords": "メンションとキーワード",
"Security Key": "セキュリティキー"
"Security Key": "セキュリティキー",
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "ID サーバーの使用は任意です。ID サーバーを使用しない場合、あなたは他のユーザーから発見されなくなり、メールアドレスや電話番号で他のユーザーを招待することもできません。",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。",
"Use an Integration Manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。",
"Use an Integration Manager <b>(%(serverName)s)</b> to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ <b>(%(serverName)s)</b> を使用して、ボット、ウィジェット、ステッカーパックを管理します。",
"Integrations not allowed": "インテグレーションは許可されていません",
"Integrations are disabled": "インテグレーションが無効になっています",
"Manage integrations": "インテグレーションの管理",
"Enter a new identity server": "新しい ID サーバーを入力",
"Use Ctrl + Enter to send a message": "Ctrl + Enter でメッセージを送信する",
"Show chat effects": "チャットエフェクトを表示",
"Backup key cached:": "バックアップキーのキャッシュ:",
"Backup key stored:": "バックアップキー保存場所:",
"Algorithm:": "アルゴリズム:",
"Backup version:": "バックアップバージョン:",
"Secret storage:": "機密ストレージ:",
"Master private key:": "マスター秘密鍵:",
"Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "セッションにアクセスできなくなる場合に備えて、アカウントデータとともに暗号鍵をバックアップします。あなたの鍵は一意のリカバリーキーで保護されます。"
}

View File

@ -790,7 +790,7 @@
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni tayeḍ %(addresses)s i texxamt-a.",
"%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ibeddel tansa-nni tayeḍ n texxamt-a.",
"%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a.",
"Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t s tukksa n tecreḍt",
"Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t belli d tukksa n tecreḍt",
"Deops user with given id": "Aseqdac Deops s usulay i d-yettunefken",
"Sends the given message coloured as a rainbow": "Yuzen iznan i d-yettunefken yeɣman s yiniten am teslit n Unẓar",
"Sends the given emote coloured as a rainbow": "Yuzen tanfalit i d-yettunefken yeɣman s yiniten am teslit n Unẓar",
@ -2283,7 +2283,7 @@
"Server did not require any authentication": "Aqeddac ur isuter ara akk asesteb",
"Server did not return valid authentication information.": "Aqeddac ur d-yerri ara talɣut n usesteb tameɣtut.",
"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)": "Ttxil-k·m ttu akk iznan i yuzneɣ mi ara senseɣ amiḍan-iw (<b>Ɣur-k·m:</b> iseqdacen ara d-yernun ad walin idiwenniyen ur nemmid ara)",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.",
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Asenqed n useqdac-a ad yecreḍ ɣef tɣimit-is tettwattkal, yerna ad yecreḍ ula ɣef tɣimit-ik·im tettwattkal i netta·nettat.",
"Enable 'Manage Integrations' in Settings to do this.": "Rmed 'imsidaf n usefrek' deg yiɣewwaren i tigin n waya.",
"Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.",
@ -2449,5 +2449,287 @@
"Widgets": "Iwiǧiten",
"Unpin app": "Serreḥ i usnas",
"Pin to room": "Sentu deg texxamt",
"You can only pin 2 widgets at a time": "Tzemreḍ ad tsentuḍ 2 kan n yiwiǧiten ɣef tikkelt"
"You can only pin 2 widgets at a time": "Tzemreḍ ad tsentuḍ 2 kan n yiwiǧiten ɣef tikkelt",
"Call Declined": "Yettwagi usiwel",
"Video Call": "Asiwel s tvidyut",
"Iraq": "ɛiṛaq",
"Bosnia": "Busniya",
"Mali": "Mali",
"Sweden": "Sswid",
"Moldova": "Muldavya",
"Sint Maarten": "San Maṛtan",
"Morocco": "Meṛṛuk",
"British Indian Ocean Territory": "Timura n ugaraw ahendi abṛitani",
"Slovakia": "Sluvakya",
"Macedonia": "Masidunya",
"Zimbabwe": "Zimbabwi",
"Antigua & Barbuda": "Antigua & Barbuda",
"Forgot password?": "Tettuḍ awal uffir?",
"Madagascar": "Madagaskaṛ",
"Niue": "Niué",
"Central African Republic": "Tafriqt Talemmast",
"St. Pierre & Miquelon": "San Pyir & Miklun",
"Benin": "Binin",
"New Zealand": "Ziland Tamaynut",
"Russia": "Rrus",
"Tajikistan": "Tajikistan",
"Bangladesh": "Bengladic",
"Iran": "Iṛan",
"St. Lucia": "Sant Lusi",
"Rwanda": "Ṛwanda",
"Laos": "Lawus",
"Guinea": "Ginya",
"Bulgaria": "Bulgarya",
"Cambodia": "Kambuj",
"Guatemala": "Guatemala",
"Luxembourg": "Luxembourg",
"Guernsey": "Guernsey",
"Ukraine": "Ukrin",
"Cape Verde": "Cap-Vert",
"Add comment": "Rnu awennit",
"Kiribati": "Kiribati",
"French Southern Territories": "Timura n uwezlu n Fṛansa",
"Barbados": "Barbade",
"Yemen": "Yaman",
"Cook Islands": "Tigzirin n Kuk",
"Uganda": "Uganda",
"Armenia": "Arminya",
"Anguilla": "Anguilla",
"Christmas Island": "Tigzrin n Kristmaṣ",
"Chad": "Čad",
"Turkmenistan": "Turkminya",
"Somalia": "Ṣumal",
"Lesotho": "Lizuṭu",
"Austria": "Tutrict",
"Burkina Faso": "Burkina Faso",
"Malawi": "Malawi",
"Philippines": "Filippin",
"Peru": "Piru",
"Nicaragua": "Nikaṛagwa",
"Libya": "Libya",
"Eritrea": "Iritirya",
"Uzbekistan": "Uzbikistan",
"Guyana": "Guyane",
"Kuwait": "Koweït",
"Invalid URL": "Yir URL",
"Venezuela": "Vinizwila",
"Greenland": "Griland",
"Jamaica": "Jamaïque",
"Ireland": "Irland",
"Brazil": "Brizil",
"Haiti": "Hayti",
"Lithuania": "Litwanya",
"Norway": "Nuṛwij",
"Botswana": "Butswana",
"Guinea-Bissau": "Ginya bisaw",
"Netherlands": "Timura n Wadda",
"United Arab Emirates": "Tiglednuwin Taεrabin Yedduklen",
"Micronesia": "Mikṛunizya",
"Cameroon": "Kamirun",
"Return to call": "Uɣal ɣer usiwel",
"Curaçao": "Kuṛačaw",
"Thailand": "Tayland",
"Croatia": "Karwaṣiya",
"Liechtenstein": "Lictencṭayn",
"Panama": "Panama",
"Mauritius": "Île Maurice",
"St. Vincent & Grenadines": "San Vansun & grinadin",
"Estonia": "Isṭuni",
"Timor-Leste": "Timur n usamar",
"Tokelau": "Ṭuklu",
"Guam": "Guam",
"Svalbard & Jan Mayen": "Svalbard & Ǧan Mayen",
"Uruguay": "Urugway",
"Indonesia": "Indunisya",
"Congo - Brazzaville": "Kungu - Brazavil",
"Montserrat": "Montserrat",
"U.S. Virgin Islands": "Tigzirin n Virǧin n Marikan",
"Paraguay": "Paṛagway",
"Iceland": "Island",
"Falkland Islands": "Tugzirin n fakland",
"Norfolk Island": "Tigzirtn n Nuṛfulk",
"Réunion": "Tigzirt n Riyunyun",
"Côte dIvoire": "Côte dIvoire",
"El Salvador": "Salvador",
"Belgium": "Biljik",
"Senegal": "Sinigal",
"Isle of Man": "Île de Man",
"Learn more": "Learn more",
"Sierra Leone": "Sirra Lyun",
"Seychelles": "Sicil",
"Niger": "Nigir",
"Andorra": "Andorre",
"Bolivia": "Bulivya",
"Solomon Islands": "Tigzirin n Salumun",
"Namibia": "Namibya",
"Germany": "Lalman",
"Belize": "Belize",
"Gambia": "Gambya",
"Portugal": "Puṛtugal",
"Burundi": "Burundi",
"American Samoa": "Samwa n Marikan",
"User settings": "Iɣewwaren n useqdac",
"Cocos (Keeling) Islands": "Tigzirin n kuku",
"Mauritania": "Muritanya",
"Gabon": "Gabun",
"Poland": "Pulunya",
"Comoros": "Kumuṛ",
"Taiwan": "Taiwan",
"Egypt": "Maṣer",
"Qatar": "Qatar",
"North Korea": "Kuriya n ugafa",
"Czech Republic": "Tagduda Tačikit",
"Saudi Arabia": "Tagelda Tasaɛudit taɛrabt",
"São Tomé & Príncipe": "Saw Ṭumi & Prinsip",
"Chile": "Cili",
"Palestine": "Falasṭin",
"Send feedback": "Azen takti-inek·inem",
"Australia": "Australie",
"Belarus": "Bilarus",
"Bhutan": "Buṭan",
"Mexico": "Miksik",
"Cyprus": "Cipr",
"Latvia": "Liṭṭunya",
"Zambia": "Ẓambya",
"Tonga": "Tatungit",
"Singapore": "Singapour",
"Effects": "Effets",
"Djibouti": "Djibouti",
"Montenegro": "Muntinigru",
"Hungary": "Hungarya",
"Cuba": "Kuba",
"Monaco": "Monaco",
"Antarctica": "Antartique",
"Pitcairn Islands": "Tigzirin n Pitkaṛn",
"Malaysia": "Malizya",
"Unpin": "Kkes asenteḍ",
"Jordan": "Urdun",
"Safeguard against losing access to encrypted messages & data": "Seḥbiber iman-ik·im mgal asruḥu n unekcum ɣer yiznann & yisefka yettwawgelhen",
"Kosovo": "Kuṣuvu",
"South Korea": "Kuriya n uwezlu",
"Dominica": "Dominique",
"Kenya": "Kinya",
"Oman": "ɛuman",
"Colombia": "Kulumbya",
"Canada": "Kanada",
"Aruba": "Aruba",
"Japan": "Japun",
"Fill Screen": "Ačcar agdil",
"Fiji": "Fidji",
"Unable to access microphone": "Anekcum ɣer usawaḍ ulamek",
"Nigeria": "Nijirya",
"St. Barthélemy": "St. Barthélemy",
"Guadeloupe": "Guadeloupe",
"Trinidad & Tobago": "Ṭrindad & Ṭubagu",
"Turkey": "Ṭṭerk",
"Macau": "Macao",
"Mayotte": "Mayotte",
"Costa Rica": "Costa Rica",
"Afghanistan": "Afɣanistan",
"Angola": "Angula",
"Approve": "Qbel",
"Heard & McDonald Islands": "Tigzirin n Hird d Tigzirin n MakDunald",
"Puerto Rico": "Porto Rico",
"Suriname": "Surinam",
"Tanzania": "Tanẓanya",
"Pakistan": "Pakistan",
"Bahamas": "Bahamas",
"Myanmar": "Myanmaṛ",
"San Marino": "Saint-Marin",
"Bahrain": "Bahreïn",
"Gibraltar": "Gibraltar",
"Sri Lanka": "Sri Lanka",
"Nepal": "Nipal",
"Nauru": "Nauru",
"Vanuatu": "Vanuyatu",
"Switzerland": "Sswis",
"South Africa": "Tafriqt n Wenẓul",
"Move left": "Mutti s azelmaḍ",
"Cayman Islands": "Tigzirin n Kayman",
"Move right": "Mutti s ayfus",
"Romania": "Rumanya",
"Western Sahara": "Ṣaḥṛa Tutrimt",
"Enter phone number": "Sekcem uṭṭun n tiliɣri",
"Sudan": "Sudan",
"Honduras": "Hunduṛas",
"Hong Kong": "Hong Kong",
"Congo - Kinshasa": "Kungu - Kincasa",
"Brunei": "Brunei",
"Finland": "Finland",
"Algeria": "Zzayer",
"Role": "Tamlit",
"Tunisia": "Tunes",
"Equatorial Guinea": "Ginya Tasebgast",
"Swaziland": "Swis",
"Azerbaijan": "Azerbiǧan",
"Faroe Islands": "Tigzirin n Fiṛuwi",
"India": "Lhend",
"South Georgia & South Sandwich Islands": "Tigzirin n Jyuṛjya n Unzul akked Sandwič n Unẓul",
"Israel": "Israyil",
"Samoa": "Samoa",
"St. Kitts & Nevis": "san Kits & Nivis",
"St. Helena": "San Ilina",
"Albania": "Albaniya",
"Syria": "Surya",
"Ghana": "Gana",
"Argentina": "Argentine",
"Spain": "Spenyul",
"Resume": "kemmel",
"Jersey": "Jersey",
"France": "Fransa",
"Kyrgyzstan": "Kirgizistan",
"Voice Call": "Asiwel aɣectan",
"Caribbean Netherlands": "Timura Karaib n hulund",
"China": "Ccinwa",
"South Sudan": "Sudan n Wenzul",
"Mozambique": "Muzumbik",
"Martinique": "Martinique",
"Ecuador": "Ikwaduṛ",
"Marshall Islands": "Tigzirin Marcal",
"Wallis & Futuna": "Wallis & Futuna",
"Denmark": "Danmark",
"Vatican City": "Vatikan",
"Vietnam": "Vyiṭnam",
"Malta": "Malte",
"Papua New Guinea": "Papwazi-Ginya-Tamaynut",
"British Virgin Islands": "Tigzirin n Virǧin n gliz",
"Georgia": "Georgia",
"Bermuda": "Bermudes",
"Dominican Republic": "Duminik",
"St. Martin": "San Maṛtan",
"Serbia": "Ṣirbya",
"Italy": "Ṭelyan",
"Lebanon": "Liban",
"Slovenia": "Sluvinya",
"Northern Mariana Islands": "Tigzirin n Maṛyan n uwezlu",
"Kazakhstan": "Kazaxistan",
"French Polynesia": "Pulinizya n Fṛansa",
"Bouvet Island": "Tigzirin Buvet",
"French Guiana": "Giyan n Fṛansa",
"Ethiopia": "Ityupya",
"Comment": "Awennit",
"Turks & Caicos Islands": "Ṭurk & Tegzirin n Kaykus",
"Åland Islands": "Tigzirin n Aland",
"Tuvalu": "Tuvalu",
"Liberia": "Libiriya",
"Maldives": "Maldives",
"Greece": "Legrig",
"Mongolia": "Mungulya",
"Togo": "Ṭugu",
"United Kingdom": "Tagelda Yeddukklen",
"Palau": "Palaos",
"Grenada": "Grenade",
"United States": "Iwanaken-Yeddukklen-N-Temrikt",
"New Caledonia": "Kaliduni amaynut",
"You've reached the maximum number of simultaneous calls.": "Tessawḍeḍ amḍan n yisawalen afellay yemseḍfaren.",
"Too Many Calls": "Ddeqs n yisawalen",
"No other application is using the webcam": "Ulac asnas-nniḍen i iseqdacen takamiṛat",
"Permission is granted to use the webcam": "Tettynefk tsiregt i useqdec takamiṛat",
"A microphone and webcam are plugged in and set up correctly": "Asawaḍ d tkamiṛat qqnen yerna ttusewlen akken iwata",
"Call failed because webcam or microphone could not be accessed. Check that:": "Asiwel ur yeddi ara aku takamiṛat neɣ asawaḍ ulac anekum ɣur-s. Senqed aya:",
"Unable to access webcam / microphone": "Anekcum ɣer tkamiṛat / usawaḍ d awezɣi",
"The call was answered on another device.": "Tiririt ɣef usiwel tella-d ɣef yibenk-nniḍen.",
"Answered Elsewhere": "Yerra-d seg wadeg-nniḍen",
"The call could not be established": "Asiwel ur yeqεid ara",
"The other party declined the call.": "Amdan-nniḍen yugi asiwel."
}

View File

@ -340,7 +340,7 @@
"File to import": "In te lezen bestand",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Hiermee kunt u de sleutels van uw ontvangen berichten in versleutelde gesprekken naar een lokaal bestand wegschrijven. Als u dat bestand dan in een andere Matrix-cliënt inleest kan die ook die berichten ontcijferen.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Wie het weggeschreven bestand kan lezen, kan daarmee ook alle versleutelde berichten die u kunt zien ontcijferen - ga er dus zorgvuldig mee om! Daartoe kunt u hieronder een wachtwoord invoeren, dat dan gebruikt zal worden om het bestand te versleutelen. Het is dan enkel mogelijk de gegevens in te lezen met hetzelfde wachtwoord.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het weggeschreven bestand is beveiligd met een wachtwoord. Voer dat wachtwoord hier in om het bestand te ontsleutelen.",
"You must join the room to see its files": "Slechts na toetreding tot het gesprek zult u de bestanden kunnen zien",
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s de uitnodigingen weigeren",
@ -449,7 +449,7 @@
"Unban this user?": "Deze gebruiker ontbannen?",
"Ban this user?": "Deze gebruiker verbannen?",
"Mirror local video feed": "Lokale videoaanvoer ook elders opslaan (spiegelen)",
"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Zelfdegradatie is onomkeerbaar. Als u de laatste bevoorrechte gebruiker in het gesprek bent zullen deze rechten voorgoed verloren gaan.",
"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Zelfdegradatie is onomkeerbaar. Als u de laatste bevoorrechte gebruiker in het gesprek bent zullen deze rechten voorgoed verloren gaan.",
"Unignore": "Niet meer negeren",
"Ignore": "Negeren",
"Jump to read receipt": "Naar het laatst gelezen bericht gaan",
@ -607,7 +607,7 @@
"Community %(groupId)s not found": "Gemeenschap %(groupId)s is niet gevonden",
"Failed to load %(groupId)s": "Laden van %(groupId)s is mislukt",
"Old cryptography data detected": "Oude cryptografiegegevens gedetecteerd",
"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.": "Er zijn gegevens van een oudere versie van %(brand)s gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontsleutelbaar in deze versie. Ook kunnen berichten die met deze versie uitgewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.",
"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.": "Er zijn gegevens van een oudere versie van %(brand)s gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontsleutelbaar in deze versie. Ook kunnen berichten die met deze versie uitgewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.",
"Your Communities": "Uw gemeenschappen",
"Error whilst fetching joined communities": "Er is een fout opgetreden bij het ophalen van de gemeenschappen waarvan u lid bent",
"Create a new community": "Maak een nieuwe gemeenschap aan",
@ -635,7 +635,7 @@
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Of u de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt",
"Your homeserver's URL": "De URL van uw thuisserver",
"<a>In reply to</a> <pill>": "<a>Als antwoord op</a> <pill>",
"This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.",
"This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.",
"were unbanned %(count)s times|one": "zijn ontbannen",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft %(displayName)s als weergavenaam aangenomen.",
"Key request sent.": "Sleutelverzoek verstuurd.",
@ -1029,7 +1029,7 @@
"Language and region": "Taal en regio",
"Theme": "Thema",
"Account management": "Accountbeheer",
"Deactivating your account is a permanent action - be careful!": "Pas op! Het sluiten van uw account is onherroepelijk!",
"Deactivating your account is a permanent action - be careful!": "Pas op! Het sluiten van uw account is onherroepelijk!",
"General": "Algemeen",
"Legal": "Wettelijk",
"Credits": "Met dank aan",
@ -1094,7 +1094,7 @@
"There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Er is een fout opgetreden bij het bijwerken van het hoofdadres van het gesprek. Dit wordt mogelijk niet toegestaan door de server, of er is een tijdelijk probleem opgetreden.",
"Main address": "Hoofdadres",
"Error updating flair": "Fout bij bijwerken van badge",
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Er is een fout opgetreden bij het bijwerken van de badge voor dit gesprek. Wellicht ondersteunt de server dit niet, of er is een tijdelijke fout opgetreden.",
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Er is een fout opgetreden bij het bijwerken van de badge voor dit gesprek. Wellicht ondersteunt de server dit niet, of er is een tijdelijke fout opgetreden.",
"Room avatar": "Gespreksavatar",
"Room Name": "Gespreksnaam",
"Room Topic": "Gespreksonderwerp",
@ -1228,16 +1228,16 @@
"Don't ask again": "Niet opnieuw vragen",
"New Recovery Method": "Nieuwe herstelmethode",
"A new recovery passphrase and key for Secure Messages have been detected.": "Er zijn een nieuw herstelwachtwoord en een nieuwe herstelsleutel voor beveiligde berichten gedetecteerd.",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat een aanvaller toegang tot uw account probeert te krijgen. Wijzig onmiddellijk uw accountwachtwoord en stel in het instellingenmenu een nieuwe herstelmethode in.",
"Go to Settings": "Ga naar instellingen",
"Set up Secure Messages": "Beveiligde berichten instellen",
"Recovery Method Removed": "Herstelmethode verwijderd",
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.",
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel in het instellingenmenu een nieuwe herstelmethode in.",
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members to the new version of the room.</i> We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "<b>Let op</b>: gesprekken bijwerken <i>voegt gespreksleden niet automatisch toe aan de nieuwe versie van het gesprek</i>. Er komt in het oude gesprek een koppeling naar het nieuwe, waarop gespreksleden moeten klikken om aan het nieuwe gesprek deel te nemen.",
"Adds a custom widget by URL to the room": "Voegt met een URL een aangepaste widget toe aan het gesprek",
"Please supply a https:// or http:// widget URL": "Voer een https://- of http://-widget-URL in",
"You cannot modify widgets in this room.": "U kunt de widgets in dit gesprek niet aanpassen.",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging aan %(targetDisplayName)s toe te treden tot het gesprek ingetrokken.",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging aan %(targetDisplayName)s toe te treden tot het gesprek ingetrokken.",
"Upgrade this room to the recommended room version": "Werk dit gesprek bij tot de aanbevolen versie",
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "Dit gesprek draait op groepsgespreksversie <roomVersion />, die door deze thuisserver als <i>onstabiel</i> is gemarkeerd.",
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Bijwerken zal de huidige versie van dit gesprek sluiten, en onder dezelfde naam een bijgewerkte versie starten.",
@ -1551,7 +1551,7 @@
"Setting up keys": "Sleutelconfiguratie",
"Verify this session": "Deze sessie verifiëren",
"Encryption upgrade available": "Er is een bijgewerkte versleuteling beschikbaar",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Typ <code>/help</code> om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Typ <code>/help</code> om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?",
"Help": "Hulp",
"Set up encryption": "Versleuteling instellen",
"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.": "Dit vergt validatie van een e-mailadres of telefoonnummer middels de standaardidentiteitsserver <server />, maar die server heeft geen gebruiksvoorwaarden.",
@ -1610,7 +1610,7 @@
"Enable message search in encrypted rooms": "Sta zoeken in versleutelde gesprekken toe",
"How fast should messages be downloaded.": "Ophaalfrequentie van berichten.",
"My Ban List": "Mijn banlijst",
"This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!",
"This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!",
"Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…",
"They match": "Ze komen overeen",
"They don't match": "Ze komen niet overeen",
@ -1756,7 +1756,7 @@
"Show rooms with unread notifications first": "Gesprekken met ongelezen meldingen eerst tonen",
"Show shortcuts to recently viewed rooms above the room list": "Snelkoppelingen naar de gesprekken die u recent heeft bekeken bovenaan de gesprekslijst weergeven",
"Cancelling…": "Bezig met annuleren…",
"%(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>.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop <nativeLink>die de zoekmodulen bevat</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>.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop <nativeLink>die de zoekmodulen bevat</nativeLink>.",
"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.": "Deze sessie <b>maakt geen back-ups van uw sleutels</b>, maar u beschikt over een reeds bestaande back-up waaruit u kunt herstellen en waaraan u nieuwe sleutels vanaf nu kunt toevoegen.",
"Customise your experience with experimental labs features. <a>Learn more</a>.": "Personaliseer uw ervaring met experimentele functies. <a>Klik hier voor meer informatie</a>.",
"Cross-signing": "Kruiselings ondertekenen",
@ -1884,7 +1884,7 @@
"Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifieer dit apparaat om het als vertrouwd te markeren. Door dit apparaat te vertrouwen geeft u extra gemoedsrust aan uzelf en andere gebruikers bij het gebruik van eind-tot-eind-versleutelde berichten.",
"Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Dit apparaat verifiëren zal het als vertrouwd markeren, en gebruikers die met u geverifieerd hebben zullen het vertrouwen.",
"Integrations are disabled": "Integraties zijn uitgeschakeld",
"Enable 'Manage Integrations' in Settings to do this.": "Schakel Beheer integraties in in de instellingen om dit te doen.",
"Enable 'Manage Integrations' in Settings to do this.": "Schakel in het Algemene Instellingenmenu Beheer integraties in om dit te doen.",
"Integrations not allowed": "Integraties niet toegestaan",
"Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.",
"Failed to invite the following users to chat: %(csvUsers)s": "Het uitnodigen van volgende gebruikers voor gesprek is mislukt: %(csvUsers)s",
@ -2009,13 +2009,13 @@
"Verify all your sessions to ensure your account & messages are safe": "Controleer al uw sessies om zeker te zijn dat uw account & berichten veilig zijn",
"Verify the new login accessing your account: %(name)s": "Verifieer de nieuwe aanmelding op uw account: %(name)s",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Bevestig uw intentie deze account te sluiten door met Single Sign On uw identiteit te bewijzen.",
"Are you sure you want to deactivate your account? This is irreversible.": "Weet u zeker dat u uw account wil sluiten? Dit is onomkeerbaar.",
"Are you sure you want to deactivate your account? This is irreversible.": "Weet u zeker dat u uw account wil sluiten? Dit is onomkeerbaar.",
"Confirm account deactivation": "Bevestig accountsluiting",
"Room name or address": "Gespreksnaam of -adres",
"Joins room with given address": "Neem aan het gesprek met dat adres deel",
"Unrecognised room address:": "Gespreksadres niet herkend:",
"Help us improve %(brand)s": "Help ons %(brand)s nog beter te maken",
"Send <UsageDataLink>anonymous usage data</UsageDataLink> which helps us improve %(brand)s. This will use a <PolicyLink>cookie</PolicyLink>.": "Stuur <UsageDataLink>anonieme gebruiksinformatie</UsageDataLink> waarmee we %(brand)s kunnen verbeteren. Dit plaatst een <PolicyLink>cookie</PolicyLink>.",
"Send <UsageDataLink>anonymous usage data</UsageDataLink> which helps us improve %(brand)s. This will use a <PolicyLink>cookie</PolicyLink>.": "Stuur <UsageDataLink>anonieme gebruiksinformatie</UsageDataLink> waarmee we %(brand)s kunnen verbeteren. Dit plaatst een <PolicyLink>cookie</PolicyLink>.",
"I want to help": "Ik wil helpen",
"Your homeserver has exceeded its user limit.": "Uw thuisserver heeft het maximaal aantal gebruikers overschreden.",
"Your homeserver has exceeded one of its resource limits.": "Uw thuisserver heeft een van zijn limieten overschreden.",
@ -2027,5 +2027,273 @@
"Restart": "Herstarten",
"People": "Tweegesprekken",
"Set a room address to easily share your room with other people.": "Geef het gesprek een adres om het gemakkelijk met anderen te kunnen delen.",
"Invite people to join %(communityName)s": "Stuur uitnodigingen voor %(communityName)s"
"Invite people to join %(communityName)s": "Stuur uitnodigingen voor %(communityName)s",
"Unable to access microphone": "Je microfoon lijkt niet beschikbaar",
"The call was answered on another device.": "De oproep werd op een ander toestel beantwoord.",
"Answered Elsewhere": "Ergens anders beantwoord",
"The call could not be established": "De oproep kon niet worden volbracht",
"The other party declined the call.": "De tegenpartij heeft je oproep afgewezen.",
"Call Declined": "Oproep Afgewezen",
"Bahrain": "Bahrein",
"Bahamas": "Bahama's",
"Azerbaijan": "Azerbeidzjan",
"Austria": "Oostenrijk",
"Australia": "Australië",
"Aruba": "Aruba",
"Armenia": "Armenië",
"Argentina": "Argentinië",
"Antigua & Barbuda": "Antigua & Barbuda",
"Antarctica": "Antarctica",
"Anguilla": "Anguilla",
"Angola": "Angola",
"Andorra": "Andorra",
"American Samoa": "Amerikaans Samoa",
"Algeria": "Algerije",
"Albania": "Albanië",
"Åland Islands": "Åland",
"Afghanistan": "Afghanistan",
"United States": "Verenigde Staten",
"United Kingdom": "Verenigd Koninkrijk",
"This will end the conference for everyone. Continue?": "Dit beëindigt de vergadering voor iedereen. Doorgaan?",
"End conference": "Beëindig vergadering",
"You've reached the maximum number of simultaneous calls.": "Je hebt het maximum aantal van gelijktijdige oproepen bereikt.",
"Too Many Calls": "Te veel oproepen",
"No other application is using the webcam": "Geen andere applicatie de camera gebruikt",
"Permission is granted to use the webcam": "Toegang tot de webcam is toegestaan",
"A microphone and webcam are plugged in and set up correctly": "Een microfoon en webcam zijn aangesloten en juist ingesteld",
"Call failed because webcam or microphone could not be accessed. Check that:": "Oproep mislukt omdat er geen toegang is tot de webcam of de microfoon. Kijk na dat:",
"Unable to access webcam / microphone": "Je webcam of microfoon lijkt niet beschikbaar",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Oproep mislukt omdat er geen toegang is tot de microfoon. Kijk na dat de microfoon juist is aangesloten en ingesteld.",
"Video conference started by %(senderName)s": "Videovergadering gestart door %(senderName)s",
"Video conference updated by %(senderName)s": "Videovergadering geüpdatet door %(senderName)s",
"Video conference ended by %(senderName)s": "Videovergadering beëindigt door %(senderName)s",
"Join the conference from the room information card on the right": "Neem deel aan de vergadering via de informatiekaart rechts",
"List options": "Lijstopties",
"A-Z": "A-Z",
"Activity": "Activiteit",
"Sort by": "Sorteer op",
"Compare emoji": "Vergelijk de emoji's",
"Verification cancelled": "Verificatie geannuleerd",
"You cancelled verification.": "Je hebt de verificatie geannuleerd.",
"%(displayName)s cancelled verification.": "%(displayName)s heeft de verificatie geannuleerd.",
"You cancelled verification on your other session.": "Je hebt de verificatie vanuit jouw andere sessie beëindigt.",
"Verification timed out.": "Verificatie verlopen.",
"Start verification again from their profile.": "Begin verificatie opnieuw vanaf hun profiel.",
"Romania": "Roemenië",
"St. Martin": "Sint Maarten/Sint-Maarten",
"St. Kitts & Nevis": "Saint Kitts en Nevis",
"St. Barthélemy": "Saint-Barthélemy",
"South Korea": "Zuid-Korea",
"Somalia": "Somalië",
"Papua New Guinea": "Papoea-Nieuw-Guinea",
"North Korea": "Noord-Korea",
"Netherlands": "Nederland",
"Malta": "Malta",
"Mali": "Mali",
"Macau": "Macau",
"Laos": "Laos",
"Kosovo": "Kosovo",
"India": "India",
"Guinea": "Guinee",
"Guinea-Bissau": "Guinee-Bissau",
"Gibraltar": "Gibraltar",
"Georgia": "Georgië",
"Equatorial Guinea": "Equatoriaal-Guinea",
"Dominican Republic": "Dominicaanse Republiek",
"Dominica": "Dominica",
"Czech Republic": "Tsjechië",
"Congo - Kinshasa": "Congo-Kinshasa",
"Congo - Brazzaville": "Congo-Brazzaville",
"Caribbean Netherlands": "Caribisch Nederland",
"Cape Verde": "Kaapverdië",
"British Indian Ocean Territory": "Brits Indische Oceaanterritorium",
"Zimbabwe": "Zimbabwe",
"Zambia": "Zambia",
"Yemen": "Jemen",
"Western Sahara": "Westelijke Sahara",
"Wallis & Futuna": "Wallis en Futuna",
"U.S. Virgin Islands": "Amerikaanse Maagdeneilanden",
"British Virgin Islands": "Britse Maagdeneilanden",
"Vietnam": "Vietnam",
"Venezuela": "Venezuela",
"Vanuatu": "Vanuatu",
"Uzbekistan": "Oezbekistan",
"Uruguay": "Uruguay",
"Ireland": "Verenigd Koninkrijk",
"United Arab Emirates": "Verenigde Arabische Emiraten",
"Ukraine": "Oekraïne",
"Uganda": "Oeganda",
"Tuvalu": "Tuvalu",
"Turks & Caicos Islands": "Turks- en Caicoseilanden",
"Turkmenistan": "Turkmenistan",
"Turkey": "Turkije",
"Tunisia": "Tunesië",
"Trinidad & Tobago": "Trinidad en Tobago",
"Tonga": "Tonga",
"Tokelau": "Tokelau",
"Togo": "Togo",
"Timor-Leste": "Oost-Timor",
"Thailand": "Thailand",
"Tanzania": "Tanzania",
"Tajikistan": "Tadzjikistan",
"Syria": "Syrië",
"Switzerland": "Zwitserland",
"Sweden": "Zweden",
"Svalbard & Jan Mayen": "Spitsbergen en Jan Mayen",
"Suriname": "Suriname",
"Sri Lanka": "Sri Lanka",
"Spain": "Spanje",
"South Africa": "Zuid-Afrika",
"Solomon Islands": "Salomonseilanden",
"Slovenia": "Slovenië",
"Slovakia": "Slowakije",
"Sint Maarten": "Sint Maarten",
"Singapore": "Singapore",
"Sierra Leone": "Sierra Leone",
"Seychelles": "Seychellen",
"Serbia": "Servië",
"Senegal": "Senegal",
"Saudi Arabia": "Saoedi-Arabië",
"San Marino": "San Marino",
"Samoa": "Samoa",
"Rwanda": "Rwanda",
"Russia": "Rusland",
"Réunion": "Réunion",
"Qatar": "Qatar",
"Puerto Rico": "Puerto Rico",
"Portugal": "Portugal",
"Poland": "Polen",
"Pitcairn Islands": "Pitcairneilanden",
"Philippines": "Filipijnen",
"Peru": "Peru",
"Paraguay": "Paraguay",
"Panama": "Panama",
"Palestine": "Palestina",
"Palau": "Palau",
"Pakistan": "Pakistan",
"Norway": "Noorwegen",
"Northern Mariana Islands": "Noordelijke Marianen",
"Macedonia": "Noord-Macedonië",
"Norfolk Island": "Norfolk",
"Niue": "Niue",
"Nigeria": "Nigeria",
"Niger": "Niger",
"Nicaragua": "Nicaragua",
"New Zealand": "Nieuw-Zeeland",
"New Caledonia": "Nieuw-Caledonië",
"Nepal": "Nepal",
"Nauru": "Nauru",
"Namibia": "Namibië",
"Myanmar": "Myanmar",
"Mozambique": "Mozambique",
"Morocco": "Marokko",
"Montserrat": "Montserrat",
"Montenegro": "Montenegro",
"Mongolia": "Mongolië",
"Monaco": "Monaco",
"Moldova": "Moldavië",
"Micronesia": "Micronesia",
"Mexico": "Mexico",
"Mayotte": "Mayotte",
"Mauritius": "Mauritius",
"Mauritania": "Mauritanië",
"Martinique": "Martinique",
"Marshall Islands": "Marshalleilanden",
"Maldives": "Maldiven",
"Malaysia": "Maleisië",
"Malawi": "Malawi",
"Madagascar": "Madagaskar",
"Luxembourg": "Luxemburg",
"Lithuania": "Litouwen",
"Liechtenstein": "Liechtenstein",
"Libya": "Libië",
"Liberia": "Liberia",
"Lesotho": "Lesotho",
"Lebanon": "Libanon",
"Latvia": "Letland",
"Kyrgyzstan": "Kirgizië",
"Kuwait": "Koeweit",
"Kiribati": "Kiribati",
"Kenya": "Kenia",
"Kazakhstan": "Kazachstan",
"Jordan": "Jordanië",
"Jersey": "Jersey",
"Japan": "Japan",
"Jamaica": "Jamaica",
"Italy": "Italië",
"Israel": "Israël",
"Isle of Man": "Man",
"Iraq": "Irak",
"Iran": "Iran",
"Indonesia": "Indonesië",
"Iceland": "IJsland",
"Hungary": "Hongarije",
"Hong Kong": "Hongkong",
"Honduras": "Honduras",
"Heard & McDonald Islands": "Heard en McDonaldeilanden",
"Haiti": "Haïti",
"Guyana": "Guyana",
"Guernsey": "Guernsey",
"Guatemala": "Guatemala",
"Guam": "Guam",
"Guadeloupe": "Guadeloupe",
"Grenada": "Grenada",
"Greenland": "Groenland",
"Greece": "Griekenland",
"Ghana": "Ghana",
"Germany": "Duitsland",
"Gambia": "Gambia",
"Gabon": "Gabon",
"French Southern Territories": "Franse Zuidelijke en Antarctische Gebieden",
"French Polynesia": "Frans-Polynesië",
"French Guiana": "Frans-Guyana",
"France": "Frankrijk",
"Finland": "Finland",
"Fiji": "Fiji",
"Faroe Islands": "Faeröer",
"Falkland Islands": "Falklandeilanden",
"Ethiopia": "Ethiopië",
"Estonia": "Estland",
"Eritrea": "Eritrea",
"El Salvador": "El Salvador",
"Egypt": "Egypte",
"Ecuador": "Ecuador",
"Djibouti": "Djibouti",
"Denmark": "Denemarken",
"Cyprus": "Cyprus",
"Curaçao": "Curaçao",
"Cuba": "Cuba",
"Croatia": "Kroatië",
"Côte dIvoire": "Ivoorkust",
"Costa Rica": "Costa Rica",
"Cook Islands": "Cookeilanden",
"Comoros": "Comoren",
"Colombia": "Colombia",
"Cocos (Keeling) Islands": "Cocoseilanden",
"Christmas Island": "Christmaseiland",
"China": "China",
"Chile": "Chili",
"Chad": "Tsjaad",
"Central African Republic": "Centraal-Afrikaanse Republiek",
"Cayman Islands": "Kaaimaneilanden",
"Canada": "Canada",
"Cameroon": "Kameroen",
"Cambodia": "Cambodja",
"Burundi": "Burundi",
"Burkina Faso": "Burkina Faso",
"Bulgaria": "Bulgarije",
"Brunei": "Brunei",
"Brazil": "Brazilië",
"Bouvet Island": "Bouveteiland",
"Botswana": "Botswana",
"Bosnia": "Bosnië en Herzegovina",
"Bolivia": "Bolivia",
"Bhutan": "Bhutan",
"Bermuda": "Bermuda",
"Benin": "Benin",
"Belize": "Belize",
"Belgium": "België",
"Belarus": "Wit-Rusland",
"Barbados": "Barbados",
"Bangladesh": "Bangladesh"
}

View File

@ -744,7 +744,7 @@
"Labs": "Labben",
"Check for update": "Sjå etter oppdateringar",
"Reject all %(invitedRooms)s invites": "Kanseller alle invitasjonar frå %(invitedRooms)s",
"Start automatically after system login": "Start automagisk etter systeminnlogging",
"Start automatically after system login": "Start automatisk etter systeminnlogging",
"No media permissions": "Ingen mediatilgang",
"You may need to manually permit %(brand)s to access your microphone/webcam": "Det kan henda at du må gje %(brand)s tilgang til mikrofonen/nettkameraet for hand",
"No Audio Outputs detected": "Ingen ljodavspelingseiningar funne",
@ -1332,5 +1332,44 @@
"Order rooms by name": "Sorter rom etter namn",
"Show rooms with unread notifications first": "Vis rom med ulesne varsel fyrst",
"Show rooms with unread messages first": "Vis rom med ulesne meldingar fyrst",
"People": "Folk"
"People": "Folk",
"Show tray icon and minimize window to it on close": "Vis ikon i systemstatusfeltet og minimer vindauget dit ved lukking",
"Always show the window menu bar": "Vis alltid menyfeltet i toppen av vindauget",
"Report a bug": "Send inn feilrapport",
"%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please <issueLink>submit a bug report</issueLink>.": "Feilkode %(errcode)s vart returnert under lasting av rommet. Viss du trur dette er ein feil, <issueLink>send inn ein feilrapport</issueLink>.",
"Feedback": "Tilbakemeldingar",
"Security & privacy": "Sikkerheit og personvern",
"All settings": "Alle innstillingar",
"Use default": "Bruk standard",
"Delete Backup": "Slett sikkerheitskopi",
"Restore from Backup": "Gjenopprett frå sikkerheitskopi",
"This session is backing up your keys. ": "Denne økta har aktivert sikkerheitskopiering av nøklane dine ",
"Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Lag sikkerheitskopiar av krypteringsnøklane saman med kontoinnstillingane, slik at du kan gjenopprette data viss det skulle skje at du å mister tilgang til øktene dine. Sikkerheitskopiane er beskytta med ein unik gjenopprettingsnøkkel (Recovery Key).",
"Encryption": "Kryptografi",
"Use Ctrl + Enter to send a message": "Bruk tastekombinasjonen Ctrl + Enter for å sende meldingar",
"Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Skriv namnet på skrifttypen(fonten) og %(brand)s forsøka å henta den frå operativsystemet.",
"Use a system font": "Bruk tilpassa skrifttype henta frå operativsystemet",
"System font name": "Namn på skrifttype",
"Enable experimental, compact IRC style layout": "Bruk ei kompakt, IRC-liknande visning (eksperimentell)",
"Use a more compact Modern layout": "Bruk 'Modern layout' - ei meir kompakt visning",
"Custom font size can only be between %(min)s pt and %(max)s pt": "Tilpassa skriftstorleik må vere mellom %(min)s og %(max)s punkt",
"Font size": "Skriftstorleik",
"Dark": "Mørkt tema",
"Light": "Lyst tema",
"Appearance": "Utsjånad",
"Appearance Settings only affect this %(brand)s session.": "Innstillingane gjeld berre for denne %(brand)s-økta.",
"Customise your appearance": "Tilpass utsjånad",
"Change notification settings": "Endra varslingsinnstillingar",
"Enable desktop notifications": "Aktiver skrivebordsvarsel",
"Toggle video on/off": "Slå video på/av",
"Video conference started by %(senderName)s": "Videokonferanse starta av %(senderName)s",
"Video conference updated by %(senderName)s": "Videokonferanse oppdatert av %(senderName)s",
"Video conference ended by %(senderName)s": "Videokonferanse avslutta av %(senderName)s",
"Show previews of messages": "Vis førehandsvisningar for meldingar",
"Activity": "Aktivitet",
"Sort by": "Sorter etter",
"List options": "Sjå alternativ",
"Explore Public Rooms": "Utforsk offentlege rom",
"Explore all public rooms": "Utforsk alle offentlege rom",
"Explore public rooms": "Utforsk offentlege rom"
}

View File

@ -1970,5 +1970,70 @@
"Mayotte": "Majotta",
"Mauritius": "Mauritius",
"Mauritania": "Mauretania",
"Martinique": "Martynika"
"Martinique": "Martynika",
"Room %(name)s": "Pokój %(name)s",
"This is the start of <roomName/>.": "Oto początek <roomName/>.",
"Add a photo, so people can easily spot your room.": "Dodaj zdjęcie, aby inni mogli łatwo zauważyć Twój pokój.",
"%(displayName)s created this room.": "%(displayName)s utworzył(a) ten pokój.",
"You created this room.": "Utworzyłeś(-aś) ten pokój.",
"Topic: %(topic)s ": "Temat: %(topic)s ",
"Topic: %(topic)s (<a>edit</a>)": "Temat: %(topic)s (<a>edytuj</a>)",
"Only the two of you are in this conversation, unless either of you invites anyone to join.": "Tylko Wy jesteście w tej konwersacji, dopóki ktoś z Was nie zaprosi tu innej osoby.",
"This is the beginning of your direct message history with <displayName/>.": "Oto początek historii Twojej rozmowy bezpośredniej z <displayName/>.",
"%(count)s results|other": "%(count)s wyniki(-ów)",
"Security & privacy": "Bezpieczeństwo i prywatność",
"Start chatting": "Rozpocznij rozmowę",
"<userName/> wants to chat": "<userName/> chce porozmawiać",
"Rejecting invite …": "Odrzucanie zaproszenia…",
"Use the + to make a new room or explore existing ones below": "Użyj + aby utworzyć nowy pokój, lub przeglądaj istniejące poniżej",
"%(count)s results|one": "%(count)s wynik",
"Custom Tag": "Niestandardowy tag",
"Explore community rooms": "Przeglądaj pokoje społeczności",
"Hide Widgets": "Ukryj widgety",
"No recently visited rooms": "Brak ostatnio odwiedzonych pokoi",
"Show Widgets": "Pokaż widgety",
"Can't see what youre looking for?": "Nie możesz znaleźć tego, czego szukasz?",
"Start a new chat": "Rozpocznij nową rozmowę",
"Change the name of this room": "Zmień nazwę tego pokoju",
"Interactively verify by Emoji": "Zweryfikuj interaktywnie przez Emoji",
"Not Trusted": "Nie zaufany(-a)",
"Ask this user to verify their session, or manually verify it below.": "Poproś go/ją o zweryfikowanie tej sesji bądź zweryfikuj ją osobiście poniżej.",
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s%(userId)s zalogował(a) się do nowej sesji bez zweryfikowania jej:",
"Verify your other session using one of the options below.": "Zweryfikuj swoje pozostałe sesje używając jednej z opcji poniżej.",
"You signed in to a new session without verifying it:": "Zalogowałeś się do nowej sesji bez jej zweryfikowania;",
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą serwery pasujące do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s",
"%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą pokoje pasujące do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s",
"%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą użytkowników pasujących do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s",
"%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą serwery pasujące do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą pokoje pasujące do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą użytkowników pasujących do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą serwery pasujące do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą pokoje pasujące do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą użytkowników pasujących do wzorca %(glob)s z powodu %(reason)s",
"%(senderName)s updated an invalid ban rule": "%(senderName)s zaktualizował nieprawidłową regułę banującą",
"%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s usunął regułę banującą serwery pasujące do wzorca %(glob)s",
"%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s usunął regułę banującą pokoje pasujące do wzorca %(glob)s",
"%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s usunął regułę banującą użytkowników pasujących do wzorca %(glob)s",
"%(senderName)s declined the call.": "%(senderName)s odrzucił(a) połączenie.",
"(an error occurred)": "(wystąpił błąd)",
"(their device couldn't start the camera / microphone)": "(ich urządzenie nie może uruchomić kamery / mikrofonu)",
"(connection failed)": "(połączenie nieudane)",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s usunął(-ęła) alternatywny adres %(addresses)s tego pokoju.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s usunął(-ęła) alternatywny adres %(addresses)s tego pokoju.",
"🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Wszystkie serwery zostały wykluczone z uczestnictwa! Ten pokój nie może być już używany.",
"Effects": "Efekty",
"Japan": "Japonia",
"Jamaica": "Jamajka",
"Italy": "Włochy",
"You've reached the maximum number of simultaneous calls.": "Osiągnięto maksymalną liczbę jednoczesnych połączeń.",
"Too Many Calls": "Zbyt wiele połączeń",
"No other application is using the webcam": "Kamera nie jest obecnie używana przez inną aplikację",
"Permission is granted to use the webcam": "Przyznano uprawnienia dostępu do kamery",
"A microphone and webcam are plugged in and set up correctly": "Mikrofon i kamera są podpięte i skonfigurowane prawidłowo",
"Call failed because webcam or microphone could not be accessed. Check that:": "Połączenie nieudane z powodu braku dostępu do kamery bądź mikrofonu. Sprawdź czy:",
"Unable to access webcam / microphone": "Nie można uzyskać dostępu do kamery / mikrofonu",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Nie udało się zestawić połączenia z powodu braku dostępu do mikrofonu. Sprawdź czy mikrofon jest podłączony i poprawnie skonfigurowany.",
"Unable to access microphone": "Nie można uzyskać dostępu do mikrofonu",
"Forgot password?": "Nie pamiętasz hasła?",
"Use an identity server to invite by email. Manage in <settings>Settings</settings>.": "Użyj serwera tożsamości, aby zapraszać przez e-mail. Zarządzaj w <settings>Ustawieniach</settings>."
}

View File

@ -2903,5 +2903,14 @@
"You held the call <a>Resume</a>": "Você pausou a chamada <a>Retomar</a>",
"You've reached the maximum number of simultaneous calls.": "Você atingiu o número máximo de chamadas simultâneas.",
"Too Many Calls": "Muitas chamadas",
"%(name)s paused": "%(name)s pausou"
"%(name)s paused": "%(name)s pausou",
"You held the call <a>Switch</a>": "Você pausou a chamada <a>Retomar</a>",
"%(name)s on hold": "%(name)s em espera",
"sends snowfall": "envia neve caindo",
"Sends the given message with snowfall": "Envia a mensagem com neve caindo",
"sends fireworks": "envia fogos de artifício",
"Sends the given message with fireworks": "Envia a mensagem com fogos de artifício",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Adiciona ┬──┬ ( ゜-゜ノ) a uma mensagem de texto simples",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Adiciona (╯°□°)╯︵ ┻━┻ a uma mensagem de texto",
"You have no visible notifications.": "Não há notificações."
}

View File

@ -2455,7 +2455,7 @@
"User settings": "Пользовательские настройки",
"Community and user menu": "Сообщество и меню пользователя",
"Privacy": "Конфиденциальность",
"Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Добавляет ( ͡° ͜ʖ ͡°) к текстовому сообщению",
"Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Добавляет ( ͡° ͜ʖ ͡°) в начало сообщения",
"Unknown App": "Неизвестное приложение",
"%(count)s results|one": "%(count)s результат",
"Room Info": "Информация о комнате",
@ -2963,5 +2963,17 @@
"You held the call <a>Resume</a>": "Вы удерживаете звонок <a>Возобновить</a>",
"%(name)s paused": "%(name)s приостановлен",
"You've reached the maximum number of simultaneous calls.": "Вы достигли максимального количества одновременных звонков.",
"Too Many Calls": "Слишком много звонков"
"Too Many Calls": "Слишком много звонков",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Добавляет ┬──┬ ( ゜-゜ノ) в начало сообщения",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Добавляет (╯°□°)╯︵ ┻━┻ в начало сообщения",
"sends fireworks": "отправляет фейерверк",
"Sends the given message with fireworks": "Отправляет сообщение с фейерверком",
"%(name)s on hold": "%(name)s на удержании",
"You held the call <a>Switch</a>": "Вы удерживаете звонок <a>Переключить</a>",
"sends snowfall": "отправляет снегопад",
"Sends the given message with snowfall": "Отправляет сообщение со снегопадом",
"You have no visible notifications.": "У вас нет видимых уведомлений.",
"Transfer": "Перевод",
"Failed to transfer call": "Не удалось перевести звонок",
"A call can only be transferred to a single user.": "Вызов может быть передан только одному пользователю."
}

View File

@ -807,7 +807,7 @@
"If you have previously used a more recent version of %(brand)s, your session may be incompatible with this version. Close this window and return to the more recent version.": "Nëse më herët keni përdorur një version më të freskët të %(brand)s-it, sesioni juaj mund të jetë i papërputhshëm me këtë version. Mbylleni këtë dritare dhe kthehuni te versioni më i ri.",
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Spastrimi i gjërave të depozituara në shfletuesin tuaj mund ta ndreqë problemin, por kjo do të sjellë nxjerrjen tuaj nga llogari dhe do ta bëjë të palexueshëm çfarëdo historiku të fshehtëzuar të bisedës.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Nëse keni tashmë një llogari Matrix, mund <a>të bëni hyrjen</a>.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Krijoni një bashkësi që bëni tok përdorues dhe dhoma! Krijoni një faqe hyrëse vetjake, që të ravijëzoni hapësirën tuaj në universin Matrix.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Krijoni një bashkësi që bëni tok përdorues dhe dhoma! Krijoni një faqe hyrëse vetjake, që të ravijëzoni hapësirën tuaj në universin Matrix.",
"Sent messages will be stored until your connection has returned.": "Mesazhet e dërguar do të depozitohen deri sa lidhja juaj të jetë rikthyer.",
"Server may be unavailable, overloaded, or search timed out :(": "Shërbyesi mund të jetë i pakapshëm, i mbingarkuar, ose kërkimit i mbaroi koha :(",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Nëse parashtruat një të metë përmes GitHub-it, regjistrat e diagnostikimit mund të na ndihmojnë të ndjekim problemin. Regjistrat e diagnostikimit përmbajnë të dhëna përdorimi, përfshi emrin tuaj të përdoruesit, ID-të ose aliaset e dhomave apo grupeve që keni vizituar dhe emrat e përdoruesve të përdoruesve të tjerë. Në to nuk përmbahen mesazhet.",
@ -2963,5 +2963,16 @@
"You've reached the maximum number of simultaneous calls.": "Keni mbërritur në numrin maksimum të thirrjeve të njëkohshme.",
"Too Many Calls": "Shumë Thirrje",
"Call failed because webcam or microphone could not be accessed. Check that:": "Thirrja dështoi, ngaqë su hy dot kamera ose mikrofoni. Kontrolloni që:",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thirrja dështoi, ngaqë su hy dot te mikrofoni. Kontrolloni që të jetë futur një mikrofon dhe të jetë ujdisur saktësisht."
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thirrja dështoi, ngaqë su hy dot te mikrofoni. Kontrolloni që të jetë futur një mikrofon dhe të jetë ujdisur saktësisht.",
"sends fireworks": "dërgon fishekzjarrë",
"Sends the given message with fireworks": "E dërgon me fishekzjarrë mesazhin e dhënë",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me ┬──┬ ( ゜-゜ノ)",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻",
"%(name)s on hold": "%(name)s e mbajtur",
"sends snowfall": "dërgon rënie bore",
"Sends the given message with snowfall": "E dërgon mesazhin e dhënë të stolisur me rënie bore",
"You have no visible notifications.": "Skeni njoftime të dukshme.",
"Transfer": "Shpërngule",
"Failed to transfer call": "Su arrit të shpërngulej thirrje",
"A call can only be transferred to a single user.": "Një thirrje mund të shpërngulet vetëm te një përdorues."
}

View File

@ -1902,7 +1902,7 @@
"Show %(count)s more|other": "Visa %(count)s till",
"Show %(count)s more|one": "Visa %(count)s till",
"Use default": "Använd förval",
"Mentions & Keywords": "Benämningar & nyckelord",
"Mentions & Keywords": "Omnämnanden & nyckelord",
"Notification options": "Aviseringsinställningar",
"Forget Room": "Glöm rum",
"Favourited": "Favoritmarkerade",
@ -2860,5 +2860,66 @@
"Show chat effects": "Visa chatteffekter",
"Effects": "Effekter",
"Call failed because webcam or microphone could not be accessed. Check that:": "Samtal misslyckades eftersom webbkamera eller mikrofon inte kunde kommas åt. Kolla att:",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Samtal misslyckades eftersom att mikrofonen inte kunde kommas åt. Kolla att en mikrofon är inkopplat och korrekt inställd."
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Samtal misslyckades eftersom att mikrofonen inte kunde kommas åt. Kolla att en mikrofon är inkopplat och korrekt inställd.",
"Go to Home View": "Gå till hemvyn",
"Decide where your account is hosted": "Bestäm var ditt konto finns",
"Host account on": "Skapa kontot på",
"Already have an account? <a>Sign in here</a>": "Har du redan ett konto? <a>Logga in här</a>",
"%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Eller %(usernamePassword)s",
"Continue with %(ssoButtons)s": "Fortsätt med %(ssoButtons)s",
"That username already exists, please try another.": "Det användarnamnet finns redan, vänligen pröva ett annat.",
"New? <a>Create account</a>": "Ny? <a>Skapa konto</a>",
"There was a problem communicating with the homeserver, please try again later.": "Ett problem inträffade vi kommunikation med hemservern, vänligen försök igen senare.",
"New here? <a>Create an account</a>": "Ny här? <a>Skapa ett konto</a>",
"Got an account? <a>Sign in</a>": "Har du ett konto? <a>Logga in</a>",
"Filter rooms and people": "Filtrera rum och personer",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even add images with Matrix URLs <img src=\"mxc://url\" />\n</p>\n": "<h1>HTML för din gemenskaps sida</h1>\n<p>\n Använd den långa beskrivningen för att introducera nya medlemmar till gemenskapen, eller\n sprida några viktiga <a href=\"foo\">länkar</a>\n</p>\n<p>\n Du kan till och med lägga till bilder med Matrix-URLer <img src=\"mxc://url\" />\n</p>\n",
"Use email to optionally be discoverable by existing contacts.": "Använd e-post för att valfritt kunna upptäckas av existerande kontakter.",
"Use email or phone to optionally be discoverable by existing contacts.": "Använd e-post eller telefon för att valfritt kunna upptäckas av existerande kontakter.",
"Add an email to be able to reset your password.": "Lägg till en e-postadress för att kunna återställa ditt lösenord.",
"Forgot password?": "Glömt lösenordet?",
"That phone number doesn't look quite right, please check and try again": "Det telefonnumret ser inte korrekt ut, vänligen kolla det och försök igen",
"Enter phone number": "Ange telefonnummer",
"Enter email address": "Ange e-postadress",
"Open the link in the email to continue registration.": "Öppna länken i e-brevet för att fortsätta registreringen.",
"A confirmation email has been sent to %(emailAddress)s": "Ett bekräftelse-e-brev har skickats till %(emailAddress)s",
"Hold": "Parkera",
"Resume": "Återuppta",
"Decline All": "Neka alla",
"Approve": "Godta",
"This widget would like to:": "Den här widgeten skulle vilja:",
"Approve widget permissions": "Godta widgetbehörigheter",
"About homeservers": "Om hemservrar",
"Learn more": "Läs mer",
"Use your preferred Matrix homeserver if you have one, or host your own.": "Använd din föredragna hemserver om du har en, eller driv din egen.",
"We call the places where you can host your account homeservers.": "Vi kallar platser där du kan ha ditt konto 'hemservrar'.",
"Other homeserver": "Annan hemserver",
"Sign into your homeserver": "Logga in på din hemserver",
"Matrix.org is the biggest public homeserver in the world, so its a good place for many.": "Matrix.org är den största offentliga hemservern i världen, så den är ett bra ställe för många.",
"Specify a homeserver": "Specificera en hemserver",
"Invalid URL": "Ogiltig URL",
"Unable to validate homeserver": "Kan inte validera hemservern",
"%(name)s on hold": "%(name)s parkerad",
"%(peerName)s held the call": "%(peerName)s parkerade samtalet",
"You held the call <a>Resume</a>": "Du parkerade samtalet <a>Återuppta</a>",
"You held the call <a>Switch</a>": "Du parkerade samtalet <a>Byt</a>",
"sends snowfall": "skickar snöfall",
"Sends the given message with snowfall": "Skickar det givna meddelandet med snöfall",
"sends fireworks": "skickar fyrverkerier",
"Sends the given message with fireworks": "Skicka det givna meddelandet med fyrverkerier",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Lägger till ┬──┬ ( ゜-゜ノ) till början av ett textmeddelande",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lägger till (╯°□°)╯︵ ┻━┻ till början av ett textmeddelande",
"You've reached the maximum number of simultaneous calls.": "Du har nått det maximala antalet samtidiga samtal.",
"Too Many Calls": "För många samtal",
"You have no visible notifications.": "Du har inga synliga aviseringar.",
"Transfer": "Överlåt",
"Failed to transfer call": "Misslyckades att överlåta samtal",
"A call can only be transferred to a single user.": "Ett samtal kan bara överlåtas till en enskild användare.",
"There was an error finding this widget.": "Ett fel inträffade vid sökning efter widgeten.",
"Active Widgets": "Aktiva widgets",
"Open dial pad": "Öppna knappsats",
"Start a Conversation": "Starta en konversation",
"Dial pad": "Knappsats",
"There was an error looking up the phone number": "Ett fel inträffade vid uppslagning av telefonnumret",
"Unable to look up phone number": "Kunde inte slå upp telefonnumret"
}

View File

@ -39,11 +39,11 @@
"Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte",
"Call Timeout": "Arama Zaman Aşımı",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Ana Sunucu'ya bağlanılamıyor - lütfen bağlantınızı kontrol edin ,<a> Ana Sunucu SSL sertifikanızın </a> güvenilir olduğundan ve bir tarayıcı uzantısının istekleri engellemiyor olduğundan emin olun.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya <a> güvensiz komut dosyalarını</a> etkinleştirin.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya <a> güvensiz komut dosyalarını</a> etkinleştirin.",
"Change Password": "Şifre Değiştir",
"%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.",
"Changes your display nickname": "Görünen takma adınızı değiştirir",
@ -226,7 +226,7 @@
"This email address is already in use": "Bu e-posta adresi zaten kullanımda",
"This email address was not found": "Bu e-posta adresi bulunamadı",
"The email address linked to your account must be entered.": "Hesabınıza bağlı e-posta adresi girilmelidir.",
"The remote side failed to pick up": "Uzak taraf toplanamadı(alınamadı)",
"The remote side failed to pick up": "Karşı taraf cevaplayamadı",
"This room has no local addresses": "Bu oda hiçbir yerel adrese sahip değil",
"This room is not recognised.": "Bu oda tanınmıyor.",
"This doesn't appear to be a valid email address": "Bu geçerli bir e-posta adresi olarak gözükmüyor",
@ -305,9 +305,9 @@
"Oct": "Ekim",
"Nov": "Kasım",
"Dec": "Aralık",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s , %(monthName)s %(day)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "Hafta - %(weekDayName)s , %(day)s -%(monthName)s -%(fullYear)s , %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s , %(monthName)s %(day)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "Hafta - %(weekDayName)s , %(day)s -%(monthName)s -%(fullYear)s , %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "Görünür isim ayarla :",
"Upload an avatar:": "Bir Avatar yükle :",
"This server does not support authentication with a phone number.": "Bu sunucu bir telefon numarası ile kimlik doğrulamayı desteklemez.",
@ -373,7 +373,7 @@
"Offline": "Çevrimdışı",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s odanın avatarını <img/> olarak çevirdi",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odanın avatarını kaldırdı.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi",
"Username available": "Kullanıcı ismi uygun",
"Username not available": "Kullanıcı ismi uygun değil",
"Something went wrong!": "Bir şeyler yanlış gitti!",
@ -821,13 +821,13 @@
"DuckDuckGo Results": "DuckDuckGo Sonuçları",
"Emoji Autocomplete": "Emoji Oto Tamamlama",
"Notify the whole room": "Tüm odayı bilgilendir",
"Room Notification": "Oda Bildirimi",
"Room Notification": "Oda Bildirimi",
"Set up with a recovery key": "Kurtarma anahtarı ile kur",
"That matches!": "Eşleşti!",
"That doesn't match.": "Eşleşmiyor.",
"Download": "İndir",
"<b>Print it</b> and store it somewhere safe": "<b>Yazdır</b> ve güvenli bir yerde sakla",
"<b>Save it</b> on a USB key or backup drive": "Bir USB anahtara <b>kaydet</b> veya sürücüye yedekle",
"<b>Save it</b> on a USB key or backup drive": "Bir USB anahtara <b>kaydet</b> veya sürücüye yedekle",
"<b>Copy it</b> to your personal cloud storage": "Kişisel bulut depolamaya <b>kopyala</b>",
"Success!": "Başarılı!",
"Retry": "Yeniden Dene",
@ -902,7 +902,7 @@
"Show developer tools": "Geliştirici araçlarını göster",
"Low bandwidth mode": "Düşük bant genişliği modu",
"Messages containing my username": "Kullanıcı adımı içeren mesajlar",
"When rooms are upgraded": "Odaların güncellenme zamanları",
"When rooms are upgraded": "Odalar güncellendiğinde",
"My Ban List": "Yasaklı Listem",
"Verified!": "Doğrulandı!",
"You've successfully verified this user.": "Bu kullanıcıyı başarılı şekilde doğruladınız.",
@ -1150,7 +1150,7 @@
"Copied!": "Kopyalandı!",
"Failed to copy": "Kopyalama başarısız",
"edited": "düzenlendi",
"You are still <b>sharing your personal data</b> on the identity server <idserver />.": "Kimlik sunucusu üzerinde hala <b>kişisel veri paylaşımı</b> yapıyorsunuz \n<idserver />.",
"You are still <b>sharing your personal data</b> on the identity server <idserver />.": "Kimlik sunucusu üzerinde hala <b>kişisel veri paylaşımı</b> yapıyorsunuz <idserver />.",
"We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Kimlik sunucusundan bağlantıyı kesmeden önce telefon numaranızı ve e-posta adreslerinizi silmenizi tavsiye ederiz.",
"Set a new account password...": "Yeni bir hesap parolası belirle...",
"Deactivating your account is a permanent action - be careful!": "Hesabınızı pasifleştirmek bir kalıcı eylemdir - dikkat edin!",
@ -1243,7 +1243,7 @@
"Avoid years that are associated with you": "Sizle ilişkili yıllardan kaçının",
"Avoid dates and years that are associated with you": "Sizle ilişkili tarihler ve yıllardan kaçının",
"Capitalization doesn't help very much": "Baş harfi büyük yapmak size pek yardımcı olmaz",
"All-uppercase is almost as easy to guess as all-lowercase": "Bütün harflerin büyük olmasıyla tümünün küçük olması tahmin için hemen hemen aynı kolaylıktadır",
"All-uppercase is almost as easy to guess as all-lowercase": "Bütün harflerin büyük olmasıyla tümünün küçük olması tahmin edilmesi bakımından hemen hemen aynı kolaylıktadır",
"Reversed words aren't much harder to guess": "Ters kelimeler tahmin için çok zor değil",
"Repeats like \"aaa\" are easy to guess": "“aaa” gibi tekrarlar tahmin için oldukça kolay",
"Dates are often easy to guess": "Tarihler sıklıkla tahmin için daha kolaydır",
@ -1326,7 +1326,7 @@
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Topluluk ID leri sadece a-z, 0-9 ya da '=_-./' karakterlerini içerebilir",
"Create a public room": "Halka açık bir oda oluşturun",
"Make this room public": "Bu odayı halka açık yap",
"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": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için %(brand)sun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var",
"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": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için %(brand)sun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var",
"Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et",
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "%(fileName)s dosyası anasunucunun yükleme boyutu limitini aşıyor",
"Double check that your server supports the room version chosen and try again.": "Seçtiğiniz oda sürümünün sunucunuz tarafından desteklenip desteklenmediğini iki kez kontrol edin ve yeniden deneyin.",
@ -1592,7 +1592,7 @@
"To continue you need to accept the terms of this service.": "Devam etmek için bu servisi kullanma şartlarını kabul etmeniz gerekiyor.",
"Upload files (%(current)s of %(total)s)": "Dosyaları yükle (%(current)s / %(total)s)",
"Incorrect recovery passphrase": "Hatalı kurtarma parolası",
"Failed to decrypt %(failedCount)s sessions!": "Çözümlemesi başarısız olan %(failedCount)s oturum!",
"Failed to decrypt %(failedCount)s sessions!": "%(failedCount)s adet oturum çözümlenemedi!",
"Enter recovery passphrase": "Kurtarma parolasını girin",
"Confirm your identity by entering your account password below.": "Hesabınızın şifresini aşağıya girerek kimliğinizi teyit edin.",
"An email has been sent to %(emailAddress)s": "%(emailAddress)s adresine bir e-posta gönderildi",
@ -1635,7 +1635,7 @@
"Sends a message as plain text, without interpreting it as markdown": "Mesajı markdown kullanmadan basit metin olarak iletir",
"Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "E-posta ile davet etmek için kimlik sunucusu kullan. Varsayılan kimlik sunucusunu (%(defaultIdentityServerName)s) kullanmak için devam edin ya da ayarlardan değiştirin.",
"Unignored user": "Reddedilmemiş kullanıcı",
"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!": "UYARI: ANAHTAR DOĞRULAMASI BAŞARISIZ! %(userld)s'nin/nın %(deviceld)s oturumu için imza anahtarı \"%(fprint)s\" verilen anahtar ile uyumsuz \"%(fingerprint)s\". Bu iletişiminizin engellendiği anlamına gelebilir!",
"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!": "UYARI: ANAHTAR DOĞRULAMASI BAŞARISIZ! %(userld)s'nin/nın %(deviceId)s oturumu için imza anahtarı \"%(fprint)s\" verilen anahtar ile uyuşmuyor \"%(fingerprint)s\". Bu iletişiminizin engellendiği anlamına gelebilir!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Verilen imza anahtarı %(userld)s'nin/nın %(deviceld)s oturumundan gelen anahtar ile uyumlu. Oturum doğrulanmış olarak işaretlendi.",
"Forces the current outbound group session in an encrypted room to be discarded": "Şifreli bir odadaki geçerli giden grup oturumunun atılmasını zorlar",
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s oda ismini %(oldRoomName)s bununla değiştirdi %(newRoomName)s.",
@ -1726,7 +1726,7 @@
"Ok": "Tamam",
"Set password": "Parola belirle",
"To return to your account in future you need to set a password": "İleride hesabınızı tekrar kullanabilmek için bir parola belirlemeniz gerek",
"New login. Was this you?": "",
"New login. Was this you?": "Yeni giriş. Bu siz miydiniz?",
"Restart": "Yeniden başlat",
"You joined the call": "Çağrıya katıldınız",
"%(senderName)s joined the call": "%(senderName)s çağrıya katıldı",
@ -1757,5 +1757,525 @@
"You were kicked": "Atıldınız",
"%(targetName)s was kicked": "%(targetName)s atıldı",
"You rejected the invite": "Daveti reddettiniz",
"%(targetName)s rejected the invite": "%(targetName)s daveti reddetti"
"%(targetName)s rejected the invite": "%(targetName)s daveti reddetti",
"See when anyone posts a sticker to your active room": "Aktif odanızda birisi çıkartma paylaştığında görün",
"See when a sticker is posted in this room": "Bu odada çıkartma paylaşıldığında görün",
"See when the avatar changes in your active room": "Aktif odanızdaki avatar değişikliklerini görün",
"See when the avatar changes in this room": "Bu odadaki avatar değişikliklerini görün",
"The person who invited you already left the room, or their server is offline.": "Seni davet eden kişi zaten odadan ayrılmış yada sunucuları çevrim dışı.",
"The person who invited you already left the room.": "Seni davet eden kişi zaten odadan ayrılmış.",
"New version of %(brand)s is available": "%(brand)s 'in yeni versiyonu hazır",
"Update %(brand)s": "%(brand)s 'i güncelle",
"Verify the new login accessing your account: %(name)s": "Hesabınıza erişen yeni girişi onaylayın: %(name)s",
"Safeguard against losing access to encrypted messages & data": "Şifrelenmiş mesajlara ve verilere erişimi kaybetmemek için koruma sağlayın",
"Set up Secure Backup": "Güvenli Yedekleme kur",
"Enable desktop notifications": "Masaüstü bildirimlerini etkinleştir",
"Don't miss a reply": "Yanıtları kaçırma",
"Send <UsageDataLink>anonymous usage data</UsageDataLink> which helps us improve %(brand)s. This will use a <PolicyLink>cookie</PolicyLink>.": "%(brand)s 'i geliştirmemize yardımcı olan <UsageDataLink> gizli kullanım verilerini</UsageDataLink> gönder. Bu <PolicyLink> çerez</PolicyLink> kullanacaktır.",
"Help us improve %(brand)s": "%(brand)s 'i geliştirmemize yardım et",
"Unknown App": "Bilinmeyen uygulama",
"Error leaving room": "Odadan ayrılırken hata",
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Bu oda, Ana Sunucudan gelen önemli mesajlar için kullanılır, bu yüzden ayrılamazsınız.",
"Can't leave Server Notices room": "Sunucu Bildirimleri odasından ayrılınamıyor",
"Unexpected server error trying to leave the room": "Odadan ayrılmaya çalışırken beklenmeyen sunucu hatası",
"See images posted to your active room": "Aktif odanıza gönderilen fotoğrafları görün",
"See emotes posted to your active room": "Aktif odanıza gönderilen ifadeleri görün",
"See emotes posted to this room": "Bu odaya gönderilen ifadeleri görün",
"See text messages posted to your active room": "Aktif odanıza gönderilen metin mesajlarını görün",
"See text messages posted to this room": "Bu odaya gönderilen metin mesajlarını gör",
"The <b>%(capability)s</b> capability": "<b>%(capability)s</b> kabiliyet",
"See messages posted to your active room": "Aktif odanıza gönderilen mesajları görün",
"See messages posted to this room": "Bu odaya gönderilen mesajları görün",
"Change the avatar of your active room": "Aktif odanın avatarını değiştir",
"Change the avatar of this room": "Bu odanın avatarını değiştir",
"Change the name of your active room": "Aktif odanızın ismini değiştirin",
"%(senderName)s declined the call.": "%(senderName)s aramayı reddetti.",
"🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Tüm sunucuların katılımı yasaklanmıştır! Bu oda artık kullanılamaz.",
"Change the name of this room": "Bu odanın ismini değiştirin",
"Change the topic of your active room": "Aktif odanızın konusunu değiştirin",
"Change the topic of this room": "Bu odanın konusunu değiştirin",
"Change which room you're viewing": "Görüntülediğiniz odayı değiştirin",
"Send stickers into your active room": "Aktif odanıza çıkartma gönderin",
"Send stickers into this room": "Bu odaya çıkartma gönderin",
"(an error occurred)": "(bir hata meydana geldi)",
"(their device couldn't start the camera / microphone)": "(Cihazları kamerayı/mikrofonu başlatamadı )",
"(connection failed)": "(bağlantı hatası)",
"%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s bu oda için sunucu ACL'lerini değiştirdi.",
"%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s bu oda için sunucu ACL'lerini ayarladı.",
"Takes the call in the current room off hold": "Mevcut odadaki aramayı beklemeden çıkarır",
"Places the call in the current room on hold": "Mevcut odadaki aramayı beklemeye alır",
"Please supply a widget URL or embed code": "Lütfen bir widget URL'si veya yerleşik kod girin",
"Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Düz metin mesajının başına (͡ ° ͜ʖ ͡ °) ekler",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "Düz metin mesajının başına ┬──┬ (゜ - ゜ ) ekler",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Düz metin mesajının başına (╯°□°)╯︵ ┻━┻ ekler",
"Zimbabwe": "Zimbabve",
"Zambia": "Zambiya",
"Yemen": "Yemen",
"Western Sahara": "Batı Sahra",
"Wallis & Futuna": "Wallis & Futuna",
"Vietnam": "Vietnam",
"Venezuela": "Venezuela",
"Vatican City": "Vatikan Şehri",
"Vanuatu": "Vanuatu",
"Uzbekistan": "Özbekistan",
"Uruguay": "Uruguay",
"United Arab Emirates": "Birleşik Arap Emirlikleri",
"Ukraine": "Ukrayna",
"Uganda": "Uganda",
"U.S. Virgin Islands": "Amerika Birleşik Devletleri Virgin Adaları",
"Tuvalu": "Tuvalu",
"Turks & Caicos Islands": "Turks ve Caicos Adaları",
"Turkmenistan": "Türkmenistan",
"Turkey": "Türkiye",
"Tunisia": "Tunus",
"Trinidad & Tobago": "Trinidad & Tobago",
"Tonga": "Tonga",
"Tokelau": "Tokelau",
"Togo": "Togo",
"Timor-Leste": "Doğu Timor",
"Thailand": "Tayland",
"Tanzania": "Tanzanya",
"Tajikistan": "Tajikistan",
"Taiwan": "Tayvan",
"São Tomé & Príncipe": "São Tomé ve Príncipe",
"Syria": "Suriye",
"Switzerland": "İsviçre",
"Sweden": "İsveç",
"Swaziland": "Svaziland",
"Svalbard & Jan Mayen": "Svalbard & Jan Mayen",
"Suriname": "Surinam",
"Sudan": "Sudan",
"St. Vincent & Grenadines": "St. Vincent ve Grenadinler",
"St. Pierre & Miquelon": "St. Pierre ve Miquelon",
"St. Martin": "St. Martin",
"St. Lucia": "St. Lucia",
"St. Kitts & Nevis": "St. Kitts ve Nevis",
"St. Helena": "St. Helena",
"St. Barthélemy": "St. Barthélemy",
"Sri Lanka": "Sri Lanka",
"Spain": "İspanya",
"South Sudan": "Güney Sudan",
"South Korea": "Güney Kore",
"South Georgia & South Sandwich Islands": "Güney Georgia ve Güney Sandwich Adaları",
"South Africa": "Güney Afrika",
"Somalia": "Somali",
"Solomon Islands": "Solomon Adaları",
"Slovenia": "Slovenya",
"Slovakia": "Slovakya",
"Sint Maarten": "St Martin",
"Singapore": "Singapur",
"Sierra Leone": "Sierra Leone",
"Seychelles": "Şeyseller",
"Serbia": "Sırbistan",
"Senegal": "Senegal",
"Saudi Arabia": "Suudi Arabistan",
"San Marino": "San Marino",
"Samoa": "Samoa",
"Réunion": "Réunion",
"Rwanda": "Ruanda",
"Russia": "Rusya",
"Romania": "Romanya",
"Qatar": "Katar",
"Puerto Rico": "Porto Riko",
"Portugal": "Portekiz",
"Poland": "Polonya",
"Pitcairn Islands": "Pitcairn Adaları",
"Philippines": "Filipinler",
"Peru": "Peru",
"Paraguay": "Paraguay",
"Papua New Guinea": "Papua Yeni Gine",
"Panama": "Panama",
"Palestine": "Filistin",
"Palau": "Palau",
"Pakistan": "Pakistan",
"Oman": "Umman",
"Norway": "Norveç",
"Northern Mariana Islands": "Kuzey Mariana Adaları",
"North Korea": "Kuzey Kore",
"Norfolk Island": "Norfolk Adası",
"Niue": "Niue",
"Nigeria": "Nijerya",
"Niger": "Nijer",
"Nicaragua": "Nikaragua",
"New Zealand": "Yeni Zelanda",
"New Caledonia": "Yeni Kaledonya",
"Netherlands": "Hollanda",
"Nepal": "Nepal",
"Macau": "Makao",
"Nauru": "Nauru",
"Namibia": "Namibya",
"Myanmar": "Myanmar",
"Mozambique": "Mozambik",
"Morocco": "Fas",
"Montserrat": "Montserrat",
"Montenegro": "Karadağ",
"Mongolia": "Moğolistan",
"Monaco": "Monako",
"Moldova": "Moldova",
"Micronesia": "Mikronezya",
"Mexico": "Meksika",
"Mayotte": "Mayotte",
"Mauritius": "Mauritius",
"Mauritania": "Moritanya",
"Martinique": "Martinik",
"Marshall Islands": "Marşal Adaları",
"Malta": "Malta",
"Mali": "Mali",
"Maldives": "Maldivler",
"Malaysia": "Malezya",
"Malawi": "Malawi",
"Madagascar": "Madagaskar",
"Macedonia": "Makedonya",
"Luxembourg": "Lüksemburg",
"Lithuania": "Litvanya",
"Liechtenstein": "Lihtenştayn",
"Libya": "Libya",
"Liberia": "Liberya",
"Lesotho": "Lesoto",
"Lebanon": "Lübnan",
"Latvia": "Letonya",
"Laos": "Laos",
"Kyrgyzstan": "Kırgızistan",
"Kuwait": "Kuveyt",
"Jordan": "Ürdün",
"Kosovo": "Kosova",
"Kiribati": "Kiribati",
"Kenya": "Kenya",
"Kazakhstan": "Kazakistan",
"Jersey": "Jersey",
"Japan": "Japonya",
"Jamaica": "Jamaika",
"Italy": "İtalya",
"Israel": "İsrail",
"Isle of Man": "Man Adası",
"Ireland": "İrlanda",
"Iraq": "Irak",
"Iran": "İran",
"Indonesia": "Endonezya",
"India": "Hindistan",
"Iceland": "İzlanda",
"Hungary": "Macaristan",
"Hong Kong": "Hong Kong",
"Honduras": "Honduras",
"Heard & McDonald Islands": "Heard ve McDonald Adaları",
"Haiti": "Haiti",
"Guyana": "Guyana",
"Guinea-Bissau": "Gine-Bissau",
"Guinea": "Gine",
"Guernsey": "Guernsey",
"Guatemala": "Guatemala",
"Guam": "Guam",
"Guadeloupe": "Guadeloupe",
"Grenada": "Grenada",
"Greenland": "Grönland",
"Greece": "Yunanistan",
"Gibraltar": "Cebelitarık",
"Ghana": "Gana",
"Germany": "Almanya",
"Georgia": "Gürcistan",
"Gambia": "Gambiya",
"Gabon": "Gabon",
"French Southern Territories": "Fransız Güney Toprakları",
"French Polynesia": "Fransız Polinezyası",
"French Guiana": "Fransız Guyanası",
"France": "Fransa",
"Finland": "Finlandiya",
"Fiji": "Fij",
"Faroe Islands": "Faroe adaları",
"Falkland Islands": "Falkland adaları",
"Ethiopia": "Etiyopya",
"Estonia": "Estonya",
"Eritrea": "Eritre",
"Equatorial Guinea": "Ekvator Ginesi",
"El Salvador": "El Salvador",
"Egypt": "Mısır",
"Ecuador": "Ekvador",
"Dominican Republic": "Dominik cumhuriyeti",
"Dominica": "Dominik",
"Denmark": "Danimarka",
"Djibouti": "Cibuti",
"Côte dIvoire": "Fildişi Sahili",
"Czech Republic": "Çek cumhuriyeti",
"Cyprus": "Kıbrıs",
"Curaçao": "Curacao",
"Cuba": "Küba",
"Croatia": "Hırvatistan",
"Costa Rica": "Kosta Rika",
"Cook Islands": "Cook Adaları",
"Congo - Kinshasa": "Kongo - Kinşasa",
"Congo - Brazzaville": "Kongo - Brazzaville",
"Comoros": "Komorlar",
"Colombia": "Kolombiya",
"Cocos (Keeling) Islands": "Cocos (Keeling) Adaları",
"Christmas Island": "Noel Adası",
"China": "Çin",
"Chile": "Şili",
"Chad": "Çad",
"Central African Republic": "Orta Afrika Cumhuriyeti",
"Cayman Islands": "Cayman Adaları",
"Caribbean Netherlands": "Karayip Hollandası",
"Cape Verde": "Cape Verde",
"Canada": "Kanada",
"Cameroon": "Kamerun",
"Cambodia": "Kamboçya",
"Burundi": "Burundi",
"Burkina Faso": "Burkina Faso",
"Bulgaria": "Bulgaristan",
"Brunei": "Brunei",
"British Virgin Islands": "Britanya Virjin Adaları",
"British Indian Ocean Territory": "İngiliz Hint Okyanusu Bölgesi",
"Brazil": "Brezilya",
"Bouvet Island": "Bouvet Adası",
"Botswana": "Botsvana",
"Bosnia": "Bosna",
"Bolivia": "Bolivya",
"Bhutan": "Butan",
"Bermuda": "Bermuda",
"Benin": "Benin",
"Belize": "Belize",
"Belgium": "Belçika",
"Belarus": "Belarus",
"Barbados": "Barbados",
"Bangladesh": "Bangladeş",
"See <b>%(msgtype)s</b> messages posted to this room": "Bu odada gönderilen <b>%(msgtype)s</b> mesajlara bak",
"Send <b>%(msgtype)s</b> messages as you in this room": "Bu odadayken <b>%(msgtype)s</b> mesajlar gönder",
"Bahrain": "Bahreyn",
"Bahamas": "Bahamalar",
"Azerbaijan": "Azerbaycan",
"Austria": "Avusturya",
"Review terms and conditions": "Hükümler ve koşulları incele",
"Terms and Conditions": "Hükümler ve koşullar",
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s ana sunucusunu kullanmaya devam etmek için hüküm ve koşulları incelemeli ve kabul etmelisiniz.",
"You do not have permission to create rooms in this community.": "Bu toplulukta oda oluşturmaya izniniz yok.",
"Cannot create rooms in this community": "Bu toplulukta oda oluşturulamıyor",
"Create a Group Chat": "Grup sohbeti başlat",
"Explore Public Rooms": "Herkese açık odaları keşfet",
"Send a Direct Message": "Direkt mesaj gönderin",
"Liberate your communication": "İletişiminizi özgürleştirin",
"Welcome to %(appName)s": "%(appName)s' e hoş geldiniz",
"Now, let's help you get started": "Şimdi, başlamanıza yardım edelim",
"Click to view edits": "Düzenlemeleri görmek için tıkla",
"Edited at %(date)s": "%(date)s tarihinde düzenlendi",
"This room is a continuation of another conversation.": "Bu oda başka bir görüşmenin devamıdır.",
"Message deleted on %(date)s": "Mesaj %(date)s tarihinde silindi",
"Message deleted by %(name)s": "Mesaj %(name)s tarafından silindi",
"Message deleted": "Mesaj silindi",
"%(name)s declined": "%(name)s reddetti",
"You declined": "Reddettiniz",
"You have ignored this user, so their message is hidden. <a>Show anyways.</a>": "Bu kullanıcıyı yok saydınız, bu yüzden mesajları gizlidir. <a>Yine de göster.</a>",
"Video conference started by %(senderName)s": "Video konferans %(senderName)s tarafından başlatıldı",
"Video conference updated by %(senderName)s": "Video konferans %(senderName)s tarafından güncellendi",
"Video conference ended by %(senderName)s": "Video konferans %(senderName)s tarafından sonlandırıldı",
"React": "Tepki ver",
"The encryption used by this room isn't supported.": "Bu odada kullanılan şifreleme desteklenmiyor.",
"Encryption not enabled": "Şifreleme etkin değil",
"Ignored attempt to disable encryption": "Şifrelemeyi devre dışı bırakma denemesi yok sayıldı",
"Encryption enabled": "Şifreleme etkin",
"Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Bu odadaki mesajlar uçtan uca şifrelenmiştir. İnsanlar katıldığında, onları profillerinden doğrulayabilirsiniz, avatarlarına dokunmanız yeterlidir.",
"Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Buradaki mesajlar uçtan uca şifrelenmiştir. %(displayName)s kullanıcısını profilinden onaylayın -avatarına dokunun.",
"Compare emoji": "Emoji karşılaştır",
"Verification cancelled": "Doğrulama iptal edildi",
"You cancelled verification.": "Doğrulamayı iptal ettiniz.",
"%(displayName)s cancelled verification.": "%(displayName)s doğrulamayı iptal etti.",
"You cancelled verification on your other session.": "Diğer oturumunuzda doğrulamayı iptal ettiniz.",
"Verification timed out.": "Doğrulama zaman aşımına uğradı.",
"Delete sessions|one": "Oturumu sil",
"Delete sessions|other": "Oturumları sil",
"Click the button below to confirm deleting these sessions.|one": "Bu oturumları silmeyi onaylamak için aşağıdaki butona tıklayın.",
"See when the name changes in your active room": "Aktif odanızın isim değişikliklerini görün",
"See when the name changes in this room": "Bu odanın isim değişikliklerini görün",
"See when the topic changes in this room": "Bu odada konu değişikliğini görün",
"See when the topic changes in your active room": "Aktif odanızda konu değiştiğinde görün",
"Remain on your screen when viewing another room, when running": "a",
"Incoming call": "Gelen arama",
"Incoming video call": "Gelen görüntülü arama",
"Incoming voice call": "Gelen sesli arama",
"Unknown caller": "Bilinmeyen arayan",
"%(name)s on hold": "%(name)s beklemede",
"Return to call": "Aramaya dön",
"Fill Screen": "Ekrana sığdır",
"Voice Call": "Sesi arama",
"%(peerName)s held the call": "%(peerName)s aramayı duraklattı",
"Video Call": "Görüntülü arama",
"sends snowfall": "Kartopu gönderir",
"Sends the given message with snowfall": "Mesajı kartopu ile gönderir",
"sends fireworks": "Havai fişek gönderir",
"Sends the given message with fireworks": "Mesajı havai fişeklerle gönderir",
"sends confetti": "Konfeti gönderir",
"Send stickers to this room as you": "Widget bu odaya sizin adınıza çıkartma göndersin",
"Send stickers to your active room as you": "Widget aktif odanıza sizin adınıza çıkartma göndersin",
"Send messages as you in this room": "Widget sizin adınıza mesaj göndersin",
"Answered Elsewhere": "Arama başka bir yerde yanıtlandı",
"Effects": "Efektler",
"Sends the given message with confetti": "Mesajı konfeti ile gönderir",
"Downloading logs": "Günlükler indiriliyor",
"Uploading logs": "Günlükler yükleniyor",
"Show chat effects": "Sohbet efektlerini gösterin",
"Enable experimental, compact IRC style layout": "Deneysel, kompakt IRC tarzı düzeni etkinleştirin",
"IRC display name width": "IRC görünen ad genişliği",
"Manually verify all remote sessions": "Bütün uzaktan oturumları el ile onayla",
"How fast should messages be downloaded.": "Mesajlar ne kadar hızlı indirilmeli.",
"Show previews/thumbnails for images": "Fotoğraflar için ön izleme/küçük resim göster",
"System font name": "Sistem yazı tipi ismi",
"Use a system font": "Bir sistem yazı tipi kullanın",
"Use Ctrl + Enter to send a message": "Mesaj göndermek için Ctrl + Enter tuşlarını kullanın",
"Use Command + Enter to send a message": "Mesaj göndermek için Command + Enter tuşlarını kullanın",
"Use a more compact Modern layout": "Daha kompakt \"Modern\" düzen",
"Use custom size": "Özel büyüklük kullan",
"Font size": "Yazı boyutu",
"Enable advanced debugging for the room list": "Oda listesi için gelişmiş hata ayıklamayı etkinleştirin",
"Show message previews for reactions in DMs": "DM'lerdeki tepkiler için mesaj ön izlemelerini göster",
"Show message previews for reactions in all rooms": "Tüm odalardaki tepkiler için mesaj ön izlemelerini göster",
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Topluluklar v2 prototipleri. Uygun ana sunucu gerektirir. Deneysel - dikkatli kullanın.",
"End": "End",
"Space": "Boşluk",
"Enter": "Enter",
"Esc": "Esc",
"%(senderName)s: %(stickerName)s": "%(senderName)s%(stickerName)s",
"%(senderName)s: %(reaction)s": "%(senderName)s%(reaction)s",
"%(senderName)s: %(message)s": "%(senderName)s%(message)s",
"* %(senderName)s %(emote)s": "%(senderName)s%(emote)s",
"%(senderName)s ended the call": "%(senderName)s aramayı sonlandırdı",
"You ended the call": "Aramayı sonlandırdınız",
"Click the button below to confirm deleting these sessions.|other": "Bu oturumları silmeyi onaylamak için aşağıdaki butona tıklayın.",
"Confirm deleting these sessions": "Bu oturumları silmeyi onayla",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Kimliğinizi kanıtlamak için Tek Seferliğine Oturum Açma özelliğini kullanarak bu oturumu silmeyi onaylayın.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Kimliğinizi kanıtlamak için Tek Seferlik Oturum Açma kullanarak bu oturumları silmeyi onaylayın.",
"New published address (e.g. #alias:server)": "Yeni yayınlanmış adresler (e.g. #alias:server)",
"Published Addresses": "Yayınlanmış adresler",
"No other published addresses yet, add one below": "Henüz yayınlanmış başka adres yok, aşağıdan bir tane ekle",
"Other published addresses:": "Diğer yayınlanmış adresler:",
"Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Yayınlanmış adresler, odanıza katılmak için herhangi bir sunucudaki herkes tarafından kullanılabilir. Bir adresi yayınlamak için önce yerel adres olarak ayarlanması gerekir.",
"Error removing address": "Adres kaldırılırken hata",
"There was an error removing that address. It may no longer exist or a temporary error occurred.": "Adres kaldırılırken bir hata ile karşılaşıldı. Artık mevcut olmayabilir yada geçici bir oluştu.",
"You don't have permission to delete the address.": "Bu adresi silmeye yetkiniz yok.",
"There was an error creating that address. It may not be allowed by the server or a temporary failure occurred.": "Adres oluşturulurken hata ile karşılaşıldı. Sunucu tarafından izin verilmemiş yada geçici bir hata olabilir.",
"Error creating address": "Adres oluşturulurken hata",
"You can still join it because this is a public room.": "Herkese açık oda olduğu için yine de katılabilirsiniz.",
"An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Davetinizi doğrularken %(errcode)s kodlu hata ile karşılaşıldı. Bu bilgiyi oda yöneticisine iletebilirsiniz.",
"%(count)s results|one": "%(count)s adet sonuç",
"%(count)s results|other": "%(count)s adet sonuç",
"Explore all public rooms": "Tüm herkese açık odaları keşfet",
"Start a new chat": "Yeni bir sohbet başlat",
"Can't see what youre looking for?": "Aradığınızı bulamıyor musunuz ?",
"Custom Tag": "Özel Etiket",
"Explore public rooms": "Herkese açık odaları keşfet",
"Explore community rooms": "Topluluk odalarını keşfet",
"People": "İnsanlar",
"Show Widgets": "Widgetları Göster",
"Hide Widgets": "Widgetları gizle",
"No recently visited rooms": "Yakında ziyaret edilen oda yok",
"Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s %(userName)s tarafından %(dateTime)s tarihinde görüldü",
"Unpin Message": "Mesajın sabitlemesini kaldır",
"This is the start of <roomName/>.": "Bu <roomName/> odasının başlangıcıdır.",
"Add a photo, so people can easily spot your room.": "İnsanların odanı kolayca tanıması için bir fotoğraf ekle.",
"%(displayName)s created this room.": "%(displayName)s bu odayı oluşturdu.",
"You created this room.": "Bu odayı oluşturdunuz.",
"<a>Add a topic</a> to help people know what it is about.": "İnsanların ne hakkında olduğunu bilmelerine yardımcı olmak için <a>Konu ekle</a>.",
"Topic: %(topic)s ": "Konu: %(topic)s ",
"This is the beginning of your direct message history with <displayName/>.": "Bu <displayName/> ile olan direkt mesaj geçmişinizin başlangıcıdır.",
"Only the two of you are in this conversation, unless either of you invites anyone to join.": "Biriniz bir başkasını davet etmediğiniz sürece bu görüşmede sadece ikiniz varsınız.",
"Emoji picker": "Emoji seçici",
"Scroll to most recent messages": "En son mesajlara git",
"The authenticity of this encrypted message can't be guaranteed on this device.": "Bu şifrelenmiş mesajın güvenilirliği bu cihazda garanti edilemez.",
"Australia": "Avustralya",
"Aruba": "Aruba",
"Armenia": "Ermenistan",
"Argentina": "Arjantin",
"Antigua & Barbuda": "Antigua ve Barbuda",
"Antarctica": "Antarktika",
"Anguilla": "Anguilla",
"Angola": "Angola",
"Andorra": "Andorra",
"American Samoa": "Amerikan Samoası",
"Algeria": "Cezayir",
"Albania": "Arnavutluk",
"Åland Islands": "Aland adaları",
"Afghanistan": "Afganistan",
"United States": "Amerika Birleşik Devletleri",
"United Kingdom": "Birleşik Krallık",
"This will end the conference for everyone. Continue?": "Bu görüşmeyi herkes için bitirecektir. Onaylıyor musunuz ?",
"End conference": "Görüşmeyi bitir",
"You've reached the maximum number of simultaneous calls.": "Maksimum eşzamanlı arama sayısına ulaştınız.",
"Too Many Calls": "Çok fazla arama",
"No other application is using the webcam": "Kamerayı başka bir uygulama kullanmıyor",
"Permission is granted to use the webcam": "Kamerayı kullanmak için izin gerekiyor",
"A microphone and webcam are plugged in and set up correctly": "Mikrofon ve kamera takılımı ve doğru şekilde ayarlanmış mı",
"Call failed because webcam or microphone could not be accessed. Check that:": "Kameraya yada mikrofona erişilemediği için arama yapılamadı. Şunu kontrol edin:",
"Unable to access webcam / microphone": "Kameraya / mikrofona erişilemedi",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Mikrofona erişilemediği için arama yapılamadı. Mikrofonun takılı ve doğru şekilde ayarlandığından emin olun.",
"Unable to access microphone": "Mikrofona erişilemiyor",
"The call was answered on another device.": "Arama başka bir cihazda cevaplandı.",
"The call could not be established": "Arama yapılamadı",
"The other party declined the call.": "Diğer taraf aramayı reddetti.",
"Call Declined": "Arama Reddedildi",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu telefon numarasını eklemeyi onaylayın.",
"Single Sign On": "Tek seferlik oturum aç",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu e-posta adresini eklemeyi onaylayın.",
"Use Single Sign On to continue": "Devam etmek için tek seferlik oturum açın",
"Change notification settings": "Bildirim ayarlarını değiştir",
"See <b>%(msgtype)s</b> messages posted to your active room": "Aktif odanıza gönderilen <b>%(msgtype)s</b> mesajları görün",
"Send <b>%(msgtype)s</b> messages as you in your active room": "Widget sizin adınıza <b>%(msgtype)s</b> mesajlar göndersin",
"See general files posted to your active room": "Aktif odanıza gönderilen genel dosyaları görün",
"See general files posted to this room": "Bu odaya gönderilen genel dosyaları gör",
"Your server isn't responding to some <a>requests</a>.": "Sunucunuz bası <a>istekler'e</a> onay vermiyor.",
"Compare a unique set of emoji if you don't have a camera on either device": "Her iki cihazda da kamera yoksa benzersiz bir emoji setini karşılaştırın",
"The other party cancelled the verification.": "Diğer taraf onaylamayı reddetti.",
"User signing private key:": "Kullanıcı imzalı özel anahtar",
"Homeserver feature support:": "Ana sunucu özellik desteği:",
"Self signing private key:": "Kendinden imzalı özel anahtar:",
"not found locally": "yerel olarak bulunamadı",
"cached locally": "yerel olarak önbelleğe alındı",
"Send general files as you in your active room": "Widget aktif odanıza sizin adınıza genel dosyalar göndersin",
"Send general files as you in this room": "Widget sizin adınıza bu odaya genel dosyalar göndersin",
"Send videos as you in your active room": "Widget aktif odanıza sizin adınıza video göndersin",
"Send videos as you in this room": "Widget sizin adınıza bu odaya video göndersin",
"See <b>%(eventType)s</b> events posted to your active room": "Aktif odanıza gönderilen <b>%(eventType)s</b> etkinlikleri gör",
"Decline (%(counter)s)": "",
"From %(deviceName)s (%(deviceId)s)": "%(deviceName)s%(deviceId)s tarafından",
"Thumbs up": "Başparmak havaya",
"Santa": "Noel Baba",
"Spanner": "Anahtar",
"Smiley": "Gülen yüz",
"To be secure, do this in person or use a trusted way to communicate.": "Güvende olmak için, bunu şahsen yapın veya güvenilir bir iletişim yöntemi kullanın.",
"Waiting for your other session to verify…": "Diğer oturumunuzun doğrulanması bekleniyor…",
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Doğrulamak için diğer oturumunuz bekleniyor, %(deviceName)s %(deviceId)s",
"Verify this user by confirming the following number appears on their screen.": "Aşağıdaki numaranın ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.",
"Verify this session by confirming the following number appears on its screen.": "Aşağıdaki numaraların ekranında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.",
"Verify this user by confirming the following emoji appear on their screen.": "Aşağıdaki emojinin ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Aşağıdaki emojinin her iki oturumda da aynı sırayla görüntülendiğini onaylayın:",
"Compare unique emoji": "Benzersiz emoji karşılaştır",
"Verify this session by completing one of the following:": "Şunlardan birini yaparak bu oturumu tamamlayın:",
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Bu kullanıcıyla olan güvenli mesajlar uçtan uca şifrelidir ve 3 taraflar tarafından okunamaz.",
"Dial pad": "Arama tuşları",
"See videos posted to your active room": "Aktif odana gönderilen videoları gör",
"See videos posted to this room": "Bu odaya gönderilen videoları gör",
"See images posted to this room": "Bu odaya gönderilen resimleri gör",
"You held the call <a>Resume</a>": "Aramayı beklettiniz <a>Devam Ettir</a>",
"You held the call <a>Switch</a>": "Aramayı beklettiniz <a>Değiştir</a>",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Parolayı değiştirmek, şu anda tüm oturumlardaki tüm uçtan-uca şifreleme anahtarlarını sıfırlayacak ve oda anahtarlarınız önce dışarı aktarıp sonrasında içeri aktarmadığınız sürece şifrelenmiş sohbet geçmişini okunamaz yapacaktır. Gelecekte bu geliştirilecektir.",
"Send images as you in this room": "Widget bu odaya sizin adınıza resim göndersin",
"Send emotes as you in your active room": "Widget aktif odanıza sizin adınıza ifade göndersin",
"Send emotes as you in this room": "Widget bu odaya sizin adınıza ifade göndersin",
"Send text messages as you in your active room": "Widget aktif odanıza sizin adınıza metin mesajı göndersin",
"Send text messages as you in this room": "Widget bu odaya sizin adınıza metin mesajı göndersin",
"Send messages as you in your active room": "Widget aktif odanıza sizin adınıza mesaj göndersin",
"Send <b>%(eventType)s</b> events as you in your active room": "Widget aktif odanıza sizin adınıza <b>%(eventType)s</b> türü etkinlik göndersin",
"Send <b>%(eventType)s</b> events as you in this room": "Widget bu odaya sizin adınıza <b>%(eventType)s</b> türü etkinlik göndersin",
"Send images as you in your active room": "Widget aktif odanıza sizin adınıza resim göndersin",
"with an empty state key": "boş durum anahtarı ile",
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Emin misiniz? Eğer anahtarlarınız doğru bir şekilde yedeklemediyse, şifrelenmiş iletilerinizi kaybedeceksiniz.",
"The operation could not be completed": "Eylem tamamlanamadı",
"Failed to save your profile": "Profiliniz kaydedilemedi",
"You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Onları %(brand)s dışında bir sunucuda yapılandırmış olabilirsin. Onları %(brand)s içinde ayarlayamazsın ama yine de geçerlidir.",
"Securely cache encrypted messages locally for them to appear in search results.": "Arama sonuçlarında gozükmeleri için iletileri güvenli bir şekilde yerel olarak önbelleğe al.",
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Çapraz imzalı cihazlara güvenmeden, güvenilir olarak işaretlemek için, bir kullanıcı tarafından kullanılan her bir oturumu ayrı ayrı doğrulayın.",
"There are advanced notifications which are not shown here.": "Burada gösterilmeyen gelişmiş bildirimler var.",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "İletilerin arama sonuçlarında gözükmeleri için %(rooms)s odasından %(size)s yardımıyla depolayarak, şifrelenmiş iletileri güvenli bir şekilde yerel olarak önbelleğe al.",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "İletilerin arama sonuçlarında gözükmeleri için %(rooms)s odalardan %(size)s yardımıyla depolayarak, şifrelenmiş iletileri güvenli bir şekilde yerel olarak önbelleğe al.",
"not found in storage": "Cihazda bulunamadı",
"This bridge was provisioned by <user />.": "Bu köprü <user /> tarafından sağlandı.",
"Render LaTeX maths in messages": "Mesajlarda LaTex maths işleyin",
"See <b>%(eventType)s</b> events posted to this room": "Bu odaya gönderilen <b>%(eventType)s</b> türü etkinlikleri gör",
"with state key %(stateKey)s": "%(stateKey)s durum anahtarı ile"
}

View File

@ -329,13 +329,13 @@
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s змінює своє видиме ім'я на %(displayName)s.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s зазначив(-ла) своє видиме ім'я: %(displayName)s.",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s видалив(-ла) своє видиме ім'я (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s вилучав/ла свою світлину профілю.",
"%(senderName)s set a profile picture.": "%(senderName)s встановлює світлину профілю.",
"%(senderName)s removed their profile picture.": "%(senderName)s вилучає зображення свого профілю.",
"%(senderName)s set a profile picture.": "%(senderName)s встановлює зображення профілю.",
"VoIP conference started.": "Розпочато дзвінок-конференцію.",
"%(targetName)s joined the room.": "%(targetName)s приєднується до кімнати.",
"VoIP conference finished.": "Дзвінок-конференцію завершено.",
"%(targetName)s rejected the invitation.": "%(targetName)s відкинув/ла запрошення.",
"%(targetName)s left the room.": "%(targetName)s залишив/ла кімнату.",
"%(targetName)s left the room.": "%(targetName)s залишає кімнату.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s розблокував/ла %(targetName)s.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s викинув/ла %(targetName)s.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s відкликав/ла запрошення %(targetName)s.",
@ -352,7 +352,7 @@
"Show developer tools": "Показувати розробницькі засоби",
"Default": "Типово",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх учасників з моменту, коли вони приєдналися.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх учасників з моменту, коли вони приєдналися.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s робить майбутню історію кімнати видимою для всіх учасників від часу їхнього приєднання.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s зробив(-ла) майбутню історію видимою для всіх учасників кімнати.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s зробив(-ла) майбутню історію видимою для невідомого значення (%(visibility)s).",
@ -392,7 +392,7 @@
"Incorrect verification code": "Неправильний код перевірки",
"Submit": "Надіслати",
"Phone": "Телефон",
"Failed to upload profile picture!": "Не вдалося відвантажити світлину профілю!",
"Failed to upload profile picture!": "Не вдалося відвантажити зображення профілю!",
"Upload new:": "Відвантажити нову:",
"No display name": "Немає видимого імені",
"New passwords don't match": "Нові паролі не збігаються",
@ -712,7 +712,7 @@
"Unexpected error resolving homeserver configuration": "Неочікувана помилка в налаштуваннях домашнього серверу",
"Unexpected error resolving identity server configuration": "Незрозуміла помилка при розборі параметру сервера ідентифікації",
"The message you are trying to send is too large.": "Ваше повідомлення було занадто велике.",
"%(items)s and %(count)s others|other": "%(items)s та ще %(count)s учасника(ів)",
"%(items)s and %(count)s others|other": "%(items)s та ще %(count)s учасників",
"%(items)s and %(count)s others|one": "%(items)s і ще хтось",
"a few seconds ago": "Декілька секунд тому",
"about a minute ago": "близько хвилини тому",
@ -779,8 +779,8 @@
"A new version of %(brand)s is available!": "Нова версія %(brand)s вже доступна!",
"Guest": "Гість",
"There was an error joining the room": "Помилка при вході в кімнату",
"You joined the call": "Ви приєднались до дзвінку",
"%(senderName)s joined the call": "%(senderName)s приєднується до розмови",
"You joined the call": "Ви приєднались до виклику",
"%(senderName)s joined the call": "%(senderName)s приєднується до виклику",
"Call in progress": "Дзвінок у процесі",
"You left the call": "Ви припинили розмову",
"%(senderName)s left the call": "%(senderName)s покинув(ла) дзвінок",
@ -875,7 +875,7 @@
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Ви не зможете скасувати цю зміну через те, що ви підвищуєте рівень повноважень користувача до свого рівня.",
"React": "Відреагувати",
"Message deleted": "Повідомлення видалено",
"Message deleted by %(name)s": "Повідомлення видалено від %(name)s",
"Message deleted by %(name)s": "Повідомлення видалено %(name)s",
"Message deleted on %(date)s": "Повідомлення видалено %(date)s",
"Power level": "Рівень повноважень",
"Use an identity server to invite by email. Manage in <settings>Settings</settings>.": "Використовуйте сервер ідентифікації щоб запрошувати через е-пошту. Керується у <settings>налаштуваннях</settings>.",
@ -1222,7 +1222,7 @@
"Clear filter": "Очистити фільтр",
"Syncing...": "Синхронізування…",
"Signing In...": "Входження…",
"If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може зайняти деякий час",
"If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може тривати деякий час",
"Create account": "Створити обліковий запис",
"Failed to fetch avatar URL": "Не вдалось вибрати URL личини",
"Clear room list filter field": "Очистити поле фільтра списку кімнат",
@ -1536,5 +1536,44 @@
"Capitalization doesn't help very much": "Великі букви не дуже допомагають",
"You're all caught up.": "Все готово.",
"Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!",
"Youre all caught up": "Все готово"
"Youre all caught up": "Все готово",
"%(senderName)s declined the call.": "%(senderName)s відхиляє виклик.",
"(an error occurred)": "(сталася помилка)",
"(their device couldn't start the camera / microphone)": "(їхній пристрій не зміг запустити камеру / мікрофон)",
"(connection failed)": "(не вдалося з'єднатися)",
"🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Всім серверам заборонено доступ до кімнати! Нею більше не можна користуватися.",
"Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Збій виклику, оскільки не вдалося отримати доступ до мікрофона. Переконайтеся, що мікрофон під'єднано та налаштовано правильно.",
"Effects": "Ефекти",
"You've reached the maximum number of simultaneous calls.": "Ви досягли максимальної кількості одночасних викликів.",
"Too Many Calls": "Забагато викликів",
"No other application is using the webcam": "Жодна інша програма не використовує вебкамеру",
"Permission is granted to use the webcam": "Використання вебкамери дозволено",
"A microphone and webcam are plugged in and set up correctly": "Мікрофон і вебкамера під'єднані та налаштовані правильно",
"Call failed because webcam or microphone could not be accessed. Check that:": "Збій виклику, оскільки не вдалося отримати доступ до вебкамери або мікрофона. Перевірте, що:",
"Unable to access webcam / microphone": "Не вдається отримати доступ до вебкамери / мікрофона",
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sприєдналися й вийшли %(count)s разів",
"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.": "Ви можете вимкнути це, якщо кімната буде використовуватися для співпраці із зовнішніми командами, які мають власний домашній сервер. Це неможливо змінити пізніше.",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sзмінює свій аватар",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sзмінюють свої аватари %(count)s разів",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sзмінюють свої аватари",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sзмінюють свої аватари %(count)s разів",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sзмінює своє ім'я",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sзмінює своє ім'я %(count)s разів",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sзмінили свої імена",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sзмінили свої імена %(count)s разів",
"Error whilst fetching joined communities": "Помилка під час отримання спільнот до яких ви приєдналися",
"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.": "Закриті кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти і приєднатись кожен.",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sвиходить і повертається",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sвиходить і повертається %(count)s разів",
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sвиходять і повертаються",
"%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sвиходять і повертаються %(count)s разів",
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sприєднується й виходить",
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sприєднується й виходить %(count)s разів",
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sприєдналися й вийшли",
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)sприєднується",
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)sприєднується %(count)s разів",
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sприєдналися",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sприєдналися %(count)s разів",
"Members only (since they joined)": "Лише учасники (від часу приєднання)"
}

View File

@ -1960,7 +1960,7 @@
"Close dialog": "关闭对话框",
"Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "请告诉我们哪里出错了,或最好创建一个 GitHub issue 来描述该问题。",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "提醒:您的浏览器不被支持,所以您的体验可能不可预料。",
"GitHub issue": "GitHub issue",
"GitHub issue": "GitHub 上的 issue",
"Notes": "提示",
"If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "如果有额外的上下文可以帮助我们分析问题,比如您当时在做什么、房间 ID、用户 ID 等等,请将其列于此处。",
"Removing…": "正在删除…",

View File

@ -2974,5 +2974,24 @@
"You held the call <a>Resume</a>": "您已保留通話 <a>繼續</a>",
"%(name)s paused": "%(name)s 已暫停",
"You've reached the maximum number of simultaneous calls.": "您已達到同時通話的最大數量。",
"Too Many Calls": "太多通話"
"Too Many Calls": "太多通話",
"Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message": "在純文字訊息前加入 ┬──┬ ( ゜-゜ノ)",
"Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "在純文字訊息前加入 (╯°□°)╯︵ ┻━┻",
"sends fireworks": "傳送煙火",
"Sends the given message with fireworks": "與煙火一同傳送指定訊息",
"%(name)s on hold": "保留 %(name)s",
"You held the call <a>Switch</a>": "您已保留通話 <a>切換</a>",
"sends snowfall": "傳送雪球",
"Sends the given message with snowfall": "與雪球一同傳送指定訊息",
"You have no visible notifications.": "您沒有可見的通知。",
"Transfer": "傳輸",
"Failed to transfer call": "傳輸通話失敗",
"A call can only be transferred to a single user.": "一個通話只能傳輸給ㄧ個使用者。",
"There was an error finding this widget.": "尋找此小工具時發生錯誤。",
"Active Widgets": "作用中的小工具",
"Open dial pad": "開啟撥號鍵盤",
"Start a Conversation": "開始對話",
"Dial pad": "撥號鍵盤",
"There was an error looking up the phone number": "尋找電話號碼時發生錯誤",
"Unable to look up phone number": "無法查詢電話號碼"
}

View File

@ -421,7 +421,8 @@ export const SETTINGS: {[setting: string]: ISetting} = {
default: true,
},
"allowedWidgets": {
supportedLevels: [SettingLevel.ROOM_ACCOUNT],
supportedLevels: [SettingLevel.ROOM_ACCOUNT, SettingLevel.ROOM_DEVICE],
supportedLevelsAreOrdered: true,
default: {}, // none allowed
},
"analyticsOptIn": {
@ -632,7 +633,11 @@ export const SETTINGS: {[setting: string]: ISetting} = {
displayName: _td("Show chat effects"),
default: true,
},
"Widgets.pinned": {
"Widgets.pinned": { // deprecated
supportedLevels: LEVELS_ROOM_OR_ACCOUNT,
default: {},
},
"Widgets.layout": {
supportedLevels: LEVELS_ROOM_OR_ACCOUNT,
default: {},
},

Some files were not shown because too many files have changed in this diff Show More