Merge branches 'develop' and 't3chguy/app_load4' of github.com:matrix-org/matrix-react-sdk into t3chguy/app_load4

 Conflicts:
	src/components/structures/MatrixChat.tsx
This commit is contained in:
Michael Telatynski 2020-04-30 17:41:14 +01:00
commit 9c916cc544
90 changed files with 2032 additions and 445 deletions

View File

@ -64,8 +64,8 @@
"create-react-class": "^15.6.0",
"diff-dom": "^4.1.3",
"diff-match-patch": "^1.0.4",
"emojibase-data": "^5.0.1",
"emojibase-regex": "^4.0.1",
"emojibase-data": "^4.0.2",
"emojibase-regex": "^3.0.0",
"escape-html": "^1.0.3",
"file-saver": "^1.3.3",
"filesize": "3.5.6",

View File

@ -14,6 +14,13 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
$font-1px: 0.067rem;
$font-2px: 0.133rem;
$font-3px: 0.200rem;
$font-4px: 0.267rem;
$font-5px: 0.333rem;
$font-6px: 0.400rem;
$font-7px: 0.467rem;
$font-8px: 0.533rem;
$font-9px: 0.600rem;
$font-10px: 0.667rem;
@ -60,4 +67,5 @@ $font-49px: 3.267rem;
$font-50px: 3.333rem;
$font-51px: 3.400rem;
$font-52px: 3.467rem;
$font-88px: 5.887rem;
$font-400px: 26.667rem;

View File

@ -74,7 +74,7 @@ limitations under the License.
.mx_RoomSubList_badge > div {
flex: 0 0 auto;
border-radius: 8px;
border-radius: $font-16px;
font-weight: 600;
font-size: $font-12px;
padding: 0 5px;

View File

@ -69,7 +69,7 @@ limitations under the License.
height: 100%;
}
.mx_TagPanel .mx_TagPanel_tagTileContainer > div {
height: 40px;
height: $font-40px;
padding: 10px 0 9px 0;
}
@ -110,13 +110,13 @@ limitations under the License.
.mx_TagPanel .mx_TagTile.mx_TagTile_selected::before {
content: '';
height: 56px;
height: calc(100% + 16px);
background-color: $accent-color;
width: 5px;
position: absolute;
left: -15px;
border-radius: 0 3px 3px 0;
top: -8px; // (56 - 40)/2
top: -8px; // (16px / 2)
}
.mx_TagPanel .mx_TagTile.mx_AccessibleButton:focus {

View File

@ -91,9 +91,8 @@ limitations under the License.
}
.mx_Toast_description {
max-width: 400px;
max-width: 272px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 4px 0 11px 0;
font-size: $font-12px;

View File

@ -17,7 +17,7 @@ limitations under the License.
.mx_MessageComposer_avatar .mx_BaseAvatar {
padding: 2px;
border: 1px solid transparent;
border-radius: 15px;
border-radius: 100%;
}
.mx_MessageComposer_avatar .mx_BaseAvatar_initial {

View File

@ -72,10 +72,10 @@ limitations under the License.
.mx_AccessibleButton::after {
mask-repeat: no-repeat;
mask-position: 0 center;
mask-size: 16px;
mask-size: $font-16px;
position: absolute;
width: 16px;
height: 16px;
width: $font-16px;
height: $font-16px;
content: "";
top: 5px;
left: 14px;

View File

@ -32,3 +32,9 @@ limitations under the License.
padding: 10px;
}
.mx_RestoreKeyBackupDialog_content > div {
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 110px; /* Empirically measured */
}

View File

@ -67,6 +67,8 @@ limitations under the License.
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
display: inline-flex;
align-items: center;
}
.mx_Dropdown_option div {

View File

@ -53,6 +53,9 @@ limitations under the License.
.mx_EditableItem_item {
flex: auto 1 0;
order: 1;
width: calc(100% - 14px); // leave space for the remove button
overflow-x: hidden;
text-overflow: ellipsis;
}
.mx_EditableItemList_label {

View File

@ -6,21 +6,35 @@
.mx_RoomPill,
.mx_GroupPill,
.mx_AtRoomPill {
border-radius: 16px;
display: inline-block;
height: 20px;
line-height: $font-20px;
padding-left: 5px;
display: inline-flex;
align-items: center;
vertical-align: middle;
border-radius: $font-16px;
line-height: $font-15px;
padding-left: 0;
}
a.mx_Pill {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
vertical-align: text-bottom;
max-width: calc(100% - 1ch);
}
.mx_Pill {
padding: $font-1px;
padding-right: 0.4em;
vertical-align: text-top;
line-height: $font-17px;
}
/* More specific to override `.markdown-body a` color */
.mx_EventTile_content .markdown-body a.mx_GroupPill,
.mx_GroupPill {
color: $accent-fg-color;
background-color: $rte-group-pill-color;
}
/* More specific to override `.markdown-body a` text-decoration */
.mx_EventTile_content .markdown-body a.mx_Pill {
text-decoration: none;
@ -31,7 +45,6 @@ a.mx_Pill {
.mx_UserPill {
color: $primary-fg-color;
background-color: $other-user-pill-bg-color;
padding-right: 5px;
}
.mx_UserPill_selected {
@ -45,7 +58,6 @@ a.mx_Pill {
.mx_MessageComposer_input .mx_AtRoomPill {
color: $accent-fg-color;
background-color: $mention-user-pill-bg-color;
padding-right: 5px;
}
/* More specific to override `.markdown-body a` color */
@ -55,15 +67,6 @@ a.mx_Pill {
.mx_GroupPill {
color: $accent-fg-color;
background-color: $rte-room-pill-color;
padding-right: 5px;
}
/* More specific to override `.markdown-body a` color */
.mx_EventTile_content .markdown-body a.mx_GroupPill,
.mx_GroupPill {
color: $accent-fg-color;
background-color: $rte-group-pill-color;
padding-right: 5px;
}
.mx_EventTile_body .mx_UserPill,
@ -77,8 +80,10 @@ a.mx_Pill {
.mx_GroupPill .mx_BaseAvatar,
.mx_AtRoomPill .mx_BaseAvatar {
position: relative;
left: -3px;
top: 2px;
display: inline-flex;
align-items: center;
border-radius: 10rem;
margin-right: 0.24rem;
}
.mx_Markdown_BOLD {

View File

@ -16,12 +16,19 @@ limitations under the License.
.mx_ToggleSwitch {
transition: background-color 0.20s ease-out 0.1s;
width: 48px;
height: 24px;
border-radius: 14px;
width: $font-44px;
height: $font-20px;
border-radius: 1.5rem;
padding: 2px;
background-color: $togglesw-off-color;
position: relative;
opacity: 0.5;
display: flex;
flex-direction: row;
flex: 0 0 auto;
align-items: center;
}
.mx_ToggleSwitch_enabled {
@ -35,19 +42,12 @@ limitations under the License.
.mx_ToggleSwitch_ball {
transition: left 0.15s ease-out 0.1s;
margin: 2px;
width: 20px;
height: 20px;
border-radius: 20px;
width: $font-20px;
height: $font-20px;
border-radius: $font-20px;
background-color: $togglesw-ball-color;
position: absolute;
top: 0;
}
.mx_ToggleSwitch_on > .mx_ToggleSwitch_ball {
left: 23px; // 48px switch - 20px ball - 5px padding = 23px
}
.mx_ToggleSwitch:not(.mx_ToggleSwitch_on) > .mx_ToggleSwitch_ball {
left: 2px;
.mx_ToggleSwitch_on {
flex-direction: row-reverse;
}

View File

@ -98,8 +98,8 @@ limitations under the License.
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
width: 100% !important;
height: 100% !important;
}
.mx_UserInfo_avatar .mx_BaseAvatar_initial {
@ -109,7 +109,7 @@ limitations under the License.
justify-content: center;
// override the calculated sizes so that the letter isn't HUGE
font-size: 56px !important;
font-size: 6rem !important;
width: 100% !important;
transition: font-size 0.5s;
}

View File

@ -31,9 +31,10 @@
}
.mx_Autocomplete_Completion_pill {
border-radius: 17px;
height: 34px;
padding: 0px 5px;
box-sizing: border-box;
border-radius: 2rem;
height: $font-34px;
padding: 0.4rem;
display: flex;
user-select: none;
cursor: pointer;
@ -42,7 +43,7 @@
}
.mx_Autocomplete_Completion_pill > * {
margin: 0 3px;
margin-right: 0.3rem;
}
/* styling for common completion elements */

View File

@ -46,22 +46,19 @@ limitations under the License.
&.mx_BasicMessageComposer_input_shouldShowPillAvatar {
span.mx_UserPill, span.mx_RoomPill {
padding-left: 21px;
position: relative;
// avatar psuedo element
&::before {
position: absolute;
left: 2px;
top: 2px;
content: var(--avatar-letter);
width: 16px;
height: 16px;
width: $font-16px;
height: $font-16px;
margin-right: 0.24rem;
background: var(--avatar-background), $avatar-bg-color;
color: $avatar-initial-color;
background-repeat: no-repeat;
background-size: 16px;
border-radius: 8px;
background-size: $font-16px;
border-radius: $font-16px;
text-align: center;
font-weight: normal;
line-height: $font-16px;

View File

@ -69,8 +69,6 @@ limitations under the License.
padding-right: 12px;
padding-top: 4px;
padding-bottom: 4px;
width: 36px;
height: 36px;
position: relative;
}

View File

@ -45,7 +45,7 @@ limitations under the License.
}
.mx_EventTile.mx_EventTile_info .mx_EventTile_avatar {
top: 8px;
top: $font-8px;
left: 65px;
}
@ -110,14 +110,16 @@ limitations under the License.
user-select: none;
}
.mx_EventTile_line, .mx_EventTile_reply {
.mx_EventTile_continuation .mx_EventTile_line {
clear: both;
}
.mx_EventTile_line, .mx_EventTile_reply {
position: relative;
padding-left: 65px; /* left gutter */
padding-top: 4px;
padding-bottom: 2px;
padding-top: 3px;
padding-bottom: 3px;
border-radius: 4px;
min-height: 24px;
line-height: $font-22px;
}
@ -311,6 +313,8 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody {
.mx_EventTile_readAvatars .mx_BaseAvatar {
position: absolute;
display: inline-block;
height: $font-14px;
width: $font-14px;
}
.mx_EventTile_readAvatarRemainder {

View File

@ -173,8 +173,6 @@ limitations under the License.
.mx_RoomHeader_avatar {
flex: 0;
width: 28px;
height: 28px;
margin: 0 7px;
position: relative;
}

View File

@ -33,11 +33,6 @@ limitations under the License.
margin-bottom: 1em;
}
.mx_RoomRecoveryReminder_button {
@mixin mx_DialogButton;
margin: 0 10px;
}
.mx_RoomRecoveryReminder_secondary {
font-size: 90%;
margin-top: 1em;

View File

@ -20,7 +20,7 @@ limitations under the License.
flex-direction: row;
align-items: center;
cursor: pointer;
height: 34px;
height: $font-34px;
margin: 0;
padding: 0 8px 0 10px;
position: relative;

View File

@ -15,13 +15,13 @@ limitations under the License.
*/
.mx_AvatarSetting_avatar {
width: 88px;
height: 88px;
width: $font-88px;
height: $font-88px;
margin-left: 13px;
position: relative;
& > * {
width: 88px;
width: $font-88px;
box-sizing: border-box;
}
@ -63,7 +63,7 @@ limitations under the License.
& > img,
.mx_AvatarSetting_avatarPlaceholder {
display: block;
height: 88px;
height: $font-88px;
border-radius: 4px;
}

View File

@ -63,7 +63,7 @@ limitations under the License.
display: inline-block;
font-size: $font-14px;
color: $primary-fg-color;
max-width: calc(100% - 48px); // Force word wrap instead of colliding with the switch
max-width: calc(100% - $font-48px); // Force word wrap instead of colliding with the switch
box-sizing: border-box;
padding-right: 10px;
}

View File

@ -55,3 +55,12 @@ limitations under the License.
.mx_SecurityUserSettingsTab_ignoredUser .mx_AccessibleButton {
margin-right: 10px;
}
.mx_SecurityUserSettingsTab {
.mx_SettingsTab_section {
.mx_AccessibleButton_kind_link {
padding: 0;
font-size: inherit;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

View File

@ -147,6 +147,9 @@ $button-danger-disabled-bg-color: #f5b6bb; // TODO: Verify color
$button-link-fg-color: $accent-color;
$button-link-bg-color: transparent;
// Toggle switch
$togglesw-off-color: $room-highlight-color;
$visual-bell-bg-color: #800;
$room-warning-bg-color: $header-panel-bg-color;

View File

@ -17,6 +17,7 @@ limitations under the License.
//
// --accent-color
$accent-color: var(--accent-color);
$accent-bg-color: var(--accent-color-15pct);
$button-bg-color: var(--accent-color);
$button-link-fg-color: var(--accent-color);
$button-primary-bg-color: var(--accent-color);
@ -52,7 +53,6 @@ $tooltip-timeline-bg-color: var(--sidebar-color);
$dialog-backdrop-color: var(--sidebar-color-50pct);
//
// --roomlist-background-color
$event-selected-color: var(--roomlist-background-color);
$header-panel-bg-color: var(--roomlist-background-color);
$reaction-row-button-bg-color: var(--roomlist-background-color);
$panel-gradient: var(--roomlist-background-color-0pct), var(--roomlist-background-color);
@ -124,3 +124,15 @@ $notice-primary-color: var(--warning-color);
$pinned-unread-color: var(--warning-color);
$warning-color: var(--warning-color);
$button-danger-disabled-bg-color: var(--warning-color-50pct); // still needs alpha at 0.5
$username-variant1-color: var(--username-colors_1, $username-variant1-color);
$username-variant2-color: var(--username-colors_2, $username-variant2-color);
$username-variant3-color: var(--username-colors_3, $username-variant3-color);
$username-variant4-color: var(--username-colors_4, $username-variant4-color);
$username-variant5-color: var(--username-colors_5, $username-variant5-color);
$username-variant6-color: var(--username-colors_6, $username-variant6-color);
$username-variant7-color: var(--username-colors_7, $username-variant7-color);
$username-variant8-color: var(--username-colors_8, $username-variant8-color);
$event-selected-color: var(--timeline-highlights-color);
$event-highlight-bg-color: var(--timeline-highlights-color);

View File

@ -53,13 +53,56 @@ export function avatarUrlForUser(user, width, height, resizeMethod) {
return url;
}
function isValidHexColor(color) {
return typeof color === "string" &&
(color.length === 7 || color.lengh === 9) &&
color.charAt(0) === "#" &&
!color.substr(1).split("").some(c => isNaN(parseInt(c, 16)));
}
function urlForColor(color) {
const size = 40;
const canvas = document.createElement("canvas");
canvas.width = size;
canvas.height = size;
const ctx = canvas.getContext("2d");
// bail out when using jsdom in unit tests
if (!ctx) {
return "";
}
ctx.fillStyle = color;
ctx.fillRect(0, 0, size, size);
return canvas.toDataURL();
}
// XXX: Ideally we'd clear this cache when the theme changes
// but since this function is at global scope, it's a bit
// hard to install a listener here, even if there were a clear event to listen to
const colorToDataURLCache = new Map();
export function defaultAvatarUrlForString(s) {
const images = ['03b381', '368bd6', 'ac3ba8'];
const defaultColors = ['#03b381', '#368bd6', '#ac3ba8'];
let total = 0;
for (let i = 0; i < s.length; ++i) {
total += s.charCodeAt(i);
}
return require('../res/img/' + images[total % images.length] + '.png');
const colorIndex = total % defaultColors.length;
// overwritten color value in custom themes
const cssVariable = `--avatar-background-colors_${colorIndex}`;
const cssValue = document.body.style.getPropertyValue(cssVariable);
const color = cssValue || defaultColors[colorIndex];
let dataUrl = colorToDataURLCache.get(color);
if (!dataUrl) {
// validate color as this can come from account_data
// with custom theming
if (isValidHexColor(color)) {
dataUrl = urlForColor(color);
colorToDataURLCache.set(color, dataUrl);
} else {
dataUrl = "";
}
}
return dataUrl;
}
/**

View File

@ -20,12 +20,13 @@ import * as sdk from './index';
import { _t } from './languageHandler';
import ToastStore from './stores/ToastStore';
function toastKey(deviceId) {
return 'unverified_session_' + deviceId;
}
const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000;
const THIS_DEVICE_TOAST_KEY = 'setupencryption';
const OTHER_DEVICES_TOAST_KEY = 'reviewsessions';
function toastKey(deviceId) {
return "unverified_session_" + deviceId;
}
export default class DeviceListener {
static sharedInstance() {
@ -34,8 +35,6 @@ export default class DeviceListener {
}
constructor() {
// set of device IDs we're currently showing toasts for
this._activeNagToasts = new Set();
// device IDs for which the user has dismissed the verify toast ('Later')
this._dismissed = new Set();
// has the user dismissed any of the various nag toasts to setup encryption on this device?
@ -44,9 +43,18 @@ export default class DeviceListener {
// cache of the key backup info
this._keyBackupInfo = null;
this._keyBackupFetchedAt = null;
// We keep a list of our own device IDs so we can batch ones that were already
// there the last time the app launched into a single toast, but display new
// ones in their own toasts.
this._ourDeviceIdsAtStart = null;
// The set of device IDs we're currently displaying toasts for
this._displayingToastsForDeviceIds = new Set();
}
start() {
MatrixClientPeg.get().on('crypto.willUpdateDevices', this._onWillUpdateDevices);
MatrixClientPeg.get().on('crypto.devicesUpdated', this._onDevicesUpdated);
MatrixClientPeg.get().on('deviceVerificationChanged', this._onDeviceVerificationChanged);
MatrixClientPeg.get().on('userTrustStatusChanged', this._onUserTrustStatusChanged);
@ -58,6 +66,7 @@ export default class DeviceListener {
stop() {
if (MatrixClientPeg.get()) {
MatrixClientPeg.get().removeListener('crypto.willUpdateDevices', this._onWillUpdateDevices);
MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this._onDevicesUpdated);
MatrixClientPeg.get().removeListener('deviceVerificationChanged', this._onDeviceVerificationChanged);
MatrixClientPeg.get().removeListener('userTrustStatusChanged', this._onUserTrustStatusChanged);
@ -66,10 +75,21 @@ export default class DeviceListener {
MatrixClientPeg.get().removeListener('sync', this._onSync);
}
this._dismissed.clear();
this._dismissedThisDeviceToast = false;
this._keyBackupInfo = null;
this._keyBackupFetchedAt = null;
}
dismissVerification(deviceId) {
this._dismissed.add(deviceId);
/**
* Dismiss notifications about our own unverified devices
*
* @param {String[]} deviceIds List of device IDs to dismiss notifications for
*/
async dismissUnverifiedSessions(deviceIds) {
for (const d of deviceIds) {
this._dismissed.add(d);
}
this._recheck();
}
@ -78,6 +98,28 @@ export default class DeviceListener {
this._recheck();
}
_ensureDeviceIdsAtStartPopulated() {
if (this._ourDeviceIdsAtStart === null) {
const cli = MatrixClientPeg.get();
this._ourDeviceIdsAtStart = new Set(
cli.getStoredDevicesForUser(cli.getUserId()).map(d => d.deviceId),
);
}
}
_onWillUpdateDevices = async (users, initialFetch) => {
// If we didn't know about *any* devices before (ie. it's fresh login),
// then they are all pre-existing devices, so ignore this and set the
// devicesAtStart list to the devices that we see after the fetch.
if (initialFetch) return;
const myUserId = MatrixClientPeg.get().getUserId();
if (users.includes(myUserId)) this._ensureDeviceIdsAtStartPopulated();
// No need to do a recheck here: we just need to get a snapshot of our devices
// before we download any new ones.
}
_onDevicesUpdated = (users) => {
if (!users.includes(MatrixClientPeg.get().getUserId())) return;
this._recheck();
@ -146,6 +188,8 @@ export default class DeviceListener {
ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY);
} else {
if (!crossSigningReady) {
// make sure our keys are finished downlaoding
await cli.downloadKeys([cli.getUserId()]);
// cross signing isn't enabled - nag to enable it
// There are 3 different toasts for:
if (cli.getStoredCrossSigningForUser(cli.getUserId())) {
@ -179,7 +223,6 @@ export default class DeviceListener {
});
}
}
return;
} else if (await cli.secretStorageKeyNeedsUpgrade()) {
ToastStore.sharedInstance().addOrReplaceToast({
key: THIS_DEVICE_TOAST_KEY,
@ -194,36 +237,70 @@ export default class DeviceListener {
}
}
// This needs to be done after awaiting on downloadKeys() above, so
// we make sure we get the devices after the fetch is done.
this._ensureDeviceIdsAtStartPopulated();
// Unverified devices that were there last time the app ran
// (technically could just be a boolean: we don't actually
// need to remember the device IDs, but for the sake of
// symmetry...).
const oldUnverifiedDeviceIds = new Set();
// Unverified devices that have appeared since then
const newUnverifiedDeviceIds = new Set();
// as long as cross-signing isn't ready,
// you can't see or dismiss any device toasts
if (crossSigningReady) {
const newActiveToasts = new Set();
const devices = await cli.getStoredDevicesForUser(cli.getUserId());
const devices = cli.getStoredDevicesForUser(cli.getUserId());
for (const device of devices) {
if (device.deviceId == cli.deviceId) continue;
const deviceTrust = await cli.checkDeviceTrust(cli.getUserId(), device.deviceId);
if (deviceTrust.isCrossSigningVerified() || this._dismissed.has(device.deviceId)) {
ToastStore.sharedInstance().dismissToast(toastKey(device.deviceId));
} else {
this._activeNagToasts.add(device.deviceId);
ToastStore.sharedInstance().addOrReplaceToast({
key: toastKey(device.deviceId),
title: _t("Unverified login. Was this you?"),
icon: "verification_warning",
props: { device },
component: sdk.getComponent("toasts.UnverifiedSessionToast"),
});
newActiveToasts.add(device.deviceId);
if (!deviceTrust.isCrossSigningVerified() && !this._dismissed.has(device.deviceId)) {
if (this._ourDeviceIdsAtStart.has(device.deviceId)) {
oldUnverifiedDeviceIds.add(device.deviceId);
} else {
newUnverifiedDeviceIds.add(device.deviceId);
}
}
}
// clear any other outstanding toasts (eg. logged out devices)
for (const deviceId of this._activeNagToasts) {
if (!newActiveToasts.has(deviceId)) ToastStore.sharedInstance().dismissToast(toastKey(deviceId));
}
this._activeNagToasts = newActiveToasts;
}
// Display or hide the batch toast for old unverified sessions
if (oldUnverifiedDeviceIds.size > 0) {
ToastStore.sharedInstance().addOrReplaceToast({
key: OTHER_DEVICES_TOAST_KEY,
title: _t("Review where youre logged in"),
icon: "verification_warning",
priority: ToastStore.PRIORITY_LOW,
props: {
deviceIds: oldUnverifiedDeviceIds,
},
component: sdk.getComponent("toasts.BulkUnverifiedSessionsToast"),
});
} else {
ToastStore.sharedInstance().dismissToast(OTHER_DEVICES_TOAST_KEY);
}
// Show toasts for new unverified devices if they aren't already there
for (const deviceId of newUnverifiedDeviceIds) {
ToastStore.sharedInstance().addOrReplaceToast({
key: toastKey(deviceId),
title: _t("New login. Was this you?"),
icon: "verification_warning",
props: { deviceId },
component: sdk.getComponent("toasts.UnverifiedSessionToast"),
});
}
// ...and hide any we don't need any more
for (const deviceId of this._displayingToastsForDeviceIds) {
if (!newUnverifiedDeviceIds.has(deviceId)) {
ToastStore.sharedInstance().dismissToast(toastKey(deviceId));
}
}
this._displayingToastsForDeviceIds = newUnverifiedDeviceIds;
}
}

View File

@ -23,10 +23,13 @@ import request from "browser-request";
import * as Matrix from 'matrix-js-sdk';
import SdkConfig from "./SdkConfig";
import {WidgetType} from "./widgets/WidgetType";
// The version of the integration manager API we're intending to work with
const imApiVersion = "1.1";
// TODO: Generify the name of this class and all components within - it's not just for Scalar.
export default class ScalarAuthClient {
constructor(apiUrl, uiUrl) {
this.apiUrl = apiUrl;
@ -233,20 +236,20 @@ export default class ScalarAuthClient {
* Mark all assets associated with the specified widget as "disabled" in the
* integration manager database.
* This can be useful to temporarily prevent purchased assets from being displayed.
* @param {string} widgetType [description]
* @param {string} widgetId [description]
* @param {WidgetType} widgetType The Widget Type to disable assets for
* @param {string} widgetId The widget ID to disable assets for
* @return {Promise} Resolves on completion
*/
disableWidgetAssets(widgetType, widgetId) {
disableWidgetAssets(widgetType: WidgetType, widgetId) {
let url = this.apiUrl + '/widgets/set_assets_state';
url = this.getStarterLink(url);
return new Promise((resolve, reject) => {
request({
method: 'GET',
method: 'GET', // XXX: Actions shouldn't be GET requests
uri: url,
json: true,
qs: {
'widget_type': widgetType,
'widget_type': widgetType.preferred,
'widget_id': widgetId,
'state': 'disable',
},

View File

@ -16,6 +16,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
// TODO: Generify the name of this and all components within - it's not just for scalar.
/*
Listens for incoming postMessage requests from the integrations UI URL. The following API is exposed:
{

View File

@ -836,7 +836,7 @@ export const Commands = [
const fingerprint = matches[3];
return success((async () => {
const device = await cli.getStoredDevice(userId, deviceId);
const device = cli.getStoredDevice(userId, deviceId);
if (!device) {
throw new Error(_t('Unknown (user, session) pair:') + ` (${userId}, ${deviceId})`);
}

View File

@ -1215,6 +1215,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
*/
private async onLoggedIn() {
ThemeController.isLogin = false;
this.themeWatcher.recheck();
this.setStateForNewView({ view: Views.LOGGED_IN });
// If a specific screen is set to be shown after login, show that above
// all else, as it probably means the user clicked on something already.

View File

@ -221,10 +221,27 @@ export default class RightPanel extends React.Component {
case RIGHT_PANEL_PHASES.EncryptionPanel:
if (SettingsStore.getValue("feature_cross_signing")) {
const onClose = () => {
dis.dispatch({
action: "view_user",
member: this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel ? this.state.member : null,
});
// XXX: There are three different ways of 'closing' this panel depending on what state
// things are in... this knows far more than it should do about the state of the rest
// of the app and is generally a bit silly.
if (this.props.user) {
// If we have a user prop then we're displaying a user from the 'user' page type
// in LoggedInView, so need to change the page type to close the panel (we switch
// to the home page which is not obviosuly the correct thing to do, but I'm not sure
// anything else is - we could hide the close button altogether?)
dis.dispatch({
action: "view_home_page",
});
} else {
// Otherwise we have got our user from RoomViewStore which means we're being shown
// within a room, so go back to the member panel if we were in the encryption panel,
// or the member list if we were in the member panel... phew.
dis.dispatch({
action: "view_user",
member: this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel ?
this.state.member : null,
});
}
};
panel = <UserInfo
user={this.state.member}

View File

@ -32,6 +32,7 @@ import RoomTile from "../views/rooms/RoomTile";
import LazyRenderList from "../views/elements/LazyRenderList";
import {_t} from "../../languageHandler";
import {RovingTabIndexWrapper} from "../../accessibility/RovingTabIndex";
import toRem from "../../utils/rem";
// turn this on for drop & drag console debugging galore
const debug = false;
@ -383,7 +384,7 @@ export default class RoomSubList extends React.PureComponent {
setHeight = (height) => {
if (this._subList.current) {
this._subList.current.style.height = `${height}px`;
this._subList.current.style.height = toRem(height);
}
this._updateLazyRenderHeight(height);
};

View File

@ -1768,7 +1768,7 @@ export default createReactClass({
const showRoomRecoveryReminder = (
SettingsStore.getValue("showRoomRecoveryReminder") &&
this.context.isRoomEncrypted(this.state.room.roomId) &&
!this.context.getKeyBackupEnabled()
this.context.getKeyBackupEnabled() === false
);
const hiddenHighlightCount = this._getHiddenHighlightCount();

View File

@ -131,7 +131,7 @@ export default class SetupEncryptionBody extends React.Component {
</div>
<div className="mx_CompleteSecurity_actionRow">
<AccessibleButton kind="link" onClick={this.onSkipClick}>
<AccessibleButton kind="link" onClick={this._onUsePassphraseClick}>
{_t("Use Recovery Passphrase or Key")}
</AccessibleButton>
<AccessibleButton kind="danger" onClick={this.onSkipClick}>

View File

@ -24,6 +24,7 @@ import * as AvatarLogic from '../../../Avatar';
import SettingsStore from "../../../settings/SettingsStore";
import AccessibleButton from '../elements/AccessibleButton';
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import toRem from "../../../utils/rem";
export default createReactClass({
displayName: 'BaseAvatar',
@ -164,9 +165,11 @@ export default createReactClass({
const initialLetter = AvatarLogic.getInitialLetter(name);
const textNode = (
<span className="mx_BaseAvatar_initial" aria-hidden="true"
style={{ fontSize: (width * 0.65) + "px",
width: width + "px",
lineHeight: height + "px" }}
style={{
fontSize: toRem(width * 0.65),
width: toRem(width),
lineHeight: toRem(height),
}}
>
{ initialLetter }
</span>
@ -174,7 +177,11 @@ export default createReactClass({
const imgNode = (
<img className="mx_BaseAvatar_image" src={imageUrl}
alt="" title={title} onError={this.onError}
width={width} height={height} aria-hidden="true" />
aria-hidden="true"
style={{
width: toRem(width),
height: toRem(height)
}} />
);
if (onClick != null) {
return (
@ -202,7 +209,10 @@ export default createReactClass({
src={imageUrl}
onClick={onClick}
onError={this.onError}
width={width} height={height}
style={{
width: toRem(width),
height: toRem(height),
}}
title={title} alt=""
inputRef={inputRef}
{...otherProps} />
@ -213,7 +223,10 @@ export default createReactClass({
className="mx_BaseAvatar mx_BaseAvatar_image"
src={imageUrl}
onError={this.onError}
width={width} height={height}
style={{
width: toRem(width),
height: toRem(height),
}}
title={title} alt=""
ref={inputRef}
{...otherProps} />

View File

@ -577,10 +577,13 @@ export default class InviteDialog extends React.PureComponent {
if (SettingsStore.getValue("feature_cross_signing")) {
// Check whether all users have uploaded device keys before.
// If so, enable encryption in the new room.
const client = MatrixClientPeg.get();
const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);
if (allHaveDeviceKeys) {
createRoomOptions.encryption = true;
const has3PidMembers = targets.some(t => t instanceof ThreepidMember);
if (!has3PidMembers) {
const client = MatrixClientPeg.get();
const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);
if (allHaveDeviceKeys) {
createRoomOptions.encryption = true;
}
}
}

View File

@ -14,16 +14,52 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import PropTypes from 'prop-types';
import SetupEncryptionBody from '../../structures/auth/SetupEncryptionBody';
import BaseDialog from './BaseDialog';
import { _t } from '../../../languageHandler';
import { SetupEncryptionStore, PHASE_DONE } from '../../../stores/SetupEncryptionStore';
export default function SetupEncryptionDialog({onFinished}) {
return <BaseDialog
headerImage={require("../../../../res/img/e2e/warning.svg")}
onFinished={onFinished}
title={_t("Verify this session")}
>
<SetupEncryptionBody onFinished={onFinished} />
</BaseDialog>;
function iconFromPhase(phase) {
if (phase === PHASE_DONE) {
return require("../../../../res/img/e2e/verified.svg");
} else {
return require("../../../../res/img/e2e/warning.svg");
}
}
export default class SetupEncryptionDialog extends React.Component {
static propTypes = {
onFinished: PropTypes.func.isRequired,
};
constructor() {
super();
this.store = SetupEncryptionStore.sharedInstance();
this.state = {icon: iconFromPhase(this.store.phase)};
}
componentDidMount() {
this.store.on("update", this._onStoreUpdate);
}
componentWillUnmount() {
this.store.removeListener("update", this._onStoreUpdate);
}
_onStoreUpdate = () => {
this.setState({icon: iconFromPhase(this.store.phase)});
};
render() {
return <BaseDialog
headerImage={this.state.icon}
onFinished={this.props.onFinished}
title={_t("Verify this session")}
>
<SetupEncryptionBody onFinished={this.props.onFinished} />
</BaseDialog>;
}
}

View File

@ -89,7 +89,7 @@ export default class UserSettingsDialog extends React.Component {
tabs.push(new Tab(
_td("Security & Privacy"),
"mx_UserSettingsDialog_securityIcon",
<SecurityUserSettingsTab />,
<SecurityUserSettingsTab closeSettingsFn={this.props.onFinished} />,
));
if (SdkConfig.get()['showLabsSettings'] || SettingsStore.getLabsFeatures().length > 0) {
tabs.push(new Tab(

View File

@ -59,6 +59,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
forceRecoveryKey: false,
passPhrase: '',
restoreType: null,
progress: { stage: "prefetch" },
};
}
@ -80,6 +81,12 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
});
}
_progressCallback = (data) => {
this.setState({
progress: data,
});
}
_onResetRecoveryClick = () => {
this.props.onFinished(false);
Modal.createTrackedDialogAsync('Key Backup', 'Key Backup',
@ -110,6 +117,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
// is the right one and restoring it is currently the only way we can do this.
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithPassword(
this.state.passPhrase, undefined, undefined, this.state.backupInfo,
{ progressCallback: this._progressCallback },
);
if (this.props.keyCallback) {
const key = await MatrixClientPeg.get().keyBackupKeyFromPassword(
@ -146,6 +154,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
try {
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithRecoveryKey(
this.state.recoveryKey, undefined, undefined, this.state.backupInfo,
{ progressCallback: this._progressCallback },
);
if (this.props.keyCallback) {
const key = MatrixClientPeg.get().keyBackupKeyFromRecoveryKey(this.state.recoveryKey);
@ -185,6 +194,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
const recoverInfo = await accessSecretStorage(async () => {
return MatrixClientPeg.get().restoreKeyBackupWithSecretStorage(
this.state.backupInfo,
{ progressCallback: this._progressCallback },
);
});
this.setState({
@ -207,6 +217,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
undefined, /* targetRoomId */
undefined, /* targetSessionId */
backupInfo,
{ progressCallback: this._progressCallback },
);
this.setState({
recoverInfo,
@ -272,8 +283,20 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
let content;
let title;
if (this.state.loading) {
title = _t("Loading...");
content = <Spinner />;
title = _t("Restoring keys from backup");
let details;
if (this.state.progress.stage === "fetch") {
details = _t("Fetching keys from server...");
} else if (this.state.progress.stage === "load_keys") {
const { total, successes, failures } = this.state.progress;
details = _t("%(completed)s of %(total)s keys restored", { total, completed: successes + failures });
} else if (this.state.progress.stage === "prefetch") {
details = _t("Fetching keys from server...");
}
content = <div>
<div>{details}</div>
<Spinner />
</div>;
} else if (this.state.loadError) {
title = _t("Error");
content = _t("Unable to load backup status");
@ -305,7 +328,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
content = _t("No backup found!");
} else if (this.state.recoverInfo) {
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
title = _t("Backup restored");
title = _t("Keys restored");
let failedToDecrypt;
if (this.state.recoverInfo.total > this.state.recoverInfo.imported) {
failedToDecrypt = <p>{_t(
@ -314,7 +337,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
)}</p>;
}
content = <div>
<p>{_t("Restored %(sessionCount)s session keys", {sessionCount: this.state.recoverInfo.imported})}</p>
<p>{_t("Successfully restored %(sessionCount)s keys", {sessionCount: this.state.recoverInfo.imported})}</p>
{failedToDecrypt}
<DialogButtons primaryButton={_t('OK')}
onPrimaryButtonClick={this._onDone}
@ -435,7 +458,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
onFinished={this.props.onFinished}
title={title}
>
<div>
<div className='mx_RestoreKeyBackupDialog_content'>
{content}
</div>
</BaseDialog>

View File

@ -21,6 +21,7 @@ import * as sdk from '../../../../index';
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
import { _t } from '../../../../languageHandler';
import { accessSecretStorage } from '../../../../CrossSigningManager';
/*
* Access Secure Secret Storage by requesting the user's passphrase.
@ -55,8 +56,9 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
}
_onResetRecoveryClick = () => {
// Re-enter the access flow, but resetting storage this time around.
this.props.onFinished(false);
throw new Error("Resetting secret storage unimplemented");
accessSecretStorage(() => {}, /* forceReset = */ true);
}
_onRecoveryKeyChange = (e) => {

View File

@ -188,13 +188,14 @@ export default class AppTile extends React.Component {
}
}
// TODO: Generify the name of this function. It's not just scalar tokens.
/**
* Adds a scalar token to the widget URL, if required
* Component initialisation is only complete when this function has resolved
*/
setScalarToken() {
if (!WidgetUtils.isScalarUrl(this.props.app.url)) {
console.warn('Non-scalar widget, not setting scalar token!', url);
console.warn('Widget does not match integration manager, refusing to set auth token', url);
this.setState({
error: null,
widgetUrl: this._addWurlParams(this.props.app.url),
@ -218,7 +219,7 @@ export default class AppTile extends React.Component {
const defaultManager = managers.getPrimaryManager();
if (!WidgetUtils.isScalarUrl(defaultManager.apiUrl)) {
console.warn('Non-scalar manager, not setting scalar token!', url);
console.warn('Unknown integration manager, refusing to set auth token', url);
this.setState({
error: null,
widgetUrl: this._addWurlParams(this.props.app.url),
@ -423,8 +424,13 @@ export default class AppTile extends React.Component {
_setupWidgetMessaging() {
// FIXME: There's probably no reason to do this here: it should probably be done entirely
// in ActiveWidgetStore.
// We use the app's URL over the rendered URL so that anything the widget does which could
// lead to requesting a "security key" will pass accordingly. The only other thing this URL
// is used for is to determine the origin we're talking to, and therefore we don't need the
// fully templated URL.
const widgetMessaging = new WidgetMessaging(
this.props.app.id, this._getRenderedUrl(), this.props.userWidget, this._appFrame.current.contentWindow);
this.props.app.id, this.props.app.url, this.props.userWidget, this._appFrame.current.contentWindow);
ActiveWidgetStore.setWidgetMessaging(this.props.app.id, widgetMessaging);
widgetMessaging.getCapabilities().then((requestedCapabilities) => {
console.log(`Widget ${this.props.app.id} requested capabilities: ` + requestedCapabilities);
@ -560,15 +566,18 @@ export default class AppTile extends React.Component {
* Replace the widget template variables in a url with their values
*
* @param {string} u The URL with template variables
* @param {string} widgetType The widget's type
*
* @returns {string} url with temlate variables replaced
*/
_templatedUrl(u) {
_templatedUrl(u, widgetType: string) {
const targetData = {};
if (WidgetType.JITSI.matches(widgetType)) {
targetData['domain'] = 'jitsi.riot.im'; // v1 jitsi widgets have this hardcoded
}
const myUserId = MatrixClientPeg.get().credentials.userId;
const myUser = MatrixClientPeg.get().getUser(myUserId);
const vars = Object.assign({
domain: "jitsi.riot.im", // v1 widgets have this hardcoded
}, this.props.app.data, {
const vars = Object.assign(targetData, this.props.app.data, {
'matrix_user_id': myUserId,
'matrix_room_id': this.props.room.roomId,
'matrix_display_name': myUser ? myUser.displayName : myUserId,
@ -605,18 +614,19 @@ export default class AppTile extends React.Component {
} else {
url = this._getSafeUrl(this.state.widgetUrl);
}
return this._templatedUrl(url);
return this._templatedUrl(url, this.props.app.type);
}
_getPopoutUrl() {
if (WidgetType.JITSI.matches(this.props.app.type)) {
return this._templatedUrl(
WidgetUtils.getLocalJitsiWrapperUrl({forLocalRender: false}),
this.props.app.type,
);
} else {
// use app.url, not state.widgetUrl, because we want the one without
// the wURL params for the popped-out version.
return this._templatedUrl(this._getSafeUrl(this.props.app.url));
return this._templatedUrl(this._getSafeUrl(this.props.app.url), this.props.app.type);
}
}
@ -630,7 +640,10 @@ export default class AppTile extends React.Component {
if (ALLOWED_APP_URL_SCHEMES.includes(parsedWidgetUrl.protocol)) {
safeWidgetUrl = url.format(parsedWidgetUrl);
}
return safeWidgetUrl;
// Replace all the dollar signs back to dollar signs as they don't affect HTTP at all.
// We also need the dollar signs in-tact for variable substitution.
return safeWidgetUrl.replace(/%24/g, '$');
}
_getTileTitle() {

View File

@ -22,7 +22,6 @@ import VerificationPanel from "./VerificationPanel";
import {MatrixClientPeg} from "../../../MatrixClientPeg";
import {ensureDMExists} from "../../../createRoom";
import {useEventEmitter} from "../../../hooks/useEventEmitter";
import {useAsyncMemo} from "../../../hooks/useAsyncMemo";
import Modal from "../../../Modal";
import {PHASE_REQUESTED, PHASE_UNSENT} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
import * as sdk from "../../../index";
@ -47,10 +46,7 @@ const EncryptionPanel = (props) => {
}, [verificationRequest]);
const deviceId = request && request.channel.deviceId;
const device = useAsyncMemo(() => {
const cli = MatrixClientPeg.get();
return cli.getStoredDevice(cli.getUserId(), deviceId);
}, [deviceId]);
const device = MatrixClientPeg.get().getStoredDevice(MatrixClientPeg.get().getUserId(), deviceId);
useEffect(() => {
async function awaitPromise() {

View File

@ -181,9 +181,7 @@ function DeviceItem({userId, device}) {
});
const onDeviceClick = () => {
if (!isVerified) {
verifyDevice(cli.getUser(userId), device);
}
verifyDevice(cli.getUser(userId), device);
};
const deviceName = device.ambiguous ?
@ -191,17 +189,29 @@ function DeviceItem({userId, device}) {
device.getDisplayName();
let trustedLabel = null;
if (userTrust.isVerified()) trustedLabel = isVerified ? _t("Trusted") : _t("Not trusted");
return (
<AccessibleButton
className={classes}
title={device.deviceId}
onClick={onDeviceClick}
>
<div className={iconClasses} />
<div className="mx_UserInfo_device_name">{deviceName}</div>
<div className="mx_UserInfo_device_trusted">{trustedLabel}</div>
</AccessibleButton>
);
if (isVerified) {
return (
<div className={classes} title={device.deviceId} >
<div className={iconClasses} />
<div className="mx_UserInfo_device_name">{deviceName}</div>
<div className="mx_UserInfo_device_trusted">{trustedLabel}</div>
</div>
);
} else {
return (
<AccessibleButton
className={classes}
title={device.deviceId}
onClick={onDeviceClick}
>
<div className={iconClasses} />
<div className="mx_UserInfo_device_name">{deviceName}</div>
<div className="mx_UserInfo_device_trusted">{trustedLabel}</div>
</AccessibleButton>
);
}
}
function DevicesSection({devices, userId, loading}) {
@ -1100,7 +1110,7 @@ export const useDevices = (userId) => {
async function _downloadDeviceList() {
try {
await cli.downloadKeys([userId], true);
const devices = await cli.getStoredDevicesForUser(userId);
const devices = cli.getStoredDevicesForUser(userId);
if (cancelled) {
// we got cancelled - presumably a different user now
@ -1125,7 +1135,7 @@ export const useDevices = (userId) => {
useEffect(() => {
let cancel = false;
const updateDevices = async () => {
const newDevices = await cli.getStoredDevicesForUser(userId);
const newDevices = cli.getStoredDevicesForUser(userId);
if (cancel) return;
setDevices(newDevices);
};

View File

@ -34,6 +34,7 @@ import {ALL_RULE_TYPES} from "../../../mjolnir/BanList";
import * as ObjectUtils from "../../../ObjectUtils";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import {E2E_STATE} from "./E2EIcon";
import toRem from "../../../utils/rem";
const eventTileTypes = {
'm.room.message': 'messages.MessageEvent',
@ -473,7 +474,7 @@ export default createReactClass({
if (remainder > 0) {
remText = <span className="mx_EventTile_readAvatarRemainder"
onClick={this.toggleAllReadAvatars}
style={{ right: -(left - receiptOffset) }}>{ remainder }+
style={{ right: "calc(" + toRem(-left) + " + " + receiptOffset + "px)" }}>{ remainder }+
</span>;
}
}

View File

@ -17,7 +17,6 @@ limitations under the License.
import React from 'react';
import { _t } from '../../../languageHandler';
import * as sdk from '../../../index';
import SettingsStore from '../../../settings/SettingsStore';
export default class InviteOnlyIcon extends React.Component {
constructor() {
@ -39,10 +38,6 @@ export default class InviteOnlyIcon extends React.Component {
render() {
const classes = this.props.collapsedPanel ? "mx_InviteOnlyIcon_small": "mx_InviteOnlyIcon_large";
if (!SettingsStore.isFeatureEnabled("feature_invite_only_padlocks")) {
return null;
}
const Tooltip = sdk.getComponent("elements.Tooltip");
let tooltip;
if (this.state.hover) {

View File

@ -160,13 +160,10 @@ export default createReactClass({
// no need to re-download the whole thing; just update our copy of
// the list.
// Promise.resolve to handle transition from static result to promise; can be removed
// in future
Promise.resolve(this.context.getStoredDevicesForUser(userId)).then((devices) => {
this.setState({
devices: devices,
e2eStatus: this._getE2EStatus(devices),
});
const devices = this.context.getStoredDevicesForUser(userId);
this.setState({
devices: devices,
e2eStatus: this._getE2EStatus(devices),
});
}
},

View File

@ -129,7 +129,7 @@ export default createReactClass({
return;
}
const devices = await cli.getStoredDevicesForUser(userId);
const devices = cli.getStoredDevicesForUser(userId);
const anyDeviceUnverified = devices.some(device => {
const { deviceId } = device;
// For your own devices, we use the stricter check of cross-signing

View File

@ -23,6 +23,7 @@ import { _t } from '../../../languageHandler';
import {formatDate} from '../../../DateUtils';
import Velociraptor from "../../../Velociraptor";
import * as sdk from "../../../index";
import toRem from "../../../utils/rem";
let bounce = false;
try {
@ -148,7 +149,7 @@ export default createReactClass({
// start at the old height and in the old h pos
startStyles.push({ top: startTopOffset+"px",
left: oldInfo.left+"px" });
left: toRem(oldInfo.left) });
const reorderTransitionOpts = {
duration: 100,
@ -181,7 +182,7 @@ export default createReactClass({
}
const style = {
left: this.props.leftOffset+'px',
left: toRem(this.props.leftOffset),
top: '0px',
visibility: this.props.hidden ? 'hidden' : 'visible',
};

View File

@ -150,7 +150,7 @@ export default class RoomRecoveryReminder extends React.PureComponent {
)}</p>
</div>
<div className="mx_RoomRecoveryReminder_buttons">
<AccessibleButton className="mx_RoomRecoveryReminder_button"
<AccessibleButton kind="primary"
onClick={this.onSetupClick}>
{setupCaption}
</AccessibleButton>

View File

@ -26,8 +26,7 @@ import PersistedElement from "../elements/PersistedElement";
import {IntegrationManagers} from "../../../integrations/IntegrationManagers";
import SettingsStore from "../../../settings/SettingsStore";
import {ContextMenu} from "../../structures/ContextMenu";
const widgetType = 'm.stickerpicker';
import {WidgetType} from "../../../widgets/WidgetType";
// This should be below the dialog level (4000), but above the rest of the UI (1000-2000).
// We sit in a context menu, so this should be given to the context menu.
@ -87,7 +86,7 @@ export default class Stickerpicker extends React.Component {
console.log('Removing Stickerpicker widgets');
if (this.state.widgetId) {
if (scalarClient) {
scalarClient.disableWidgetAssets(widgetType, this.state.widgetId).then(() => {
scalarClient.disableWidgetAssets(WidgetType.STICKERPICKER, this.state.widgetId).then(() => {
console.log('Assets disabled');
}).catch((err) => {
console.error('Failed to disable assets');
@ -364,13 +363,13 @@ export default class Stickerpicker extends React.Component {
if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) {
IntegrationManagers.sharedInstance().openAll(
this.props.room,
`type_${widgetType}`,
`type_${WidgetType.STICKERPICKER.preferred}`,
this.state.widgetId,
);
} else {
IntegrationManagers.sharedInstance().getPrimaryManager().open(
this.props.room,
`type_${widgetType}`,
`type_${WidgetType.STICKERPICKER.preferred}`,
this.state.widgetId,
);
}

View File

@ -163,7 +163,7 @@ export default class EventIndexPanel extends React.Component {
);
eventIndexingSettings = (
<div>
<div className='mx_SettingsTab_subsectionText'>
{
_t( "Riot is missing some components required for securely " +
"caching encrypted messages locally. If you'd like to " +
@ -180,7 +180,7 @@ export default class EventIndexPanel extends React.Component {
);
} else {
eventIndexingSettings = (
<div>
<div className='mx_SettingsTab_subsectionText'>
{
_t( "Riot can't securely cache encrypted messages locally " +
"while running in a web browser. Use <riotLink>Riot Desktop</riotLink> " +

View File

@ -52,6 +52,10 @@ export class IgnoredUser extends React.Component {
}
export default class SecurityUserSettingsTab extends React.Component {
static propTypes = {
closeSettingsFn: PropTypes.func.isRequired,
};
constructor() {
super();
@ -107,6 +111,11 @@ export default class SecurityUserSettingsTab extends React.Component {
);
};
_onGoToUserProfileClick = () => {
window.location.href = "#/user/" + MatrixClientPeg.get().getUserId();
this.props.closeSettingsFn();
}
_onUserUnignored = async (userId) => {
const {ignoredUserIds, waitingUnignored} = this.state;
const currentlyIgnoredUserIds = ignoredUserIds.filter(e => !waitingUnignored.includes(e));
@ -282,15 +291,12 @@ export default class SecurityUserSettingsTab extends React.Component {
</div>
);
let eventIndex;
if (SettingsStore.isFeatureEnabled("feature_event_indexing")) {
eventIndex = (
<div className="mx_SettingsTab_section">
<span className="mx_SettingsTab_subheading">{_t("Message search")}</span>
<EventIndexPanel />
</div>
);
}
const eventIndex = (
<div className="mx_SettingsTab_section">
<span className="mx_SettingsTab_subheading">{_t("Message search")}</span>
<EventIndexPanel />
</div>
);
// XXX: There's no such panel in the current cross-signing designs, but
// it's useful to have for testing the feature. If there's no interest
@ -315,7 +321,18 @@ export default class SecurityUserSettingsTab extends React.Component {
<div className="mx_SettingsTab mx_SecurityUserSettingsTab">
<div className="mx_SettingsTab_heading">{_t("Security & Privacy")}</div>
<div className="mx_SettingsTab_section">
<span className="mx_SettingsTab_subheading">{_t("Sessions")}</span>
<span className="mx_SettingsTab_subheading">{_t("Where youre logged in")}</span>
<span>
{_t(
"Manage the names of and sign out of your sessions below or " +
"<a>verify them in your User Profile</a>.", {},
{
a: sub => <AccessibleButton kind="link" onClick={this._onGoToUserProfileClick}>
{sub}
</AccessibleButton>,
},
)}
</span>
<div className='mx_SettingsTab_subsectionText'>
{_t("A session's public name is visible to people you communicate with")}
<DevicesPanel />

View File

@ -0,0 +1,56 @@
/*
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 { _t } from '../../../languageHandler';
import dis from "../../../dispatcher";
import { MatrixClientPeg } from '../../../MatrixClientPeg';
import DeviceListener from '../../../DeviceListener';
import FormButton from '../elements/FormButton';
import { replaceableComponent } from '../../../utils/replaceableComponent';
@replaceableComponent("views.toasts.BulkUnverifiedSessionsToast")
export default class BulkUnverifiedSessionsToast extends React.PureComponent {
static propTypes = {
deviceIds: PropTypes.array,
}
_onLaterClick = () => {
DeviceListener.sharedInstance().dismissUnverifiedSessions(this.props.deviceIds);
};
_onReviewClick = async () => {
DeviceListener.sharedInstance().dismissUnverifiedSessions(this.props.deviceIds);
dis.dispatch({
action: 'view_user_info',
userId: MatrixClientPeg.get().getUserId(),
});
};
render() {
return (<div>
<div className="mx_Toast_description">
{_t("Verify all your sessions to ensure your account & messages are safe")}
</div>
<div className="mx_Toast_buttons" aria-live="off">
<FormButton label={_t("Later")} kind="danger" onClick={this._onLaterClick} />
<FormButton label={_t("Review")} onClick={this._onReviewClick} />
</div>
</div>);
}
}

View File

@ -90,6 +90,7 @@ export default class SetupEncryptionToast extends React.PureComponent {
getSetupCaption() {
switch (this.props.kind) {
case 'set_up_encryption':
return _t('Set up');
case 'upgrade_encryption':
case 'upgrade_ssss':
return _t('Upgrade');

View File

@ -17,8 +17,8 @@ limitations under the License.
import React from 'react';
import PropTypes from 'prop-types';
import { _t } from '../../../languageHandler';
import Modal from "../../../Modal";
import { MatrixClientPeg } from '../../../MatrixClientPeg';
import Modal from '../../../Modal';
import DeviceListener from '../../../DeviceListener';
import NewSessionReviewDialog from '../dialogs/NewSessionReviewDialog';
import FormButton from '../elements/FormButton';
@ -27,44 +27,39 @@ import { replaceableComponent } from '../../../utils/replaceableComponent';
@replaceableComponent("views.toasts.UnverifiedSessionToast")
export default class UnverifiedSessionToast extends React.PureComponent {
static propTypes = {
toastKey: PropTypes.string.isRequired,
device: PropTypes.object.isRequired,
};
deviceId: PropTypes.string,
}
_onLaterClick = () => {
const { device } = this.props;
DeviceListener.sharedInstance().dismissVerification(device.deviceId);
DeviceListener.sharedInstance().dismissUnverifiedSessions([this.props.deviceId]);
};
_onReviewClick = async () => {
const { device } = this.props;
const cli = MatrixClientPeg.get();
Modal.createTrackedDialog('New Session Review', 'Starting dialog', NewSessionReviewDialog, {
userId: MatrixClientPeg.get().getUserId(),
device,
userId: cli.getUserId(),
device: cli.getStoredDevice(cli.getUserId(), this.props.deviceId),
onFinished: (r) => {
if (!r) {
/* This'll come back false if the user clicks "this wasn't me" and saw a warning dialog */
this._onLaterClick();
DeviceListener.sharedInstance().dismissUnverifiedSessions([this.props.deviceId]);
}
},
}, null, /* priority = */ false, /* static = */ true);
};
render() {
const { device } = this.props;
const cli = MatrixClientPeg.get();
const device = cli.getStoredDevice(cli.getUserId(), this.props.deviceId);
return (<div>
<div className="mx_Toast_description">
<span className="mx_Toast_deviceName">
{device.getDisplayName()}
</span> <span className="mx_Toast_deviceID">
({device.deviceId})
</span>
{_t(
"Verify the new login accessing your account: %(name)s", { name: device.getDisplayName()})}
</div>
<div className="mx_Toast_buttons" aria-live="off">
<FormButton label={_t("Later")} kind="danger" onClick={this._onLaterClick} />
<FormButton label={_t("Review")} onClick={this._onReviewClick} />
<FormButton label={_t("Verify")} onClick={this._onReviewClick} />
</div>
</div>);
}

View File

@ -51,7 +51,7 @@ export default class VerificationRequestToast extends React.PureComponent {
if (request.isSelfVerification) {
const cli = MatrixClientPeg.get();
this.setState({device: await cli.getStoredDevice(cli.getUserId(), request.channel.deviceId)});
this.setState({device: cli.getStoredDevice(cli.getUserId(), request.channel.deviceId)});
}
}

View File

@ -252,7 +252,11 @@ class RoomPillPart extends PillPart {
setAvatar(node) {
let initialLetter = "";
let avatarUrl = Avatar.avatarUrlForRoom(this._room, 16 * window.devicePixelRatio, 16 * window.devicePixelRatio);
let avatarUrl = Avatar.avatarUrlForRoom(
this._room,
16 * window.devicePixelRatio,
16 * window.devicePixelRatio,
"crop");
if (!avatarUrl) {
initialLetter = Avatar.getInitialLetter(this._room ? this._room.name : this.resourceId);
avatarUrl = `../../${Avatar.defaultAvatarUrlForString(this._room ? this._room.roomId : this.resourceId)}`;
@ -290,7 +294,8 @@ class UserPillPart extends PillPart {
let avatarUrl = Avatar.avatarUrlForMember(
this._member,
16 * window.devicePixelRatio,
16 * window.devicePixelRatio);
16 * window.devicePixelRatio,
"crop");
let initialLetter = "";
if (avatarUrl === defaultAvatarUrl) {
// the url from defaultAvatarUrlForString is meant to go in an img element,

View File

@ -1406,7 +1406,7 @@
"Error updating flair": "Nepovedlo se změnit příslušnost ke skupině",
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Pro tuto místnost se nepovedlo změnit příslušnost ke skupině. Možná to server neumožňuje, nebo došlo k dočasné chybě.",
"<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>": "Uživatel <reactors/><reactedWith>reagoval s %(shortName)s</reactedWith>",
"edited": "pozměněno",
"edited": "upraveno",
"Maximize apps": "Maximalizovat aplikace",
"Rotate Left": "Otočit doleva",
"Rotate counter-clockwise": "Otočit proti směru hodinových ručiček",
@ -1550,7 +1550,7 @@
"Show advanced": "Zobrazit pokročilé možnosti",
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Zamezit uživatelům jiných domovských serverů, aby do místnosti vstoupili (nelze později změnit!)",
"Your homeserver doesn't seem to support this feature.": "Váš domovský server asi tuto funkci nepodporuje.",
"Message edits": "Editování zpráv",
"Message edits": "Úpravy zpráv",
"Please fill why you're reporting.": "Vyplňte prosím co chcete nahlásit.",
"Report Content to Your Homeserver Administrator": "Nahlásit obsah správci vašeho domovského serveru",
"Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Nahlášení této zprávy pošle její jedinečné 'event ID' správci vašeho domovského serveru. Pokud jsou zprávy šifrované, správce nebude mít možnost přečíst text zprávy ani se podívat na soubory nebo obrázky.",
@ -1645,7 +1645,7 @@
"%(name)s wants to verify": "%(name)s chce ověřit",
"You sent a verification request": "Poslali jste požadavek na ověření",
"Show all": "Zobrazit vše",
"Edited at %(date)s. Click to view edits.": "Pozměněno v %(date)s. Klinutím zobrazíte změny.",
"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",

View File

@ -31,10 +31,10 @@
"Bans user with given id": "Forbyder bruger med givet id",
"Deops user with given id": "Fjerner OP af bruger med givet id",
"Invites user with given id to current room": "Inviterer bruger med givet id til nuværende rum",
"Joins room with given alias": "Kommer ind i rum med givet alias",
"Kicks user with given id": "Smid bruger med givet id ud",
"Changes your display nickname": "Ændrer dit visningsnavn",
"Searches DuckDuckGo for results": "Søger DuckDuckGo for resultater",
"Joins room with given alias": "Deltager i rum med givet alias",
"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",
"Emoji": "Emoji",
"Sign in": "Log ind",
@ -77,7 +77,7 @@
"Close": "Luk",
"Cancel": "Afbryd",
"Edit": "Rediger",
"Unpin Message": "Fasthold ikke længere Besked",
"Unpin Message": "Frigør Besked",
"Failed to forget room %(errCode)s": "Kunne ikke glemme rummet %(errCode)s",
"Mute": "Sæt på lydløs",
"Leave": "Forlad",
@ -125,7 +125,7 @@
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
"Who would you like to add to this community?": "Hvem vil du tilføje til dette fællesskab?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Advarsel: alle personer du tilføjer til et fællesskab vil være synlige for alle der kender Fællesskabs ID'et",
"Invite new community members": "Inviter nye fællesskabsmedlemmer",
"Invite new community members": "Inviter nye medlemmer til fællesskabet",
"Invite to Community": "Inviter til Fællesskab",
"Which rooms would you like to add to this community?": "Hvilke rum vil du tilføje til dette fællesskab?",
"Show these rooms to non-members on the community page and room list?": "Vis disse rum til ikke-medlemmer på fællesskabssiden og rumlisten?",
@ -136,11 +136,11 @@
"Failed to invite users to community": "Kunne ikke invitere brugere til fællesskab",
"Failed to invite users to %(groupId)s": "Kunne ikke invitere brugere til %(groupId)s",
"Failed to add the following rooms to %(groupId)s:": "Kunne ikke tilføje de følgende rum til %(groupId)s:",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikke tilladelse til at sende dig notifikationer - tjek venligst dine browser indstillinger",
"Riot was not given permission to send notifications - please try again": "Riot fik ikke tilladelse til at sende notifikationer - prøv igen",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikke tilladelse til at sende dig notifikationer - tjek venligst dine browserindstillinger",
"Riot was not given permission to send notifications - please try again": "Riot fik ikke tilladelse til at sende notifikationer - Vær sød at prøve igen",
"Unable to enable Notifications": "Kunne ikke slå Notifikationer til",
"This email address was not found": "Denne emailadresse blev ikke fundet",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din emailadresse lader ikke til at være tilknyttet en Matrix ID på denne Homeserver.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din emailadresse lader ikke til at være tilknyttet et Matrix ID på denne Homeserver.",
"Restricted": "Begrænset",
"Moderator": "Moderator",
"Start a chat": "Start en chat",
@ -160,12 +160,12 @@
"Missing user_id in request": "Manglende user_id i forespørgsel",
"Usage": "Brug",
"/ddg is not a command": "/ddg er ikke en kommando",
"To use it, just wait for autocomplete results to load and tab through them.": "For at bruge det skal du bare vente på at autocomplete resultaterne indlæses og bruge Tab for at bladre igennem dem.",
"To use it, just wait for autocomplete results to load and tab through them.": "For at bruge det skal du bare vente på at autocomplete resultaterne indlæses, og bruge Tab for at bladre igennem dem.",
"Unrecognised room alias:": "Ugenkendt rum alias:",
"Ignored user": "Ignoreret bruger",
"You are now ignoring %(userId)s": "Du ignorere nu %(userId)s",
"You are now ignoring %(userId)s": "Du ignorerer nu %(userId)s",
"Unignored user": "Holdt op med at ignorere bruger",
"You are no longer ignoring %(userId)s": "Du ignorer ikke længere %(userId)s",
"You are no longer ignoring %(userId)s": "Du ignorerer ikke længere %(userId)s",
"Verified key": "Verificeret nøgle",
"Reason": "Årsag",
"%(senderName)s requested a VoIP conference.": "%(senderName)s forespurgte en VoIP konference.",
@ -350,9 +350,9 @@
"Call Failed": "Opkald mislykkedes",
"Review Devices": "Gennemse enheder",
"Call Anyway": "Ring op alligevel",
"Answer Anyway": "Tag imod alligevel",
"Answer Anyway": "Svar alligevel",
"Call": "Ring",
"Answer": "Tag imod",
"Answer": "Svar",
"Call failed due to misconfigured server": "Opkaldet mislykkedes pga. fejlkonfigureret server",
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Bed administratoren af din homeserver (<code>%(homeserverDomain)s</code>) om at konfigurere en TURN server for at opkald virker pålideligt.",
"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.": "Alternativt kan du prøve at bruge den offentlige server <code>turn.matrix.org</code>, men det er ikke lige så pålideligt, og din IP-adresse deles med den server. Du kan også administrere dette under Indstillinger.",
@ -361,8 +361,8 @@
"Call in Progress": "Igangværende opkald",
"A call is currently being placed!": "Et opkald er allerede ved at blive oprettet!",
"A call is already in progress!": "Et opkald er allerede i gang!",
"Permission Required": "Rettighed påkrævet",
"You do not have permission to start a conference call in this room": "Du har ikke rettigheden til at starte et gruppekald i dette rum",
"Permission Required": "Tilladelse påkrævet",
"You do not have permission to start a conference call in this room": "Du har ikke rettighed til at starte et gruppekald i dette rum",
"Replying With Files": "Svare med filer",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "I øjeblikket er det ikke muligt at svare med en fil. Vil du uploade filen uden at svare?",
"The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunne ikke uploades.",
@ -383,13 +383,13 @@
"Actions": "Handlinger",
"Other": "Andre",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Tilføjer ¯\\_(ツ)_/¯ i starten af beskeder i ren tekst",
"Sends a message as plain text, without interpreting it as markdown": "Sender en besked som ren tekst, uden at fortolke den som Markdown",
"Sends a message as plain text, without interpreting it as markdown": "Sender en besked som ren tekst, uden at fortolke den som markdown",
"Upgrades a room to a new version": "Opgraderer et rum til en ny version",
"You do not have the required permissions to use this command.": "Du har ikke de nødvendige rettigheder for at udføre denne kommando.",
"<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>Advarsel:</b> Opgradering af et rum <i>flytter ikke automatisk rummets medlemmer til den nye version af rummet.</i> Vi sender et link til den nye version i den gamle version af rummet - rummets medlemmer må klikke på dette link for at tilgå det nye rum.",
"Changes your display nickname in the current room only": "Ændrer dit viste navn kun for det nuværende rum",
"Changes the avatar of the current room": "Ændrer avataren af det nuværende rum",
"Changes your avatar in this current room only": "Ændrer din avatar kun for det nuværende rum",
"Changes your display nickname in the current room only": "Ændrer kun dit viste navn for det nuværende rum",
"Changes the avatar of the current room": "Ændrer avataren i det nuværende rum",
"Changes your avatar in this current room only": "Ændrer kun din avatar for det nuværende rum",
"Changes your avatar in all rooms": "Ændrer din avatar i alle rum",
"Gets or sets the room topic": "Henter eller sætter rummets emne",
"This room has no topic.": "Dette rum har intet emne.",
@ -401,10 +401,10 @@
"Unbans user with given ID": "Fjerner ban fra brugeren med det oplyste ID",
"Ignores a user, hiding their messages from you": "Ignorerer en bruger og skjuler dennes beskeder fra dig",
"Stops ignoring a user, showing their messages going forward": "Stopper med at ignorere en bruger og viser deres beskeder igen fra nu af",
"Define the power level of a user": "Indstiller rettighedsniveau for en bruger",
"Opens the Developer Tools dialog": "Åbner dialogen med udviklingsværktøjer",
"Adds a custom widget by URL to the room": "Tilføjer en widget til rummet vha. URL",
"Please supply a https:// or http:// widget URL": "Oplys en https:// eller http:// widget URL",
"Define the power level of a user": "Indstil rettighedsniveau for en bruger",
"Opens the Developer Tools dialog": "Åbner dialogen med udviklerværktøjer",
"Adds a custom widget by URL to the room": "Tilføjer en widget til rummet ved hjælp af URL",
"Please supply a https:// or http:// widget URL": "Oplys venligst en https:// eller http:// widget URL",
"You cannot modify widgets in this room.": "Du kan ikke ændre widgets i dette rum.",
"Forces the current outbound group session in an encrypted room to be discarded": "Tvinger den nuværende udgående gruppe-session i et krypteret rum til at blive kasseret",
"Sends the given message coloured as a rainbow": "Sender beskeden med regnbuefarver",
@ -418,7 +418,7 @@
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s ændrede adgangsreglen til %(rule)s",
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s har givet gæster adgang til rummet.",
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s har forhindret gæster i at tilgå rummet.",
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s ændrede gæsteadgang til",
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s ændrede gæsteadgang til %(rule)s",
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktiverede etiket for %(groups)s i dette rum.",
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s deaktiverede etiket for %(groups)s i dette rum.",
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s aktiverede etiket for %(newGroups)s og deaktiverede etiket for %(oldGroups)s i dette rum.",
@ -464,7 +464,7 @@
"%(items)s and %(count)s others|other": "%(items)s og %(count)s andre",
"%(items)s and %(count)s others|one": "%(items)s og en anden",
"%(items)s and %(lastItem)s": "%(items)s og %(lastItem)s",
"Your browser does not support the required cryptography extensions": "Din browser understøtter ikke de påkrævede kryptografiske udvidelser.",
"Your browser does not support the required cryptography extensions": "Din browser understøtter ikke de påkrævede kryptografiske udvidelser",
"Not a valid Riot keyfile": "Ikke en gyldig Riot nøglefil",
"Authentication check failed: incorrect password?": "Godkendelse mislykkedes: forkert kodeord?",
"Unrecognised address": "Ukendt adresse",
@ -519,5 +519,73 @@
"Show a placeholder for removed messages": "Vis en pladsholder for fjernede beskeder",
"The version of Riot": "Riot versionen",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Hvorvidt du benytter Riot på en enhed, hvor touch er den primære input-grænseflade",
"Your user agent": "Din user agent"
"Your user agent": "Din user agent",
"Use Single Sign On to continue": "Brug Single Sign On til at fortsætte",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Bekræft tilføjelsen af denne email adresse ved at bruge Single Sign On til at bevise din identitet.",
"Single Sign On": "Single Sign On",
"Confirm adding email": "Bekræft tilføjelse af email",
"Click the button below to confirm adding this email address.": "Klik på knappen herunder for at bekræfte tilføjelsen af denne email adresse.",
"Confirm": "Bekræft",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekræft tilføjelsen af dette telefonnummer ved at bruge Single Sign On til at bevise din identitet.",
"Confirm adding phone number": "Bekræft tilføjelse af telefonnummer",
"Click the button below to confirm adding this phone number.": "Klik på knappen herunder for at bekræfte tilføjelsen af dette telefonnummer.",
"Whether you're using Riot as an installed Progressive Web App": "Om du anvender Riot som en installeret Progressiv Web App",
"The information being sent to us to help make Riot better includes:": "Informationen der sendes til os for at hjælpe os med at gøre Riot bedre inkluderer:",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Der er ukendte sessions i dette rum: Hvis du fortsætter uden at verificere dem, vil det være muligt for andre at smuglytte til dit opkald.",
"Review Sessions": "Overse sessions",
"If you cancel now, you won't complete verifying the other user.": "Hvis du annullerer du, vil du ikke have færdiggjort verifikationen af den anden bruger.",
"If you cancel now, you won't complete verifying your other session.": "Hvis du annullerer nu, vil du ikke have færdiggjort verifikationen af din anden session.",
"If you cancel now, you won't complete your operation.": "Hvis du annullerer nu, vil du ikke færdiggøre din operation.",
"Cancel entering passphrase?": "Annuller indtastning af kodeord?",
"Enter passphrase": "Indtast kodeord",
"Setting up keys": "Sætter nøgler op",
"Verify this session": "Verificér denne session",
"Encryption upgrade available": "Opgradering af kryptering tilgængelig",
"Set up encryption": "Opsæt kryptering",
"Unverified login. Was this you?": "Ikke-verificeret login. Var det dig?",
"Identity server has no terms of service": "Identity serveren har ingen terms of service",
"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.": "Denne handling kræver adgang til default identitets serveren <server /> for at validere en email adresse eller et telefonnummer, men serveren har ingen terms of service.",
"Only continue if you trust the owner of the server.": "Fortsæt kun hvis du stoler på ejeren af denne server.",
"Trust": "Tillid",
"%(name)s is requesting verification": "%(name)s beder om verifikation",
"Sign In or Create Account": "Log ind eller Opret bruger",
"Use your account or create a new one to continue.": "Brug din konto eller opret en ny for at fortsætte.",
"Create Account": "Opret brugerkonto",
"Sign In": "Log ind",
"Custom (%(level)s)": "Kustomiseret %(level)s",
"Sends a message as html, without interpreting it as markdown": "Sender besked som html, uden at tolke den som markdown",
"Error upgrading room": "Fejl under opgradering af rum",
"Double check that your server supports the room version chosen and try again.": "Dobbelt-tjek at din server understøtter den valgte rum-version og forsøg igen.",
"Failed to set topic": "Fejlede i at sætte emne",
"Command failed": "Kommando fejlede",
"Could not find user in room": "Kunne ikke finde bruger i rum",
"Verifies a user, session, and pubkey tuple": "Verificerer en bruger, session og pubkey tuple",
"Unknown (user, session) pair:": "Ukendt (bruger, session) par:",
"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!": "ADVARSEL: NØGLEVERIFIKATIONEN FEJLEDE! Underskriftsnøglen for %(userId)s og session %(deviceId)s er %(fprint)s som ikke matcher den supplerede nøgle \"%(fingerprint)s\". Dette kunne betyde at jeres kommunikation er infiltreret!",
"Session already verified!": "Sessionen er allerede verificeret!",
"WARNING: Session already verified, but keys do NOT MATCH!": "ADVARSEL: Sessionen er allerede verificeret, men nøglerne MATCHER IKKE!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Underskriftsnøglen du supplerede matcher den underskriftsnøgle du modtog fra %(userId)s's session %(deviceId)s. Sessionen er markeret som verificeret.",
"Displays information about a user": "Viser information om en bruger",
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s ændrede rumnavnet fra %(oldRoomName)s til %(newRoomName)s.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s tilføjede de alternative adresser %(addresses)s til dette rum.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s tilføjede alternative adresser %(addresses)s til dette rum.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s fjernede de alternative adresser %(addresses)s til dette rum.",
"%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s fjernede alternative adresser %(addresses)s til dette rum.",
"%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ændrede de alternative adresser til dette rum.",
"%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ændrede hoved- og alternative adresser til dette rum.",
"%(senderName)s changed the addresses for this room.": "%(senderName)s ændrede adresserne til dette rum.",
"%(senderName)s placed a voice call.": "%(senderName)s foretog et stemmeopkald.",
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s foretog et stemmeopkald. (ikke understøttet af denne browser)",
"%(senderName)s placed a video call.": "%(senderName)s foretog et videoopkald.",
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s foretog et videoopkald. (ikke understøttet af denne browser)",
"%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s fjernede den regel der bannede brugere der matcher %(glob)s",
"%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s fjernede den regel der bannede brugere der matcher %(glob)s",
"%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s fjernede den regel der bannede servere som matcher %(glob)s",
"%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s fjernede en ban-regel der matcher %(glob)s",
"%(senderName)s updated an invalid ban rule": "%(senderName)s opdaterede en ugyldig ban-regel",
"%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s opdaterede den regel der banner brugere som matcher %(glob)s på grund af %(reason)s",
"%(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"
}

View File

@ -1074,7 +1074,7 @@
"Render simple counters in room header": "Einfache Zähler in Raum-Kopfzeile anzeigen",
"Enable Emoji suggestions while typing": "Emoji-Vorschläge während der Eingabe aktivieren",
"Show a placeholder for removed messages": "Zeigt einen Platzhalter für gelöschte Nachrichten an",
"Show join/leave messages (invites/kicks/bans unaffected)": "Zeige Betreten-/Verlassen-Nachrichten (betrifft nicht Einladungen/Kicks/Bans)",
"Show join/leave messages (invites/kicks/bans unaffected)": "Zeige Betreten-/Verlassen-Nachrichten (Einladungen/Kicks/Bans sind dadurch nicht betroffen)",
"Show avatar changes": "Avatar-Änderungen anzeigen",
"Show display name changes": "Anzeigenamen-Änderungen anzeigen",
"Send typing notifications": "Tipp-Benachrichtigungen senden",
@ -1222,7 +1222,7 @@
"Use two-way text verification": "Bidirektionale Textverifizierung verwenden",
"Waiting for partner to confirm...": "Warte auf Bestätigung des Gesprächspartners...",
"Incoming Verification Request": "Eingehende Verifikationsanfrage",
"Allow Peer-to-Peer for 1:1 calls": "Erlaube Peer-to-Peer-Verbindungen für 1:1-Anrufe",
"Allow Peer-to-Peer for 1:1 calls": "Erlaube Peer-to-Peer für 1:1-Anrufe",
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Bist du sicher? Du wirst deine verschlüsselten Nachrichten verlieren, wenn deine Schlüssel nicht gesichert sind.",
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Verschlüsselte Nachrichten sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der/die Empfänger haben die Schlüssel um diese Nachrichten zu lesen.",
"Restore from Backup": "Von Sicherung wiederherstellen",
@ -1444,7 +1444,7 @@
"Add Phone Number": "Telefonnummer hinzufügen",
"Changes the avatar of the current room": "Ändert den Avatar für diesen Raum",
"Deactivate account": "Benutzerkonto schließen",
"Show previews/thumbnails for images": "Zeige eine Vorschau für Bilder",
"Show previews/thumbnails for images": "Zeige Vorschauen/Thumbnails für Bilder",
"View": "Vorschau",
"Find a room…": "Suche einen Raum…",
"Find a room… (e.g. %(exampleRoom)s)": "Suche einen Raum… (z.B. %(exampleRoom)s)",
@ -1458,7 +1458,7 @@
"Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.",
"%(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)",
"Send read receipts for messages (requires compatible homeserver to disable)": "Schicke Lesebestätigungen für Nachrichten (erfordert einen kompatiblen Heimserver zum Deaktivieren)",
"Send read receipts for messages (requires compatible homeserver to disable)": "Schicke Lesebestätigungen für Nachrichten (erfordert kompatiblen Heimserver zum Deaktivieren)",
"My Ban List": "Meine Bannliste",
"This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!",
"Accept <policyLink /> to continue:": "Akzeptiere <policyLink />, um fortzufahren:",
@ -1786,6 +1786,74 @@
"Your recovery key": "Dein Wiederherstellungsschlüssel",
"Copy": "In Zwischenablage kopieren",
"Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel",
"Unverified login. Was this you?": "Nicht verifzierte Anmeldung. Bist du es gewesen?",
"Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren"
"Unverified login. Was this you?": "Nicht verifizierte Anmeldung. Bist du es gewesen?",
"Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren",
"Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen",
"Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen",
"Use Single Sign On to continue": "Benutze „Single Sign-On“ (Einmalanmeldung) um fortzufahren",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser E-Mail-Adresse mit „Single Sign-On“, um deine Identität nachzuweisen.",
"Single Sign On": "Single Sign-On",
"Confirm adding email": "Bestätige das Hinzfugen der Email-Addresse",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnumer, indem du deine Identität mittels Single Sign-On nachweist.",
"Click the button below to confirm adding this phone number.": "Betätige unten die Schaltfläche um das Hinzufügen dieser Telefonnummer zu bestätigen.",
"If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.",
"%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an",
"Failed to set topic": "Das Festlegen des Themas ist fehlgeschlagen",
"Command failed": "Befehl fehlgeschlagen",
"Could not find user in room": "Der Benutzer konnte im Raum nicht gefunden werden",
"Click the button below to confirm adding this email address.": "Klicken Sie auf die Schaltfläche unten, um das Hinzufügen dieser E-Mail-Adresse zu bestätigen.",
"Confirm adding phone number": "Bestätigen Sie das Hinzufügen der Telefonnummer.",
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erneuert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s",
"Not Trusted": "Nicht vertrauenswürdig",
"Manually Verify by Text": "Verifiziere manuell mit einem Text",
"Interactively verify by Emoji": "Verifiziere interaktiv mit Emojis",
"Support adding custom themes": "Unterstütze das Hinzufügen von benutzerdefinierten Designs",
"Enable cross-signing to verify per-user instead of per-session": "Aktiviere Cross-Signing um pro Benutzer statt pro Sitzung zu verifizieren",
"Ask this user to verify their session, or manually verify it below.": "Bitte diese/n Nutzer!n, seine/ihre Sitzung zu verifizieren, oder verifiziere diese unten manuell.",
"Enable local event indexing and E2EE search (requires restart)": "Aktiviere lokale Ereignis-Indizierung und E2EE-Suche (erfordert Neustart)",
"a few seconds from now": "in ein paar Sekunden",
"Show a presence dot next to DMs in the room list": "Verfügbarkeitspunkt neben den Direktnachrichten in der Raumliste anzeigen",
"Show padlocks on invite only rooms": "Zeige Schlösser an Räumen, welchen nur mit Einladung beigetreten werden kann",
"Keep recovery passphrase in memory for this session": "Behalte die Wiederherstellungspassphrase für diese Sitzung im Speicher",
"Manually verify all remote sessions": "Verifiziere alle Remotesitzungen",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Bestätige, dass die unten angezeigten Emojis auf beiden Sitzungen in der selben Reihenfolge angezeigt werden:",
"Verify this session by confirming the following number appears on its screen.": "Verfiziere diese Sitzung, indem du bestätigst, dass die folgende Nummer auf ihrem Bildschirm erscheint.",
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Warte auf deine andere Sitzung,%(deviceName)s /%(deviceId)s), um zu verfizieren…",
"How fast should messages be downloaded.": "Wie schnell sollten Nachrichten heruntergeladen werden?",
"Compare a unique set of emoji if you don't have a camera on either device": "Vergleiche eine einmalige Reihe von Emoji, sofern du an keinem Gerät eine Kamera hast",
"Waiting for %(displayName)s to verify…": "Warte darauf, dass %(displayName)s bestätigt…",
"Cancelling…": "Abbrechen…",
"They match": "Sie passen zueinander",
"They don't match": "Sie passen nicht zueinander",
"To be secure, do this in person or use a trusted way to communicate.": "Um sicher zu gehen, mache dies persönlich oder verwende eine vertrauenswürdige Art der Kommunikation.",
"Verify yourself & others to keep your chats safe": "Verifiziere dich & andere, um eure Chats zu schützen",
"This bridge was provisioned by <user />.": "Diese Brücke wurde von <user /> bereitgestellt.",
"This bridge is managed by <user />.": "Diese Brücke wird von <user /> verwaltet.",
"Workspace: %(networkName)s": "Arbeitsbereich: %(networkName)s",
"Channel: %(channelName)s": "Kanal: %(channelName)s",
"Show less": "Weniger zeigen",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Achtung</b>: Du solltest das nur auf einem vertrauenswürdigen Gerät tun.",
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Achtung</b>: Du solltest die Schlüsselsicherung nur auf einem vertrauenswürdigen Gerät einrichten.",
"Regain access to your account and recover encryption keys stored in this session. Without them, you wont be able to read all of your secure messages in any session.": "Melde dich an um die ausschließlich in dieser Sitzung gespeicherten Verschlüsselungsschlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten in jeder Sitzung zu lesen.",
"Forgotten your password?": "Passwort vergessen?",
"You're signed out": "Du wurdest abgemeldet",
"Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Achtung: Deine persönlichen Daten (inclusive der Verschlüsselungsschlüssel) sind noch in dieser Sitzung gespeichert. Lösche diese Daten wenn du die Sitzung nicht mehr benötigst oder dich mit einem anderen Konto anmelden möchtest.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Bestätige das Löschen dieser Sitzung indem du dich mittels Single Sign-On anmeldest um deine Identität nachzuweisen.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Bestätige das Löschen dieser Sitzung indem du dich mittels Single Sign-On anmeldest um deine Identität nachzuweisen.",
"Confirm deleting these sessions": "Bestätige das Löschen dieser Sitzungen",
"Click the button below to confirm deleting these sessions.|other": "Klicke den Button um das Löschen dieser Sitzungen zu bestätigen.",
"Click the button below to confirm deleting these sessions.|one": "Klicke den Button um das Löschen dieser Sitzung zu bestätigen.",
"Clear all data in this session?": "Alle Daten dieser Sitzung löschen?",
"Clear all data": "Daten löschen",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Bestätige das Löschen deines Kontos indem du dich mittels Single Sign-On anmeldest um deine Identität nachzuweisen.",
"Confirm account deactivation": "Konto löschen bestätigen",
"Confirm your identity by entering your account password below.": "Bestätige deine Identität indem du dein Passwort unten eingibst.",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Bestätige deine Identität indem du diesen Login von einer deiner anderen Sitzungen verifizierst um Zugriff auf deine verschlüsselten Nachrichten zu erhalten.",
"Enter your account password to confirm the upgrade:": "Gib dein Passwort ein um die Aktualisierung zu bestätigen:",
"You'll need to authenticate with the server to confirm the upgrade.": "Du musst dich am Server authentifizieren um die Aktualisierung zu bestätigen.",
"Enter your recovery passphrase a second time to confirm it.": "Gib deine Wiederherstellungspassphrase zur Bestätigung erneut ein.",
"Confirm your recovery passphrase": "Bestätige deine Wiederherstellungspassphrase",
"Confirm recovery passphrase": "Bestätige die Wiederherstellungspassphrase",
"Please enter your recovery passphrase a second time to confirm.": "Bitte gib deine Wiederherstellungspassphrase ein zweites Mal ein um sie zu bestätigen."
}

View File

@ -105,7 +105,8 @@
"Verify this session": "Verify this session",
"Encryption upgrade available": "Encryption upgrade available",
"Set up encryption": "Set up encryption",
"Unverified login. Was this you?": "Unverified login. Was this you?",
"Review where youre logged in": "Review where youre logged in",
"New login. Was this you?": "New login. Was this you?",
"Who would you like to add to this community?": "Who would you like to add to this community?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID",
"Invite new community members": "Invite new community members",
@ -403,9 +404,7 @@
"Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)",
"Support adding custom themes": "Support adding custom themes",
"Enable cross-signing to verify per-user instead of per-session": "Enable cross-signing to verify per-user instead of per-session",
"Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)",
"Show info about bridges in room settings": "Show info about bridges in room settings",
"Show padlocks on invite only rooms": "Show padlocks on invite only rooms",
"Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing",
"Use compact timeline layout": "Use compact timeline layout",
"Show a placeholder for removed messages": "Show a placeholder for removed messages",
@ -560,13 +559,16 @@
"Headphones": "Headphones",
"Folder": "Folder",
"Pin": "Pin",
"Verify all your sessions to ensure your account & messages are safe": "Verify all your sessions to ensure your account & messages are safe",
"Later": "Later",
"Review": "Review",
"Verify yourself & others to keep your chats safe": "Verify yourself & others to keep your chats safe",
"Other users may not trust it": "Other users may not trust it",
"Update your secure storage": "Update your secure storage",
"Set up": "Set up",
"Upgrade": "Upgrade",
"Verify": "Verify",
"Later": "Later",
"Review": "Review",
"Verify the new login accessing your account: %(name)s": "Verify the new login accessing your account: %(name)s",
"From %(deviceName)s (%(deviceId)s)": "From %(deviceName)s (%(deviceId)s)",
"Decline (%(counter)s)": "Decline (%(counter)s)",
"Accept <policyLink /> to continue:": "Accept <policyLink /> to continue:",
@ -847,7 +849,8 @@
"Message search": "Message search",
"Cross-signing": "Cross-signing",
"Security & Privacy": "Security & Privacy",
"Sessions": "Sessions",
"Where youre logged in": "Where youre logged in",
"Manage the names of and sign out of your sessions below or <a>verify them in your User Profile</a>.": "Manage the names of and sign out of your sessions below or <a>verify them in your User Profile</a>.",
"A session's public name is visible to people you communicate with": "A session's public name is visible to people you communicate with",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.",
@ -1032,6 +1035,7 @@
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.",
"Are you sure?": "Are you sure?",
"No sessions with registered encryption keys": "No sessions with registered encryption keys",
"Sessions": "Sessions",
"Jump to read receipt": "Jump to read receipt",
"Mention": "Mention",
"Invite": "Invite",
@ -1793,6 +1797,9 @@
"Not a valid recovery key": "Not a valid recovery key",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions 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>.",
"Restoring keys from backup": "Restoring keys from backup",
"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.",
@ -1800,9 +1807,9 @@
"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.",
"Unable to restore backup": "Unable to restore backup",
"No backup found!": "No backup found!",
"Backup restored": "Backup restored",
"Keys restored": "Keys restored",
"Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!",
"Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys",
"Successfully restored %(sessionCount)s keys": "Successfully restored %(sessionCount)s keys",
"<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>",
@ -2229,7 +2236,6 @@
"Unable to create key backup": "Unable to create key backup",
"Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.",
"If you don't want to set this up now, you can later in Settings.": "If you don't want to set this up now, you can later in Settings.",
"Set up": "Set up",
"Don't ask again": "Don't ask again",
"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.",

View File

@ -2289,5 +2289,10 @@
"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",
"Compare emoji": "Kompari bildsignojn"
"Compare emoji": "Kompari bildsignojn",
"Use Single Sign On to continue": "Daŭrigi per ununura saluto",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Konfirmi aldonon de ĉi tiu retpoŝtadreso, uzante ununuran saluton por pruvi vian identecon.",
"Single Sign On": "Ununura saluto",
"Confirm adding email": "Konfirmi aldonon de retpoŝtadreso",
"Click the button below to confirm adding this email address.": "Klaku la ĉi-suban butonon por konfirmi aldonon de ĉi tiu retpoŝtadreso."
}

View File

@ -1 +1,148 @@
{}
{
"This email address is already in use": "See e-posti aadress on juba kasutusel",
"This phone number is already in use": "See telefoninumber on juba kasutusel",
"Confirm": "Kinnita",
"Add Email Address": "Lisa e-posti aadress",
"Failed to verify email address: make sure you clicked the link in the email": "E-posti aadressi kontrollimine ei õnnestunud: palun vaata, et sa kindlasti klõpsisid saabunud kirjas olnud viidet",
"The platform you're on": "Sinu kasutatav arvutisüsteem",
"The version of Riot": "Riot'i versioon",
"Whether or not you're logged in (we don't record your username)": "Kas sa oled sisseloginud või mitte (me ei salvesta sinu kasutajanime)",
"Your language of choice": "Sinu keelevalik",
"Your homeserver's URL": "Sinu koduserveri aadress",
"e.g. <CurrentPageURL>": "näiteks <CurrentPageURL>",
"Your user agent": "Sinu kasutajaagent",
"Your device resolution": "Sinu seadme resolutsioon",
"Analytics": "Analüütika",
"The information being sent to us to help make Riot better includes:": "Riot'i arendamiseks meile saadetava info hulgas on:",
"Error": "Viga",
"Unable to load! Check your network connectivity and try again.": "Laadimine ei õnnestunud! Kontrolli oma võrguühendust ja proovi uuesti.",
"Dismiss": "Loobu",
"Call Failed": "Kõne ebaõnnestus",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Selles jututoas on teadmata sessioone: kui sa jätkad ilma nende verifitseerimiseta, siis kolmas osapool võib kuulata seda kõnet pealt.",
"Review Sessions": "Vaata sessioonid üle",
"Call Anyway": "Helista ikkagi",
"Answer Anyway": "Vasta ikkagi",
"Call": "Helista",
"Answer": "Vasta",
"Call Timeout": "Kõne aegumine",
"The remote side failed to pick up": "Teine osapool ei võtnud kõnet vastu",
"Call failed due to misconfigured server": "Kõne ebaõnnestus valesti seadistatud serveri tõttu",
"Cancel": "Loobu",
"Send anyway": "Saada siiski",
"Send": "Saada",
"Jan": "jaan",
"Feb": "veeb",
"Mar": "mär",
"Apr": "apr",
"May": "mai",
"Jun": "jun",
"Jul": "jul",
"Aug": "aug",
"Sep": "sep",
"Oct": "okt",
"Nov": "nov",
"Dec": "dets",
"PM": "PL",
"AM": "EL",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Verify this session": "Verifitseeri see sessioon",
"Which rooms would you like to add to this community?": "Milliseid jututubasid sooviksid lisada siia kogukonda?",
"Show these rooms to non-members on the community page and room list?": "Kas näitan neid jututubasid kogukonna lehel ja tubade loendis mitte-liikmetele?",
"Add rooms to the community": "Lisa siia kogukonda jututubasid",
"Failed to add the following rooms to %(groupId)s:": "Järgnevate jututubade lisamine %(groupId)s kogukonda ebaõnnestus:",
"Changes your avatar in all rooms": "Muuda oma tunnuspilti kõikides jututubades",
"Ask this user to verify their session, or manually verify it below.": "Palu nimetatud kasutajal verifitseerida see sessioon või tee seda alljärgnevas käsitsi.",
"Manually Verify by Text": "Verifitseeri käsitsi etteantud teksti abil",
"Interactively verify by Emoji": "Verifitseeri interaktiivselt Emoji abil",
"Enable big emoji in chat": "Kasuta vestlustes suuri emoji'sid",
"Order rooms by name": "Järjesta jututoad nime alusel",
"Show rooms with unread notifications first": "Järjesta lugemata teadetega jututoad esimesena",
"Show shortcuts to recently viewed rooms above the room list": "Näita viimati külastatud jututubade viiteid jututubade loendi kohal",
"Enable message search in encrypted rooms": "Võta kasutusele sõnumite otsing krüptitud jututubades",
"When rooms are upgraded": "Kui jututubasid uuendatakse",
"Verify this session by completing one of the following:": "Verifitseeri see sessioon täites ühe alljärgnevatest:",
"Verify this user by confirming the following emoji appear on their screen.": "Verifitseeri see kasutaja tehes kindlaks et järgnev emoji kuvatakse tema ekraanil.",
"Verify this session by confirming the following number appears on its screen.": "Verifitseeri see sessioon tehes kindlaks, et järgnev number kuvatakse tema ekraanil.",
"For help with using Riot, click <a>here</a> or start a chat with our bot using the button below.": "Riot'i kasutamisega seotud abiteabe otsimiseks klõpsi <a>seda viidet</a> või vajutades järgnevat nuppu alusta vestlust meie robotiga.",
"Chat with Riot Bot": "Vestle Riot'i robotiga",
"Start a chat": "Alusta vestlust",
"Invite to this room": "Kutsu siia jututuppa",
"Voice call": "Häälkõne",
"Video call": "Videokõne",
"Hangup": "Katkesta kõne",
"Upload file": "Lae fail üles",
"Send an encrypted reply…": "Saada krüptitud vastus…",
"Send a reply…": "Saada vastus…",
"Send an encrypted message…": "Saada krüptitud sõnum…",
"Send a message…": "Saada sõnum…",
"Send a reply (unencrypted)…": "Saada krüptimata vastus…",
"Send a message (unencrypted)…": "Saada krüpteerimata sõnum…",
"The conversation continues here.": "Vestlus jätkub siin.",
"Recent rooms": "Hiljutised jututoad",
"No rooms to show": "Ei saa kuvada ühtegi jututuba",
"Direct Messages": "Isiklikud sõnumid",
"Start chat": "Alusta vestlust",
"Rooms": "Jututoad",
"Do you want to chat with %(user)s?": "Kas sa soovid vestelda %(user)s'ga?",
"<userName/> wants to chat": "<userName/> soovib vestelda",
"All Rooms": "Kõik jututoad",
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "Krüptitud jututubades, nagu see praegune, URL'ide eelvaated ei ole vaikimisi kasutusel. See tagab, et sinu koduserver (kus eelvaated luuakse) ei saaks koguda teavet viidete kohta, mida sa siin jututoas näed.",
"In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Krüptitud jututubades sinu sõnumid on turvatud ning vaid sinul ja sõnumi saajal on unikaalsed võtmed nende kuvamiseks.",
"In encrypted rooms, verify all users to ensure its secure.": "Krüptitud jututubades turvalisuse tagamiseks verifitseeri kõik kasutajad.",
"Verification timed out.": "Verifitseerimine aegus.",
"You cancelled verification on your other session.": "Sina tühistasid verifitseerimise oma teises sessioonis.",
"%(displayName)s cancelled verification.": "%(displayName)s tühistas verifitseerimise.",
"You cancelled verification.": "Sina tühistasid verifitseerimise.",
"Verification cancelled": "Verifitseerimine tühistatud",
"Compare emoji": "Võrdle emoji'sid",
"Sunday": "Pühapäev",
"Monday": "Esmaspäev",
"Tuesday": "Teisipäev",
"Wednesday": "Kolmapäev",
"Thursday": "Neljapäev",
"Friday": "Reede",
"Saturday": "Laupäev",
"Today": "Täna",
"Yesterday": "Eile",
"View Source": "Vaata lähtekoodi",
"Encryption enabled": "Krüptimine on kasutusel",
"Add rooms to this community": "Lisa siia kogukonda jututubasid",
"Create new room": "Loo uus jututuba",
"Unblacklist": "Eemalda mustast nimekirjast",
"Blacklist": "Kanna musta nimekirja",
"Unverify": "Eemalda õigeks tunnistamine",
"Verify...": "Tunnista õigeks...",
"Join": "Liitu",
"No results": "Tulemusi pole",
"Please <newIssueLink>create a new issue</newIssueLink> on GitHub so that we can investigate this bug.": "Selle vea uurimiseks palun <newIssueLink>loo uus veateade</newIssueLink> meie GitHub'is.",
"collapse": "ahenda",
"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",
"Rotate Left": "Pööra vasakule",
"Rotate counter-clockwise": "Pööra vastupäeva",
"Rotate Right": "Pööra paremale",
"Rotate clockwise": "Pööra päripäeva",
"All rooms": "Kõik jututoad",
"Enter the name of a new server you want to explore.": "Sisesta uue serveri nimi mida tahad uurida.",
"Matrix rooms": "Matrix'i jututoad",
"Explore Room State": "Uuri jututoa olekut",
"Explore Account Data": "Uuri konto andmeid",
"Private Chat": "Privaatne vestlus",
"Public Chat": "Avalik vestlus",
"Other users can invite you to rooms using your contact details": "Teades sinu kontaktinfot võivad teised kutsuda sind osalema jututubades",
"Add rooms to the community summary": "Lisa jututoad kogukonna ülevaatesse",
"Which rooms would you like to add to this summary?": "Milliseid jututubasid sooviksid lisada sellesse ülevaatesse?",
"Failed to add the following rooms to the summary of %(groupId)s:": "Järgmiste jututubade lisamine %(groupId)s kogukonna ülevaatesse ebaõnnestus:",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Neid jututubasid kuvatakse kogukonna liikmetele kogukonna lehel. Liikmed saavad nimetatud jututubadega liituda neil klõpsides.",
"Featured Rooms:": "Esiletõstetud jututoad:",
"Explore Public Rooms": "Sirvi avalikke jututubasid",
"Explore": "Uuri",
"Filter rooms…": "Filtreeri jututubasid…",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Liites kokku kasutajaid ja jututubasid loo oma kogukond! Loo kogukonna koduleht, et märkida oma koht Matrix'i universumis.",
"Explore rooms": "Uuri jututubasid",
"If you've joined lots of rooms, this might take a while": "Kui oled liitunud paljude jututubadega, siis see võib natuke aega võtta",
"If disabled, messages from encrypted rooms won't appear in search results.": "Kui see seadistus pole kasutusel, siis krüptitud jututubade sõnumeid otsing ei vaata.",
"Indexed rooms:": "Indekseeritud jututoad:"
}

View File

@ -667,8 +667,8 @@
"Data from an older version of Riot 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.": "Riot bertsio zahar batek datuak antzeman dira. Honek bertsio zaharrean muturretik muturrerako zifratzea ez funtzionatzea eragingo du. Azkenaldian bertsio zaharrean bidali edo jasotako zifratutako mezuak agian ezin izango dira deszifratu bertsio honetan. Honek ere Bertsio honekin egindako mezu trukeak huts egitea ekar dezake. Arazoak badituzu, amaitu saioa eta hasi berriro saioa. Mezuen historiala gordetzeko, esportatu eta berriro inportatu zure gakoak.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Sortu komunitate bat erabiltzaileak eta gelak biltzeko! Sortu zure hasiera orria eta markatu zure espazioa Matrix unibertsoan.",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Ez dago beste inor hemen! <inviteText>Beste batzuk gonbidatu</inviteText> nahi dituzu edo <nowarnText>gela hutsik dagoela abisatzeari utzi</nowarnText>?",
"Light theme": "Itxura argia",
"Dark theme": "Itxura iluna",
"Light theme": "Azal argia",
"Dark theme": "Azal iluna",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "%(emailAddress)s helbidera e-mail bat bidali da. Behin dakarren esteka jarraituta, egin klik behean.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Hasiera zerbitzari honek ez du bezero honek onartzen duen fluxurik eskaintzen.",
"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.": "Ezin izango duzu hau aldatu zure burua mailaz jaisten ari zarelako, zu bazara gelan baimenak dituen azken erabiltzailea ezin izango dira baimenak berreskuratu.",
@ -1174,7 +1174,7 @@
"Email addresses": "E-mail helbideak",
"Phone numbers": "Telefono zenbakiak",
"Language and region": "Hizkuntza eta eskualdea",
"Theme": "Itxura",
"Theme": "Azala",
"Account management": "Kontuen kudeaketa",
"Deactivating your account is a permanent action - be careful!": "Kontua desgaitzea behin betiko ekintza bat da, kontuz ibili!",
"For help with using Riot, click <a>here</a>.": "Riot erabiltzeko laguntza behar baduzu, egin klik <a>hemen</a>.",
@ -1236,8 +1236,8 @@
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s bisitariak gelara elkartzea eragotzi du.",
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s erabiltzaileak bisitarien araua aldatu du: %(rule)s",
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Erabiltzaile honekin dauzkazun mezu seguruak muturretik muturrera zifratuta daude eta ezin ditu beste inork irakurri.",
"Verify this user by confirming the following emoji appear on their screen.": "Baieztatu erabiltzaile hau beheko emojiak bere pantailan agertzen direla egiaztatuz.",
"Verify this user by confirming the following number appears on their screen.": "Baieztatu erabiltzaile hau honako zenbakia bere pantailan agertzen dela egiaztatuz.",
"Verify this user by confirming the following emoji appear on their screen.": "Egiaztatu erabiltzaile hau beheko emojiak bere pantailan agertzen direla baieztatuz.",
"Verify this user by confirming the following number appears on their screen.": "Egiaztatu erabiltzaile hau honako zenbakia bere pantailan agertzen dela baieztatuz.",
"Unable to find a supported verification method.": "Ezin izan da onartutako egiaztaketa metodorik aurkitu.",
"Thumbs up": "Ederto",
"Hourglass": "Harea-erlojua",
@ -1353,7 +1353,7 @@
"Want more than a community? <a>Get your own server</a>": "Komunitate bat baino gehiago nahi duzu? <a>Eskuratu zure zerbitzari propioa</a>",
"Could not load user profile": "Ezin izan da erabiltzaile-profila kargatu",
"You cannot modify widgets in this room.": "Ezin dituzu gela honetako trepetak aldatu.",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak %(targetDisplayName)s geñara elkartzeko gonbidapena errefusatu du.",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak %(targetDisplayName)s gelara elkartzeko gonbidapena errefusatu du.",
"Upgrade this room to the recommended room version": "Bertsio-berritu gela hau aholkatutako bertsiora",
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Gela hau bertsio-berritzeak gelaren oraingo instantzia itzaliko du eta izen bereko beste gela berri bat sortuko du.",
"Failed to revoke invite": "Gonbidapena indargabetzeak huts egin du",
@ -1725,7 +1725,7 @@
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s erabiltzaileak bideo-dei bat abiatu du. (Nabigatzaile honek ez du onartzen)",
"Try out new ways to ignore people (experimental)": "Probatu jendea ez entzuteko modu berriak (esperimentala)",
"Enable local event indexing and E2EE search (requires restart)": "Gaitu gertaera lokalen indexazioa eta E2EE bilaketa (berrabiarazi behar da)",
"Match system theme": "Bat egin sistemako gaiarekin",
"Match system theme": "Bat egin sistemako azalarekin",
"My Ban List": "Nire debeku-zerrenda",
"This is your list of users/servers you have blocked - don't leave the room!": "Hau blokeatu dituzun erabiltzaile edo zerbitzarien zerrenda da, ez atera gelatik!",
"Decline (%(counter)s)": "Ukatu (%(counter)s)",
@ -1781,7 +1781,7 @@
"Your display name": "Zure pantaila-izena",
"Your avatar URL": "Zure abatarraren URL-a",
"Your user ID": "Zure erabiltzaile ID-a",
"Your theme": "Zure gaia",
"Your theme": "Zure azala",
"Riot URL": "Riot URL-a",
"Room ID": "Gelaren ID-a",
"Widget ID": "Trepetaren ID-a",
@ -1948,7 +1948,7 @@
"Encryption upgraded": "Zifratzea eguneratuta",
"Encryption setup complete": "Zifratzearen ezarpena egina",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Saio ezezagunak daude gela honetan: egiaztatu gabe aurrera jarraitzen baduzu, baten batek zure deian kuxkuxeatu lezake.",
"Setting up keys": "Gakoak ezartzea",
"Setting up keys": "Gakoak ezartzen",
"Verify this session": "Egiaztatu saio hau",
"Encryption upgrade available": "Zifratze eguneratzea eskuragarri",
"Unverified session": "Egiaztatu gabeko saioa",
@ -1978,7 +1978,7 @@
"Channel: %(channelName)s": "Kanala: %(channelName)s",
"Show less": "Erakutsi gutxiago",
"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.": "Pasahitza aldatzean oraingo muturretik muturrerako zifratze gako guztiak ezeztatuko ditu saio guztietan, zifratutako txaten historiala ezin izango da irakurri ez badituzu aurretik zure geletako gakoak esportatzen eta gero berriro inportatzen. Etorkizunean hau hobetuko da.",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Zure kontua zeharkako sinatze identitate bat du biltegi sekretuan, baina saio honek ez du oraindik fidagarritzat.",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Zure kontuak zeharkako sinatze identitate bat du biltegi sekretuan, baina saio honek ez du oraindik fidagarritzat.",
"in memory": "memorian",
"Your homeserver does not support session management.": "Zure hasiera-zerbitzariak ez du saio kudeaketa onartzen.",
"Unable to load session list": "Ezin izan da saioen zerrenda kargatu",
@ -2185,12 +2185,12 @@
"%(senderName)s changed the alternative addresses for this room.": "%(senderName)s erabiltzaileak gela honen ordezko helbideak aldatu ditu.",
"%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s erabiltzaileak gela honen helbide nagusia eta ordezko helbideak aldatu ditu.",
"%(senderName)s changed the addresses for this room.": "%(senderName)s erabiltzaileak gela honen helbideak aldatu ditu.",
"Support adding custom themes": "Gai pertsonalizatua gehitzea onartzen du",
"Invalid theme schema.": "Baliogabeko gai eskema.",
"Error downloading theme information.": "Errorea gaiaren informazioa deskargatzean.",
"Theme added!": "Gaia gehituta!",
"Custom theme URL": "Gai pertsonalizatuaren URLa",
"Add theme": "Gehitu gaia",
"Support adding custom themes": "Azal pertsonalizatuak gehitzea onartzen du",
"Invalid theme schema.": "Baliogabeko azal eskema.",
"Error downloading theme information.": "Errorea azalaren informazioa deskargatzean.",
"Theme added!": "Azala gehituta!",
"Custom theme URL": "Azal pertsonalizatuaren URLa",
"Add theme": "Gehitu azala",
"Scroll to most recent messages": "Korritu azken mezuetara",
"There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Errore bat gertatu da gelaren ordezko helbideak eguneratzean. Agian zerbitzariak ez du onartzen edo une bateko akatsa izan da.",
"You don't have permission to delete the alias.": "Ez duzu ezizena ezabatzeko baimenik.",
@ -2234,7 +2234,7 @@
"Signature upload success": "Sinaduren igoera ongi burutu da",
"Signature upload failed": "Sinaduren igoerak huts egin du",
"Confirm by comparing the following with the User Settings in your other session:": "Berretsi honako hau zure beste saioaren erabiltzaile-ezarpenetan agertzen denarekin alderatuz:",
"Confirm this user's session by comparing the following with their User Settings:": "Baieztatu erabiltzaile saio hau, honako hau bestearen erabiltzaile-ezarpenekin alderatuz:",
"Confirm this user's session by comparing the following with their User Settings:": "Egiaztatu erabiltzailearen saio hau, honako hau bestearen erabiltzaile-ezarpenekin alderatuz:",
"If they don't match, the security of your communication may be compromised.": "Ez badatoz bat, komunikazioaren segurtasuna konprometitua egon daiteke.",
"Navigation": "Nabigazioa",
"Calls": "Deiak",
@ -2296,5 +2296,94 @@
"Session backup key:": "Saioaren babes-kopia gakoa:",
"Sends a message as html, without interpreting it as markdown": "Bidali mezua html gisa, markdown balitz aztertu gabe",
"Sign in with SSO": "Hasi saioa SSO-rekin",
"Cancel replying to a message": "Utzi mezua erantzuteari"
"Cancel replying to a message": "Utzi mezua erantzuteari",
"Use Single Sign On to continue": "Erabili Single sign-on jarraitzeko",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Baieztatu e-mail hau gehitzea Single sign-on bidez zure identitatea frogatuz.",
"Single Sign On": "Single sign-on",
"Confirm adding email": "Baieztatu e-maila gehitzea",
"Click the button below to confirm adding this email address.": "Sakatu beheko botoia e-mail helbide hau gehitzea berresteko.",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Baieztatu telefono zenbaki hau gehitzea Single sign-on bidez zure identitatea frogatuz.",
"Confirm adding phone number": "Berretsi telefono zenbakia gehitzea",
"Click the button below to confirm adding this phone number.": "Sakatu beheko botoia telefono zenbaki hau gehitzea berresteko.",
"%(name)s is requesting verification": "%(name)s egiaztaketa eskatzen ari da",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Baieztatu beheko emojiak bi saioetan ikusten direla, ordena berean:",
"Verify this session by confirming the following number appears on its screen.": "Egiaztatu saio hau honako zenbakia bere pantailan agertzen dela baieztatuz.",
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Beste saioaren zain, %(deviceName)s (%(deviceId)s), egiaztatzeko…",
"From %(deviceName)s (%(deviceId)s)": "%(deviceName)s (%(deviceId)s) gailutik",
"well formed": "ongi osatua",
"unexpected type": "ustekabeko mota",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Berretsi saio hauek ezabatzea Single sign-on bidez zure identitatea frogatuz.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Berretsi saio hau ezabatzea Single sign-on bidez zure identitatea frogatuz.",
"Confirm deleting these sessions": "Berretsi saio hauek ezabatzea",
"Click the button below to confirm deleting these sessions.|other": "Sakatu beheko botoia saio hauek ezabatzea berresteko.",
"Click the button below to confirm deleting these sessions.|one": "Sakatu beheko botoia saio hau ezabatzea berresteko.",
"Delete sessions": "Ezabatu saioak",
"Waiting for you to accept on your other session…": "Zu beste saioa onartu bitartean zain…",
"Almost there! Is your other session showing the same shield?": "Ia amaitu duzu! Zure beste saioak ezkutu bera erakusten du?",
"Almost there! Is %(displayName)s showing the same shield?": "Ia amaitu duzu! %(displayName)s gailuak ezkutu bera erakusten du?",
"You've successfully verified %(deviceName)s (%(deviceId)s)!": "Ongi egiaztatu duzu %(deviceName)s (%(deviceId)s)!",
"Start verification again from the notification.": "Hasi egiaztaketa berriro jakinarazpenetik.",
"Start verification again from their profile.": "Hasi egiaztaketa berriro bere profiletik.",
"Verification timed out.": "Egiaztaketarako denbora-muga agortu da.",
"You cancelled verification on your other session.": "Egiaztaketa ezeztatu duzu zure beste saioan.",
"%(displayName)s cancelled verification.": "%(displayName)s-k egiaztaketa ezeztatu du.",
"You cancelled verification.": "Egiaztaketa ezeztatu duzu.",
"Enable end-to-end encryption": "Gaitu muturretik-muturrera zifratzea",
"You cant disable this later. Bridges & most bots wont work yet.": "Ezin duzu hau gero desgaitu: Zubiak eta bot gehienak ez dabiltza oraindik.",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Berretsi zure kontua desgaitzea Single sign-on bidez zure identitatea frogatuz.",
"Are you sure you want to deactivate your account? This is irreversible.": "Ziur kontua desaktibatu nahi duzula? Ez dago gero atzera egiterik.",
"Confirm account deactivation": "Baieztatu kontua desaktibatzea",
"Server did not require any authentication": "Zerbitzariak ez du autentifikaziorik eskatu",
"Server did not return valid authentication information.": "Zerbitzariak ez du baliozko autentifikazio informaziorik itzuli.",
"There was a problem communicating with the server. Please try again.": "Arazo bat egon da zerbitzariarekin komunikatzeko. Saiatu berriro.",
"Welcome to %(appName)s": "Ongi etorri %(appName)s-era",
"Liberate your communication": "Askatu zure komunikazioa",
"Send a Direct Message": "Bidali mezu zuzena",
"Explore Public Rooms": "Arakatu gela publikoak",
"Create a Group Chat": "Sortu talde-txata",
"Self-verification request": "Auto-egiaztaketa eskaria",
"Delete sessions|other": "Ezabatu saioak",
"Delete sessions|one": "Ezabatu saioa",
"If you cancel now, you won't complete your operation.": "Orain ezeztatzen baduzu, ez duzu eragiketa burutuko.",
"Failed to set topic": "Ezin izan da mintzagaia ezarri",
"Command failed": "Aginduak huts egin du",
"Could not find user in room": "Ezin izan da erabiltzailea gelan aurkitu",
"Please supply a widget URL or embed code": "Eman trepetaren URLa edo txertatu kodea",
"Send a bug report with logs": "Bidali akats txostena egunkariekin",
"Enable cross-signing to verify per-user instead of per-session": "Gaitu zeharkako sinadura erabiltzaileko edo saioko egiaztatzeko",
"Keep recovery passphrase in memory for this session": "Mantendu berreskuratze pasa-esaldia memorian saio honentzat",
"Can't load this message": "Ezin izan da mezu hau kargatu",
"Submit logs": "Bidali egunkariak",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Oroigarria: Ez dugu zure nabigatzailearentzako euskarririk, ezin da zure esperientzia nolakoa izango den aurreikusi.",
"Unable to upload": "Ezin izan da igo",
"Verify other session": "Egiaztatu beste saioa",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Ezin izan da biltegi sekretura sartu. Egiaztatu berreskuratze pasa-esaldi zuzena sartu duzula.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Abisua:</b>: Hau fidagarritzat jotzen duzun ordenagailu batetik egin beharko zenuke beti.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Atzitu zure mezu seguruen historiala eta zeharkako sinatzerako identitatea beste saioak egiaztatzeko zure berreskuratze pasa-esaldia sartuz.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>.": "Zure berreskuratze pasa-esaldia ahaztu baduzu <button1>berreskuratze-gakoa erabili</button1> dezakezu edo <button2>berreskuratze aukera berriak ezarri</button2> ditzakezu.",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Ezin izan da babes-kopia deszifratu berreskuratze-gako honekin: egiaztatu berreskuratze-gako egokia sartu duzula.",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Ezin izan da babes-kopia deszifratu berreskuratze pasa-esaldi honekin: egiaztatu berreskuratze berreskuratze pasa-esaldia ondo idatzi duzula.",
"Verify this login": "Egiaztatu saio hau",
"Syncing...": "Sinkronizatzen…",
"Signing In...": "Saioa hasten...",
"If you've joined lots of rooms, this might take a while": "Gela askotara elkartu bazara, honek denbora behar lezake",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Baieztatu zure identitatea saio hau zure beste saio batetik egiaztatuz, mezu zifratuetara sarbidea emanez.",
"This requires the latest Riot on your other devices:": "Honek zure beste gailuetan azken Riot bertsioa eskatzen du:",
"or another cross-signing capable Matrix client": "edo zeharkako sinadurarako gai den beste Matrix bezero bat",
"Use Recovery Passphrase or Key": "Erabili berreskuratze pasa-esaldia edo gakoa",
"Great! This recovery passphrase looks strong enough.": "Bikain! Berreskuratze pasa-esaldi hau sendoa dirudi.",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Ezarri berreskuratze pasa-esaldia zifratutako informazioa babesteko eta, saioa amaitzekotan, berreskuratzeko. Hau ez luke zure kontuaren pasahitzaren berdina izan behar:",
"Enter a recovery passphrase": "Sartu berreskuratze pasa-esaldia",
"Back up encrypted message keys": "Egin zifratutako mezuen gakoen babes-kopia",
"Enter your recovery passphrase a second time to confirm it.": "Sartu zure berreskuratze pasa-esaldia berriro baieztatzeko.",
"Confirm your recovery passphrase": "Berretsi berreskuratze pasa-esaldia",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Zure berreskuratze-gakoa badaezpadakoa da, pasa-esaldia ahazten baduzu zure zifratutako mezuak berreskuratzeko erabili dezakezu.",
"Unable to query secret storage status": "Ezin izan da biltegi sekretuaren egoera kontsultatu",
"Confirm recovery passphrase": "Berretsi berreskuratze pasa-esaldia",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Zure gakoen kopia zifratu bat gordeko dugu gure zerbitzarian. Babestu zure babes-kopia berreskuratze pasa-esaldi batekin.",
"Enter a recovery passphrase...": "Sartu berreskuratze pasa-esaldia...",
"Please enter your recovery passphrase a second time to confirm.": "Sartu zure berreskuratze pasa-esaldia berriro baieztatzeko.",
"Repeat your recovery passphrase...": "Errepikatu zure berreskuratze pasa-esaldia...",
"Secure your backup with a recovery passphrase": "Babestu zure babeskopia berreskuratze pasa-esaldi batekin",
"Currently indexing: %(currentRoom)s": "Orain indexatzen: %(currentRoom)s"
}

View File

@ -1997,7 +1997,7 @@
"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!",
"Not Trusted": "Ei luotettu",
"Ask this user to verify their session, or manually verify it below.": "Pyydä tätä käyttäjää vahvistamaan heidän istuntonsa, tai manuaalisesti vahvista se alla.",
"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.",
"Manually Verify": "Manuaalisesti vahvista",
"a few seconds from now": "muutama sekunti sitten",
"about a minute from now": "noin minuutti sitten",
@ -2106,5 +2106,56 @@
"Esc": "Esc",
"Enter": "Enter",
"Space": "Välilyönti",
"End": "End"
"End": "End",
"Use Single Sign On to continue": "Jatka kertakirjautumista käyttäen",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Vahvista tämän sähköpostiosoitteen lisääminen todistamalla henkilöllisyytesi kertakirjautumista käyttäen.",
"Single Sign On": "Kertakirjautuminen",
"Confirm adding email": "Vahvista sähköpostin lisääminen",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Vahvista tämän puhelinnumeron lisääminen todistamalla henkilöllisyytesi kertakirjautumista käyttäen.",
"Confirm adding phone number": "Vahvista puhelinnumeron lisääminen",
"From %(deviceName)s (%(deviceId)s)": "Laitteelta %(deviceName)s (%(deviceId)s)",
"cached locally": "paikallisessa välimuistissa",
"not found locally": "ei paikallisessa välimuistissa",
"exists": "on olemassa",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Vahvista näiden istuntojen poistaminen todistamalla henkilöllisyytesi kertakirjautumista käyttäen.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Vahvista tämän istunnon poistaminen todistamalla henkilöllisyytesi kertakirjautumista käyttäen.",
"Confirm deleting these sessions": "Vahvista näiden istuntojen poistaminen",
"Delete sessions": "Poista istunnot",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "<code>/help</code> näyttää luettelon käytettävissä olevista komennoista. Oliko tarkoituksesi lähettää se viestinä?",
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Vinkki: <code>//</code> aloittaa viestin kauttaviivalla.",
"Published Addresses": "Julkaistut osoitteet",
"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.": "Kuka tahansa millä tahansa palvelimella voi käyttää julkaistuja osoitteita liittyäksesi huoneeseesi. Osoitteen julkaisemiseksi se on ensin asetettava paikalliseksi osoitteeksi.",
"Other published addresses:": "Muut julkaistut osoitteet:",
"No other published addresses yet, add one below": "Toistaiseksi ei muita julkaistuja osoitteita, lisää alle",
"New published address (e.g. #alias:server)": "Uusi julkaistu osoite (esim. #alias:palvelin)",
"Ask %(displayName)s to scan your code:": "Pyydä käyttäjää %(displayName)s lukemaan koodisi:",
"Matrix rooms": "Matrix-huoneet",
"The internet connection either session is using": "Jomman kumman istunnon käyttämä internet-yhteys",
"Sign in with SSO": "Kirjaudu kertakirjautumista käyttäen",
"Welcome to %(appName)s": "Tervetuloa %(appName)s-sovellukseen",
"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äkeskustelu",
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Suojaa salausavaimesi salalauseella. Parhaan turvallisuuden takaamiseksi sen tulisi olla eri kuin käyttäjätilisi salasana:",
"Super": "Super",
"Cancel replying to a message": "Peruuta viestiin vastaaminen",
"Jump to room search": "Siirry huonehakuun",
"Failed to set topic": "Aiheen asettaminen epäonnistui",
"Command failed": "Komento epäonnistui",
"Could not find user in room": "Käyttäjää ei löytynyt huoneesta",
"Send a bug report with logs": "Lähetä virheilmoitus lokien kera",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Varmista että alla olevat emojit näkyvät molemmissa istunnoissa samassa järjestyksessä:",
"Delete sessions|other": "Poista istunnot",
"Delete sessions|one": "Poista istunto",
"Compare emoji": "Vertaile emojeita",
"Can't load this message": "Tätä viestiä ei voi ladata",
"Submit logs": "Lähetä lokit",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Muistutus: Selaintasi ei tueta, joten voit kohdata yllätyksiä.",
"There was a problem communicating with the server. Please try again.": "Palvelinyhteydessä oli ongelma. Yritä uudelleen.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Varoitus</b>: Tee tämä ainoastaan luotetulla tietokoneella.",
"Syncing...": "Synkronoidaan...",
"Signing In...": "Kirjaudutaan sisään...",
"If you've joined lots of rooms, this might take a while": "Jos olet liittynyt moniin huoneisiin, tässä voi kestää hetken",
"Use your other device to continue…": "Jatka toisella laitteellasi…"
}

View File

@ -2345,5 +2345,63 @@
"Liberate your communication": "Libérez votre communication",
"Send a Direct Message": "Envoyez un message direct",
"Explore Public Rooms": "Explorez les salons publics",
"Create a Group Chat": "Créez une discussion de groupe"
"Create a Group Chat": "Créez une discussion de groupe",
"%(name)s is requesting verification": "%(name)s demande une vérification",
"well formed": "bien formée",
"unexpected type": "type inattendu",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Confirmez la désactivation de votre compte en utilisant lauthentification unique pour prouver votre identité.",
"Are you sure you want to deactivate your account? This is irreversible.": "Voulez-vous vraiment désactiver votre compte ? Ceci est irréversible.",
"Confirm account deactivation": "Confirmez la désactivation de votre compte",
"Server did not require any authentication": "Le serveur na pas demandé dauthentification",
"Server did not return valid authentication information.": "Le serveur na pas renvoyé des informations dauthentification valides.",
"There was a problem communicating with the server. Please try again.": "Un problème est survenu en essayant de communiquer avec le serveur. Veuillez réessayer.",
"Delete sessions|other": "Supprimer les sessions",
"Delete sessions|one": "Supprimer la session",
"Enable end-to-end encryption": "Activer le chiffrement de bout en bout",
"You cant disable this later. Bridges & most bots wont work yet.": "Vous ne pourrez pas le désactiver plus tard. Les passerelles et la plupart des bots ne fonctionneront pas pour le moment.",
"Failed to set topic": "Échec du changement de sujet",
"Command failed": "La commande a échoué",
"Could not find user in room": "Impossible de trouver lutilisateur dans le salon",
"Use an existing session to verify this one, granting it access to encrypted messages.": "Utilisez une session existante pour vérifier celle-ci, ce qui lui permettra davoir accès aux messages chiffrés.",
"Use your other device to continue…": "Utilisez votre autre appareil pour continuer…",
"Syncing...": "Synchronisation…",
"Signing In...": "Authentification…",
"If you've joined lots of rooms, this might take a while": "Si vous avez rejoint beaucoup de salons, cela peut prendre du temps",
"If you cancel now, you won't complete your operation.": "Si vous annulez maintenant, vous ne pourrez par terminer votre opération.",
"Enable cross-signing to verify per-user instead of per-session": "Activez la signature croisée pour vérifier par utilisateur plutôt que par session",
"Keep recovery passphrase in memory for this session": "Conserver la phrase secrète de récupération en mémoire pour cette session",
"Verify other session": "Vérifier une autre session",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Impossible daccéder au coffre secret. Vérifiez que vous avez renseigné la bonne phrase secrète de récupération.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Attention</b> : Vous devriez faire cela depuis un ordinateur fiable.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Accédez à lhistorique des messages sécurisés et à votre identité de signature croisée en vérifiant dautres sessions en renseignant votre phrase secrète de récupération.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>.": "Si vous avez oublié votre phrase secrète de récupération, vous pouvez <button1>utiliser votre clé de récupération</button1> ou <button2>définir de nouvelles options de récupération</button2>.",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "La sauvegarde na pas pu être déchiffrée avec cette clé de récupération : vérifiez que vous avez renseigné la bonne clé de récupération.",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "La sauvegarde na pas pu être déchiffrée avec cette phrase secrète de récupération : vérifiez que vous avez renseigné la bonne phrase secrète de récupération.",
"If you cant access one, <button>use your recovery key or recovery passphrase.</button>": "Si vous ne pouvez pas, <button>utilisez votre clé de récupération ou votre phrase secrète de récupération.</button>",
"Great! This recovery passphrase looks strong enough.": "Super ! Cette phrase secrète de récupération a lair suffisamment robuste.",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Définissez une phrase secrète de récupération pour sécuriser les informations chiffrées et les récupérer si vous vous déconnectez. Elle devrait être différente du mot de passe de votre compte :",
"Enter a recovery passphrase": "Saisir une phrase secrète de récupération",
"Back up encrypted message keys": "Sauvegarder les clés des messages chiffrés",
"Enter your recovery passphrase a second time to confirm it.": "Saisissez à nouveau votre phrase secrète de récupération pour la confirmer.",
"Confirm your recovery passphrase": "Confirmer votre phrase secrète de récupération",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Votre clé de récupération est un filet de sécurité : vous pouvez lutiliser pour récupérer laccès à vos messages chiffrés si vous oubliez votre phrase secrète de récupération.",
"Confirm recovery passphrase": "Confirmer la phrase secrète de récupération",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Nous conserverons une copie chiffrée de vos clés sur notre serveur. Protégez votre sauvegarde avec une phrase secrète de récupération.",
"Enter a recovery passphrase...": "Saisir une phrase secrète de récupération…",
"Please enter your recovery passphrase a second time to confirm.": "Saisissez à nouveau votre phrase secrète de récupération pour la confirmer.",
"Repeat your recovery passphrase...": "Répéter votre phrase secrète de récupération…",
"Secure your backup with a recovery passphrase": "Protégez votre sauvegarde avec une phrase secrète de récupération",
"Can't load this message": "Impossible de charger ce message",
"Submit logs": "Envoyer les journaux",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Rappel : Votre navigateur nest pas pris en charge donc votre expérience pourrait être imprévisible.",
"Unable to upload": "Envoi impossible",
"Currently indexing: %(currentRoom)s": "En train dindexer : %(currentRoom)s",
"Please supply a widget URL or embed code": "Veuillez fournir lURL ou le code dintégration du widget",
"Send a bug report with logs": "Envoyer un rapport danomalie avec les journaux",
"Unable to query secret storage status": "Impossible de demander le statut du coffre secret",
"Verify this login": "Vérifier cette connexion",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirmez votre identité en vérifiant cette connexion depuis une de vos autres sessions, cela lui permettra davoir accès aux messages chiffrés.",
"This requires the latest Riot on your other devices:": "Ceci nécessite la dernière version de Riot sur vos autres appareils :",
"or another cross-signing capable Matrix client": "ou un autre client Matrix compatible avec la signature croisée",
"Use Recovery Passphrase or Key": "Utiliser la phrase secrète ou la clé de récupération"
}

View File

@ -2301,5 +2301,99 @@
"Enter": "Enter",
"Space": "Szóköz",
"End": "End",
"Session backup key:": "Munkamenet másolat kulcs:"
"Session backup key:": "Munkamenet másolat kulcs:",
"Use Single Sign On to continue": "A folytatáshoz használd 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ás lenne",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Erősítsd meg, hogy az alábbi emodzsik mindkét munkamenetben azonos sorrendben jelentek meg:",
"Verify this session by confirming the following number appears on its screen.": "Ellenőrizd ezt a munkamenetet azzal, hogy megerősíted, hogy az alábbi szám jelent meg a kijelzőjén.",
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Az ellenőrzéshez a másik munkamenetedre várakozunk, %(deviceName)s (%(deviceId)s)…",
"From %(deviceName)s (%(deviceId)s)": "Innen: %(deviceName)s (%(deviceId)s)",
"well formed": "helyes formátum",
"unexpected type": "váratlan típus",
"Confirm deleting these sessions": "Megerősíted ennek a munkamenetnek a törlését",
"Click the button below to confirm deleting these sessions.|other": "Ezeknek a munkamenetek törlésének a megerősítéséhez kattints a gombra lent.",
"Click the button below to confirm deleting these sessions.|one": "Ennek a munkamenet törlésének a megerősítéséhez kattints a gombra lent.",
"Delete sessions|other": "Munkamenetek törlése",
"Delete sessions|one": "Munkamenet törlése",
"Waiting for you to accept on your other session…": "Az elfogadást várjuk a másik munkamenetedből…",
"Almost there! Is your other session showing the same shield?": "Majdnem kész! A másik munkameneted is ugyanazt a pajzsot mutatja?",
"Almost there! Is %(displayName)s showing the same shield?": "Majdnem kész! %(displayName)s is ugyanazt a pajzsot mutatja?",
"You've successfully verified %(deviceName)s (%(deviceId)s)!": "Sikeresen ellenőrizted: %(deviceName)s (%(deviceId)s)!",
"Start verification again from the notification.": "Ellenőrzés újrakezdése az értesítésből.",
"Start verification again from their profile.": "Ellenőrzés újraindítása a profiljából.",
"Verification timed out.": "Az ellenőrzés időtúllépés miatt megszakadt.",
"You cancelled verification on your other session.": "Az ellenőrzést megszakítottad a másik munkamenetedben.",
"%(displayName)s cancelled verification.": "%(displayName)s megszakította az ellenőrzést.",
"You cancelled verification.": "Megszakítottad az ellenőrzést.",
"Enable end-to-end encryption": "Végpontok közötti titkosítás engedélyezése",
"You cant disable this later. Bridges & most bots wont work yet.": "Ezt később nem lehet kikapcsolni. A hidak és a legtöbb bot nem fog működni egyenlőre.",
"Confirm account deactivation": "Fiók felfüggesztésének megerősítése",
"Server did not require any authentication": "A szerver nem követelt meg semmilyen azonosítást",
"Server did not return valid authentication information.": "A szerver semmilyen érvényes azonosítási információt sem küldött vissza.",
"There was a problem communicating with the server. Please try again.": "A szerverrel való kommunikációval probléma történt. Kérlek próbáld újra.",
"Sign in with SSO": "Belépés SSO-val",
"Welcome to %(appName)s": "Üdv itt: %(appName)s",
"Liberate your communication": "Szabadítsd fel a kommunikációdat",
"Send a Direct Message": "Közvetlen üzenet küldése",
"Explore Public Rooms": "Nyilvános szobák felderítése",
"Create a Group Chat": "Készíts Csoportos Beszélgetést",
"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.",
"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.",
"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 nem sikerült",
"Command failed": "A parancs nem sikerült",
"Could not find user in room": "A felhasználó nem található a szobában",
"Enable cross-signing to verify per-user instead of per-session": "A felhasználó alapú ellenőrzéshez a munkamenet alapú helyett engedélyezd az eszközök közötti hitelesítést",
"Keep recovery passphrase in memory for this session": "A visszaállítási jelmondat memóriában tartása ebben a munkamenetben",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Erősítsd meg az egyszeri bejelentkezéssel, hogy ezeket a munkameneteteket törlöd.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Erősítsd meg egyszeri bejelentkezéssel, hogy ezt a munkamenetet törlöd.",
"Can't load this message": "Ezt az üzenetet nem sikerült betölteni",
"Submit logs": "Napló elküldése",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Emlékeztető: A böngésződ nem támogatott, így az élmény kiszámíthatatlan lehet.",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Erősítsd meg egyszeri bejelentkezéssel, hogy felfüggeszted ezt a fiókot.",
"Are you sure you want to deactivate your account? This is irreversible.": "Biztos, hogy felfüggeszted a fiókodat? Ezt nem lehet visszavonni.",
"Unable to upload": "Nem lehet feltölteni",
"Verify other session": "Más munkamenetek ellenőrzése",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "A biztonsági tárolóhoz nem lehet hozzáférni. Kérlek ellenőrizd, hogy jó visszaállítási jelmondatot adtál-e meg.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Figyelmeztetés</b>: Ezt csak megbízható számítógépen tedd meg.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "A visszaállítási jelmondat megadásával hozzáférhetsz a titkosított üzeneteidhez és az eszközök közötti aláírásnál használt személyazonosságodhoz hogy más munkameneteket ellenőrizhess.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>.": "Ha elfelejtetted a visszaállítási jelmondatodat, akkor <button1>használhatod a visszaállítási kulcsot</button1> vagy <button2>új visszaállítási lehetőséget állíthatsz be</button2>.",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Ezzel a visszaállítási kulccsal a mentést nem lehet visszafejteni: kérlek ellenőrizd, hogy a visszaállítási kulcsot jól adtad-e meg.",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "A mentést nem lehet visszafejteni ezzel a visszaállítási jelmondattal: kérlek ellenőrizd, hogy a megfelelő visszaállítási jelmondatot adtad-e meg.",
"Syncing...": "Szinkronizálás…",
"Signing In...": "Bejelentkezés…",
"If you've joined lots of rooms, this might take a while": "Ha sok szobában vagy benn ez eltarthat egy darabig",
"Use an existing session to verify this one, granting it access to encrypted messages.": "A titkosított üzenetekhez való hozzáféréshez nyiss meg egy létező munkamenetet és használd ennek a hitelesítésére.",
"If you cant access one, <button>use your recovery key or recovery passphrase.</button>": "Ha nem érsz el egyet sem, <button>használd a visszaállítási kulcsot vagy visszaállítási jelmondatot.</button>",
"Use your other device to continue…": "A folytatáshoz használd a más eszközödet…",
"Great! This recovery passphrase looks strong enough.": "Nagyszerű! Ez a visszaállítási jelmondat elég erősnek tűnik.",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Helyezd biztonságba a titkosított információkat, hogy kijelentkezés után is vissza tudd állítani, a visszaállítási jelmondat beállításával. Ez legyen a fiók jelszótól különböző:",
"Enter a recovery passphrase": "Visszaállítási jelmondat megadása",
"Back up encrypted message keys": "Titkosított üzenetek kulcsainak mentése",
"Enter your recovery passphrase a second time to confirm it.": "A megerősítéshez add meg a visszaállítási jelmondatot még egyszer.",
"Confirm your recovery passphrase": "Visszaállítási jelmondat megerősítése",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "A visszaállítási kulcs egy biztonsági háló - arra az esetre ha elfelejted a visszaállítási jelmondatot a titkosított üzenetekhez való hozzáférést vissza tudd állítani.",
"Confirm recovery passphrase": "Visszaállítási jelmondat megerősítése",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "A kulcsaidat titkosított formában tároljuk a szerverünkön. Helyezd biztonságba a mentéseded a visszaállítási jelmondattal.",
"Enter a recovery passphrase...": "Visszaállítási jelmondat megadása…",
"Please enter your recovery passphrase a second time to confirm.": "A megerősítéshez kérlek add meg a visszaállítási jelmondatot még egyszer.",
"Repeat your recovery passphrase...": "Ismételd meg a visszaállítási jelmondatot…",
"Secure your backup with a recovery passphrase": "Védd a mentést a visszaállítási jelmondattal",
"Currently indexing: %(currentRoom)s": "Indexelés alatt: %(currentRoom)s",
"Send a bug report with logs": "Hibajelentés beküldése naplóval",
"Please supply a widget URL or embed code": "Add meg a kisalkalmazás URL-jét vagy a beágyazott kódot",
"Verify this login": "Belépés ellenőrzése",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Erősítsd meg ebben a bejelentkezésben a személyazonosságodat egy másik munkamenetből, hogy hozzáférhess a titkosított üzenetekhez.",
"This requires the latest Riot on your other devices:": "A Riot legújabb kliensére van ehhez szükséged a többi eszközödön:",
"or another cross-signing capable Matrix client": "vagy másik eszközök közötti hitelesítésre alkalmas Matrix kliensre",
"Use Recovery Passphrase or Key": "Használd a Visszaállítási Jelmondatot vagy Kulcsot",
"Unable to query secret storage status": "A biztonsági tároló állapotát nem lehet lekérdezni"
}

View File

@ -2333,5 +2333,72 @@
"You cancelled verification on your other session.": "Hai annullato la verifica nell'altra sessione.",
"%(displayName)s cancelled verification.": "%(displayName)s ha annullato la verifica.",
"You cancelled verification.": "Hai annullato la verifica.",
"Self-verification request": "Richiesta di auto-verifica"
"Self-verification request": "Richiesta di auto-verifica",
"%(name)s is requesting verification": "%(name)s sta richiedendo la verifica",
"well formed": "formattato bene",
"unexpected type": "tipo inatteso",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Conferma l'eliminazione di queste sessioni usando Single Sign On per dare prova della tua identità.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Conferma l'eliminazione di questa sessione usando Single Sign On per dare prova della tua identità.",
"Click the button below to confirm deleting these sessions.|other": "Clicca il pulsante sottostante per confermare l'eliminazione di queste sessioni.",
"Click the button below to confirm deleting these sessions.|one": "Clicca il pulsante sottostante per confermare l'eliminazione di questa sessione.",
"Delete sessions|other": "Elimina sessioni",
"Delete sessions|one": "Elimina sessione",
"Enable end-to-end encryption": "Attiva cifratura end-to-end",
"You cant disable this later. Bridges & most bots wont work yet.": "Non potrai più disattivarla. I bridge e molti bot non funzioneranno.",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Conferma la disattivazione del tuo account usando Single Sign On per dare prova della tua identità.",
"Are you sure you want to deactivate your account? This is irreversible.": "Sei sicuro di volere disattivare il tuo account? È irreversibile.",
"Confirm account deactivation": "Conferma disattivazione account",
"Server did not require any authentication": "Il server non ha richiesto alcuna autenticazione",
"Server did not return valid authentication information.": "Il server non ha restituito informazioni di autenticazione valide.",
"There was a problem communicating with the server. Please try again.": "C'è stato un problema nella comunicazione con il server. Riprova.",
"Welcome to %(appName)s": "Benvenuti su %(appName)s",
"Liberate your communication": "Libera le tue comunicazioni",
"Send a Direct Message": "Invia un messaggio diretto",
"Explore Public Rooms": "Esplora le stanze pubbliche",
"Create a Group Chat": "Crea una chat di gruppo",
"Failed to set topic": "Impostazione argomento fallita",
"Command failed": "Comando fallito",
"Could not find user in room": "Utente non trovato nella stanza",
"Use an existing session to verify this one, granting it access to encrypted messages.": "Usa una sessione esistente per verificare questa, dandole l'accesso ai messaggi cifrati.",
"Use your other device to continue…": "Usa il tuo altro dispositivo per continuare…",
"Syncing...": "Sincronizzazione...",
"Signing In...": "Accesso...",
"If you've joined lots of rooms, this might take a while": "Se sei dentro a molte stanze, potrebbe impiegarci un po'",
"If you cancel now, you won't complete your operation.": "Se annulli adesso, non completerai l'operazione.",
"Please supply a widget URL or embed code": "Inserisci un URL del widget o un codice di incorporamento",
"Send a bug report with logs": "Invia una segnalazione di errore con i registri",
"Enable cross-signing to verify per-user instead of per-session": "Attiva la firma incrociata per verificare per-utente invece di per-sessione",
"Keep recovery passphrase in memory for this session": "Tieni la password di ripristino in memoria per questa sessione",
"Can't load this message": "Impossibile caricare questo messaggio",
"Submit logs": "Invia registri",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Promemoria: il tuo browser non è supportato, perciò la tua esperienza può essere imprevedibile.",
"Unable to upload": "Impossibile inviare",
"Verify other session": "Verifica l'altra sessione",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Impossibile accedere all'archivio segreto. Verifica di avere inserito la password di ripristino giusta.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Attenzione</b>: dovresti farlo solo con un computer fidato.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Accedi alla cronologia dei messaggi sicuri e all'identità di firma incrociata per verificare altre sessioni inserendo la password di ripristino.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>.": "Se hai dimenticato la password di ripristino puoi <button1>usare la chiave di ripristino</button1> o <button2>configurare nuove opzioni di recupero</button2>.",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Impossibile decifrare il backup con questa chiave di ripristino: verifica di avere inserito la chiave di ripristino giusta.",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Impossibile decifrare il backup con questa password di ripristino: verifica di avere inserito la password di ripristino giusta.",
"If you cant access one, <button>use your recovery key or recovery passphrase.</button>": "Se non riesci ad accedere, <button>usa la chiave o password di ripristino.</button>",
"Great! This recovery passphrase looks strong enough.": "Ottimo! Questa password di ripristino sembra abbastanza robusta.",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Imposta una password di ripristino per proteggere le informazioni cifrate e recuperarle se ti disconnetti. Dovrebbe essere diversa dalla password dell'account:",
"Enter a recovery passphrase": "Inserisci una password di ripristino",
"Back up encrypted message keys": "Fai un backup delle chiavi dei messaggi cifrati",
"Enter your recovery passphrase a second time to confirm it.": "Inserisci di nuovo la password di ripristino per confermarla.",
"Confirm your recovery passphrase": "Conferma la password di ripristino",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "La chiave di ripristino è come una rete di sicurezza - puoi usarla per recuperare l'accesso ai messaggi cifrati se dimentichi la password di ripristino.",
"Unable to query secret storage status": "Impossibile rilevare lo stato dell'archivio segreto",
"Confirm recovery passphrase": "Conferma la password di ripristino",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Salveremo una copia cifrata delle tue chiavi sul nostro server. Proteggi il tuo backup con una password di ripristino.",
"Enter a recovery passphrase...": "Inserisci una password di ripristino...",
"Please enter your recovery passphrase a second time to confirm.": "Inserisci di nuovo la password di ripristino per confermarla.",
"Repeat your recovery passphrase...": "Ripeti la password di ripristino...",
"Secure your backup with a recovery passphrase": "Proteggi il backup con una password di ripristino",
"Currently indexing: %(currentRoom)s": "Attualmente si indicizzano: %(currentRoom)s",
"Verify this login": "Verifica questo accesso",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Conferma la tua identità verificando questo accesso da una delle tue altre sessioni, dandogli l'accesso ai messaggi cifrati.",
"This requires the latest Riot on your other devices:": "È richiesta l'ultima versione di Riot sui tuoi altri dispositivi:",
"or another cross-signing capable Matrix client": "o un altro client Matrix che supporti la firma incrociata",
"Use Recovery Passphrase or Key": "Usa la password di ripristino o la chiave"
}

View File

@ -1069,5 +1069,74 @@
"End": "Slutt",
"If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Hvis du støter på noen programfeil eller har tilbakemeldinger som du vil dele, vennligst fortell oss om det på GitHub.",
"To help avoid duplicate issues, please <existingIssuesLink>view existing issues</existingIssuesLink> first (and add a +1) or <newIssueLink>create a new issue</newIssueLink> if you can't find it.": "For å unngå å lage duplikatrapporter, vennligst <existingIssuesLink>sjekk gjennom de eksisterende sakene</existingIssuesLink> først (og gi en tommel opp), eller <newIssueLink>opprett en ny saksrapport</newIssueLink> dersom du ikke finner noen tilsvarende saker.",
"Report bugs & give feedback": "Meld ifra om feil og gi tilbakemeldinger"
"Report bugs & give feedback": "Meld ifra om feil og gi tilbakemeldinger",
"Enter passphrase": "Skriv inn passordfrase",
"(no answer)": "(intet svar)",
"Avoid sequences": "Unngå sekvenser",
"Avoid recent years": "Unngå nylige år",
"Failed to join room": "Mislyktes i å bli med i rommet",
"unknown caller": "ukjent oppringer",
"Cancelling…": "Avbryter …",
"They match": "De samsvarer",
"They don't match": "De samsvarer ikke",
"in memory": "i minnet",
"outdated": "utdatert",
"Disable Notifications": "Skru av varsler",
"Enable Notifications": "Skru på varsler",
"Delete Backup": "Slett sikkerhetskopien",
"Restore from Backup": "Gjenopprett fra sikkerhetskopi",
"Remove %(email)s?": "Vil du fjerne %(email)s?",
"Invalid Email Address": "Ugyldig E-postadresse",
"%(senderName)s uploaded a file": "%(senderName)s lastet opp en fil",
"Kick this user?": "Vil du sparke ut denne brukeren?",
"No pinned messages.": "Ingen klistrede meldinger.",
"Pinned Messages": "Klistrede meldinger",
"Unpin Message": "Avklistre meldingen",
"Try to join anyway": "Forsøk å bli med likevel",
"%(count)s unread messages including mentions.|one": "1 ulest nevnelse.",
"%(count)s unread messages.|other": "%(count)s uleste meldinger.",
"Add a topic": "Legg til et emne",
"Command error": "Kommandofeil",
"Room avatar": "Rommets avatar",
"Start Verification": "Begynn verifisering",
"Verify User": "Verifiser bruker",
"%(count)s verified sessions|one": "1 verifisert økt",
"%(count)s sessions|other": "%(count)s økter",
"%(count)s sessions|one": "%(count)s økt",
"Verify by scanning": "Verifiser med skanning",
"Verify by emoji": "Verifiser med emoji",
"Message Actions": "Meldingshandlinger",
"%(name)s accepted": "%(name)s aksepterte",
"%(name)s declined": "%(name)s avslo",
"%(name)s cancelled": "%(name)s avbrøt",
"%(name)s wants to verify": "%(name)s ønsker å verifisere",
"Failed to copy": "Mislyktes i å kopiere",
"Submit logs": "Send inn loggføringer",
"Failed to remove widget": "Mislyktes i å fjerne modulen",
"Minimize apps": "Minimer apper",
"Maximize apps": "Maksimer apper",
"were invited %(count)s times|other": "ble invitert %(count)s ganger",
"was invited %(count)s times|other": "ble invitert %(count)s ganger",
"were banned %(count)s times|other": "ble bannlyst %(count)s ganger",
"was banned %(count)s times|other": "ble bannlyst %(count)s ganger",
"were unbanned %(count)s times|other": "fikk bannlysningene sine opphevet %(count)s ganger",
"were unbanned %(count)s times|one": "fikk bannlysningene sine opphevet",
"was unbanned %(count)s times|other": "fikk bannlysningen sin opphevet %(count)s ganger",
"was unbanned %(count)s times|one": "fikk bannlysningen sin opphevet",
"Clear all data": "Tøm alle data",
"Verify session": "Verifiser økten",
"Start verification": "Begynn verifisering",
"Upload completed": "Opplasting fullført",
"Unable to upload": "Mislyktes i å laste opp",
"Username not available": "Brukernavnet er utilgjengelig",
"Username available": "Brukernavnet er tilgjengelig",
"Unknown sessions": "Ukjente økter",
"Alias (optional)": "Alias (valgfritt)",
"Remove for everyone": "Fjern for alle",
"Remove for me": "Fjern for meg",
"Syncing...": "Synkroniserer ...",
"Signing In...": "Logger inn …",
"NOT verified": "IKKE verifisert",
"Calls": "Samtaler",
"Room List": "Romliste"
}

View File

@ -1381,5 +1381,6 @@
"Enter your passphrase a second time to confirm it.": "Stadfest passfrasen ved å skrive den inn ein gong til.",
"Unable to set up secret storage": "Oppsett av hemmeleg lager feila",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Denne økta har oppdaga at gjenopprettingspassfrasen og nøkkelen for sikre meldingar vart fjerna.",
"Toggle microphone mute": "Slå av/på demping av mikrofon"
"Toggle microphone mute": "Slå av/på demping av mikrofon",
"Confirm": "Stadfest"
}

View File

@ -1413,5 +1413,180 @@
"Esc": "Esc",
"Enter": "Enter",
"Space": "Spacja",
"End": "End"
"End": "End",
"Confirm": "Potwierdź",
"Sign In or Create Account": "Zaloguj się lub utwórz konto",
"Use your account or create a new one to continue.": "Użyj konta lub utwórz nowe, aby kontynuować.",
"No sessions with registered encryption keys": "Brak sesji z zarejestrowanymi kluczami szyfrującymi",
"No": "Nie",
"Yes": "Tak",
"React": "Zareaguj",
"Edited at %(date)s. Click to view edits.": "Edytowano w %(date)s. Kliknij, aby zobaczyć zmiany.",
"Frequently Used": "Często używane",
"Smileys & People": "Buźki i osoby",
"Animals & Nature": "Zwierzęta i natura",
"Food & Drink": "Żywność i napoje",
"Activities": "Aktywności",
"Travel & Places": "Podróże i miejsca",
"Objects": "Przedmioty",
"Symbols": "Symbole",
"Flags": "Flagi",
"Looks good": "Wygląda dobrze",
"All rooms": "Wszystkie pokoje",
"Your server": "Twój serwer",
"Are you sure you want to remove <b>%(serverName)s</b>": "Czy na pewno chcesz usunąć <b>%(serverName)s</b>",
"Remove server": "Usuń serwer",
"Matrix": "Matrix",
"Add a new server": "Dodaj nowy serwer",
"Enter the name of a new server you want to explore.": "Wpisz nazwę nowego serwera, którego chcesz przeglądać.",
"Server name": "Nazwa serwera",
"Add a new server...": "Dodaj nowy serwer…",
"Please enter a name for the room": "Proszę podać nazwę pokoju",
"Set a room alias to easily share your room with other people.": "Ustaw alias pokoju, aby łatwo udostępniać swój pokój innym osobom.",
"This room is private, and can only be joined by invitation.": "Ten pokój jest prywatny i można do niego dołączyć tylko za zaproszeniem.",
"Enable end-to-end encryption": "Włącz szyfrowanie end-to-end",
"Create a public room": "Utwórz publiczny pokój",
"Create a private room": "Utwórz prywatny pokój",
"Topic (optional)": "Temat (opcjonalnie)",
"Make this room public": "Upublicznij ten pokój",
"Hide advanced": "Ukryj zaawansowane",
"Show advanced": "Pokaż zaawansowane",
"Recent Conversations": "Najnowsze rozmowy",
"Suggestions": "Propozycje",
"Start a conversation with someone using their name, username (like <userId/>) or email address.": "Rozpocznij rozmowę z kimś, kto używa swojej nazwy, nazwy użytkownika (jak <userId/>) lub adresu e-mail.",
"Your password": "Twoje hasło",
"Upload files (%(current)s of %(total)s)": "Prześlij pliki (%(current)s z %(total)s)",
"Upload files": "Prześlij pliki",
"Upload all": "Prześlij wszystko",
"Cancel All": "Anuluj wszystko",
"Resend edit": "Wyślij ponownie edycję",
"Share Permalink": "Udostępnij odnośnik bezpośredni",
"Report Content": "Zgłoś treść",
"Notification settings": "Ustawienia powiadomień",
"Clear status": "Wyczyść status",
"Update status": "Zaktualizuj status",
"Set status": "Ustaw status",
"Set a new status...": "Ustaw nowy status…",
"Hide": "Ukryj",
"Take picture": "Zrób zdjęcie",
"Remove for everyone": "Usuń dla wszystkich",
"Remove for me": "Usuń dla mnie",
"User Status": "Status użytkownika",
"Server Name": "Nazwa serwera",
"The username field must not be blank.": "Pole nazwy użytkownika nie może być puste.",
"Username": "Nazwa użytkownika",
"Not sure of your password? <a>Set a new one</a>": "Nie jesteś pewien swojego hasła? <a>Ustaw nowe</a>",
"Enter password": "Wprowadź hasło",
"Password is allowed, but unsafe": "Hasło jest dozwolone, ale niebezpieczne",
"Nice, strong password!": "Ładne, silne hasło!",
"Enter phone number (required on this homeserver)": "Wprowadź numer telefonu (wymagane na tym serwerze domowym)",
"Enter username": "Wprowadź nazwę użytkownika",
"Homeserver URL": "Adres URL serwera domowego",
"Other servers": "Inne serwery",
"Sign in to your Matrix account on <underlinedServerName />": "Zaloguj się do swojego konta Matrix na <underlinedServerName />",
"Explore rooms": "Przeglądaj pokoje",
"Your profile": "Twój profil",
"Your Matrix account on %(serverName)s": "Twoje konto Matrix na %(serverName)s",
"Your Matrix account on <underlinedServerName />": "Twoje konto Matrix na <underlinedServerName />",
"A verification email will be sent to your inbox to confirm setting your new password.": "E-mail weryfikacyjny zostanie wysłany do skrzynki odbiorczej w celu potwierdzenia ustawienia nowego hasła.",
"Set a new password": "Ustaw nowe hasło",
"Go Back": "Wróć",
"Forgotten your password?": "Nie pamiętasz hasła?",
"Restore": "Przywróć",
"Copy": "Kopiuj",
"Success!": "Sukces!",
"Disable": "Wyłącz",
"Verify": "Weryfikuj",
"Manage integrations": "Zarządzaj integracjami",
"%(count)s verified sessions|other": "%(count)s zweryfikowanych sesji",
"%(count)s verified sessions|one": "1 zweryfikowana sesja",
"Hide verified sessions": "Ukryj zweryfikowane sesje",
"%(count)s sessions|other": "%(count)s sesji",
"%(count)s sessions|one": "%(count)s sesja",
"Hide sessions": "Ukryj sesje",
"Direct message": "Wiadomość bezpośrednia",
"Security": "Bezpieczeństwo",
"Integrations are disabled": "Integracje są wyłączone",
"Enable 'Manage Integrations' in Settings to do this.": "Włącz „Zarządzaj integracjami” w ustawieniach, aby to zrobić.",
"Encryption upgrade available": "Dostępna aktualizacja szyfrowania",
"Upgrade": "Uaktualnij",
"Delete sessions|other": "Usuń sesje",
"Delete %(count)s sessions|one": "Usuń %(count)s sesję",
"Manage": "Zarządzaj",
"Enable": "Włącz",
"Session ID:": "Identyfikator sesji:",
"Session key:": "Klucz sesji:",
"Accept all %(invitedRooms)s invites": "Zaakceptuj wszystkie zaproszenia do %(invitedRooms)s",
"Invite only": "Tylko dla zaproszonych",
"Close preview": "Zamknij podgląd",
"Send a reply…": "Wyślij odpowiedź…",
"Send a message…": "Wyślij wiadomość…",
"Verified": "Zweryfikowano",
"Cancel search": "Anuluj wyszukiwanie",
"Your theme": "Twój motyw",
"More options": "Więcej opcji",
"Invite anyway": "Zaproś mimo to",
"Notes": "Notatki",
"Session name": "Nazwa sesji",
"Session key": "Klucz sesji",
"Go": "Przejdź",
"Your account is not secure": "Twoje konto nie jest bezpieczne",
"New session": "Nowa sesja",
"Deny": "Zabroń",
"Email (optional)": "Adres e-mail (opcjonalnie)",
"Guest": "Gość",
"Setting up keys": "Konfigurowanie kluczy",
"Verify this session": "Zweryfikuj tę sesję",
"Set up encryption": "Skonfiguruj szyfrowanie",
"%(name)s is requesting verification": "%(name)s prosi o weryfikację",
"Failed to set topic": "Nie udało się ustawić tematu",
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s zmienił(a) nazwę pokoju z %(oldRoomName)s na %(newRoomName)s.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s dodał(a) alternatywne adresy %(addresses)s dla tego pokoju.",
"%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s dodał(a) alternatywny adres %(addresses)s dla tego pokoju.",
"%(senderName)s changed the alternative addresses for this room.": "%(senderName)s zmienił(a) alternatywne adresy dla tego pokoju.",
"%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s zmienił(a) główne i alternatywne adresy dla tego pokoju.",
"%(senderName)s changed the addresses for this room.": "%(senderName)s zmienił(a) adresy dla tego pokoju.",
"%(senderName)s placed a voice call.": "%(senderName)s wykonał(a) połączenie głosowe.",
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s wykonał(a) połączenie głosowe. (nie obsługiwane przez tę przeglądarkę)",
"%(senderName)s placed a video call.": "%(senderName)s wykonał(a) połączenie wideo.",
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s wykonał(a) połączenie wideo. (nie obsługiwane przez tę przeglądarkę)",
"Done": "Gotowe",
"The message you are trying to send is too large.": "Wiadomość, którą próbujesz wysłać jest za duża.",
"about a minute ago": "około minuty temu",
"about an hour ago": "około godziny temu",
"about a day ago": "około dzień temu",
"Support adding custom themes": "Obsługa dodawania niestandardowych motywów",
"Order rooms by name": "Sortuj pokoje według nazwy",
"Delete sessions|one": "Usuń sesję",
"Delete %(count)s sessions|other": "Usuń %(count)s sesji",
"Share": "Udostępnij",
"Bold": "Pogrubienie",
"Italics": "Kursywa",
"Strikethrough": "Przekreślenie",
"Recent rooms": "Ostatnie pokoje",
"Reason: %(reason)s": "Powód: %(reason)s",
"Reject & Ignore user": "Odrzuć i zignoruj użytkownika",
"Show image": "Pokaż obraz",
"Verify session": "Zweryfikuj sesję",
"Loading session info...": "Ładowanie informacji o sesji…",
"Upload completed": "Przesyłanie zakończone",
"Message edits": "Edycje wiadomości",
"If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Jeśli napotkasz jakieś błędy lub masz opinię, którą chcesz się podzielić, daj nam znać na GitHubie.",
"Terms of Service": "Warunki użytkowania",
"Upload %(count)s other files|other": "Prześlij %(count)s innych plików",
"Upload %(count)s other files|one": "Prześlij %(count)s inny plik",
"Send a Direct Message": "Wyślij wiadomość bezpośrednią",
"Explore Public Rooms": "Przeglądaj publiczne pokoje",
"Create a Group Chat": "Utwórz czat grupowy",
" (1/%(totalCount)s)": " (1/%(totalCount)s)",
"<a>Log in</a> to your new account.": "<a>Zaloguj się</a> do nowego konta.",
"Registration Successful": "Pomyślnie zarejestrowano",
"DuckDuckGo Results": "Wyniki z DuckDuckGo",
"Enter your account password to confirm the upgrade:": "Wprowadź hasło do konta, aby potwierdzić aktualizację:",
"You're done!": "Jesteś gotów!",
"Autocomplete": "Autouzupełnienie",
"Toggle Bold": "Przełącz pogrubienie",
"Toggle Italics": "Przełącz kursywę",
"Toggle Quote": "Przełącz cytowanie",
"Cancel autocomplete": "Anuluj autouzupełnienie"
}

View File

@ -1,12 +1,12 @@
{
"Account": "Аккаунт",
"Account": "Учётная запись",
"Admin": "Администратор",
"Advanced": "Подробности",
"Algorithm": "Алгоритм",
"A new password must be entered.": "Введите новый пароль.",
"Anyone who knows the room's link, apart from guests": "Все, у кого есть ссылка на эту комнату, кроме гостей",
"Anyone who knows the room's link, including guests": "Все, у кого есть ссылка на эту комнату, включая гостей",
"Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?",
"Are you sure you want to reject the invitation?": "Вы уверены что хотите отклонить приглашение?",
"Banned users": "Заблокированные пользователи",
"Bans user with given id": "Блокирует пользователя с заданным ID",
"Blacklisted": "В черном списке",
@ -19,7 +19,7 @@
"Create Room": "Создать комнату",
"Cryptography": "Криптография",
"Curve25519 identity key": "Ключ идентификации Curve25519",
"Deactivate Account": "Деактивировать аккаунт",
"Deactivate Account": "Деактивировать учётную запись",
"Decryption error": "Ошибка расшифровки",
"Default": "По умолчанию",
"Deops user with given id": "Снимает полномочия оператора с пользователя с заданным ID",
@ -116,9 +116,9 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "для %(userId)s с %(fromPowerLevel)s на %(toPowerLevel)s",
"click to reveal": "нажмите для открытия",
"%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.",
"%(targetName)s joined the room.": "К комнате присоединяется %(targetName)s.",
"%(targetName)s joined the room.": "%(targetName)s входит в комнату.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s выгнал(а) %(targetName)s.",
"%(targetName)s left the room.": "%(targetName)s покинул комнату.",
"%(targetName)s left the room.": "%(targetName)s покидает комнату.",
"%(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.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников.",
@ -245,7 +245,7 @@
"Success": "Успех",
"This email address is already in use": "Этот email уже используется",
"This email address was not found": "Этот адрес электронной почты не найден",
"The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учётной записью.",
"The email address linked to your account must be entered.": "Введите адрес электронной почты, связанный с вашей учётной записью.",
"The remote side failed to pick up": "Собеседник не ответил на ваш звонок",
"This room has no local addresses": "У этой комнаты нет адресов на вашем сервере",
"This room is not recognised.": "Эта комната не опознана.",
@ -383,7 +383,7 @@
"Username available": "Имя пользователя доступно",
"Username not available": "Имя пользователя недоступно",
"Something went wrong!": "Что-то пошло не так!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Это будет имя вашей учётной записи на <span></span> домашнем сервере, или вы можете выбрать <a>другой сервер</a>.",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Это будет имя вашей учётной записи на <span></span> домашнем сервере, либо вы можете выбрать <a>другой сервер</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Если у вас уже есть учётная запись Matrix, вы можете <a>войти</a>.",
"Home": "Начало",
"Accept": "Принять",
@ -722,7 +722,7 @@
"Fetching third party location failed": "Не удалось извлечь местоположение третьей стороны",
"A new version of Riot is available.": "Доступна новая версия Riot.",
"I understand the risks and wish to continue": "Я понимаю риски и желаю продолжить",
"Send Account Data": "Отправить данные аккаунта",
"Send Account Data": "Отправка данных учётной записи",
"All notifications are currently disabled for all targets.": "Все оповещения для всех устройств отключены.",
"Uploading report": "Отправка отчета",
"Sunday": "Воскресенье",
@ -737,11 +737,11 @@
"Changelog": "История изменений",
"Waiting for response from server": "Ожидание ответа от сервера",
"Uploaded on %(date)s by %(user)s": "Загружено %(user)s в %(date)s",
"Send Custom Event": "Отправить индивидуальное мероприятие",
"Send Custom Event": "Отправить произвольное событие",
"Advanced notification settings": "Дополнительные параметры уведомлений",
"Failed to send logs: ": "Не удалось отправить журналы: ",
"delete the alias.": "удалить псевдоним.",
"To return to your account in future you need to <u>set a password</u>": "Чтобы вы могли вернуться в свою учётную запись в будущем, вам необходимо <u>задать пароль</u>",
"To return to your account in future you need to <u>set a password</u>": "Чтобы вы могли использовать свою учётную запись позже, вам необходимо <u>задать пароль</u>",
"Forget": "Забыть",
"You cannot delete this image. (%(code)s)": "Вы не можете удалить это изображение. (%(code)s)",
"Cancel Sending": "Отменить отправку",
@ -759,8 +759,8 @@
"Please set a password!": "Пожалуйста, установите пароль!",
"You have successfully set a password!": "Вы успешно установили пароль!",
"An error occurred whilst saving your email notification preferences.": "Возникла ошибка при сохранении настроек email-уведомлений.",
"Explore Room State": "Просмотр статуса комнаты",
"Source URL": "Исходный URL-адрес",
"Explore Room State": "Просмотр состояния комнаты",
"Source URL": "Исходная ссылка",
"Messages sent by bot": "Сообщения от ботов",
"Filter results": "Фильтрация результатов",
"Members": "Участники",
@ -781,7 +781,7 @@
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.",
"Developer Tools": "Инструменты разработчика",
"Preparing to send logs": "Подготовка к отправке журналов",
"Explore Account Data": "Просмотр данных аккаунта",
"Explore Account Data": "Просмотр данных учётной записи",
"All messages (noisy)": "Все сообщения (со звуком)",
"Saturday": "Суббота",
"Remember, you can always set an email address in user settings if you change your mind.": "Помните, что вы всегда сможете задать email в настройках пользователя, если передумаете.",
@ -802,7 +802,7 @@
"Call invitation": "Звонки",
"Downloading update...": "Загрузка обновления…",
"State Key": "Ключ состояния",
"Failed to send custom event.": "Не удалось отправить индивидуальное мероприятие.",
"Failed to send custom event.": "Не удалось отправить произвольное событие.",
"What's new?": "Что нового?",
"Notify me for anything else": "Уведомлять во всех остальных случаях",
"When I'm invited to a room": "Приглашения в комнаты",
@ -830,17 +830,17 @@
"Unable to fetch notification target list": "Не удалось получить список устройств для уведомлений",
"Set Password": "Задать пароль",
"Off": "Выключить",
"Riot does not know how to join a room on this network": "Riot не знает, как присоединиться к комнате, принадлежащей к этой сети",
"Riot does not know how to join a room on this network": "Riot не знает, как присоединиться к комнате в этой сети",
"Mentions only": "Только при упоминаниях",
"Wednesday": "Среда",
"You can now return to your account after signing out, and sign in on other devices.": "Теперь вы сможете вернуться к своей учётной записи после выхода из системы и войти на других устройствах.",
"You can now return to your account after signing out, and sign in on other devices.": "Теперь вы сможете вернуться к своей учётной записи после выхода и войти на других устройствах.",
"Enable email notifications": "Включить уведомления на email",
"Event Type": "Тип мероприятия",
"Download this file": "Скачать файл",
"Pin Message": "Закрепить сообщение",
"Failed to change settings": "Не удалось изменить настройки",
"View Community": "Просмотр сообщества",
"Event sent!": "Мероприятие отправлено!",
"Event sent!": "Событие отправлено!",
"Event Content": "Содержание мероприятия",
"Thank you!": "Спасибо!",
"Quote": "Цитата",
@ -859,20 +859,20 @@
"Clear Storage and Sign Out": "Очистить хранилище и выйти",
"Refresh": "Обновить",
"We encountered an error trying to restore your previous session.": "Произошла ошибка при попытке восстановить предыдущий сеанс.",
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена и зашифрованная история чата станет нечитаемой.",
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена, и зашифрованная история чата станет нечитаемой.",
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не удается загрузить событие, на которое был дан ответ. Либо оно не существует, либо у вас нет разрешения на его просмотр.",
"Enable widget screenshots on supported widgets": "Включить скриншоты виджетов для поддерживаемых виджетов",
"Collapse Reply Thread": "Ответить с цитированием",
"Collapse Reply Thread": "Свернуть ответы",
"Send analytics data": "Отправить данные аналитики",
"Muted Users": "Приглушённые пользователи",
"Terms and Conditions": "Условия и положения",
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.",
"Review terms and conditions": "Просмотр условий и положений",
"e.g. %(exampleValue)s": "напр. %(exampleValue)s",
"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>": "Это навсегда сделает вашу учётную запись невозможной для использования. Вы не сможете войти в систему, и никто не сможет перерегистрировать тот же идентификатор пользователя. Это приведёт к тому, что ваша учётная запись выйдет из всех комнат, в которые она входит, и будут удалены данные вашей учётной записи с сервера идентификации. <b>Это действие необратимо.</b>",
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Ваша учётная запись будет заблокирована. Вы не сможете войти в систему, и никто не сможет в дальнейшем заререгистрироваться под этим именем пользователя. В результате ваша учётная запись выйдет из всех комнат, в которых она находится, а с сервера идентификации будут удалены все связанные с ней данные. <b>Это действие необратимо.</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.": "По умолчанию деактивация вашей учётной записи <b>не приведёт к удалению всех ваших сообщений.</b> Если вы хотите, чтобы мы удалили ваши сообщения, поставьте отметку в поле ниже.",
"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.": "Видимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут видны новым или незарегистрированным пользователям, но зарегистрированные пользователи, у которых уже есть доступ к этим сообщениям, по-прежнему будут иметь доступ к своей копии.",
"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)": "Пожалуйста, удалите все сообщения, которые я отправил, после деактивации учётной записи. (<b>Внимание:</b> будущие пользователи увидят неполный вид разговоров)",
"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)": "Удалить все мои сообщения после деактивации учётной записи. (<b>Внимание:</b> разговоры с другими пользователями будут выглядеть неполными)",
"To continue, please enter your password:": "Чтобы продолжить, введите пароль:",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie (ознакомьтесь с нашей<PolicyLink>Политикой cookie</PolicyLink>).",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie.",
@ -881,7 +881,7 @@
"This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната используется для важных сообщений от сервера, поэтому вы не можете ее покинуть.",
"No Audio Outputs detected": "Аудиовыход не обнаружен",
"Audio Output": "Аудиовыход",
"Share Link to User": "Поделиться ссылкой с пользователем",
"Share Link to User": "Поделиться ссылкой на пользователя",
"Share room": "Поделиться комнатой",
"Share Room": "Поделиться комнатой",
"Link to most recent message": "Ссылка на последнее сообщение",
@ -924,7 +924,7 @@
"Failed to invite users to the room:": "Не удалось пригласить пользователей в комнату:",
"Upgrades a room to a new version": "Модернизирует комнату до новой версии",
"Sets the room name": "Устанавливает название комнаты",
"Forces the current outbound group session in an encrypted room to be discarded": "Принудительно отбрасывает текущую сессию исходящей группы в зашифрованной комнате",
"Forces the current outbound group session in an encrypted room to be discarded": "Принудительно отбрасывает текущую групповую сессию для отправки сообщений в зашифрованную комнату",
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s модернизировал эту комнату.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s добавил %(addedAddresses)s к списку адресов комнаты.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s добавил %(addedAddresses)s к списку адресов комнаты.",
@ -956,7 +956,7 @@
"All-uppercase is almost as easy to guess as all-lowercase": "Всё прописными буквами так же легко угадывается как и всё строчными",
"Reversed words aren't much harder to guess": "Угадать перевёрнутые слова не сильно труднее",
"Predictable substitutions like '@' instead of 'a' don't help very much": "Предсказуемые замены типа «@» вместо «a» не особо помогают",
"Add another word or two. Uncommon words are better.": "Добавить другое слово или два. Необычные слова лучше.",
"Add another word or two. Uncommon words are better.": "Добавьте ещё одно-два слова. Лучше использовать редкие слова.",
"Repeats like \"aaa\" are easy to guess": "Повторы типа \"ааа\" легко угадываемы",
"Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "Повторы типа «abcabcabc», лишь немного сложнее угадать, чем «abc»",
"Sequences like abc or 6543 are easy to guess": "Последовательности типа abc или 6543 легко угадываемы",
@ -993,7 +993,7 @@
"Verified!": "Верифицировано!",
"You've successfully verified this user.": "Вы успешно верифицировали этого пользователя.",
"Got It": "Понятно",
"Verify this user by confirming the following number appears on their screen.": "Верифицируйте пользователя, убедившись, что на его экране отображается следующее число.",
"Verify this user by confirming the following number appears on their screen.": "Подтвердите пользователя, убедившись, что на его экране отображается следующее число.",
"Yes": "Да",
"No": "Нет",
"Email Address": "Адрес электронной почты",
@ -1014,7 +1014,7 @@
"Phone numbers": "Телефонные номера",
"Language and region": "Язык и регион",
"Theme": "Тема",
"Account management": "Управление аккаунтом",
"Account management": "Управление учётной записью",
"Deactivating your account is a permanent action - be careful!": "Деактивация вашей учётной записи — это необратимое действие. Будьте осторожны!",
"Chat with Riot Bot": "Чат с ботом Riot",
"Help & About": "Помощь & О программе",
@ -1042,7 +1042,7 @@
"Failed to load group members": "Не удалось загрузить участников группы",
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Из-за ежемесячного ограничения активных пользователей сервера <b>некоторые из пользователей не смогут войти в систему</b>.",
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Превышен один из ресурсных лимитов сервера, по этому <b>некоторые пользователи не смогут залогиниться</b>.",
"Join": "Присоединиться",
"Join": "Войти",
"That doesn't look like a valid email address": "Это не похоже на адрес электронной почты",
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please <a>contact your service administrator</a> to continue using the service.": "Ваше сообщение не было отправлено, потому что этот домашний сервер превысил месячный лимит активных пользователей. <a>обратитесь к администратору службы</a>, чтобы продолжить использование службы.",
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please <a>contact your service administrator</a> to continue using the service.": "Ваше сообщение не было отправлено, потому что этот домашний сервер превысил лимит ресурсов. <a>обратитесь к администратору службы</a>, чтобы продолжить использование службы.",
@ -1058,7 +1058,7 @@
"Legal": "Законный",
"Room avatar": "Аватар комнаты",
"The following users may not exist": "Следующих пользователей может не существовать",
"Invite anyway and never warn me again": "Тем не менее пригласить и больше не предупреждать",
"Invite anyway and never warn me again": "Пригласить и больше не предупреждать",
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Перед отправкой логов необходимо <a>создать GitHub issue</a>, для описания проблемы.",
"Incompatible Database": "Несовместимая база данных",
"Continue With Encryption Disabled": "Продолжить с отключенным шифрованием",
@ -1111,7 +1111,7 @@
"<b>Copy it</b> to your personal cloud storage": "<b>Скопируйте</b> в персональное облачное хранилище",
"<b>Save it</b> on a USB key or backup drive": "<b>Сохраните</b> на USB-диске или на резервном диске",
"This room has no topic.": "У этой комнаты нет темы.",
"Group & filter rooms by custom tags (refresh to apply changes)": "Группировать и фильтровать комнаты по пользовательским тэгам (обновите, чтобы применить изменения)",
"Group & filter rooms by custom tags (refresh to apply changes)": "Группировать и фильтровать комнаты по пользовательским тэгам (обновите для применения изменений)",
"Dog": "Собака",
"Cat": "Кошка",
"Lion": "Лев",
@ -1193,7 +1193,7 @@
"Unable to find a supported verification method.": "Невозможно определить поддерживаемый метод верификации.",
"Scissors": "Ножницы",
"Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Защищённые сообщения с этим пользователем зашифрованы сквозным шифрованием и недоступны третьим лицам.",
"We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Мы отправили вам сообщение для подтверждения адреса электронной почты. Пожалуйста выполните указания данные в сообщении и нажмите кнопку внизу.",
"We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Мы отправили вам сообщение для подтверждения адреса электронной почты. Пожалуйста, следуйте указаниям в сообщении, после чего нажмите кнопку ниже.",
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Вы уверены? Зашифрованные сообщения будут безвозвратно утеряны при отсутствии соответствующего резервного копирования ваших ключей.",
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифрованные сообщения защищены сквозным шифрованием. Только вы и ваш собеседник имеете ключи для их расшифровки и чтения.",
"Unable to load key backup status": "Не удалось получить статус резервного копирования для ключей шифрования",
@ -1202,11 +1202,11 @@
"Start using Key Backup": "Использовать резервную копию ключей шифрования",
"Profile picture": "Аватар",
"Accept all %(invitedRooms)s invites": "Принять все приглашения (%(invitedRooms)s)",
"Missing media permissions, click the button below to request.": "Отсутствует доступ к источнику медиа. Нажмите кнопку ниже чтобы запросить.",
"Missing media permissions, click the button below to request.": "Отсутствуют разрешения для доступа к камере/микрофону. Нажмите кнопку ниже, чтобы запросить их.",
"Request media permissions": "Запросить доступ к медиа носителю",
"Change room name": "Изменить название комнаты",
"For help with using Riot, click <a>here</a>.": "Для получения помощи по использованию Riot, нажмите <a>здесь</a>.",
"For help with using Riot, click <a>here</a> or start a chat with our bot using the button below.": "Для получения помощи по использованию Riot, нажмите <a>здесь</a> или начните чат с нашим ботом, используюя кнопку ниже.",
"For help with using Riot, click <a>here</a> or start a chat with our bot using the button below.": "Для получения помощи по использованию Riot, нажмите <a>здесь</a> или начните чат с нашим ботом с помощью кнопки ниже.",
"Bug reporting": "Сообщить об ошибке",
"Open Devtools": "Открыть инструменты разработчика",
"Change room avatar": "Изменить аватар комнаты",
@ -1259,7 +1259,7 @@
"Modify widgets": "Изменить виджеты",
"Invite users": "Пригласить пользователей",
"Kick users": "Выгнать пользователей",
"Ban users": "Запрет пользователей",
"Ban users": "Блокировка пользователей",
"Send %(eventType)s events": "Отправить %(eventType)s события",
"Select the roles required to change various parts of the room": "Выберите роли, которые смогут менять различные параметры комнаты",
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "После включения шифрования в комнате оно не может быть отключено. Сообщения, отправленные в шифрованной комнате, смогут прочитать только участники комнаты, но не сервер. Включенное шифрование может помешать корректной работе многим ботам и мостам. <a>Подробнее о шифровании.</a>",
@ -1270,15 +1270,15 @@
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s включено для %(newGroups)s и отключено для %(oldGroups)s в этой комнате.",
"Once enabled, encryption cannot be disabled.": "После включения, шифрование не может быть отключено.",
"This room has been replaced and is no longer active.": "Эта комната была замещена и больше не активна.",
"Joining room …": "Вступление в комнату …",
"Joining room …": "Вход в комнату …",
"Loading …": "Загрузка…",
"Rejecting invite …": "Отказ от приглашения …",
"Join the conversation with an account": "Присоединиться к разговору с учётной записью",
"Sign Up": "Подписаться",
"Sign In": "Войти в систему",
"Sign Up": "Зарегистрироваться",
"Sign In": "Войти",
"You were kicked from %(roomName)s by %(memberName)s": "Вы были выгнаны %(memberName)s из %(roomName)s",
"Reason: %(reason)s": "Причина: %(reason)s",
"Forget this room": "Забудь эту комнату",
"Forget this room": "Забыть эту комнату",
"Re-join": "Пере-присоединение",
"You were banned from %(roomName)s by %(memberName)s": "Вы были забанены %(memberName)s с %(roomName)s",
"Something went wrong with your invite to %(roomName)s": "Что-то пошло не так с вашим приглашением в %(roomName)s",
@ -1288,7 +1288,7 @@
"Try to join anyway": "Постарайся присоединиться в любом случае",
"Do you want to chat with %(user)s?": "Хотите пообщаться с %(user)s?",
"Do you want to join %(roomName)s?": "Хотите присоединиться к %(roomName)s?",
"<userName/> invited you": "<userName/> пригласил тебя",
"<userName/> invited you": "<userName/> приглашает вас",
"You're previewing %(roomName)s. Want to join it?": "Вы просматриваете %(roomName)s. Хотите присоединиться?",
"%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s не может быть предварительно просмотрена. Вы хотите присоединиться к ней?",
"This room doesn't exist. Are you sure you're at the right place?": "Эта комната не существует. Вы уверены, что находитесь в правильном месте?",
@ -1329,7 +1329,7 @@
"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 пользователей и т. д., пожалуйста, включите эти данные.",
"Unable to load commit detail: %(msg)s": "Невозможно загрузить детали: %(msg)s",
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Чтобы не потерять историю чата, вы должны экспортировать ключи от комнаты перед выходом из системы. Для этого вам нужно будет вернуться к более новой версии Riot",
"You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ",
"You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "В прошлый раз вы использовали более новую версию Riot на сервере %(host)s. Чтобы снова использовать эту версию со сквозным шифрованием, вам нужно выйти и снова войти. ",
"Waiting for partner to accept...": "Ожидание подтверждения партнера...",
"Nothing appearing? Not all clients support interactive verification yet. <button>Use legacy verification</button>.": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную проверку. <button> Использовать устаревшую проверку</button>.",
"Waiting for %(userId)s to confirm...": "Ожидание подтверждения от %(userId)s...",
@ -1348,11 +1348,11 @@
"Low bandwidth mode": "Режим низкой пропускной способности",
"To help us prevent this in future, please <a>send us logs</a>.": "Чтобы помочь нам предотвратить это в будущем, пожалуйста, <a>отправьте нам логи</a>.",
"Missing session data": "Отсутствуют данные сессии",
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Некоторые данные сессии, включая зашифрованные ключи сообщений, отсутствуют. Выйдите и войдите, чтобы исправить ситуацию, восстанавливая ключи из резервной копии.",
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Отсутствуют некоторые данные сессии, в том числе ключи шифрования сообщений. Выйдите и войдите, чтобы восстановить ключи из резервной копии.",
"Your browser likely removed this data when running low on disk space.": "Вероятно, ваш браузер удалил эти данные, когда на дисковом пространстве оставалось мало места.",
"Upload files (%(current)s of %(total)s)": "Загрузка файлов %(current)s от %(total)s",
"Upload files (%(current)s of %(total)s)": "Загрузка файлов (%(current)s из %(total)s)",
"Upload files": "Загрузка файлов",
"Upload": "Загрузка",
"Upload": "Загрузить",
"This file is <b>too large</b> to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Этот файл <b>слишком большой</b> для загрузки. Лимит размера файла составляет %(limit)s но этот файл %(sizeOfThisFile)s.",
"These files are <b>too large</b> to upload. The file size limit is %(limit)s.": "Эти файлы <b>слишком большие</b> для загрузки. Лимит размера файла составляет %(limit)s.",
"Some files are <b>too large</b> to be uploaded. The file size limit is %(limit)s.": "Некоторые файлы имеют <b>слишком большой размер</b>, чтобы их можно было загрузить. Лимит размера файла составляет %(limit)s.",
@ -1384,15 +1384,15 @@
"Set a new status...": "Установка нового статуса...",
"Hide": "Скрыть",
"This homeserver would like to make sure you are not a robot.": "Этот сервер хотел бы убедиться, что вы не робот.",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "Пользовательские параметры сервера можно использовать для входа на другие серверы Matrix, указав другой URL-адрес сервера. Это позволяет использовать это приложение с существующей учётной записью Matrix на другом домашнем сервере.",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "Пользовательские серверные параметры можно использовать для входа на другой сервер Matrix по его адресу. Таким образом, вы сможете использовать это приложение с существующим аккаунтом Matrix на другом домашнем сервере.",
"Please review and accept all of the homeserver's policies": "Пожалуйста, просмотрите и примите все правила сервера",
"Please review and accept the policies of this homeserver:": "Пожалуйста, просмотрите и примите политику этого сервера:",
"Unable to validate homeserver/identity server": "Невозможно проверить сервер/сервер идентификации",
"Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of <a>modular.im</a>.": "Введите местоположение вашего Modula homeserver. Он может использовать ваше собственное доменное имя или быть поддоменом <a>modular.im</a>.",
"Sign in to your Matrix account on %(serverName)s": "Войдите в свою учётную запись Matrix на %(serverName)s",
"Sign in to your Matrix account on <underlinedServerName />": "Войдите в свою учётную запись Matrix с помощью <underlinedServerName />",
"Sign in to your Matrix account on %(serverName)s": "Вход в учётную запись Matrix на сервере %(serverName)s",
"Sign in to your Matrix account on <underlinedServerName />": "Вход в учётную запись Matrix на сервере <underlinedServerName />",
"Change": "Изменить",
"Use an email address to recover your account": "Используйте email, чтобы восстановить свой аккаунт",
"Use an email address to recover your account": "Используйте почтовый адрес, чтобы восстановить доступ к учётной записи",
"Enter email address (required on this homeserver)": "Введите адрес электронной почты (требуется для этого сервера)",
"Doesn't look like a valid email address": "Не похоже на действительный адрес электронной почты",
"Enter password": "Введите пароль",
@ -1406,10 +1406,10 @@
"Enter username": "Введите имя пользователя",
"Some characters not allowed": "Некоторые символы не разрешены",
"Create your Matrix account on %(serverName)s": "Создайте свою учётную запись Matrix на %(serverName)s",
"Create your Matrix account on <underlinedServerName />": "Создайте свою учётную запись Matrix на <underlinedServerName />",
"Create your Matrix account on <underlinedServerName />": "Создайте учётную запись Matrix на <underlinedServerName />",
"Join millions for free on the largest public server": "Присоединяйтесь бесплатно к миллионам на крупнейшем общедоступном сервере",
"Premium hosting for organisations <a>Learn more</a>": "Премиум-хостинг для организаций <a>Подробнее</a>",
"Find other public servers or use a custom server": "Найти другие общедоступные серверы или использовать пользовательский сервер",
"Find other public servers or use a custom server": "Найти другие общедоступные серверы или использовать другой сервер",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Пожалуйста, установите <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> или <safariLink>Safari</safariLink> для наилучшего результата.",
"Couldn't load page": "Невозможно загрузить страницу",
"You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Вы являетесь администратором этого сообщества. Вы не сможете вернуться без приглашения от другого администратора.",
@ -1424,8 +1424,8 @@
"Guest": "Гость",
"Your profile": "Ваш профиль",
"Could not load user profile": "Не удалось загрузить профиль пользователя",
"Your Matrix account on %(serverName)s": "Ваша учётная запись Matrix на %(serverName)s",
"Your Matrix account on <underlinedServerName />": "Ваша учётная запись Matrix на <underlinedServerName />",
"Your Matrix account on %(serverName)s": "Ваша учётная запись Matrix на сервере %(serverName)s",
"Your Matrix account on <underlinedServerName />": "Ваша учётная запись Matrix на сервере <underlinedServerName />",
"A verification email will be sent to your inbox to confirm setting your new password.": "Письмо с подтверждением будет отправлено на ваш почтовый ящик, чтобы подтвердить установку нового пароля.",
"Sign in instead": "Войдите, вместо этого",
"Your password has been reset.": "Ваш пароль был сброшен.",
@ -1441,7 +1441,7 @@
"General failure": "Общая ошибка",
"This homeserver does not support login using email address.": "Этот сервер не поддерживает вход с использованием адреса электронной почты.",
"Failed to perform homeserver discovery": "Не удалось выполнить обнаружение сервера",
"Sign in with single sign-on": "Войдите в систему с единой регистрацией",
"Sign in with single sign-on": "Войти в систему с помощью единой точки входа",
"Create account": "Создать учётную запись",
"Registration has been disabled on this homeserver.": "Регистрация на этом сервере отключена.",
"Unable to query for supported registration methods.": "Невозможно запросить поддерживаемые методы регистрации.",
@ -1450,15 +1450,15 @@
"For maximum security, this should be different from your account password.": "Для максимальной безопасности он должен отличаться от пароля вашей учётной записи.",
"Enter a passphrase...": "Введите пароль....",
"Set up with a Recovery Key": "Настройка с ключом восстановления",
"That matches!": "Это совпадает!",
"That doesn't match.": "Это не совпадает.",
"That matches!": "Они совпадают!",
"That doesn't match.": "Они не совпадают.",
"Uploaded sound": "Загруженный звук",
"Sounds": "Звук",
"Notification sound": "Звук уведомления",
"Reset": "Сброс",
"Set a new custom sound": "Установка нового пользовательского звука",
"Browse": "Просматривать",
"Go back to set it again.": "Вернитесь, чтобы установить его снова.",
"Go back to set it again.": "Задать другой пароль.",
"Please enter your passphrase a second time to confirm.": "Пожалуйста, введите ваш пароль еще раз для подтверждения.",
"Repeat your passphrase...": "Повторите ваш пароль...",
"As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Как сеть безопасности, вы можете использовать ее для восстановления истории зашифрованных сообщений, если вы забыли свой пароль восстановления.",
@ -1472,8 +1472,8 @@
"Unable to create key backup": "Невозможно создать резервную копию ключа",
"Retry": "Попробуйте снова",
"Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Без настройки безопасного восстановления сообщений при выходе из системы вы потеряете историю защищенных сообщений.",
"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 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 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 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.": "Если вы не убрали метод восстановления, злоумышленник может получить доступ к вашей учётной записи. Смените пароль учётной записи и сразу задайте новый способ восстановления в настройках.",
"Cannot reach homeserver": "Не удаётся связаться с сервером",
"Ensure you have a stable internet connection, or get in touch with the server admin": "Убедитесь, что у вас есть стабильное подключение к интернету, или свяжитесь с администратором сервера",
"Your Riot is misconfigured": "Ваш Riot неправильно настроен",
@ -1484,8 +1484,8 @@
"You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Вы можете зарегистрироваться, но некоторые возможности не будет доступны, пока сервер идентификации не станет доступным. Если вы продолжаете видеть это предупреждение, проверьте вашу конфигурацию или свяжитесь с администратором сервера.",
"You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Вы можете сбросить пароль, но некоторые возможности не будет доступны, пока сервер идентификации не станет доступным. Если вы продолжаете видеть это предупреждение, проверьте вашу конфигурацию или свяжитесь с администратором сервера.",
"You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Вы можете войти в систему, но некоторые возможности не будет доступны, пока сервер идентификации не станет доступным. Если вы продолжаете видеть это предупреждение, проверьте вашу конфигурацию или свяжитесь с администратором сервера.",
"<a>Log in</a> to your new account.": "<a>Войти</a> в вашу новую учётную запись.",
"You can now close this window or <a>log in</a> to your new account.": "Вы можете закрыть это окно или <a>войти</a> в вашу новую учётную запись.",
"<a>Log in</a> to your new account.": "<a>Войти</a> в новую учётную запись.",
"You can now close this window or <a>log in</a> to your new account.": "Можно закрыть это окно или <a>войти</a> в новую учётную запись.",
"Registration Successful": "Регистрация успешно завершена",
"Changes your avatar in all rooms": "Изменяет ваш аватар во всех комнатах",
"%(senderName)s made no change.": "%(senderName)s не внёс изменений.",
@ -1513,17 +1513,17 @@
"Resend edit": "Отправить исправление повторно",
"Resend %(unsentCount)s reaction(s)": "Отправить повторно %(unsentCount)s реакций",
"Resend removal": "Отправить удаление повторно",
"Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Ваша новая учётная запись (%(newAccountId)s) зарегистрирована, но Вы уже вошли в другую учётную запись (%(loggedInUserId)s).",
"Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Учётная запись (%(newAccountId)s) зарегистрирована, но вы уже вошли в другую учётную запись (%(loggedInUserId)s).",
"Continue with previous account": "Продолжить с предыдущей учётной записью",
"Failed to re-authenticate due to a homeserver problem": "Ошибка повторной аутентификации из-за проблем на сервере",
"Failed to re-authenticate": "Ошибка повторной аутентификации",
"Enter your password to sign in and regain access to your account.": "Введите Ваш пароль для входа и восстановления доступа к Вашей учётной записи.",
"Enter your password to sign in and regain access to your account.": "Введите пароль для входа и восстановите доступ к учётной записи.",
"Forgotten your password?": "Забыли Ваш пароль?",
"Sign in and regain access to your account.": "Войти и восстановить доступ к Вашей учётной записи.",
"You cannot sign in to your account. Please contact your homeserver admin for more information.": "Вы не можете войти в Вашу учётную запись. Пожалуйста свяжитесь с администратором вашего сервера для более подробной информации.",
"Sign in and regain access to your account.": "Войти и восстановить доступ к учётной записи.",
"You cannot sign in to your account. Please contact your homeserver admin for more information.": "Не удаётся войти в учётную запись. Пожалуйста, обратитесь к администратору домашнего сервера за подробностями.",
"You're signed out": "Вы вышли из учётной записи",
"Clear personal data": "Очистить персональные данные",
"This account has been deactivated.": "Этот аккаунт был деактивирован.",
"This account has been deactivated.": "Эта учётная запись была деактивирована.",
"Call failed due to misconfigured server": "Вызов не состоялся из-за неправильно настроенного сервера",
"Try using turn.matrix.org": "Попробуйте использовать turn.matrix.org",
"Messages": "Сообщения",
@ -1583,11 +1583,11 @@
"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.": "Использование сервера идентификации не обязательно. Если вы решите не использовать сервер идентификации, другие пользователи не смогут обнаружить вас, и вы не сможете пригласить других по электронной почте или телефону.",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Подтвердите условия предоставления услуг сервера идентификации (%(serverName)s), чтобы вас можно было обнаружить по адресу электронной почты или номеру телефона.",
"Discovery": "Обнаружение",
"Deactivate account": "Деактивировать аккаунт",
"Deactivate account": "Деактивировать учётную запись",
"Clear cache and reload": "Очистить кэш и перезагрузить",
"Always show the window menu bar": "Всегда показывать строку меню",
"Read Marker lifetime (ms)": итать маркер время жизни (мс)",
"Read Marker off-screen lifetime (ms)": итать маркер вне экрана время жизни (мс)",
"Read Marker lifetime (ms)": ерез какое время помечать сообщение прочитанным (мс)",
"Read Marker off-screen lifetime (ms)": ерез какое время помечать сообщение прочитанным при отсутствии активности (мс)",
"Upgrade the room": "Обновить эту комнату",
"Enable room encryption": "Включить шифрование комнаты",
"You should <b>remove your personal data</b> from identity server <idserver /> before disconnecting. Unfortunately, identity server <idserver /> is currently offline or cannot be reached.": "Вы должны <b> удалить свои личные данные </b> с сервера идентификации <idserver /> перед отключением. К сожалению, идентификационный сервер <idserver /> в данный момент отключен или недоступен.",
@ -1651,8 +1651,8 @@
"Report Content": "Пожаловаться на сообщение",
"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?": "Деактивация этого пользователя приведет к его выходу из системы и запрету повторного входа. Кроме того, они оставит все комнаты, в которых он участник. Это действие безповоротно. Вы уверены, что хотите деактивировать этого пользователя?",
"An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "При попытке подтвердить приглашение была возвращена ошибка (%(errcode)s). Вы можете попробовать передать эту информацию администратору комнаты.",
"This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Это приглашение в %(roomName)s было отправлено на %(email)s, которое не связано с вашей учетной записью",
"Link this email with your account in Settings to receive invites directly in Riot.": "Свяжите это письмо с вашей учетной записью в Настройках, чтобы получать приглашения непосредственно в Riot.",
"This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Приглашение в %(roomName)s было отправлено на %(email)s, но этот адрес не связан с вашей учётной записью",
"Link this email with your account in Settings to receive invites directly in Riot.": "Свяжите этот адрес с вашей учетной записью в настройках, чтобы получать приглашения непосредственно в Riot.",
"This invite to %(roomName)s was sent to %(email)s": "Это приглашение в %(roomName)s было отправлено на %(email)s",
"Use an identity server in Settings to receive invites directly in Riot.": "Используйте сервер идентификации в Настройках для получения приглашений непосредственно в Riot.",
"Share this email in Settings to receive invites directly in Riot.": "Введите адрес эл.почты в Настройках, чтобы получать приглашения прямо в Riot.",
@ -1666,12 +1666,12 @@
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Запретить пользователям других Matrix-Серверов присоединяться к этой комнате (этот параметр нельзя изменить позже!)",
"Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Отчет о данном сообщении отправит свой уникальный 'event ID' администратору вашего домашнего сервера. Если сообщения в этой комнате зашифрованы, администратор вашего домашнего сервера не сможет прочитать текст сообщения или просмотреть какие-либо файлы или изображения.",
"Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Отсутствует Капча открытого ключа в конфигурации домашнего сервера. Пожалуйста, сообщите об этом администратору вашего домашнего сервера.",
"Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Установка адреса электронной почты для восстановления учетной записи. Используйте электронную почту или телефон, чтобы опционально быть обнаруженными существующими контактами.",
"Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Установите адрес электронной почты для восстановления аккаунта. Используйте электронную почту, чтобы опционально быть обнаруженными существующими контактами.",
"Enter your custom homeserver URL <a>What does this mean?</a>": "Введите URL-адрес вашего собственного домашнего сервера <a> Что это значит? </a>",
"Enter your custom identity server URL <a>What does this mean?</a>": "Введите URL-адрес вашего собственного сервера идентификации <a>Что это значит?</a>",
"Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Задайте адрес электронной почты для восстановления учетной записи. Чтобы знакомые могли вас найти, задайте адрес почты или номер телефона.",
"Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Задайте адрес электронной почты для восстановления учетной записи. Чтобы знакомые могли вас найти, задайте адрес почты.",
"Enter your custom homeserver URL <a>What does this mean?</a>": "Введите ссылку на другой домашний сервер <a>Что это значит?</a>",
"Enter your custom identity server URL <a>What does this mean?</a>": "Введите ссылку на другой сервер идентификации <a>Что это значит?</a>",
"%(creator)s created and configured the room.": "%(creator)s создал и настроил комнату.",
"Preview": "Предпросмотр",
"Preview": "Заглянуть",
"View": "Просмотр",
"Find a room…": "Найди комнату…",
"Find a room… (e.g. %(exampleRoom)s)": "Найди комнату... (напр. %(exampleRoom)s)",
@ -1710,7 +1710,7 @@
"Custom (%(level)s)": "Пользовательский (%(level)s)",
"%(name)s (%(userId)s)": "%(name)s (%(userId)s)",
"Try out new ways to ignore people (experimental)": "Попробуйте новые способы игнорировать людей (экспериментальные)",
"My Ban List": "Мой список запрещенных",
"My Ban List": "Мой список блокировки",
"Ignored/Blocked": "Игнорируемые/Заблокированные",
"Error adding ignored user/server": "Ошибка добавления игнорируемого пользователя/сервера",
"Error subscribing to list": "Ошибка при подписке на список",
@ -1720,7 +1720,7 @@
"Show tray icon and minimize window to it on close": "Показать иконку в панели задач и свернуть окно при закрытии",
"The version of Riot": "Версия Riot",
"Show typing notifications": "Показывать уведомления о наборе",
"Delete %(count)s sessions|other": "Удалить %(count)s сессию",
"Delete %(count)s sessions|other": "Удалить %(count)s сессий",
"Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии",
"Enable audible notifications for this session": "Включить звуковые уведомления для этой сессии",
"Use an Integration Manager <b>(%(serverName)s)</b> to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций <b>%(serverName)s</b> для управления ботами, виджетами и стикерами.",
@ -1728,9 +1728,9 @@
"Manage integrations": "Управление интеграциями",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.",
"Sessions": "Сессии",
"Direct Messages": "Прямые сообщения",
"Direct Messages": "Диалоги",
"%(count)s sessions|other": "%(count)s сессий",
"Hide sessions": "Скрытые сессии",
"Hide sessions": "Скрыть сессии",
"Enable 'Manage Integrations' in Settings to do this.": "Включите «Управление интеграциями» в настройках, чтобы сделать это.",
"Unknown sessions": "Неизвестные сессии",
"Help": "Помощь",
@ -1803,13 +1803,13 @@
"They don't match": "Они не совпадают",
"To be secure, do this in person or use a trusted way to communicate.": "Чтобы быть в безопасности, делайте это лично или используйте надежный способ связи.",
"Lock": "Заблокировать",
"Verify yourself & others to keep your chats safe": роверить себя и других, чтобы сохранить ваши чаты безопасными",
"Verify yourself & others to keep your chats safe": одтвердите себя и других для безопасности ваших бесед",
"Other users may not trust it": "Другие пользователи могут не доверять этому",
"Upgrade": "Обновление",
"Verify": "Проверить",
"Later": "Позже",
"Review": "Обзор",
"Decline (%(counter)s)": "Сокращение (%(counter)s)",
"Decline (%(counter)s)": "Отклонить (%(counter)s)",
"This bridge was provisioned by <user />.": "Этот мост был подготовлен пользователем <user />.",
"This bridge is managed by <user />.": "Этот мост управляется <user />.",
"Workspace: %(networkName)s": "Рабочая область: %(networkName)s",
@ -1824,9 +1824,9 @@
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "В комнате присутствуют неизвестные сессии: если вы продолжите без подтверждения, возможно, кто-то сможет подслушать ваш звонок.",
"Review Sessions": "Просмотреть сессии",
"Unverified login. Was this you?": "Неподтверждённый вход. Это были вы?",
"Sign In or Create Account": "Войти или создать аккаунт",
"Use your account or create a new one to continue.": "Воспользуйтесь своим аккаунтом или создайте новый, чтобы продолжить.",
"Create Account": "Создать аккаунт",
"Sign In or Create Account": "Войдите или создайте учётную запись",
"Use your account or create a new one to continue.": "Воспользуйтесь своей учётной записью или создайте новую, чтобы продолжить.",
"Create Account": "Создать учётную запись",
"Sends a message as html, without interpreting it as markdown": "Отправить сообщение как html, не интерпретируя его как markdown",
"Displays information about a user": "Показать информацию о пользователе",
"%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s изменил(а) название комнаты с %(oldRoomName)s на %(newRoomName)s.",
@ -1880,8 +1880,8 @@
"User signing private key:": "Приватный ключ подписи пользователей:",
"Session backup key:": "Резервная копия сессионного ключа:",
"Secret storage public key:": "Публичный ключ хранилища секретов:",
"in account data": "в данных аккаунта",
"Homeserver feature support:": "Возможности домашнего сервера:",
"in account data": "в данных учётной записи",
"Homeserver feature support:": "Поддержка со стороны домашнего сервера:",
"exists": "существует",
"Secret Storage key format:": "Формат ключа хранилища секретов:",
"outdated": "устарел",
@ -1892,7 +1892,7 @@
"Connecting to integration manager...": "Подключение к менеджеру интеграций...",
"Cannot connect to integration manager": "Не удалось подключиться к менеджеру интеграций",
"The integration manager is offline or it cannot reach your homeserver.": "Менеджер интеграций не работает или не может подключиться к вашему домашнему серверу.",
"This session is backing up your keys. ": "Эта сессия сохраняет ваши ключи. ",
"This session is backing up your keys. ": "Эта сессия сохраняет резервную копию ваших ключей. ",
"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.": "Эта сессия <b>не сохраняет ваши ключи</b>, но у вас есть резервная копия, из которой вы можете их восстановить.",
"Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Подключите эту сессию к резервированию ключей до выхода, чтобы избежать утраты ключей, которые могут быть доступны только в этой сессии.",
"Connect this session to Key Backup": "Подключить эту сессию к резервированию ключей",
@ -1934,5 +1934,215 @@
"Cancel autocomplete": "Отменить автодополнение",
"Esc": "",
"Enter": "Enter",
"Delete %(count)s sessions|one": "Удалить %(count)s сессий"
"Delete %(count)s sessions|one": "Удалить %(count)s сессий",
"Use Single Sign On to continue": "Воспользуйтесь единой точкой входа для продолжения",
"Confirm adding this email address by using Single Sign On to prove your identity.": "Подтвердите добавление этого почтового адреса с помощью единой точки входа.",
"Single Sign On": "Единая точка входа",
"Confirm adding email": "Подтвердите добавление почтового адреса",
"Click the button below to confirm adding this email address.": "Нажмите кнопку ниже для подтверждения этого почтового адреса.",
"Confirm adding this phone number by using Single Sign On to prove your identity.": "Подтвердите добавление этого номера телефона с помощью единой точки входа.",
"Confirm adding phone number": "Подтвердите добавление номера телефона",
"Click the button below to confirm adding this phone number.": "Нажмите кнопку ниже для добавления этого номера телефона.",
"%(name)s is requesting verification": "%(name)s запрашивает проверку",
"Confirm the emoji below are displayed on both sessions, in the same order:": "Убедитесь, что смайлики ниже отображаются в обеих сессиях в том же порядке:",
"Verify this session by confirming the following number appears on its screen.": "Подтвердите эту сессию, убедившись, что следующее число отображается на экране.",
"Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Ожидание других ваших сессий, %(deviceName)s %(deviceId)s, для подтверждения…",
"From %(deviceName)s (%(deviceId)s)": "От %(deviceName)s (%(deviceId)s)",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "У вашей учётной записи есть кросс-подпись в хранилище секретов, но она пока не является доверенной в этой сессии.",
"Bootstrap cross-signing and secret storage": "Инициализировать кросс-подпись и хранилище секретов",
"well formed": "корректный",
"unexpected type": "непредвиденный тип",
"Self signing private key:": "Самоподписанный приватный ключ:",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Подтвердите удаление этих сессий с помощью единой точки входа.",
"Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Подтвердите удаление этой сессии с помощью единой точки входа.",
"Confirm deleting these sessions": "Подтвердите удаление этих сессий",
"Click the button below to confirm deleting these sessions.|other": "Нажмите кнопку ниже для удаления этих сессий.",
"Click the button below to confirm deleting these sessions.|one": "Нажмите кнопку ниже для удаления этой сессии.",
"Delete sessions": "Удалить сессии",
"rooms.": "комнаты.",
"Manage": "Управление",
"Custom theme URL": "Ссылка на стороннюю тему",
"⚠ These settings are meant for advanced users.": "⚠ Эти настройки рассчитаны для опытных пользователей.",
"Personal ban list": "Личный список блокировки",
"eg: @bot:* or example.org": "например: @bot:* или example.org",
"Session ID:": "ID сессии:",
"Session key:": "Ключ сессии:",
"Message search": "Поиск по сообщениям",
"Cross-signing": "Кросс-подпись",
"Bridges": "Мосты",
"This user has not verified all of their sessions.": "Этот пользователь не подтвердил все свои сессии.",
"You have not verified this user.": "Вы не подтвердили этого пользователя.",
"You have verified this user. This user has verified all of their sessions.": "Вы подтвердили этого пользователя. Пользователь подтвердил все свои сессии.",
"Someone is using an unknown session": "Кто-то использует неизвестную сессию",
"This room is end-to-end encrypted": "Эта комната зашифрована сквозным шифрованием",
"Everyone in this room is verified": "Все в этой комнате подтверждены",
"Some sessions for this user are not trusted": "К некоторым сессиям этого пользователя нет доверия",
"All sessions for this user are trusted": "Все сессии этого пользователя доверенные",
"Some sessions in this encrypted room are not trusted": "К некоторым сессиям в этой зашифрованной комнате нет доверия",
"All sessions in this encrypted room are trusted": "Все сессии в этой зашифрованной комнате доверенные",
"Mod": "Модератор",
"This message cannot be decrypted": "Не удалось расшифровать это сообщение",
"Encrypted by an unverified session": "Зашифровано неподтверждённой сессией",
"Unencrypted": "Не зашифровано",
"Encrypted by a deleted session": "Зашифровано удалённой сессией",
"Invite only": "Только по приглашениям",
"Scroll to most recent messages": "Перейти к последним сообщениям",
"Close preview": "Закрыть предпросмотр",
"Send a reply…": "Отправить ответ…",
"Send a message…": "Отправить сообщение…",
"<userName/> wants to chat": "<userName/> хочет поговорить",
"Start chatting": "Начать беседу",
"Reject & Ignore user": "Отклонить и заигнорировать пользователя",
"Unknown Command": "Неизвестная команда",
"Unrecognised command: %(commandText)s": "Нераспознанная команда: %(commandText)s",
"Send as message": "Отправить как сообщение",
"Failed to connect to integration manager": "Не удалось подключиться к менеджеру интеграций",
"Mark all as read": "Отметить всё как прочитанное",
"You don't have permission to delete the alias.": "У вас нет прав для удаления этого псевдонима.",
"Local address": "Локальный адрес",
"Published Addresses": "Публичные адреса",
"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.": "Публичные адреса позволяют кому угодно зайти в вашу комнату с любого сервера. Чтобы опубликовать адрес, сначала задайте его в качестве локального адреса.",
"Other published addresses:": "Прочие публичные адреса:",
"No other published addresses yet, add one below": "Пока нет других публичных адресов, добавьте их ниже",
"New published address (e.g. #alias:server)": "Новый публичный адрес (напр. #alias:server)",
"Local Addresses": "Локальные адреса",
"Waiting for you to accept on your other session…": "Ожидание принятия в другой вашей сессии…",
"Waiting for %(displayName)s to accept…": "Ожидание принятия от %(displayName)s…",
"Accepting…": "Принятие…",
"Start Verification": "Начать проверку",
"Messages in this room are end-to-end encrypted.": "Сообщения в этой комнате зашифрованы сквозным шифрованием.",
"Verify User": "Подтвердить пользователя",
"Your messages are not secure": "Ваши сообщения не защищены",
"Your homeserver": "Ваш домашний сервер",
"The homeserver the user youre verifying is connected to": "Домашний сервер пользователя, которого вы подтверждаете",
"Trusted": "Доверенный",
"Not trusted": "Не доверенный",
"%(count)s verified sessions|other": "%(count)s подтверждённых сессий",
"%(count)s verified sessions|one": "1 подтверждённая сессия",
"Hide verified sessions": "Скрыть подтверждённые сессии",
"%(count)s sessions|one": "%(count)s сессия",
"Direct message": "Начать диалог",
"Verification timed out.": "Таймаут подтверждения.",
"You cancelled verification on your other session.": "Вы отменили подтверждение в другой вашей сессии.",
"You cancelled verification.": "Вы отменили подтверждение.",
"Verification cancelled": "Подтверждение отменено",
"Encryption enabled": "Шифрование включено",
"Delete sessions|other": "Удалить сессии",
"Delete sessions|one": "Удалить сессию",
"Please verify the room ID or alias and try again.": "Пожалуйста, проверьте ID комнаты или псевдоним и попробуйте снова.",
"Error removing ignored user/server": "Ошибка при удалении игнорируемого пользователя/сервера",
"Please try again or view your console for hints.": "Попробуйте снова или посмотрите сообщения в консоли.",
"Ban list rules - %(roomName)s": "Правила блокировки - %(roomName)s",
"Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Игнорирование людей реализовано через списки правил блокировки. Подписка на список блокировки приведёт к сокрытию от вас пользователей и серверов, которые в нём перечислены.",
"Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Ваш личный список блокировки содержит всех пользователей и серверы, сообщения которых вы не хотите видеть. После внесения туда первого пользователя/сервера в списке комнат появится новая комната 'Мой список блокировки' — не покидайте эту комнату, чтобы список блокировки работал.",
"Subscribing to a ban list will cause you to join it!": "При подписке на список блокировки вы присоединитесь к нему!",
"Room ID or alias of ban list": "ID комнаты или псевдоним списка блокировки",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Подтвердите удаление учётной записи с помощью единой точки входа.",
"Are you sure you want to deactivate your account? This is irreversible.": "Вы уверены, что хотите деактивировать свою учётную запись? Это необратимое действие.",
"Confirm account deactivation": "Подтвердите деактивацию учётной записи",
"Your account is not secure": "Ваша учётная запись не в безопасности",
"Backup has a <validity>valid</validity> signature from this user": "У резервной копии <validity>верная</validity> подпись этого пользователя",
"Backup has a <validity>invalid</validity> signature from this user": "У резервной копии <validity>неверная</validity> подпись этого пользователя",
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "У резервной копии подпись <verify>неизвестного</verify> пользователя с ID %(deviceId)s",
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "У резервной копии подпись <verify>неизвестной</verify> сессии с ID %(deviceId)s",
"If this isn't what you want, please use a different tool to ignore users.": "Если вас это не устраивает, попробуйте другой инструмент для игнорирования пользователей.",
"<requestLink>Re-request encryption keys</requestLink> from your other sessions.": "<requestLink>Перезапросить ключи шифрования</requestLink> у других ваших сессий.",
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Совет: поставьте <code>//</code> в начале сообщения, чтобы начать его с косой черты.",
"Almost there! Is your other session showing the same shield?": "Почти готово! Отображается ли такой же щит в другой вашей сессии?",
"Almost there! Is %(displayName)s showing the same shield?": "Почти готово! Отображает ли %(displayName)s такой же щит?",
"You've successfully verified %(deviceName)s (%(deviceId)s)!": "Вы успешно подтвердили %(deviceName)s (%(deviceId)s)!",
"%(displayName)s cancelled verification.": "%(displayName)s отменил(а) подтверждение.",
"Encryption not enabled": "Шифрование не включено",
"The encryption used by this room isn't supported.": "Шифрование этой комнаты не поддерживается.",
"You verified %(name)s": "Вы подтвердили %(name)s",
"You cancelled verifying %(name)s": "Вы отменили подтверждение %(name)s",
"You accepted": "Вы приняли",
"%(name)s accepted": "%(name)s принял(а)",
"You declined": "Вы отказали",
"You cancelled": "Вы отменили",
"%(name)s declined": "%(name)s отказал(а)",
"%(name)s cancelled": "%(name)s отменил(а)",
"Accepting …": "Принимаем …",
"Declining …": "Отказываем …",
"%(name)s wants to verify": "%(name)s желает подтвердить",
"You sent a verification request": "Вы отправили запрос подтверждения",
"Reactions": "Реакции",
"<reactors/><reactedWith> reacted with %(content)s</reactedWith>": "<reactors/><reactedWith> отреагировал(а) с %(content)s</reactedWith>",
"Your display name": "Отображаемое имя",
"Your avatar URL": "Ссылка на ваш аватар",
"One of the following may be compromised:": "Что-то из этого может быть скомпрометировано:",
"Yours, or the other users internet connection": "Ваше интернет-соединение или соединение других пользователей",
"Yours, or the other users session": "Ваши сессии или сессии других пользователей",
"%(name)s cancelled verifying": "%(name)s отменил(а) подтверждение",
"Any of the following data may be shared:": "Следующие сведения могут быть переданы:",
"Your user ID": "ID пользователя",
"Your theme": "Ваша тема",
"Riot URL": "Ссылка на Riot",
"Room ID": "ID комнаты",
"Widget ID": "ID виджета",
"Widget added by": "Виджет добавлен",
"This widget may use cookies.": "Этот виджет может использовать куки.",
"More options": "Дополнительные параметры",
"Language Dropdown": "Список языков",
"Enter a server name": "Введите имя сервера",
"Looks good": "В порядке",
"All rooms": "Все комнаты",
"Your server": "Ваш сервер",
"Remove server": "Удалить сервер",
"Matrix": "Матрикс",
"Add a new server": "Добавить сервер",
"Server name": "Имя сервера",
"Add a new server...": "Добавить сервер…",
"Matrix rooms": "Комнаты Matrix",
"Destroy cross-signing keys?": "Уничтожить ключи кросс-подписи?",
"Clear cross-signing keys": "Очистить ключи кросс-подписи",
"Clear all data in this session?": "Очистить все данные в этой сессии?",
"Enable end-to-end encryption": "Включить сквозное шифрование",
"You cant disable this later. Bridges & most bots wont work yet.": "Вы не сможете его отключить в дальнейшем. Мосты и большинство ботов пока что не будут работать.",
"Verify session": "Подтвердить сессию",
"Session name": "Название сессии",
"Session key": "Ключ сессии",
"Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Резервная копия ключа сохранена в хранилище секретов, но эта возможность не включена в этой сессии. Разрешите кросс-подпись в Лаборатории, чтобы изменить состояние резервной копии.",
"Backup key stored: ": "Резервная копия ключа сохранена: ",
"Command failed": "Не удалось выполнить команду",
"To report a Matrix-related security issue, please read the Matrix.org <a>Security Disclosure Policy</a>.": "Чтобы сообщить о проблеме безопасности Matrix, пожалуйста, прочитайте <a>Политику раскрытия информации</a> Matrix.org.",
"Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Установить адрес этой комнаты, чтобы пользователи могли найти ее на вашем сервере (%(localDomain)s)",
"Start a conversation with someone using their name, username (like <userId/>) or email address.": "Начните диалог с кем-нибудь по его имени, имени пользователя (например, <userId/>) или адресу почты.",
"Great! This recovery passphrase looks strong enough.": "Отлично! Этот пароль восстановления достаточно надёжен.",
"Enter recovery passphrase": "Введите пароль восстановления",
"Enter a recovery passphrase": "Введите пароль восстановления",
"Enter your recovery passphrase a second time to confirm it.": "Введите пароль восстановления ещё раз для подтверждения.",
"Enter a recovery passphrase...": "Введите пароль восстановления...",
"Please enter your recovery passphrase a second time to confirm.": "Введите пароль восстановления повторно для подтверждения.",
"If you cancel now, you won't complete your operation.": "Если вы отмените операцию сейчас, она не завершится.",
"Failed to set topic": "Не удалось установить тему",
"Could not find user in room": "Не удалось найти пользователя в комнате",
"Please supply a widget URL or embed code": "Укажите URL или код вставки виджета",
"Send a bug report with logs": "Отправить отчёт об ошибке с логами",
"Enable cross-signing to verify per-user instead of per-session": "Разрешить кросс-подпись для подтверждения пользователей вместо отдельных сессий",
"Keep recovery passphrase in memory for this session": "Сохранить пароль восстановления в памяти для этой сессии",
"Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Отдельно подтверждать каждую сессию пользователя как доверенную, не доверяя кросс-подписанным устройствам.",
"Securely cache encrypted messages locally for them to appear in search results, using ": "Безопасно кэшировать шифрованные сообщения локально, чтобы они появлялись в результатах поиска с помощью ",
" to store messages from ": " чтобы сохранить сообщения от ",
"Securely cache encrypted messages locally for them to appear in search results.": "Безопасно кэшировать шифрованные сообщения локально, чтобы они появлялись в результатах поиска.",
"Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with <nativeLink>search components added</nativeLink>.": "Отсутствуют некоторые необходимые компоненты для Riot, чтобы безопасно кэшировать шифрованные сообщения локально. Если вы хотите попробовать эту возможность, соберите самостоятельно Riot Desktop с <nativeLink>добавлением поисковых компонентов</nativeLink>.",
"not stored": "не сохранено",
"Backup has a <validity>valid</validity> signature from this session": "У резервной копии <validity>верная</validity> подпись этой сессии",
"Backup has an <validity>invalid</validity> signature from this session": "У резервной копии <validity>неверная</validity> подпись этой сессии",
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> session <device></device>": "У резервной копии <validity>верная</validity>подпись <verify>проверенной</verify> сессии <device></device>",
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> session <device></device>": "У резервной копии <validity>верная</validity>подпись <verify>непроверенной</verify> сессии <device></device>",
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> session <device></device>": "У резервной копии <validity>неверная</validity>подпись <verify>проверенной</verify> сессии <device></device>",
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> session <device></device>": "У резервной копии <validity>неверная</validity> подпись <verify>непроверенной</verify> сессии <device></device>",
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Ваш пароль был успешно изменён. Вы не будете получать уведомления в других сессия, пока вы не войдёте в них",
"Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, <code>@bot:*</code> would ignore all users that have the name 'bot' on any server.": "Добавьте пользователей и серверы, которых вы хотите игнорировать. Используйте звёздочки для совпадения с любыми символами. Например, <code>@bot:*</code> приведёт к игнорированию всех пользователей на любом сервере, у которых есть 'bot' в имени.",
"This room is bridging messages to the following platforms. <a>Learn more.</a>": "Эта комната пересылает сообщения с помощью моста на следующие платформы. <a>Подробнее</a>",
"This room isnt bridging messages to any platforms. <a>Learn more.</a>": "Эта комната не пересылает никуда сообщения с помощью моста. <a>Подробнее</a>",
"Your key share request has been sent - please check your other sessions for key share requests.": "Запрос ключа был отправлен - проверьте другие ваши сессии на предмет таких запросов.",
"If your other sessions do not have the key for this message you will not be able to decrypt them.": "Вы не сможете расшифровать это сообщение в других сессиях, если у них нет ключа для него.",
"No sessions with registered encryption keys": "Нет сессий с зарегистрированными ключами шифрования",
"For extra security, verify this user by checking a one-time code on both of your devices.": "Для дополнительной безопасности подтвердите этого пользователя, сравнив одноразовый код на ваших устройствах.",
"<strong>%(role)s</strong> in %(roomName)s": "<strong>%(role)s</strong>в %(roomName)s",
"Start verification again from their profile.": "Начните подтверждение заново в профиле пользователя.",
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Сообщения в этой комнате зашифрованы сквозным шифрованием. Посмотрите подробности и подтвердите пользователя в его профиле.",
"Send a Direct Message": "Отправить сообщение"
}

View File

@ -976,7 +976,7 @@
"Set up Secure Message Recovery": "Rregulloni Rimarrje të Sigurt Mesazhesh",
"Keep it safe": "Mbajeni të parrezikuar",
"Create Key Backup": "Krijo Kopjeruajtje Kyçesh",
"Unable to create key backup": "Sarrihet të krijojhet kopjeruajtje kyçesh",
"Unable to create key backup": "Sarrihet të krijohet kopjeruajtje kyçesh",
"Retry": "Riprovo",
"Unable to load backup status": "Sarrihet të ngarkohet gjendje kopjeruajtjeje",
"Unable to restore backup": "Sarrihet të rikthehet kopjeruajtje",
@ -2336,5 +2336,47 @@
"Liberate your communication": "Çlironi komunikimin tuaj",
"Send a Direct Message": "Dërgoni Mesazh të Drejtpërdrejtë",
"Explore Public Rooms": "Eksploroni Dhoma Publike",
"Create a Group Chat": "Krijoni një Fjalosje Grupi"
"Create a Group Chat": "Krijoni një Fjalosje Grupi",
"Failed to set topic": "Su arrit të caktohej temë",
"Command failed": "Urdhri dështoi",
"Could not find user in room": "Su gjet përdorues në dhomë",
"well formed": "e mirëformuar",
"Delete sessions|other": "Fshiji sesionet",
"Delete sessions|one": "Fshije sesionin",
"Enable end-to-end encryption": "Aktivizo fshehtëzim skaj-më-skaj",
"You cant disable this later. Bridges & most bots wont work yet.": "Këtë smund ta çaktivizoni më vonë. Urat & shumica e robotëve ende sdo të funksionojnë.",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "Ripohoni çaktivizimin e llogarisë tuaj duke përdorur Hyrje Njëshe që të dëshmoni identitetin tuaj.",
"Are you sure you want to deactivate your account? This is irreversible.": "Jeni i sigurt se doni të çaktivizohet llogaria juaj? Kjo është e pakthyeshme.",
"Confirm account deactivation": "Ripohoni çaktivizim llogarie",
"Server did not require any authentication": "Shërbyesi skërkoi ndonjë mirëfilltësim",
"Server did not return valid authentication information.": "Shërbyesi sktheu ndonjë të dhënë të vlefshme mirëfilltësimi.",
"There was a problem communicating with the server. Please try again.": "Pati një problem në komunikimin me shërbyesin. Ju lutemi, riprovoni.",
"If you cancel now, you won't complete your operation.": "Nëse e anuloni tani, sdo ta plotësoni veprimin tuaj.",
"Keep recovery passphrase in memory for this session": "Për këtë sesion, mbaje në kujtesë frazëkalimin e rimarrjeve",
"Verify other session": "Verifikoni tjetër sesion",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Sarrihet të hyhet në depozitë të fshehtë. Ju lutemi, verifikoni se dhatë frazëkalimin e duhur për rimarrje.",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>Kujdes</b>: Këtë duhet ta bëni vetëm në një kompjuter të besuar.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për <em>cross-signing</em> për verifikim sesionesh të tjerë, duke dhënë frazëkalimin tuaj për rimarrje.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>.": "Nëse e keni harruar frazëkalimin tuaj të rimarrjeve, mund të <button1>përdorni kyçin tuaj të rimarrjeve</button1> ose <button2>të ujdisni mundësi të reja rimarrjesh</button2>.",
"Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Kopjeruajtja su shfshehtëzua dot me këtë kyç rimarrjesh: ju lutemi, verifikoni se keni dhënë kyçin e saktë të rimarrjeve.",
"Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Kopjeruajtja su shfshehtëzua dot me këtë frazëkalim rimarrjesh: ju lutemi, verifikoni se keni dhënë frazëkalimin e saktë të rimarrjeve.",
"Syncing...": "Po njëkohësohet…",
"Signing In...": "Po hyhet…",
"If you've joined lots of rooms, this might take a while": "Nëse jeni pjesë e shumë dhomave, kjo mund të zgjasë ca",
"Use an existing session to verify this one, granting it access to encrypted messages.": "Që të verifikoni këtë, përdorni një sesion ekzistues, duke i akorduar hyrje te mesazhe të fshehtëzuar.",
"If you cant access one, <button>use your recovery key or recovery passphrase.</button>": "Nëse shyni dot në një, <button>përdorni kyçin tuaj të rimarrjeve ose frazëkalim rimarrjesh.</button>",
"Use your other device to continue…": "Që të vazhdohet, përdorni pajisjen tuaj tjetër…",
"Great! This recovery passphrase looks strong enough.": "Bukur! Ky frazëkalim rimarrjesh duket mjaftueshëm i fuqishëm.",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Caktoni një frazëkalim rimarrjesh që të siguroni informacione të fshehtëzuar dhe për ta rimarrë, nëse dilni nga llogaria. Ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë:",
"Enter a recovery passphrase": "Jepni një frazëkalim rimarrjesh",
"Back up encrypted message keys": "Kopjeruani kyçe mesazhesh të fshehtëzuar",
"Enter your recovery passphrase a second time to confirm it.": "Për ta ripohuar, jepeni edhe një herë frazëkalimin tuaj të rimarrjeve.",
"Confirm your recovery passphrase": "Ripohoni frazëkalimin tuaj të rimarrjeve",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Kyçi juaj i rimarrjeve është një rrjet sigurie - mund ta përdorni të të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj të rimarrjeve.",
"Confirm recovery passphrase": "Ripohoni frazëkalim rimarrjesh",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Do të ruajmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Siguroni kopjeruajtjen tuaj me një frazëkalim rimarrjesh.",
"Enter a recovery passphrase...": "Jepni një frazëkalim rimarrjesh…",
"Please enter your recovery passphrase a second time to confirm.": "Ju lutemi, jepeni frazëkalimin tuaj të rimarrjeve edhe një herë, për ta ripohuar.",
"Repeat your recovery passphrase...": "Përsëritni frazëkalimin tuaj të rimarrjeve…",
"Secure your backup with a recovery passphrase": "Sigurojeni kopjeruajtjen tuaj me një frazëkalim rimarrjesh"
}

View File

@ -2344,5 +2344,63 @@
"Liberate your communication": "讓您的通訊自由",
"Send a Direct Message": "傳送直接訊息",
"Explore Public Rooms": "探索公開聊天室",
"Create a Group Chat": "建立群組聊天"
"Create a Group Chat": "建立群組聊天",
"%(name)s is requesting verification": "%(name)s 正在要求驗證",
"well formed": "結構良好",
"unexpected type": "預料之外的類型",
"Confirm your account deactivation by using Single Sign On to prove your identity.": "透過使用單一登入系統來證您的身份以確認刪除您的帳號。",
"Are you sure you want to deactivate your account? This is irreversible.": "您確定您想要停用您的帳號嗎?此為不可逆的操作。",
"Confirm account deactivation": "確認停用帳號",
"Server did not require any authentication": "伺服器不需要任何驗證",
"Server did not return valid authentication information.": "伺服器沒有回傳有效的驗證資訊。",
"There was a problem communicating with the server. Please try again.": "與伺服器通訊時發生問題。請再試一次。",
"Delete sessions|other": "刪除工作階段",
"Delete sessions|one": "刪除工作階段",
"Enable end-to-end encryption": "啟用端到端加密",
"You cant disable this later. Bridges & most bots wont work yet.": "您無法在稍後停用此功能。橋接與大多數機器人也尚無法運作。",
"Failed to set topic": "設定主題失敗",
"Command failed": "指令失敗",
"Could not find user in room": "在聊天室中找不到使用者",
"Use an existing session to verify this one, granting it access to encrypted messages.": "使用既有的工作階段來驗證這個,授予其對加密訊息的存取權限。",
"Use your other device to continue…": "使用您其他的裝置繼續……",
"Syncing...": "正在同步……",
"Signing In...": "正在登入……",
"If you've joined lots of rooms, this might take a while": "如果您已加入很多聊天室,這可能需要一點時間",
"If you cancel now, you won't complete your operation.": "如果您現在取消,您將無法完成您的操作。",
"Enable cross-signing to verify per-user instead of per-session": "啟用交叉簽章可以使用者為單位進行驗證,而非驗證每個工作階段",
"Keep recovery passphrase in memory for this session": "在此工作階段中將復原通關密語保留在記憶體中",
"Verify other session": "驗證其他工作階段",
"Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "無法存取秘密儲存空間。請驗證您是否輸入正確的復原通關密語。",
"<b>Warning</b>: You should only do this on a trusted computer.": "<b>警告</b>:您應該只在信任的電腦上做這件事。",
"Access your secure message history and your cross-signing identity for verifying other sessions 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>.": "如果您忘記您的復原通關密語,您可以<button1>使用您的復原金鑰</button1>或<button2>設定新的復原選項</button2>。",
"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 passphrase: please verify that you entered the correct recovery passphrase.": "備份無法使用此復原通關密語解密:請驗證您是否輸入正確的復原通關密語。",
"If you cant access one, <button>use your recovery key or recovery passphrase.</button>": "如果您無法存取,<button>請使用您的復原金鑰或復原通關密語。</button>",
"Great! This recovery passphrase looks strong enough.": "很好!這個復原通關密語看起來夠強。",
"Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "設定復原通關密語以保護您的加密資訊並在您登出時復原它。且應該要與您的帳號密碼不同:",
"Enter a recovery passphrase": "輸入復原通關密語",
"Back up encrypted message keys": "備份加密訊息金鑰",
"Enter your recovery passphrase a second time to confirm it.": "再次輸入您的復原通關密語以確認。",
"Confirm 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.": "您的復原金鑰是安全網 - 如果您忘記您的復原通關密語的話,您可以用它來恢復您對加密訊息的存取權。",
"Confirm recovery passphrase": "確認復原通關密語",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "我們將會在我們的伺服器上儲存一份您金鑰的加密副本。使用復原通關密語以保護您的備份。",
"Enter a recovery passphrase...": "輸入復原通關密語……",
"Please enter your recovery passphrase a second time to confirm.": "請再次輸入您的復原通關密語以確認。",
"Repeat your recovery passphrase...": "再次輸入您的復原通關密語……",
"Secure your backup with a recovery passphrase": "使用復原通關密語保護您的備份",
"Can't load this message": "無法載入此訊息",
"Submit logs": "遞交紀錄檔",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "注意:您的瀏覽器不受支援,所以您的使用體驗可能無法預測。",
"Unable to upload": "無法上傳",
"Currently indexing: %(currentRoom)s": "目前正在建立索引:%(currentRoom)s",
"Send a bug report with logs": "傳送有紀錄檔的臭蟲回報",
"Please supply a widget URL or embed code": "請提供小工具 URL 或嵌入程式碼",
"Unable to query secret storage status": "無法查詢秘密儲存空間狀態",
"Verify this login": "驗證此登入",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "透過驗證這個從您的其他工作階段而來的登入來確認您的身份,並授予其對加密訊息的存取權限。",
"This requires the latest Riot on your other devices:": "這需要在您的其他裝置上使用最新的 Riot",
"or another cross-signing capable Matrix client": "或另一個有交叉簽章功能的 Matrix 客戶端",
"Use Recovery Passphrase or Key": "使用復原通關密語或金鑰"
}

View File

@ -37,10 +37,6 @@ class EventIndexPeg {
* EventIndex was successfully initialized, false otherwise.
*/
async init() {
if (!SettingsStore.isFeatureEnabled("feature_event_indexing")) {
return false;
}
const indexManager = PlatformPeg.get().getEventIndexingManager();
if (!indexManager) {
console.log("EventIndex: Platform doesn't support event indexing, not initializing.");

View File

@ -152,24 +152,12 @@ export const SETTINGS = {
supportedLevels: ['device', 'config'], // we shouldn't use LEVELS_FEATURE for non-features, so copy it here.
default: true,
},
"feature_event_indexing": {
isFeature: true,
supportedLevels: LEVELS_FEATURE,
displayName: _td("Enable local event indexing and E2EE search (requires restart)"),
default: false,
},
"feature_bridge_state": {
isFeature: true,
supportedLevels: LEVELS_FEATURE,
displayName: _td("Show info about bridges in room settings"),
default: false,
},
"feature_invite_only_padlocks": {
isFeature: true,
supportedLevels: LEVELS_FEATURE,
displayName: _td("Show padlocks on invite only rooms"),
default: true,
},
"MessageComposerInput.suggestEmoji": {
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
displayName: _td('Enable Emoji suggestions while typing'),

View File

@ -20,8 +20,9 @@ import EventEmitter from 'events';
* Holds the active toasts
*/
export default class ToastStore extends EventEmitter {
static PRIORITY_REALTIME = 1;
static PRIORITY_DEFAULT = 0;
static PRIORITY_REALTIME = 0;
static PRIORITY_DEFAULT = 1;
static PRIORITY_LOW = 2;
static sharedInstance() {
if (!global.mx_ToastStore) global.mx_ToastStore = new ToastStore();
@ -38,17 +39,23 @@ export default class ToastStore extends EventEmitter {
this._toasts = [];
}
/**
* Add or replace a toast
* If a toast with the same toastKey already exists, the given toast will replace it
* Toasts are always added underneath any toasts of the same priority, so existing
* toasts stay at the top unless a higher priority one arrives (better to not change the
* toast unless necessary).
*
* @param {boject} newToast The new toast
*/
addOrReplaceToast(newToast) {
if (newToast.priority === undefined) newToast.priority = ToastStore.PRIORITY_DEFAULT;
const oldIndex = this._toasts.findIndex(t => t.key === newToast.key);
if (oldIndex === -1) {
// we only have two priorities so just push realtime ones onto the front
if (newToast.priority) {
this._toasts.unshift(newToast);
} else {
this._toasts.push(newToast);
}
let newIndex = this._toasts.length;
while (newIndex > 0 && this._toasts[newIndex - 1].priority > newToast.priority) --newIndex;
this._toasts.splice(newIndex, 0, newToast);
} else {
this._toasts[oldIndex] = newToast;
}

View File

@ -141,16 +141,31 @@ export function enumerateThemes() {
return Object.assign({}, customThemeNames, BUILTIN_THEMES);
}
function setCustomThemeVars(customTheme) {
const {style} = document.body;
if (customTheme.colors) {
for (const [name, hexColor] of Object.entries(customTheme.colors)) {
style.setProperty(`--${name}`, hexColor);
// uses #rrggbbaa to define the color with alpha values at 0% and 50%
function setCSSVariable(name, hexColor, doPct = true) {
style.setProperty(`--${name}`, hexColor);
if (doPct) {
// uses #rrggbbaa to define the color with alpha values at 0%, 15% and 50%
style.setProperty(`--${name}-0pct`, hexColor + "00");
style.setProperty(`--${name}-15pct`, hexColor + "26");
style.setProperty(`--${name}-50pct`, hexColor + "7F");
}
}
if (customTheme.colors) {
for (const [name, value] of Object.entries(customTheme.colors)) {
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i += 1) {
setCSSVariable(`${name}_${i}`, value[i], false);
}
} else {
setCSSVariable(name, value);
}
}
}
}
function getCustomTheme(themeName) {

View File

@ -7,7 +7,7 @@ interface Client {
isCrossSigningVerified: () => boolean
wasCrossSigningVerified: () => boolean
};
getStoredDevicesForUser: (userId: string) => Promise<[{ deviceId: string }]>;
getStoredDevicesForUser: (userId: string) => [{ deviceId: string }];
checkDeviceTrust: (userId: string, deviceId: string) => {
isVerified: () => boolean
}
@ -45,7 +45,7 @@ export async function shieldStatusForRoom(client: Client, room: Room): Promise<s
(members.length === 1); // Do alarm for self if we're alone in a room
const targets = includeUser ? [...verified, client.getUserId()] : verified;
for (const userId of targets) {
const devices = await client.getStoredDevicesForUser(userId);
const devices = client.getStoredDevicesForUser(userId);
const anyDeviceNotVerified = devices.some(({deviceId}) => {
return !client.checkDeviceTrust(userId, deviceId).isVerified();
});

View File

@ -72,6 +72,7 @@ export default class WidgetUtils {
return room.currentState.maySendStateEvent('im.vector.modular.widgets', me);
}
// TODO: Generify the name of this function. It's not just scalar.
/**
* Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api
* @param {[type]} testUrlString URL to check
@ -210,9 +211,9 @@ export default class WidgetUtils {
});
}
static setUserWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData) {
static setUserWidget(widgetId, widgetType: WidgetType, widgetUrl, widgetName, widgetData) {
const content = {
type: widgetType,
type: widgetType.preferred,
url: widgetUrl,
name: widgetName,
data: widgetData,
@ -369,7 +370,7 @@ export default class WidgetUtils {
static addIntegrationManagerWidget(name: string, uiUrl: string, apiUrl: string) {
return WidgetUtils.setUserWidget(
"integration_manager_" + (new Date().getTime()),
"m.integration_manager",
WidgetType.INTEGRATION_MANAGER,
uiUrl,
"Integration Manager: " + name,
{"api_url": apiUrl},

20
src/utils/rem.js Normal file
View File

@ -0,0 +1,20 @@
/*
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.
*/
// converts a pixel value to rem.
export default function(pixelVal) {
return pixelVal / 15 + "rem";
}

View File

@ -68,6 +68,7 @@ export async function verifyDevice(user, device) {
return;
}
}
Modal.createTrackedDialog("Verification warning", "unverified session", UntrustedDeviceDialog, {
user,
device,
@ -84,7 +85,8 @@ export async function verifyDevice(user, device) {
refireParams: {member: user, verificationRequestPromise},
});
} else if (action === "legacy") {
const ManualDeviceKeyVerificationDialog = sdk.getComponent("dialogs.ManualDeviceKeyVerificationDialog");
const ManualDeviceKeyVerificationDialog =
sdk.getComponent("dialogs.ManualDeviceKeyVerificationDialog");
Modal.createTrackedDialog("Legacy verify session", "legacy verify session",
ManualDeviceKeyVerificationDialog,
{

View File

@ -16,6 +16,8 @@ limitations under the License.
export class WidgetType {
public static readonly JITSI = new WidgetType("m.jitsi", "jitsi");
public static readonly STICKERPICKER = new WidgetType("m.stickerpicker", "m.stickerpicker");
public static readonly INTEGRATION_MANAGER = new WidgetType("m.integration_manager", "m.integration_manager");
public static readonly CUSTOM = new WidgetType("m.custom", "m.custom");
constructor(public readonly preferred: string, public readonly legacy: string) {

View File

@ -206,7 +206,8 @@ describe("<TextualBody />", () => {
'Hey <span>' +
'<a class="mx_Pill mx_UserPill" title="@user:server">' +
'<img class="mx_BaseAvatar mx_BaseAvatar_image" src="mxc://avatar.url/image.png" ' +
'width="16" height="16" title="@member:domain.bla" alt="" aria-hidden="true">Member</a>' +
'style="width: 1.0666666666666667rem; height: 1.0666666666666667rem;" ' +
'title="@member:domain.bla" alt="" aria-hidden="true">Member</a>' +
'</span></span>');
});
});

View File

@ -11,7 +11,7 @@ function mkClient(selfTrust) {
checkDeviceTrust: (userId, deviceId) => ({
isVerified: () => userId === "@self:localhost" ? selfTrust : userId[2] == "T",
}),
getStoredDevicesForUser: async (userId) => ["DEVICE"],
getStoredDevicesForUser: (userId) => ["DEVICE"],
};
}

View File

@ -3077,15 +3077,15 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emojibase-data@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-5.0.1.tgz#ce6fe36b4affd3578e0be8779211018a2fdae960"
integrity sha512-rYWlogJ2q5P78U8Xx1vhsXHcYKu1wFnr7+o6z9QHssZ1SsJLTCkJINZIPHRFWuDreAUK457TkqHpdOXElu0fzA==
emojibase-data@^4.0.2:
version "4.2.1"
resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-4.2.1.tgz#3d1f0c69ddbb2ca7b7014f5e34654190802a40df"
integrity sha512-O0vxoPMgVkRq/uII/gdAjz9RwNv6ClJrd3J9QCCRC4btZRmeut/qohC/Fi+NNXUcjY08RWNTvxSnq/vij8hvrw==
emojibase-regex@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-4.0.1.tgz#a2cd4bbb42825422da9ec72f15e970bc2c90b46a"
integrity sha512-S42UHkFfz15i4NNz+wi9iMKFo+B6Kalc6PJLpYX0BUANViXw4vSyYZMFdBGRLduSabWHuEcTLZl9xOa2YP3eJw==
emojibase-regex@^3.0.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-3.2.1.tgz#122935958c9a49c96bb29ac69ccbbac0b2e7022d"
integrity sha512-VAX2Rc2U/alu5q6P2cET2alzC63o1Uarm6Ea/b3ab+KOzxZT4JKmB0tCU1sTZvfNKa16KMLCK2k7hJBHJq4vWQ==
emojis-list@^2.0.0:
version "2.1.0"