Merge branch 'develop' into luke/submit-debug-logs

pull/21833/head
Luke Barnard 2018-03-19 14:55:28 +00:00
commit 0c125b3dff
80 changed files with 4708 additions and 835 deletions

View File

@ -1,3 +1,9 @@
Changes in [0.11.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.4) (2018-02-09)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.3...v0.11.4)
* Add isUrlPermitted function to sanity check URLs
Changes in [0.11.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.3) (2017-12-04)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.2...v0.11.3)

View File

@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
"version": "0.11.3",
"version": "0.11.4",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {

View File

@ -50,11 +50,15 @@ function pad(n) {
return (n < 10 ? '0' : '') + n;
}
function twelveHourTime(date) {
function twelveHourTime(date, showSeconds=false) {
let hours = date.getHours() % 12;
const minutes = pad(date.getMinutes());
const ampm = date.getHours() >= 12 ? _t('PM') : _t('AM');
hours = hours ? hours : 12; // convert 0 -> 12
if (showSeconds) {
const seconds = pad(date.getSeconds());
return `${hours}:${minutes}:${seconds}${ampm}`;
}
return `${hours}:${minutes}${ampm}`;
}
@ -101,10 +105,17 @@ export function formatFullDate(date, showTwelveHour=false) {
monthName: months[date.getMonth()],
day: date.getDate(),
fullYear: date.getFullYear(),
time: formatTime(date, showTwelveHour),
time: formatFullTime(date, showTwelveHour),
});
}
export function formatFullTime(date, showTwelveHour=false) {
if (showTwelveHour) {
return twelveHourTime(date, true);
}
return pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds());
}
export function formatTime(date, showTwelveHour=false) {
if (showTwelveHour) {
return twelveHourTime(date);

View File

@ -22,28 +22,30 @@ import MatrixClientPeg from './MatrixClientPeg';
import GroupStoreCache from './stores/GroupStoreCache';
export function showGroupInviteDialog(groupId) {
const description = <div>
<div>{ _t("Who would you like to add to this community?") }</div>
<div className="warning">
{ _t(
"Warning: any person you add to a community will be publicly "+
"visible to anyone who knows the community ID",
) }
</div>
</div>;
return new Promise((resolve, reject) => {
const description = <div>
<div>{ _t("Who would you like to add to this community?") }</div>
<div className="warning">
{ _t(
"Warning: any person you add to a community will be publicly "+
"visible to anyone who knows the community ID",
) }
</div>
</div>;
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Group Invite', '', AddressPickerDialog, {
title: _t("Invite new community members"),
description: description,
placeholder: _t("Name or matrix ID"),
button: _t("Invite to Community"),
validAddressTypes: ['mx-user-id'],
onFinished: (success, addrs) => {
if (!success) return;
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Group Invite', '', AddressPickerDialog, {
title: _t("Invite new community members"),
description: description,
placeholder: _t("Name or matrix ID"),
button: _t("Invite to Community"),
validAddressTypes: ['mx-user-id'],
onFinished: (success, addrs) => {
if (!success) return;
_onGroupInviteFinished(groupId, addrs);
},
_onGroupInviteFinished(groupId, addrs).then(resolve, reject);
},
});
});
}
@ -87,7 +89,7 @@ function _onGroupInviteFinished(groupId, addrs) {
const addrTexts = addrs.map((addr) => addr.address);
multiInviter.invite(addrTexts).then((completionStates) => {
return multiInviter.invite(addrTexts).then((completionStates) => {
// Show user any errors
const errorList = [];
for (const addr of Object.keys(completionStates)) {

View File

@ -1,6 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 New Vector Ltd
Copyright 2017, 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -25,6 +25,7 @@ import escape from 'lodash/escape';
import emojione from 'emojione';
import classNames from 'classnames';
import MatrixClientPeg from './MatrixClientPeg';
import url from 'url';
emojione.imagePathSVG = 'emojione/svg/';
// Store PNG path for displaying many flags at once (for increased performance over SVG)
@ -44,6 +45,8 @@ const SYMBOL_PATTERN = /([\u2100-\u2bff])/;
const EMOJI_REGEX = new RegExp(emojione.unicodeRegexp+"+", "gi");
const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;
const PERMITTED_URL_SCHEMES = ['http', 'https', 'ftp', 'mailto', 'magnet'];
/*
* Return true if the given string contains emoji
* Uses a much, much simpler regex than emojione's so will give false
@ -152,6 +155,25 @@ export function sanitizedHtmlNode(insaneHtml) {
return <div dangerouslySetInnerHTML={{ __html: saneHtml }} dir="auto" />;
}
/**
* Tests if a URL from an untrusted source may be safely put into the DOM
* The biggest threat here is javascript: URIs.
* Note that the HTML sanitiser library has its own internal logic for
* doing this, to which we pass the same list of schemes. This is used in
* other places we need to sanitise URLs.
* @return true if permitted, otherwise false
*/
export function isUrlPermitted(inputUrl) {
try {
const parsed = url.parse(inputUrl);
if (!parsed.protocol) return false;
// URL parser protocol includes the trailing colon
return PERMITTED_URL_SCHEMES.includes(parsed.protocol.slice(0, -1));
} catch (e) {
return false;
}
}
const sanitizeHtmlParams = {
allowedTags: [
'font', // custom to matrix for IRC-style font coloring
@ -172,7 +194,7 @@ const sanitizeHtmlParams = {
// Lots of these won't come up by default because we don't allow them
selfClosing: ['img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta'],
// URL schemes we permit
allowedSchemes: ['http', 'https', 'ftp', 'mailto', 'magnet'],
allowedSchemes: PERMITTED_URL_SCHEMES,
allowProtocolRelative: false,
@ -388,8 +410,7 @@ class TextHighlighter extends BaseHighlighter {
* opts.disableBigEmoji: optional argument to disable the big emoji class.
*/
export function bodyToHtml(content, highlights, opts={}) {
const isHtml = (content.format === "org.matrix.custom.html");
const body = isHtml ? content.formatted_body : escape(content.body);
let isHtml = (content.format === "org.matrix.custom.html");
let bodyHasEmoji = false;
@ -409,9 +430,27 @@ export function bodyToHtml(content, highlights, opts={}) {
return highlighter.applyHighlights(safeText, safeHighlights).join('');
};
}
safeBody = sanitizeHtml(body, sanitizeHtmlParams);
bodyHasEmoji = containsEmoji(body);
if (bodyHasEmoji) safeBody = unicodeToImage(safeBody);
bodyHasEmoji = containsEmoji(isHtml ? content.formatted_body : content.body);
// Only generate safeBody if the message was sent as org.matrix.custom.html
if (isHtml) {
safeBody = sanitizeHtml(content.formatted_body, sanitizeHtmlParams);
} else {
// ... or if there are emoji, which we insert as HTML alongside the
// escaped plaintext body.
if (bodyHasEmoji) {
isHtml = true;
safeBody = sanitizeHtml(escape(content.body), sanitizeHtmlParams);
}
}
// An HTML message with emoji
// or a plaintext message with emoji that was escaped and sanitized into
// HTML.
if (bodyHasEmoji) {
safeBody = unicodeToImage(safeBody);
}
} finally {
delete sanitizeHtmlParams.textFilter;
}
@ -429,7 +468,10 @@ export function bodyToHtml(content, highlights, opts={}) {
'mx_EventTile_bigEmoji': emojiBody,
'markdown-body': isHtml,
});
return <span className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir="auto" />;
return isHtml ?
<span className={className} dangerouslySetInnerHTML={{ __html: safeBody }} dir="auto" /> :
<span className={className} dir="auto">{ content.body }</span>;
}
export function emojifyText(text) {

View File

@ -362,7 +362,7 @@ async function _doSetLoggedIn(credentials, clearStorage) {
dis.dispatch({action: 'on_logged_in', teamToken: teamToken});
});
startMatrixClient();
await startMatrixClient();
return MatrixClientPeg.get();
}
@ -423,7 +423,7 @@ export function logout() {
* Starts the matrix client and all other react-sdk services that
* listen for events while a session is logged in.
*/
function startMatrixClient() {
async function startMatrixClient() {
console.log(`Lifecycle: Starting MatrixClient`);
// dispatch this before starting the matrix client: it's used
@ -437,7 +437,7 @@ function startMatrixClient() {
Presence.start();
DMRoomMap.makeShared().start();
MatrixClientPeg.start();
await MatrixClientPeg.start();
// dispatch that we finished starting up to wire up any other bits
// of the matrix client that cannot be set prior to starting up.

View File

@ -175,4 +175,4 @@ class MatrixClientPeg {
if (!global.mxMatrixClientPeg) {
global.mxMatrixClientPeg = new MatrixClientPeg();
}
module.exports = global.mxMatrixClientPeg;
export default global.mxMatrixClientPeg;

View File

@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -31,7 +32,7 @@ class Presence {
this.running = true;
if (undefined === this.state) {
this._resetTimer();
this.dispatcherRef = dis.register(this._onUserActivity.bind(this));
this.dispatcherRef = dis.register(this._onAction.bind(this));
}
}
@ -125,9 +126,10 @@ class Presence {
this.setState("unavailable");
}
_onUserActivity(payload) {
if (payload.action === "sync_state" || payload.action === "self_presence_updated") return;
this._resetTimer();
_onAction(payload) {
if (payload.action === "user_activity") {
this._resetTimer();
}
}
/**

View File

@ -563,7 +563,7 @@ const onMessage = function(event) {
const url = SdkConfig.get().integrations_ui_url;
if (
event.origin.length === 0 ||
!url.startsWith(event.origin) ||
!url.startsWith(event.origin + '/') ||
!event.data.action ||
event.data.api // Ignore messages with specific API set
) {

View File

@ -252,7 +252,6 @@ class Tinter {
setTheme(theme) {
console.trace("setTheme " + theme);
this.theme = theme;
// update keyRgb from the current theme CSS itself, if it defines it

View File

@ -28,6 +28,8 @@ module.exports = {
return false;
} else if (ev.getType() == 'm.room.member') {
return false;
} else if (ev.getType() == 'm.room.third_party_invite') {
return false;
} else if (ev.getType() == 'm.call.answer' || ev.getType() == 'm.call.hangup') {
return false;
} else if (ev.getType == 'm.room.message' && ev.getContent().msgtype == 'm.notify') {

View File

@ -62,6 +62,127 @@ function createAccountDataAction(matrixClient, accountDataEvent) {
};
}
/**
* @typedef RoomAction
* @type {Object}
* @property {string} action 'MatrixActions.Room'.
* @property {Room} room the Room that was stored.
*/
/**
* Create a MatrixActions.Room action that represents a MatrixClient `Room`
* matrix event, emitted when a Room is stored in the client.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {Room} room the Room that was stored.
* @returns {RoomAction} an action of type `MatrixActions.Room`.
*/
function createRoomAction(matrixClient, room) {
return { action: 'MatrixActions.Room', room };
}
/**
* @typedef RoomTagsAction
* @type {Object}
* @property {string} action 'MatrixActions.Room.tags'.
* @property {Room} room the Room whose tags changed.
*/
/**
* Create a MatrixActions.Room.tags action that represents a MatrixClient
* `Room.tags` matrix event, emitted when the m.tag room account data
* event is updated.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {MatrixEvent} roomTagsEvent the m.tag event.
* @param {Room} room the Room whose tags were changed.
* @returns {RoomTagsAction} an action of type `MatrixActions.Room.tags`.
*/
function createRoomTagsAction(matrixClient, roomTagsEvent, room) {
return { action: 'MatrixActions.Room.tags', room };
}
/**
* @typedef RoomTimelineAction
* @type {Object}
* @property {string} action 'MatrixActions.Room.timeline'.
* @property {boolean} isLiveEvent whether the event was attached to a
* live timeline.
* @property {boolean} isLiveUnfilteredRoomTimelineEvent whether the
* event was attached to a timeline in the set of unfiltered timelines.
* @property {Room} room the Room whose tags changed.
*/
/**
* Create a MatrixActions.Room.timeline action that represents a
* MatrixClient `Room.timeline` matrix event, emitted when an event
* is added to or removed from a timeline of a room.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {MatrixEvent} timelineEvent the event that was added/removed.
* @param {Room} room the Room that was stored.
* @param {boolean} toStartOfTimeline whether the event is being added
* to the start (and not the end) of the timeline.
* @param {boolean} removed whether the event was removed from the
* timeline.
* @param {Object} data
* @param {boolean} data.liveEvent whether the event is a live event,
* belonging to a live timeline.
* @param {EventTimeline} data.timeline the timeline being altered.
* @returns {RoomTimelineAction} an action of type `MatrixActions.Room.timeline`.
*/
function createRoomTimelineAction(matrixClient, timelineEvent, room, toStartOfTimeline, removed, data) {
return {
action: 'MatrixActions.Room.timeline',
event: timelineEvent,
isLiveEvent: data.liveEvent,
isLiveUnfilteredRoomTimelineEvent:
room && data.timeline.getTimelineSet() === room.getUnfilteredTimelineSet(),
};
}
/**
* @typedef RoomMembershipAction
* @type {Object}
* @property {string} action 'MatrixActions.RoomMember.membership'.
* @property {RoomMember} member the member whose membership was updated.
*/
/**
* Create a MatrixActions.RoomMember.membership action that represents
* a MatrixClient `RoomMember.membership` matrix event, emitted when a
* member's membership is updated.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {MatrixEvent} membershipEvent the m.room.member event.
* @param {RoomMember} member the member whose membership was updated.
* @param {string} oldMembership the member's previous membership.
* @returns {RoomMembershipAction} an action of type `MatrixActions.RoomMember.membership`.
*/
function createRoomMembershipAction(matrixClient, membershipEvent, member, oldMembership) {
return { action: 'MatrixActions.RoomMember.membership', member };
}
/**
* @typedef EventDecryptedAction
* @type {Object}
* @property {string} action 'MatrixActions.Event.decrypted'.
* @property {MatrixEvent} event the matrix event that was decrypted.
*/
/**
* Create a MatrixActions.Event.decrypted action that represents
* a MatrixClient `Event.decrypted` matrix event, emitted when a
* matrix event is decrypted.
*
* @param {MatrixClient} matrixClient the matrix client.
* @param {MatrixEvent} event the matrix event that was decrypted.
* @returns {EventDecryptedAction} an action of type `MatrixActions.Event.decrypted`.
*/
function createEventDecryptedAction(matrixClient, event) {
return { action: 'MatrixActions.Event.decrypted', event };
}
/**
* This object is responsible for dispatching actions when certain events are emitted by
* the given MatrixClient.
@ -78,6 +199,11 @@ export default {
start(matrixClient) {
this._addMatrixClientListener(matrixClient, 'sync', createSyncAction);
this._addMatrixClientListener(matrixClient, 'accountData', createAccountDataAction);
this._addMatrixClientListener(matrixClient, 'Room', createRoomAction);
this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction);
this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction);
this._addMatrixClientListener(matrixClient, 'RoomMember.membership', createRoomMembershipAction);
this._addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction);
},
/**
@ -91,7 +217,7 @@ export default {
*/
_addMatrixClientListener(matrixClient, eventName, actionCreator) {
const listener = (...args) => {
dis.dispatch(actionCreator(matrixClient, ...args));
dis.dispatch(actionCreator(matrixClient, ...args), true);
};
matrixClient.on(eventName, listener);
this._matrixClientListenersStop.push(() => {

View File

@ -0,0 +1,146 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { asyncAction } from './actionCreators';
import RoomListStore from '../stores/RoomListStore';
import Modal from '../Modal';
import Rooms from '../Rooms';
import { _t } from '../languageHandler';
import sdk from '../index';
const RoomListActions = {};
/**
* Creates an action thunk that will do an asynchronous request to
* tag room.
*
* @param {MatrixClient} matrixClient the matrix client to set the
* account data on.
* @param {Room} room the room to tag.
* @param {string} oldTag the tag to remove (unless oldTag ==== newTag)
* @param {string} newTag the tag with which to tag the room.
* @param {?number} oldIndex the previous position of the room in the
* list of rooms.
* @param {?number} newIndex the new position of the room in the list
* of rooms.
* @returns {function} an action thunk.
* @see asyncAction
*/
RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex, newIndex) {
let metaData = null;
// Is the tag ordered manually?
if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) {
const lists = RoomListStore.getRoomLists();
const newList = [...lists[newTag]];
newList.sort((a, b) => a.tags[newTag].order - b.tags[newTag].order);
// If the room was moved "down" (increasing index) in the same list we
// need to use the orders of the tiles with indices shifted by +1
const offset = (
newTag === oldTag && oldIndex < newIndex
) ? 1 : 0;
const indexBefore = offset + newIndex - 1;
const indexAfter = offset + newIndex;
const prevOrder = indexBefore <= 0 ?
0 : newList[indexBefore].tags[newTag].order;
const nextOrder = indexAfter >= newList.length ?
1 : newList[indexAfter].tags[newTag].order;
metaData = {
order: (prevOrder + nextOrder) / 2.0,
};
}
return asyncAction('RoomListActions.tagRoom', () => {
const promises = [];
const roomId = room.roomId;
// Evil hack to get DMs behaving
if ((oldTag === undefined && newTag === 'im.vector.fake.direct') ||
(oldTag === 'im.vector.fake.direct' && newTag === undefined)
) {
return Rooms.guessAndSetDMRoom(
room, newTag === 'im.vector.fake.direct',
).catch((err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to set direct chat tag " + err);
Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, {
title: _t('Failed to set direct chat tag'),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
const hasChangedSubLists = oldTag !== newTag;
// More evilness: We will still be dealing with moving to favourites/low prio,
// but we avoid ever doing a request with 'im.vector.fake.direct`.
//
// if we moved lists, remove the old tag
if (oldTag && oldTag !== 'im.vector.fake.direct' &&
hasChangedSubLists
) {
const promiseToDelete = matrixClient.deleteRoomTag(
roomId, oldTag,
).catch(function(err) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to remove tag " + oldTag + " from room: " + err);
Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, {
title: _t('Failed to remove tag %(tagName)s from room', {tagName: oldTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
promises.push(promiseToDelete);
}
// if we moved lists or the ordering changed, add the new tag
if (newTag && newTag !== 'im.vector.fake.direct' &&
(hasChangedSubLists || metaData)
) {
// metaData is the body of the PUT to set the tag, so it must
// at least be an empty object.
metaData = metaData || {};
const promiseToAdd = matrixClient.setRoomTag(roomId, newTag, metaData).catch(function(err) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + newTag + " to room: " + err);
Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, {
title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
throw err;
});
promises.push(promiseToAdd);
}
return Promise.all(promises);
}, () => {
// For an optimistic update
return {
room, oldTag, newTag, metaData,
};
});
};
export default RoomListActions;

View File

@ -35,6 +35,7 @@ const TagOrderActions = {};
TagOrderActions.moveTag = function(matrixClient, tag, destinationIx) {
// Only commit tags if the state is ready, i.e. not null
let tags = TagOrderStore.getOrderedTags();
let removedTags = TagOrderStore.getRemovedTagsAccountData() || [];
if (!tags) {
return;
}
@ -42,17 +43,66 @@ TagOrderActions.moveTag = function(matrixClient, tag, destinationIx) {
tags = tags.filter((t) => t !== tag);
tags = [...tags.slice(0, destinationIx), tag, ...tags.slice(destinationIx)];
removedTags = removedTags.filter((t) => t !== tag);
const storeId = TagOrderStore.getStoreId();
return asyncAction('TagOrderActions.moveTag', () => {
Analytics.trackEvent('TagOrderActions', 'commitTagOrdering');
return matrixClient.setAccountData(
'im.vector.web.tag_ordering',
{tags, _storeId: storeId},
{tags, removedTags, _storeId: storeId},
);
}, () => {
// For an optimistic update
return {tags};
return {tags, removedTags};
});
};
/**
* Creates an action thunk that will do an asynchronous request to
* label a tag as removed in im.vector.web.tag_ordering account data.
*
* The reason this is implemented with new state `removedTags` is that
* we incrementally and initially populate `tags` with groups that
* have been joined. If we remove a group from `tags`, it will just
* get added (as it looks like a group we've recently joined).
*
* NB: If we ever support adding of tags (which is planned), we should
* take special care to remove the tag from `removedTags` when we add
* it.
*
* @param {MatrixClient} matrixClient the matrix client to set the
* account data on.
* @param {string} tag the tag to remove.
* @returns {function} an action thunk that will dispatch actions
* indicating the status of the request.
* @see asyncAction
*/
TagOrderActions.removeTag = function(matrixClient, tag) {
// Don't change tags, just removedTags
const tags = TagOrderStore.getOrderedTags();
const removedTags = TagOrderStore.getRemovedTagsAccountData() || [];
if (removedTags.includes(tag)) {
// Return a thunk that doesn't do anything, we don't even need
// an asynchronous action here, the tag is already removed.
return () => {};
}
removedTags.push(tag);
const storeId = TagOrderStore.getStoreId();
return asyncAction('TagOrderActions.removeTag', () => {
Analytics.trackEvent('TagOrderActions', 'removeTag');
return matrixClient.setAccountData(
'im.vector.web.tag_ordering',
{tags, removedTags, _storeId: storeId},
);
}, () => {
// For an optimistic update
return {removedTags};
});
};

View File

@ -31,6 +31,15 @@ limitations under the License.
* `${id}.pending` and either
* `${id}.success` or
* `${id}.failure`.
*
* The shape of each are:
* { action: '${id}.pending', request }
* { action: '${id}.success', result }
* { action: '${id}.failure', err }
*
* where `request` is returned by `pendingFn` and
* result is the result of the promise returned by
* `fn`.
*/
export function asyncAction(id, fn, pendingFn) {
return (dispatch) => {

View File

@ -72,6 +72,7 @@ export default class UserProvider extends AutocompleteProvider {
// updates from pagination will happen when the paginate completes.
if (toStartOfTimeline || !data || !data.liveEvent) return;
// TODO: lazyload if we have no ev.sender room member?
this.onUserSpoke(ev.sender);
}
@ -147,6 +148,7 @@ export default class UserProvider extends AutocompleteProvider {
onUserSpoke(user: RoomMember) {
if (this.users === null) return;
if (!user) return;
if (user.userId === MatrixClientPeg.get().credentials.userId) return;
// Move the user that spoke to the front of the array
@ -158,7 +160,7 @@ export default class UserProvider extends AutocompleteProvider {
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate">
return <div className="mx_Autocomplete_Completion_container_pill">
{ completions }
</div>;
}

View File

@ -29,6 +29,7 @@ import classnames from 'classnames';
import GroupStoreCache from '../../stores/GroupStoreCache';
import GroupStore from '../../stores/GroupStore';
import FlairStore from '../../stores/FlairStore';
import { showGroupAddRoomDialog } from '../../GroupAddressPicker';
import GeminiScrollbar from 'react-gemini-scrollbar';
import {makeGroupPermalink, makeUserPermalink} from "../../matrix-to";
@ -429,6 +430,7 @@ export default React.createClass({
editing: false,
saving: false,
uploadingAvatar: false,
avatarChanged: false,
membershipBusy: false,
publicityBusy: false,
inviterProfile: null,
@ -590,6 +592,10 @@ export default React.createClass({
this.setState({
uploadingAvatar: false,
profileForm: newProfileForm,
// Indicate that FlairStore needs to be poked to show this change
// in TagTile (TagPanel), Flair and GroupTile (MyGroups).
avatarChanged: true,
});
}).catch((e) => {
this.setState({uploadingAvatar: false});
@ -615,6 +621,11 @@ export default React.createClass({
});
dis.dispatch({action: 'panel_disable'});
this._initGroupStore(this.props.groupId);
if (this.state.avatarChanged) {
// XXX: Evil - poking a store should be done from an async action
FlairStore.refreshGroupProfile(this._matrixClient, this.props.groupId);
}
}).catch((e) => {
this.setState({
saving: false,
@ -625,6 +636,10 @@ export default React.createClass({
title: _t('Error'),
description: _t('Failed to update community'),
});
}).finally(() => {
this.setState({
avatarChanged: false,
});
}).done();
},
@ -692,8 +707,15 @@ export default React.createClass({
});
const header = this.state.editing ? <h2> { _t('Community Settings') } </h2> : <div />;
const changeDelayWarning = this.state.editing && this.state.isUserPrivileged ?
<div className="mx_GroupView_changeDelayWarning">
{ _t( 'Changes made to your community might not be seen by other users ' +
'for up to 30 minutes.',
) }
</div> : <div />;
return <div className={groupSettingsSectionClasses}>
{ header }
{ changeDelayWarning }
{ this._getLongDescriptionNode() }
{ this._getRoomsNode() }
</div>;

View File

@ -19,6 +19,7 @@ limitations under the License.
import * as Matrix from 'matrix-js-sdk';
import React from 'react';
import PropTypes from 'prop-types';
import { DragDropContext } from 'react-beautiful-dnd';
import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../Keyboard';
import Notifier from '../../Notifier';
@ -30,6 +31,9 @@ import sessionStore from '../../stores/SessionStore';
import MatrixClientPeg from '../../MatrixClientPeg';
import SettingsStore from "../../settings/SettingsStore";
import TagOrderActions from '../../actions/TagOrderActions';
import RoomListActions from '../../actions/RoomListActions';
/**
* This is what our MatrixChat shows when we are logged in. The precise view is
* determined by the page_type property.
@ -207,8 +211,51 @@ const LoggedInView = React.createClass({
}
},
_onDragEnd: function(result) {
// Dragged to an invalid destination, not onto a droppable
if (!result.destination) {
return;
}
const dest = result.destination.droppableId;
if (dest === 'tag-panel-droppable') {
// Could be "GroupTile +groupId:domain"
const draggableId = result.draggableId.split(' ').pop();
// Dispatch synchronously so that the TagPanel receives an
// optimistic update from TagOrderStore before the previous
// state is shown.
dis.dispatch(TagOrderActions.moveTag(
this._matrixClient,
draggableId,
result.destination.index,
), true);
} else if (dest.startsWith('room-sub-list-droppable_')) {
this._onRoomTileEndDrag(result);
}
},
_onRoomTileEndDrag: function(result) {
let newTag = result.destination.droppableId.split('_')[1];
let prevTag = result.source.droppableId.split('_')[1];
if (newTag === 'undefined') newTag = undefined;
if (prevTag === 'undefined') prevTag = undefined;
const roomId = result.draggableId.split('_')[1];
const oldIndex = result.source.index;
const newIndex = result.destination.index;
dis.dispatch(RoomListActions.tagRoom(
this._matrixClient,
this._matrixClient.getRoom(roomId),
prevTag, newTag,
oldIndex, newIndex,
), true);
},
render: function() {
const TagPanel = sdk.getComponent('structures.TagPanel');
const LeftPanel = sdk.getComponent('structures.LeftPanel');
const RightPanel = sdk.getComponent('structures.RightPanel');
const RoomView = sdk.getComponent('structures.RoomView');
@ -329,17 +376,18 @@ const LoggedInView = React.createClass({
return (
<div className='mx_MatrixChat_wrapper'>
{ topBar }
<div className={bodyClasses}>
{ SettingsStore.isFeatureEnabled("feature_tag_panel") ? <TagPanel /> : <div /> }
<LeftPanel
collapsed={this.props.collapseLhs || false}
disabled={this.props.leftDisabled}
/>
<main className='mx_MatrixChat_middlePanel'>
{ page_element }
</main>
{ right_panel }
</div>
<DragDropContext onDragEnd={this._onDragEnd}>
<div className={bodyClasses}>
<LeftPanel
collapsed={this.props.collapseLhs || false}
disabled={this.props.leftDisabled}
/>
<main className='mx_MatrixChat_middlePanel'>
{ page_element }
</main>
{ right_panel }
</div>
</DragDropContext>
</div>
);
},

View File

@ -1171,18 +1171,6 @@ export default React.createClass({
cli.on("crypto.warning", (type) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
switch (type) {
case 'CRYPTO_WARNING_ACCOUNT_MIGRATED':
Modal.createTrackedDialog('Crypto migrated', '', ErrorDialog, {
title: _t('Cryptography data migrated'),
description: _t(
"A one-off migration of cryptography data has been performed. "+
"End-to-end encryption will not work if you go back to an older "+
"version of Riot. If you need to use end-to-end cryptography on "+
"an older version, log out of Riot first. To retain message history, "+
"export and re-import your keys.",
),
});
break;
case 'CRYPTO_WARNING_OLD_VERSION_DETECTED':
Modal.createTrackedDialog('Crypto migrated', '', ErrorDialog, {
title: _t('Old cryptography data detected'),

View File

@ -73,8 +73,25 @@ export default withMatrixClient(React.createClass({
});
contentHeader = groupNodes.length > 0 ? <h3>{ _t('Your Communities') }</h3> : <div />;
content = groupNodes.length > 0 ?
<GeminiScrollbar className="mx_MyGroups_joinedGroups">
{ groupNodes }
<GeminiScrollbar>
<div className="mx_MyGroups_microcopy">
<p>
{ _t(
"Did you know: you can use communities to filter your Riot.im experience!",
) }
</p>
<p>
{ _t(
"To set up a filter, drag a community avatar over to the filter panel on " +
"the far left hand side of the screen. You can click on an avatar in the " +
"filter panel at any time to see only the rooms and people associated " +
"with that community.",
) }
</p>
</div>
<div className="mx_MyGroups_joinedGroups">
{ groupNodes }
</div>
</GeminiScrollbar> :
<div className="mx_MyGroups_placeholder">
{ _t(

View File

@ -627,8 +627,8 @@ module.exports = React.createClass({
const room = this.state.room;
if (!room) return;
const color_scheme = SettingsStore.getValue("roomColor", room.room_id);
console.log("Tinter.tint from updateTint");
const color_scheme = SettingsStore.getValue("roomColor", room.roomId);
Tinter.tint(color_scheme.primary_color, color_scheme.secondary_color);
},
@ -677,23 +677,7 @@ module.exports = React.createClass({
// a member state changed in this room
// refresh the conf call notification state
this._updateConfCallNotification();
// if we are now a member of the room, where we were not before, that
// means we have finished joining a room we were previously peeking
// into.
const me = MatrixClientPeg.get().credentials.userId;
if (this.state.joining && this.state.room.hasMembershipState(me, "join")) {
// Having just joined a room, check to see if it looks like a DM room, and if so,
// mark it as one. This is to work around the fact that some clients don't support
// is_direct. We should remove this once they do.
const me = this.state.room.getMember(MatrixClientPeg.get().credentials.userId);
if (Rooms.looksLikeDirectMessageRoom(this.state.room, me)) {
// XXX: There's not a whole lot we can really do if this fails: at best
// perhaps we could try a couple more times, but since it's a temporary
// compatability workaround, let's not bother.
Rooms.setDMRoom(this.state.room.roomId, me.events.member.getSender()).done();
}
}
this._updateDMState();
}, 500),
_checkIfAlone: function(room) {
@ -734,6 +718,44 @@ module.exports = React.createClass({
});
},
_updateDMState() {
const me = this.state.room.getMember(MatrixClientPeg.get().credentials.userId);
if (!me || me.membership !== "join") {
return;
}
// The user may have accepted an invite with is_direct set
if (me.events.member.getPrevContent().membership === "invite" &&
me.events.member.getPrevContent().is_direct
) {
// This is a DM with the sender of the invite event (which we assume
// preceded the join event)
Rooms.setDMRoom(
this.state.room.roomId,
me.events.member.getUnsigned().prev_sender,
);
return;
}
const invitedMembers = this.state.room.getMembersWithMembership("invite");
const joinedMembers = this.state.room.getMembersWithMembership("join");
// There must be one invited member and one joined member
if (invitedMembers.length !== 1 || joinedMembers.length !== 1) {
return;
}
// The user may have sent an invite with is_direct sent
const other = invitedMembers[0];
if (other &&
other.membership === "invite" &&
other.events.member.getContent().is_direct
) {
Rooms.setDMRoom(this.state.room.roomId, other.userId);
return;
}
},
onSearchResultsResize: function() {
dis.dispatch({ action: 'timeline_resize' }, true);
},
@ -826,18 +848,6 @@ module.exports = React.createClass({
action: 'join_room',
opts: { inviteSignUrl: signUrl },
});
// if this is an invite and has the 'direct' hint set, mark it as a DM room now.
if (this.state.room) {
const me = this.state.room.getMember(MatrixClientPeg.get().credentials.userId);
if (me && me.membership == 'invite') {
if (me.events.member.getContent().is_direct) {
// The 'direct' hint is there, so declare that this is a DM room for
// whoever invited us.
return Rooms.setDMRoom(this.state.room.roomId, me.events.member.getSender());
}
}
}
return Promise.resolve();
});
},

View File

@ -17,15 +17,16 @@ limitations under the License.
import React from 'react';
import PropTypes from 'prop-types';
import { MatrixClient } from 'matrix-js-sdk';
import GeminiScrollbar from 'react-gemini-scrollbar';
import TagOrderStore from '../../stores/TagOrderStore';
import GroupActions from '../../actions/GroupActions';
import TagOrderActions from '../../actions/TagOrderActions';
import sdk from '../../index';
import dis from '../../dispatcher';
import { _t } from '../../languageHandler';
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
import { Droppable } from 'react-beautiful-dnd';
const TagPanel = React.createClass({
displayName: 'TagPanel',
@ -44,7 +45,7 @@ const TagPanel = React.createClass({
componentWillMount: function() {
this.unmounted = false;
this.context.matrixClient.on("Group.myMembership", this._onGroupMyMembership);
this.context.matrixClient.on("sync", this.onClientSync);
this.context.matrixClient.on("sync", this._onClientSync);
this._tagOrderStoreToken = TagOrderStore.addListener(() => {
if (this.unmounted) {
@ -62,7 +63,7 @@ const TagPanel = React.createClass({
componentWillUnmount() {
this.unmounted = true;
this.context.matrixClient.removeListener("Group.myMembership", this._onGroupMyMembership);
this.context.matrixClient.removeListener("sync", this.onClientSync);
this.context.matrixClient.removeListener("sync", this._onClientSync);
if (this._filterStoreToken) {
this._filterStoreToken.remove();
}
@ -73,7 +74,7 @@ const TagPanel = React.createClass({
dis.dispatch(GroupActions.fetchJoinedGroups(this.context.matrixClient));
},
onClientSync(syncState, prevState) {
_onClientSync(syncState, prevState) {
// Consider the client reconnected if there is no error with syncing.
// This means the state could be RECONNECTING, SYNCING or PREPARED.
const reconnected = syncState !== "ERROR" && prevState !== syncState;
@ -83,9 +84,7 @@ const TagPanel = React.createClass({
}
},
onClick(e) {
// Ignore clicks on children
if (e.target !== e.currentTarget) return;
onMouseDown(e) {
dis.dispatch({action: 'deselect_tags'});
},
@ -94,26 +93,15 @@ const TagPanel = React.createClass({
dis.dispatch({action: 'view_create_group'});
},
onTagTileEndDrag(result) {
// Dragged to an invalid destination, not onto a droppable
if (!result.destination) {
return;
}
// Dispatch synchronously so that the TagPanel receives an
// optimistic update from TagOrderStore before the previous
// state is shown.
dis.dispatch(TagOrderActions.moveTag(
this.context.matrixClient,
result.draggableId,
result.destination.index,
), true);
onClearFilterClick(ev) {
dis.dispatch({action: 'deselect_tags'});
},
render() {
const GroupsButton = sdk.getComponent('elements.GroupsButton');
const DNDTagTile = sdk.getComponent('elements.DNDTagTile');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
const TintableSvg = sdk.getComponent('elements.TintableSvg');
const DNDTagTile = sdk.getComponent('elements.DNDTagTile');
const tags = this.state.orderedTags.map((tag, index) => {
return <DNDTagTile
@ -123,28 +111,45 @@ const TagPanel = React.createClass({
selected={this.state.selectedTags.includes(tag)}
/>;
});
const clearButton = this.state.selectedTags.length > 0 ?
<TintableSvg src="img/icons-close.svg" width="24" height="24"
alt={_t("Clear filter")}
title={_t("Clear filter")}
/> :
<div />;
return <div className="mx_TagPanel">
<DragDropContext onDragEnd={this.onTagTileEndDrag}>
<Droppable droppableId="tag-panel-droppable">
<AccessibleButton className="mx_TagPanel_clearButton" onClick={this.onClearFilterClick}>
{ clearButton }
</AccessibleButton>
<div className="mx_TagPanel_divider" />
<GeminiScrollbar
className="mx_TagPanel_scroller"
autoshow={true}
// XXX: Use onMouseDown as a workaround for https://github.com/atlassian/react-beautiful-dnd/issues/273
// instead of onClick. Otherwise we experience https://github.com/vector-im/riot-web/issues/6253
onMouseDown={this.onMouseDown}
>
<Droppable
droppableId="tag-panel-droppable"
type="draggable-TagTile"
>
{ (provided, snapshot) => (
<div
className="mx_TagPanel_tagTileContainer"
ref={provided.innerRef}
// react-beautiful-dnd has a bug that emits a click to the parent
// of draggables upon dropping
// https://github.com/atlassian/react-beautiful-dnd/issues/273
// so we use onMouseDown here as a workaround.
onMouseDown={this.onClick}
>
{ tags }
{ provided.placeholder }
</div>
<div
className="mx_TagPanel_tagTileContainer"
ref={provided.innerRef}
>
{ tags }
{ provided.placeholder }
</div>
) }
</Droppable>
</DragDropContext>
<AccessibleButton className="mx_TagPanel_createGroupButton" onClick={this.onCreateGroupClick}>
<TintableSvg src="img/icons-create-room.svg" width="25" height="25" />
</AccessibleButton>
</GeminiScrollbar>
<div className="mx_TagPanel_divider" />
<div className="mx_TagPanel_createGroupButton">
<GroupsButton tooltip={true} />
</div>
</div>;
},
});

View File

@ -624,6 +624,7 @@ var TimelinePanel = React.createClass({
this.props.timelineSet.room.setUnreadNotificationCount('highlight', 0);
dis.dispatch({
action: 'on_room_read',
roomId: this.props.timelineSet.room.roomId,
});
}
}
@ -1121,9 +1122,9 @@ var TimelinePanel = React.createClass({
// exist.
if (this.state.timelineLoading) {
return (
<div className={this.props.className + " mx_RoomView_messageListWrapper"}>
<Loader />
</div>
<div className="mx_RoomView_messagePanelSpinner">
<Loader />
</div>
);
}

View File

@ -79,6 +79,7 @@ const SIMPLE_SETTINGS = [
{ id: "Pill.shouldHidePillAvatar" },
{ id: "TextualBody.disableBigEmoji" },
{ id: "VideoView.flipVideoHorizontally" },
{ id: "TagPanel.disableTagPanel" },
];
// These settings must be defined in SettingsStore

View File

@ -431,10 +431,10 @@ module.exports = React.createClass({
// FIXME: remove status.im theme tweaks
const theme = SettingsStore.getValue("theme");
if (theme !== "status") {
header = <h2>{ _t('Sign in') }</h2>;
header = <h2>{ _t('Sign in') } { loader }</h2>;
} else {
if (!this.state.errorText) {
header = <h2>{ _t('Sign in to get started') }</h2>;
header = <h2>{ _t('Sign in to get started') } { loader }</h2>;
}
}

View File

@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -82,7 +83,7 @@ module.exports = React.createClass({
}
},
onClientSync(syncState, prevState) {
onClientSync: function(syncState, prevState) {
if (this.unmounted) return;
// Consider the client reconnected if there is no error with syncing.

View File

@ -48,12 +48,33 @@ module.exports = React.createClass({
};
},
componentWillMount: function() {
MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents);
},
componentWillUnmount: function() {
const cli = MatrixClientPeg.get();
if (cli) {
cli.removeListener("RoomState.events", this.onRoomStateEvents);
}
},
componentWillReceiveProps: function(newProps) {
this.setState({
urls: this.getImageUrls(newProps),
});
},
onRoomStateEvents: function(ev) {
if (ev.getRoomId() !== this.props.room.roomId ||
ev.getType() !== 'm.room.avatar'
) return;
this.setState({
urls: this.getImageUrls(this.props),
});
},
getImageUrls: function(props) {
return [
ContentRepo.getHttpUriForMxc(

View File

@ -59,6 +59,7 @@ export default class ChatCreateOrReuseDialog extends React.Component {
);
tiles.push(
<RoomTile key={room.roomId} room={room}
transparent={true}
collapsed={false}
selected={false}
unread={Unread.doesRoomHaveUnreadMessages(room)}

View File

@ -393,6 +393,10 @@ export default React.createClass({
const sandboxFlags = "allow-forms allow-popups allow-popups-to-escape-sandbox "+
"allow-same-origin allow-scripts allow-presentation";
// Additional iframe feature pemissions
// (see - https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-permissions-in-cross-origin-iframes and https://wicg.github.io/feature-policy/)
const iframeFeatures = "microphone; camera; encrypted-media;";
if (this.props.show) {
const loadingElement = (
<div className='mx_AppTileBody mx_AppLoading'>
@ -412,7 +416,13 @@ export default React.createClass({
appTileBody = (
<div className={this.state.loading ? 'mx_AppTileBody mx_AppLoading' : 'mx_AppTileBody'}>
{ this.state.loading && loadingElement }
{ /*
The "is" attribute in the following iframe tag is needed in order to enable rendering of the
"allow" attribute, which is unknown to react 15.
*/ }
<iframe
is
allow={iframeFeatures}
ref="appFrame"
src={this._getSafeUrl()}
allowFullScreen="true"

View File

@ -25,6 +25,7 @@ export default function DNDTagTile(props) {
key={props.tag}
draggableId={props.tag}
index={props.index}
type="draggable-TagTile"
>
{ (provided, snapshot) => (
<div>

View File

@ -42,6 +42,9 @@ module.exports = React.createClass({
// should the user be able to change the value? false by default.
disabled: PropTypes.bool,
onChange: PropTypes.func,
// Optional key to pass as the second argument to `onChange`
powerLevelKey: PropTypes.string,
},
getInitialState: function() {
@ -84,17 +87,17 @@ module.exports = React.createClass({
onSelectChange: function(event) {
this.setState({ custom: event.target.value === "SELECT_VALUE_CUSTOM" });
if (event.target.value !== "SELECT_VALUE_CUSTOM") {
this.props.onChange(event.target.value);
this.props.onChange(event.target.value, this.props.powerLevelKey);
}
},
onCustomBlur: function(event) {
this.props.onChange(parseInt(this.refs.custom.value));
this.props.onChange(parseInt(this.refs.custom.value), this.props.powerLevelKey);
},
onCustomKeyDown: function(event) {
if (event.key == "Enter") {
this.props.onChange(parseInt(this.refs.custom.value));
this.props.onChange(parseInt(this.refs.custom.value), this.props.powerLevelKey);
}
},

View File

@ -21,6 +21,7 @@ import { MatrixClient } from 'matrix-js-sdk';
import sdk from '../../../index';
import dis from '../../../dispatcher';
import { isOnlyCtrlOrCmdIgnoreShiftKeyEvent } from '../../../Keyboard';
import ContextualMenu from '../../structures/ContextualMenu';
import FlairStore from '../../../stores/FlairStore';
@ -54,20 +55,29 @@ export default React.createClass({
componentWillMount() {
this.unmounted = false;
if (this.props.tag[0] === '+') {
FlairStore.getGroupProfileCached(
this.context.matrixClient,
this.props.tag,
).then((profile) => {
if (this.unmounted) return;
this.setState({profile});
}).catch((err) => {
console.warn('Could not fetch group profile for ' + this.props.tag, err);
});
FlairStore.addListener('updateGroupProfile', this._onFlairStoreUpdated);
this._onFlairStoreUpdated();
}
},
componentWillUnmount() {
this.unmounted = true;
if (this.props.tag[0] === '+') {
FlairStore.removeListener('updateGroupProfile', this._onFlairStoreUpdated);
}
},
_onFlairStoreUpdated() {
if (this.unmounted) return;
FlairStore.getGroupProfileCached(
this.context.matrixClient,
this.props.tag,
).then((profile) => {
if (this.unmounted) return;
this.setState({profile});
}).catch((err) => {
console.warn('Could not fetch group profile for ' + this.props.tag, err);
});
},
onClick: function(e) {
@ -81,6 +91,35 @@ export default React.createClass({
});
},
onContextButtonClick: function(e) {
e.preventDefault();
e.stopPropagation();
// Hide the (...) immediately
this.setState({ hover: false });
const TagTileContextMenu = sdk.getComponent('context_menus.TagTileContextMenu');
const elementRect = e.target.getBoundingClientRect();
// The window X and Y offsets are to adjust position when zoomed in to page
const x = elementRect.right + window.pageXOffset + 3;
const chevronOffset = 12;
let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset);
y = y - (chevronOffset + 8); // where 8 is half the height of the chevron
const self = this;
ContextualMenu.createMenu(TagTileContextMenu, {
chevronOffset: chevronOffset,
left: x,
top: y,
tag: this.props.tag,
onFinished: function() {
self.setState({ menuDisplayed: false });
},
});
this.setState({ menuDisplayed: true });
},
onMouseOver: function() {
this.setState({hover: true});
},
@ -109,10 +148,21 @@ export default React.createClass({
const tip = this.state.hover ?
<RoomTooltip className="mx_TagTile_tooltip" label={name} /> :
<div />;
const contextButton = this.state.hover || this.state.menuDisplayed ?
<div className="mx_TagTile_context_button" onClick={this.onContextButtonClick}>
{ "\u00B7\u00B7\u00B7" }
</div> : <div />;
return <AccessibleButton className={className} onClick={this.onClick}>
<div className="mx_TagTile_avatar" onMouseOver={this.onMouseOver} onMouseOut={this.onMouseOut}>
<BaseAvatar name={name} url={httpUrl} width={avatarHeight} height={avatarHeight} />
<BaseAvatar
name={name}
idName={this.props.tag}
url={httpUrl}
width={avatarHeight}
height={avatarHeight}
/>
{ tip }
{ contextButton }
</div>
</AccessibleButton>;
},

View File

@ -132,7 +132,9 @@ module.exports = React.createClass({
render: function() {
if (this.state.removingUser) {
const Spinner = sdk.getComponent("elements.Spinner");
return <Spinner />;
return <div className="mx_MemberInfo">
<Spinner />
</div>;
}
let adminTools;

View File

@ -17,10 +17,12 @@ limitations under the License.
import React from 'react';
import PropTypes from 'prop-types';
import {MatrixClient} from 'matrix-js-sdk';
import { Draggable, Droppable } from 'react-beautiful-dnd';
import sdk from '../../../index';
import dis from '../../../dispatcher';
import FlairStore from '../../../stores/FlairStore';
const GroupTile = React.createClass({
displayName: 'GroupTile',
@ -57,7 +59,7 @@ const GroupTile = React.createClass({
});
},
onClick: function(e) {
onMouseDown: function(e) {
e.preventDefault();
dis.dispatch({
action: 'view_group',
@ -77,10 +79,52 @@ const GroupTile = React.createClass({
const httpUrl = profile.avatarUrl ? this.context.matrixClient.mxcUrlToHttp(
profile.avatarUrl, avatarHeight, avatarHeight, "crop",
) : null;
return <AccessibleButton className="mx_GroupTile" onClick={this.onClick}>
<div className="mx_GroupTile_avatar">
<BaseAvatar name={name} url={httpUrl} width={avatarHeight} height={avatarHeight} />
</div>
// XXX: Use onMouseDown as a workaround for https://github.com/atlassian/react-beautiful-dnd/issues/273
// instead of onClick. Otherwise we experience https://github.com/vector-im/riot-web/issues/6156
return <AccessibleButton className="mx_GroupTile" onMouseDown={this.onMouseDown}>
<Droppable droppableId="my-groups-droppable" type="draggable-TagTile">
{ (droppableProvided, droppableSnapshot) => (
<div ref={droppableProvided.innerRef}>
<Draggable
key={"GroupTile " + this.props.groupId}
draggableId={"GroupTile " + this.props.groupId}
index={this.props.groupId}
type="draggable-TagTile"
>
{ (provided, snapshot) => (
<div>
<div
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
<div className="mx_GroupTile_avatar">
<BaseAvatar
name={name}
idName={this.props.groupId}
url={httpUrl}
width={avatarHeight}
height={avatarHeight} />
</div>
</div>
{ /* Instead of a blank placeholder, use a copy of the avatar itself. */ }
{ provided.placeholder ?
<div className="mx_GroupTile_avatar">
<BaseAvatar
name={name}
idName={this.props.groupId}
url={httpUrl}
width={avatarHeight}
height={avatarHeight} />
</div> :
<div />
}
</div>
) }
</Draggable>
</div>
) }
</Droppable>
<div className="mx_GroupTile_profile">
<div className="mx_GroupTile_name">{ name }</div>
{ descElement }

View File

@ -82,7 +82,7 @@ Tinter.registerTintable(updateTintedDownloadImage);
// downloaded. This limit does not seem to apply when the url is used as
// the source attribute of an image tag.
//
// Blob URLs are generated using window.URL.createObjectURL and unforuntately
// Blob URLs are generated using window.URL.createObjectURL and unfortunately
// for our purposes they inherit the origin of the page that created them.
// This means that any scripts that run when the URL is viewed will be able
// to access local storage.

View File

@ -152,7 +152,17 @@ module.exports = withMatrixClient(React.createClass({
},
getInitialState: function() {
return {menu: false, allReadAvatars: false, verified: null};
return {
// Whether the context menu is being displayed.
menu: false,
// Whether all read receipts are being displayed. If not, only display
// a truncation of them.
allReadAvatars: false,
// Whether the event's sender has been verified.
verified: null,
// Whether onRequestKeysClick has been called since mounting.
previouslyRequestedKeys: false,
};
},
componentWillMount: function() {
@ -393,6 +403,19 @@ module.exports = withMatrixClient(React.createClass({
});
},
onRequestKeysClick: function() {
this.setState({
// Indicate in the UI that the keys have been requested (this is expected to
// be reset if the component is mounted in the future).
previouslyRequestedKeys: true,
});
// Cancel any outgoing key request for this event and resend it. If a response
// is received for the request with the required keys, the event could be
// decrypted successfully.
this.props.matrixClient.cancelAndResendEventRoomKeyRequest(this.props.mxEvent);
},
onPermalinkClicked: function(e) {
// This allows the permalink to be opened in a new tab/window or copied as
// matrix.to, but also for it to enable routing within Riot when clicked.
@ -458,6 +481,7 @@ module.exports = withMatrixClient(React.createClass({
const isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1);
const isRedacted = (eventType === 'm.room.message') && this.props.isRedacted;
const isEncryptionFailure = this.props.mxEvent.isDecryptionFailure();
const classes = classNames({
mx_EventTile: true,
@ -474,7 +498,7 @@ module.exports = withMatrixClient(React.createClass({
menu: this.state.menu,
mx_EventTile_verified: this.state.verified == true,
mx_EventTile_unverified: this.state.verified == false,
mx_EventTile_bad: msgtype === 'm.bad.encrypted',
mx_EventTile_bad: isEncryptionFailure,
mx_EventTile_emote: msgtype === 'm.emote',
mx_EventTile_redacted: isRedacted,
});
@ -534,6 +558,40 @@ module.exports = withMatrixClient(React.createClass({
const timestamp = this.props.mxEvent.getTs() ?
<MessageTimestamp showTwelveHour={this.props.isTwelveHour} ts={this.props.mxEvent.getTs()} /> : null;
const keyRequestHelpText =
<div className="mx_EventTile_keyRequestInfo_tooltip_contents">
<p>
{ this.state.previouslyRequestedKeys ?
_t( 'Your key share request has been sent - please check your other devices ' +
'for key share requests.') :
_t( 'Key share requests are sent to your other devices automatically. If you ' +
'rejected or dismissed the key share request on your other devices, click ' +
'here to request the keys for this session again.')
}
</p>
<p>
{ _t( 'If your other devices do not have the key for this message you will not ' +
'be able to decrypt them.')
}
</p>
</div>;
const keyRequestInfoContent = this.state.previouslyRequestedKeys ?
_t('Key request sent.') :
_t(
'<requestLink>Re-request encryption keys</requestLink> from your other devices.',
{},
{'requestLink': (sub) => <a onClick={this.onRequestKeysClick}>{ sub }</a>},
);
const ToolTipButton = sdk.getComponent('elements.ToolTipButton');
const keyRequestInfo = isEncryptionFailure ?
<div className="mx_EventTile_keyRequestInfo">
<span className="mx_EventTile_keyRequestInfo_text">
{ keyRequestInfoContent }
</span>
<ToolTipButton helpText={keyRequestHelpText} />
</div> : null;
switch (this.props.tileShape) {
case 'notif': {
const room = this.props.matrixClient.getRoom(this.props.mxEvent.getRoomId());
@ -627,6 +685,7 @@ module.exports = withMatrixClient(React.createClass({
highlightLink={this.props.highlightLink}
showUrlPreview={this.props.showUrlPreview}
onWidgetLoad={this.props.onWidgetLoad} />
{ keyRequestInfo }
{ editButton }
</div>
</div>

View File

@ -754,6 +754,7 @@ module.exports = withMatrixClient(React.createClass({
tiles.push(
<RoomTile key={room.roomId} room={room}
transparent={true}
collapsed={false}
selected={false}
unread={Unread.doesRoomHaveUnreadMessages(room)}

View File

@ -18,7 +18,6 @@ limitations under the License.
'use strict';
const React = require("react");
const ReactDOM = require("react-dom");
import { DragDropContext } from 'react-beautiful-dnd';
import PropTypes from 'prop-types';
import { _t } from '../../../languageHandler';
const GeminiScrollbar = require('react-gemini-scrollbar');
@ -27,15 +26,15 @@ const CallHandler = require('../../../CallHandler');
const dis = require("../../../dispatcher");
const sdk = require('../../../index');
const rate_limited_func = require('../../../ratelimitedfunc');
const Rooms = require('../../../Rooms');
import * as Rooms from '../../../Rooms';
import DMRoomMap from '../../../utils/DMRoomMap';
const Receipt = require('../../../utils/Receipt');
import TagOrderStore from '../../../stores/TagOrderStore';
import RoomListStore from '../../../stores/RoomListStore';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import Modal from '../../../Modal';
const HIDE_CONFERENCE_CHANS = true;
const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/;
function phraseForSection(section) {
switch (section) {
@ -78,11 +77,7 @@ module.exports = React.createClass({
cli.on("Room", this.onRoom);
cli.on("deleteRoom", this.onDeleteRoom);
cli.on("Room.timeline", this.onRoomTimeline);
cli.on("Room.name", this.onRoomName);
cli.on("Room.tags", this.onRoomTags);
cli.on("Room.receipt", this.onRoomReceipt);
cli.on("RoomState.events", this.onRoomStateEvents);
cli.on("RoomMember.name", this.onRoomMemberName);
cli.on("Event.decrypted", this.onEventDecrypted);
cli.on("accountData", this.onAccountData);
@ -118,6 +113,10 @@ module.exports = React.createClass({
this.updateVisibleRooms();
});
this._roomListStoreToken = RoomListStore.addListener(() => {
this._delayedRefreshRoomList();
});
this.refreshRoomList();
// order of the sublists
@ -160,12 +159,6 @@ module.exports = React.createClass({
});
}
break;
case 'on_room_read':
// Force an update because the notif count state is too deep to cause
// an update. This forces the local echo of reading notifs to be
// reflected by the RoomTiles.
this.forceUpdate();
break;
}
},
@ -176,11 +169,7 @@ module.exports = React.createClass({
if (MatrixClientPeg.get()) {
MatrixClientPeg.get().removeListener("Room", this.onRoom);
MatrixClientPeg.get().removeListener("deleteRoom", this.onDeleteRoom);
MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
MatrixClientPeg.get().removeListener("Room.tags", this.onRoomTags);
MatrixClientPeg.get().removeListener("Room.receipt", this.onRoomReceipt);
MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents);
MatrixClientPeg.get().removeListener("RoomMember.name", this.onRoomMemberName);
MatrixClientPeg.get().removeListener("Event.decrypted", this.onEventDecrypted);
MatrixClientPeg.get().removeListener("accountData", this.onAccountData);
@ -191,6 +180,10 @@ module.exports = React.createClass({
this._tagStoreToken.remove();
}
if (this._roomListStoreToken) {
this._roomListStoreToken.remove();
}
if (this._groupStoreTokens.length > 0) {
// NB: GroupStore is not a Flux.Store
this._groupStoreTokens.forEach((token) => token.unregister());
@ -232,13 +225,6 @@ module.exports = React.createClass({
this._updateStickyHeaders(true, scrollToPosition);
},
onRoomTimeline: function(ev, room, toStartOfTimeline, removed, data) {
if (toStartOfTimeline) return;
if (!room) return;
if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;
this._delayedRefreshRoomList();
},
onRoomReceipt: function(receiptEvent, room) {
// because if we read a notification, it will affect notification count
// only bother updating if there's a receipt from us
@ -247,18 +233,6 @@ module.exports = React.createClass({
}
},
onRoomName: function(room) {
this._delayedRefreshRoomList();
},
onRoomTags: function(event, room) {
this._delayedRefreshRoomList();
},
onRoomStateEvents: function(ev, state) {
this._delayedRefreshRoomList();
},
onRoomMemberName: function(ev, member) {
this._delayedRefreshRoomList();
},
@ -278,106 +252,6 @@ module.exports = React.createClass({
this.forceUpdate();
},
onRoomTileEndDrag: function(result) {
if (!result.destination) return;
let newTag = result.destination.droppableId.split('_')[1];
let prevTag = result.source.droppableId.split('_')[1];
if (newTag === 'undefined') newTag = undefined;
if (prevTag === 'undefined') prevTag = undefined;
const roomId = result.draggableId.split('_')[1];
const room = MatrixClientPeg.get().getRoom(roomId);
const newIndex = result.destination.index;
// Evil hack to get DMs behaving
if ((prevTag === undefined && newTag === 'im.vector.fake.direct') ||
(prevTag === 'im.vector.fake.direct' && newTag === undefined)
) {
Rooms.guessAndSetDMRoom(
room, newTag === 'im.vector.fake.direct',
).catch((err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to set direct chat tag " + err);
Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, {
title: _t('Failed to set direct chat tag'),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
return;
}
const hasChangedSubLists = result.source.droppableId !== result.destination.droppableId;
let newOrder = null;
// Is the tag ordered manually?
if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) {
const newList = this.state.lists[newTag];
// If the room was moved "down" (increasing index) in the same list we
// need to use the orders of the tiles with indices shifted by +1
const offset = (
newTag === prevTag && result.source.index < result.destination.index
) ? 1 : 0;
const indexBefore = offset + newIndex - 1;
const indexAfter = offset + newIndex;
const prevOrder = indexBefore < 0 ?
0 : newList[indexBefore].tags[newTag].order;
const nextOrder = indexAfter >= newList.length ?
1 : newList[indexAfter].tags[newTag].order;
newOrder = {
order: (prevOrder + nextOrder) / 2.0,
};
}
// More evilness: We will still be dealing with moving to favourites/low prio,
// but we avoid ever doing a request with 'im.vector.fake.direct`.
//
// if we moved lists, remove the old tag
if (prevTag && prevTag !== 'im.vector.fake.direct' &&
hasChangedSubLists
) {
// Optimistic update of what will happen to the room tags
delete room.tags[prevTag];
MatrixClientPeg.get().deleteRoomTag(roomId, prevTag).catch(function(err) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to remove tag " + prevTag + " from room: " + err);
Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, {
title: _t('Failed to remove tag %(tagName)s from room', {tagName: prevTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
// if we moved lists or the ordering changed, add the new tag
if (newTag && newTag !== 'im.vector.fake.direct' &&
(hasChangedSubLists || newOrder)
) {
// Optimistic update of what will happen to the room tags
room.tags[newTag] = newOrder;
MatrixClientPeg.get().setRoomTag(roomId, newTag, newOrder).catch(function(err) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + newTag + " to room: " + err);
Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, {
title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
// Refresh to display the optimistic updates - this needs to be done in the
// same tick as the drag finishing otherwise the room will pop back to its
// previous position - hence no delayed refresh
this.refreshRoomList();
},
_delayedRefreshRoomList: new rate_limited_func(function() {
this.refreshRoomList();
}, 500),
@ -441,7 +315,7 @@ module.exports = React.createClass({
totalRooms += l.length;
}
this.setState({
lists: this.getRoomLists(),
lists,
totalRoomCount: totalRooms,
// Do this here so as to not render every time the selected tags
// themselves change.
@ -452,70 +326,38 @@ module.exports = React.createClass({
},
getRoomLists: function() {
const lists = {};
lists["im.vector.fake.invite"] = [];
lists["m.favourite"] = [];
lists["im.vector.fake.recent"] = [];
lists["im.vector.fake.direct"] = [];
lists["m.lowpriority"] = [];
lists["im.vector.fake.archived"] = [];
const lists = RoomListStore.getRoomLists();
const dmRoomMap = DMRoomMap.shared();
const filteredLists = {};
this._visibleRooms.forEach((room, index) => {
const me = room.getMember(MatrixClientPeg.get().credentials.userId);
if (!me) return;
const isRoomVisible = {
// $roomId: true,
};
// console.log("room = " + room.name + ", me.membership = " + me.membership +
// ", sender = " + me.events.member.getSender() +
// ", target = " + me.events.member.getStateKey() +
// ", prevMembership = " + me.events.member.getPrevContent().membership);
this._visibleRooms.forEach((r) => {
isRoomVisible[r.roomId] = true;
});
if (me.membership == "invite") {
lists["im.vector.fake.invite"].push(room);
} else if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(room, me, this.props.ConferenceHandler)) {
// skip past this room & don't put it in any lists
} else if (me.membership == "join" || me.membership === "ban" ||
(me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) {
// Used to split rooms via tags
const tagNames = Object.keys(room.tags);
if (tagNames.length) {
for (let i = 0; i < tagNames.length; i++) {
const tagName = tagNames[i];
lists[tagName] = lists[tagName] || [];
lists[tagName].push(room);
}
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
lists["im.vector.fake.direct"].push(room);
} else {
lists["im.vector.fake.recent"].push(room);
Object.keys(lists).forEach((tagName) => {
const filteredRooms = lists[tagName].filter((taggedRoom) => {
// Somewhat impossible, but guard against it anyway
if (!taggedRoom) {
return;
}
} else if (me.membership === "leave") {
lists["im.vector.fake.archived"].push(room);
} else {
console.error("unrecognised membership: " + me.membership + " - this should never happen");
const me = taggedRoom.getMember(MatrixClientPeg.get().credentials.userId);
if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, me, this.props.ConferenceHandler)) {
return;
}
return Boolean(isRoomVisible[taggedRoom.roomId]);
});
if (filteredRooms.length > 0 || tagName.match(STANDARD_TAGS_REGEX)) {
filteredLists[tagName] = filteredRooms;
}
});
// we actually apply the sorting to this when receiving the prop in RoomSubLists.
// we'll need this when we get to iterating through lists programatically - e.g. ctrl-shift-up/down
/*
this.listOrder = [
"im.vector.fake.invite",
"m.favourite",
"im.vector.fake.recent",
"im.vector.fake.direct",
Object.keys(otherTagNames).filter(tagName=>{
return (!tagName.match(/^m\.(favourite|lowpriority)$/));
}).sort(),
"m.lowpriority",
"im.vector.fake.archived"
];
*/
return lists;
return filteredLists;
},
_getScrollNode: function() {
@ -684,17 +526,20 @@ module.exports = React.createClass({
const RoomDirectoryButton = sdk.getComponent('elements.RoomDirectoryButton');
const CreateRoomButton = sdk.getComponent('elements.CreateRoomButton');
let tip = null;
switch (section) {
case 'im.vector.fake.direct':
return <div className="mx_RoomList_emptySubListTip">
tip = <div className="mx_RoomList_emptySubListTip">
{ _t(
"Press <StartChatButton> to start a chat with someone",
{},
{ 'StartChatButton': <StartChatButton size="16" callout={true} /> },
) }
</div>;
break;
case 'im.vector.fake.recent':
return <div className="mx_RoomList_emptySubListTip">
tip = <div className="mx_RoomList_emptySubListTip">
{ _t(
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or"+
" <RoomDirectoryButton> to browse the directory",
@ -705,6 +550,13 @@ module.exports = React.createClass({
},
) }
</div>;
break;
}
if (tip) {
return <div className="mx_RoomList_emptySubListTip_container">
{ tip }
</div>;
}
// We don't want to display drop targets if there are no room tiles to drag'n'drop
@ -752,116 +604,114 @@ module.exports = React.createClass({
const self = this;
return (
<DragDropContext onDragEnd={this.onRoomTileEndDrag}>
<GeminiScrollbar className="mx_RoomList_scrollbar"
autoshow={true} onScroll={self._whenScrolling} ref="gemscroll">
<div className="mx_RoomList">
<RoomSubList list={[]}
extraTiles={this._makeGroupInviteTiles()}
label={_t('Community Invites')}
editable={false}
order="recent"
isInvite={true}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
/>
<GeminiScrollbar className="mx_RoomList_scrollbar"
autoshow={true} onScroll={self._whenScrolling} ref="gemscroll">
<div className="mx_RoomList">
<RoomSubList list={[]}
extraTiles={this._makeGroupInviteTiles()}
label={_t('Community Invites')}
editable={false}
order="recent"
isInvite={true}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
/>
<RoomSubList list={self.state.lists['im.vector.fake.invite']}
label={_t('Invites')}
editable={false}
order="recent"
isInvite={true}
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
/>
<RoomSubList list={self.state.lists['im.vector.fake.invite']}
label={_t('Invites')}
editable={false}
order="recent"
isInvite={true}
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
/>
<RoomSubList list={self.state.lists['m.favourite']}
label={_t('Favourites')}
tagName="m.favourite"
emptyContent={this._getEmptyContent('m.favourite')}
editable={true}
order="manual"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['m.favourite']}
label={_t('Favourites')}
tagName="m.favourite"
emptyContent={this._getEmptyContent('m.favourite')}
editable={true}
order="manual"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['im.vector.fake.direct']}
label={_t('People')}
tagName="im.vector.fake.direct"
emptyContent={this._getEmptyContent('im.vector.fake.direct')}
headerItems={this._getHeaderItems('im.vector.fake.direct')}
editable={true}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
alwaysShowHeader={true}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['im.vector.fake.direct']}
label={_t('People')}
tagName="im.vector.fake.direct"
emptyContent={this._getEmptyContent('im.vector.fake.direct')}
headerItems={this._getHeaderItems('im.vector.fake.direct')}
editable={true}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
alwaysShowHeader={true}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['im.vector.fake.recent']}
label={_t('Rooms')}
editable={true}
emptyContent={this._getEmptyContent('im.vector.fake.recent')}
headerItems={this._getHeaderItems('im.vector.fake.recent')}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['im.vector.fake.recent']}
label={_t('Rooms')}
editable={true}
emptyContent={this._getEmptyContent('im.vector.fake.recent')}
headerItems={this._getHeaderItems('im.vector.fake.recent')}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
{ Object.keys(self.state.lists).map((tagName) => {
if (!tagName.match(/^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/)) {
return <RoomSubList list={self.state.lists[tagName]}
key={tagName}
label={tagName}
tagName={tagName}
emptyContent={this._getEmptyContent(tagName)}
editable={true}
order="manual"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />;
}
}) }
{ Object.keys(self.state.lists).map((tagName) => {
if (!tagName.match(STANDARD_TAGS_REGEX)) {
return <RoomSubList list={self.state.lists[tagName]}
key={tagName}
label={tagName}
tagName={tagName}
emptyContent={this._getEmptyContent(tagName)}
editable={true}
order="manual"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />;
}
}) }
<RoomSubList list={self.state.lists['m.lowpriority']}
label={_t('Low priority')}
tagName="m.lowpriority"
emptyContent={this._getEmptyContent('m.lowpriority')}
editable={true}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['m.lowpriority']}
label={_t('Low priority')}
tagName="m.lowpriority"
emptyContent={this._getEmptyContent('m.lowpriority')}
editable={true}
order="recent"
incomingCall={self.state.incomingCall}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms} />
<RoomSubList list={self.state.lists['im.vector.fake.archived']}
label={_t('Historical')}
editable={false}
order="recent"
collapsed={self.props.collapsed}
alwaysShowHeader={true}
startAsHidden={true}
showSpinner={self.state.isLoadingLeftRooms}
onHeaderClick= {self.onArchivedHeaderClick}
incomingCall={self.state.incomingCall}
searchFilter={self.props.searchFilter}
onShowMoreRooms={self.onShowMoreRooms} />
</div>
</GeminiScrollbar>
</DragDropContext>
<RoomSubList list={self.state.lists['im.vector.fake.archived']}
label={_t('Historical')}
editable={false}
order="recent"
collapsed={self.props.collapsed}
alwaysShowHeader={true}
startAsHidden={true}
showSpinner={self.state.isLoadingLeftRooms}
onHeaderClick= {self.onArchivedHeaderClick}
incomingCall={self.state.incomingCall}
searchFilter={self.props.searchFilter}
onShowMoreRooms={self.onShowMoreRooms} />
</div>
</GeminiScrollbar>
);
},
});

View File

@ -29,13 +29,21 @@ module.exports = React.createClass({
room: PropTypes.object.isRequired,
},
getInitialState: function() {
return {
name: null,
};
},
componentWillMount: function() {
const room = this.props.room;
const name = room.currentState.getStateEvents('m.room.name', '');
const myId = MatrixClientPeg.get().credentials.userId;
const defaultName = room.getDefaultRoomName(myId);
this._initialName = name ? name.getContent().name : '';
this.setState({
name: name ? name.getContent().name : '',
});
this._placeholderName = _t("Unnamed Room");
if (defaultName && defaultName !== 'Empty room') { // default name from JS SDK, needs no translation as we don't ever show it.
@ -44,7 +52,13 @@ module.exports = React.createClass({
},
getRoomName: function() {
return this.refs.editor.getValue();
return this.state.name;
},
_onValueChanged: function(value, shouldSubmit) {
this.setState({
name: value,
});
},
render: function() {
@ -57,7 +71,8 @@ module.exports = React.createClass({
placeholderClassName="mx_RoomHeader_placeholder"
placeholder={this._placeholderName}
blurToCancel={false}
initialValue={this._initialName}
initialValue={this.state.name}
onValueChanged={this._onValueChanged}
dir="auto" />
</div>
);

View File

@ -117,7 +117,6 @@ module.exports = React.createClass({
propTypes: {
room: PropTypes.object.isRequired,
onSaveClick: PropTypes.func,
},
getInitialState: function() {
@ -132,7 +131,8 @@ module.exports = React.createClass({
join_rule: this._yankValueFromEvent("m.room.join_rules", "join_rule"),
history_visibility: this._yankValueFromEvent("m.room.history_visibility", "history_visibility"),
guest_access: this._yankValueFromEvent("m.room.guest_access", "guest_access"),
power_levels_changed: false,
powerLevels: this._yankContentFromEvent("m.room.power_levels", {}),
powerLevelsChanged: false,
tags_changed: false,
tags: tags,
// isRoomPublished is loaded async in componentWillMount so when the component
@ -151,7 +151,7 @@ module.exports = React.createClass({
MatrixClientPeg.get().getRoomDirectoryVisibility(
this.props.room.roomId,
).done((result) => {
).done((result = {}) => {
this.setState({ isRoomPublished: result.visibility === "public" });
this._originalIsRoomPublished = result.visibility === "public";
}, (err) => {
@ -272,8 +272,8 @@ module.exports = React.createClass({
// power levels
const powerLevels = this._getPowerLevels();
if (powerLevels) {
const powerLevels = this.state.powerLevels;
if (this.state.powerLevelsChanged) {
promises.push(MatrixClientPeg.get().sendStateEvent(
roomId, "m.room.power_levels", powerLevels, "",
));
@ -384,36 +384,32 @@ module.exports = React.createClass({
return strA !== strB;
},
_getPowerLevels: function() {
if (!this.state.power_levels_changed) return undefined;
onPowerLevelsChanged: function(value, powerLevelKey) {
const powerLevels = Object.assign({}, this.state.powerLevels);
const eventsLevelPrefix = "event_levels_";
let powerLevels = this.props.room.currentState.getStateEvents('m.room.power_levels', '');
powerLevels = powerLevels ? powerLevels.getContent() : {};
value = parseInt(value);
for (const key of Object.keys(this.refs).filter((k) => k.startsWith("event_levels_"))) {
const eventType = key.substring("event_levels_".length);
powerLevels.events[eventType] = parseInt(this.refs[key].getValue());
if (powerLevelKey.startsWith(eventsLevelPrefix)) {
// deep copy "events" object, Object.assign itself won't deep copy
powerLevels["events"] = Object.assign({}, this.state.powerLevels["events"] || {});
powerLevels["events"][powerLevelKey.slice(eventsLevelPrefix.length)] = value;
} else {
powerLevels[powerLevelKey] = value;
}
const newPowerLevels = {
ban: parseInt(this.refs.ban.getValue()),
kick: parseInt(this.refs.kick.getValue()),
redact: parseInt(this.refs.redact.getValue()),
invite: parseInt(this.refs.invite.getValue()),
events_default: parseInt(this.refs.events_default.getValue()),
state_default: parseInt(this.refs.state_default.getValue()),
users_default: parseInt(this.refs.users_default.getValue()),
users: powerLevels.users,
events: powerLevels.events,
};
return newPowerLevels;
this.setState({
powerLevels,
powerLevelsChanged: true,
});
},
onPowerLevelsChanged: function() {
this.setState({
power_levels_changed: true,
});
_yankContentFromEvent: function(stateEventType, defaultValue) {
// E.g.("m.room.name") would yank the content of "m.room.name"
const event = this.props.room.currentState.getStateEvents(stateEventType, '');
if (!event) {
return defaultValue;
}
return event.getContent() || defaultValue;
},
_yankValueFromEvent: function(stateEventType, keyName, defaultValue) {
@ -633,29 +629,61 @@ module.exports = React.createClass({
const cli = MatrixClientPeg.get();
const roomState = this.props.room.currentState;
const user_id = cli.credentials.userId;
const myUserId = cli.credentials.userId;
const power_level_event = roomState.getStateEvents('m.room.power_levels', '');
const power_levels = power_level_event ? power_level_event.getContent() : {};
const events_levels = power_levels.events || {};
const user_levels = power_levels.users || {};
const powerLevels = this.state.powerLevels;
const eventsLevels = powerLevels.events || {};
const userLevels = powerLevels.users || {};
const ban_level = parseIntWithDefault(power_levels.ban, 50);
const kick_level = parseIntWithDefault(power_levels.kick, 50);
const redact_level = parseIntWithDefault(power_levels.redact, 50);
const invite_level = parseIntWithDefault(power_levels.invite, 50);
const send_level = parseIntWithDefault(power_levels.events_default, 0);
const state_level = power_level_event ? parseIntWithDefault(power_levels.state_default, 50) : 0;
const default_user_level = parseIntWithDefault(power_levels.users_default, 0);
const powerLevelDescriptors = {
users_default: {
desc: _t('The default role for new room members is'),
defaultValue: 0,
},
events_default: {
desc: _t('To send messages, you must be a'),
defaultValue: 0,
},
invite: {
desc: _t('To invite users into the room, you must be a'),
defaultValue: 50,
},
state_default: {
desc: _t('To configure the room, you must be a'),
defaultValue: 50,
},
kick: {
desc: _t('To kick users, you must be a'),
defaultValue: 50,
},
ban: {
desc: _t('To ban users, you must be a'),
defaultValue: 50,
},
redact: {
desc: _t('To remove other users\' messages, you must be a'),
defaultValue: 50,
},
};
this._populateDefaultPlEvents(events_levels, state_level, send_level);
const banLevel = parseIntWithDefault(powerLevels.ban, powerLevelDescriptors.ban.defaultValue);
const defaultUserLevel = parseIntWithDefault(
powerLevels.users_default,
powerLevelDescriptors.users_default.defaultValue,
);
let current_user_level = user_levels[user_id];
if (current_user_level === undefined) {
current_user_level = default_user_level;
this._populateDefaultPlEvents(
eventsLevels,
parseIntWithDefault(powerLevels.state_default, powerLevelDescriptors.state_default.defaultValue),
parseIntWithDefault(powerLevels.events_default, powerLevelDescriptors.events_default.defaultValue),
);
let currentUserLevel = userLevels[myUserId];
if (currentUserLevel === undefined) {
currentUserLevel = defaultUserLevel;
}
const can_change_levels = roomState.mayClientSendStateEvent("m.room.power_levels", cli);
const canChangeLevels = roomState.mayClientSendStateEvent("m.room.power_levels", cli);
const canSetTag = !cli.isGuest();
@ -668,15 +696,18 @@ module.exports = React.createClass({
/>;
let userLevelsSection;
if (Object.keys(user_levels).length) {
if (Object.keys(userLevels).length) {
userLevelsSection =
<div>
<h3>{ _t('Privileged Users') }</h3>
<ul className="mx_RoomSettings_userLevels">
{ Object.keys(user_levels).map(function(user, i) {
{ Object.keys(userLevels).map(function(user, i) {
return (
<li className="mx_RoomSettings_userLevel" key={user}>
{ _t("%(user)s is a", {user: user}) } <PowerSelector value={user_levels[user]} disabled={true} />
{ _t("%(user)s is a %(userRole)s", {
user: user,
userRole: <PowerSelector value={userLevels[user]} disabled={true} />,
}) }
</li>
);
}) }
@ -689,7 +720,7 @@ module.exports = React.createClass({
const banned = this.props.room.getMembersWithMembership("ban");
let bannedUsersSection;
if (banned.length) {
const canBanUsers = current_user_level >= ban_level;
const canBanUsers = currentUserLevel >= banLevel;
bannedUsersSection =
<div>
<h3>{ _t('Banned users') }</h3>
@ -711,13 +742,13 @@ module.exports = React.createClass({
if (this._yankValueFromEvent("m.room.create", "m.federate", true) === false) {
unfederatableSection = (
<div className="mx_RoomSettings_powerLevel">
{ _t('This room is not accessible by remote Matrix servers') }.
{ _t('This room is not accessible by remote Matrix servers') }.
</div>
);
}
let leaveButton = null;
const myMember = this.props.room.getMember(user_id);
const myMember = this.props.room.getMember(myUserId);
if (myMember) {
if (myMember.membership === "join") {
leaveButton = (
@ -800,6 +831,50 @@ module.exports = React.createClass({
</div>;
}
const powerSelectors = Object.keys(powerLevelDescriptors).map((key, index) => {
const descriptor = powerLevelDescriptors[key];
const value = parseIntWithDefault(powerLevels[key], descriptor.defaultValue);
return <div key={index} className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">
{ descriptor.desc }
</span>
<PowerSelector
value={value}
usersDefault={defaultUserLevel}
controlled={false}
disabled={!canChangeLevels || currentUserLevel < value}
powerLevelKey={key} // Will be sent as the second parameter to `onChange`
onChange={this.onPowerLevelsChanged}
/>
</div>;
});
const eventPowerSelectors = Object.keys(eventsLevels).map(function(eventType, i) {
let label = plEventsToLabels[eventType];
if (label) {
label = _t(label);
} else {
label = _t(
"To send events of type <eventType/>, you must be a", {},
{ 'eventType': <code>{ eventType }</code> },
);
}
return (
<div className="mx_RoomSettings_powerLevel" key={eventType}>
<span className="mx_RoomSettings_powerLevelKey">{ label } </span>
<PowerSelector
value={eventsLevels[eventType]}
usersDefault={defaultUserLevel}
controlled={false}
disabled={!canChangeLevels || currentUserLevel < eventsLevels[eventType]}
powerLevelKey={"event_levels_" + eventType}
onChange={self.onPowerLevelsChanged}
/>
</div>
);
});
return (
<div className="mx_RoomSettings">
@ -899,49 +974,9 @@ module.exports = React.createClass({
<h3>{ _t('Permissions') }</h3>
<div className="mx_RoomSettings_powerLevels mx_RoomSettings_settings">
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('The default role for new room members is') } </span>
<PowerSelector ref="users_default" value={default_user_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < default_user_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To send messages, you must be a') } </span>
<PowerSelector ref="events_default" value={send_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < send_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To invite users into the room, you must be a') } </span>
<PowerSelector ref="invite" value={invite_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < invite_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To configure the room, you must be a') } </span>
<PowerSelector ref="state_default" value={state_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < state_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To kick users, you must be a') } </span>
<PowerSelector ref="kick" value={kick_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < kick_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To ban users, you must be a') } </span>
<PowerSelector ref="ban" value={ban_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < ban_level} onChange={this.onPowerLevelsChanged} />
</div>
<div className="mx_RoomSettings_powerLevel">
<span className="mx_RoomSettings_powerLevelKey">{ _t('To remove other users\' messages, you must be a') } </span>
<PowerSelector ref="redact" value={redact_level} usersDefault={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < redact_level} onChange={this.onPowerLevelsChanged} />
</div>
{ Object.keys(events_levels).map(function(event_type, i) {
let label = plEventsToLabels[event_type];
if (label) label = _t(label);
else label = _t("To send events of type <eventType/>, you must be a", {}, { 'eventType': <code>{ event_type }</code> });
return (
<div className="mx_RoomSettings_powerLevel" key={event_type}>
<span className="mx_RoomSettings_powerLevelKey">{ label } </span>
<PowerSelector ref={"event_levels_"+event_type} value={events_levels[event_type]} usersDefault={default_user_level} onChange={self.onPowerLevelsChanged}
controlled={false} disabled={!can_change_levels || current_user_level < events_levels[event_type]} />
</div>
);
}) }
{ unfederatableSection }
{ powerSelectors }
{ eventPowerSelectors }
{ unfederatableSection }
</div>
{ userLevelsSection }

View File

@ -21,6 +21,7 @@ const React = require('react');
const ReactDOM = require("react-dom");
import PropTypes from 'prop-types';
const classNames = require('classnames');
import dis from '../../../dispatcher';
const MatrixClientPeg = require('../../../MatrixClientPeg');
import DMRoomMap from '../../../utils/DMRoomMap';
const sdk = require('../../../index');
@ -41,6 +42,8 @@ module.exports = React.createClass({
collapsed: PropTypes.bool.isRequired,
unread: PropTypes.bool.isRequired,
highlight: PropTypes.bool.isRequired,
// If true, apply mx_RoomTile_transparent class
transparent: PropTypes.bool,
isInvite: PropTypes.bool.isRequired,
incomingCall: PropTypes.object,
},
@ -56,7 +59,9 @@ module.exports = React.createClass({
hover: false,
badgeHover: false,
menuDisplayed: false,
roomName: this.props.room.name,
notifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId),
notificationCount: this.props.room.getUnreadNotificationCount(),
selected: this.props.room.roomId === RoomViewStore.getRoomId(),
});
},
@ -79,6 +84,20 @@ module.exports = React.createClass({
}
},
onRoomTimeline: function(ev, room) {
if (room !== this.props.room) return;
this.setState({
notificationCount: this.props.room.getUnreadNotificationCount(),
});
},
onRoomName: function(room) {
if (room !== this.props.room) return;
this.setState({
roomName: this.props.room.name,
});
},
onAccountData: function(accountDataEvent) {
if (accountDataEvent.getType() == 'm.push_rules') {
this.setState({
@ -87,6 +106,21 @@ module.exports = React.createClass({
}
},
onAction: function(payload) {
switch (payload.action) {
// XXX: slight hack in order to zero the notification count when a room
// is read. Ideally this state would be given to this via props (as we
// do with `unread`). This is still better than forceUpdating the entire
// RoomList when a room is read.
case 'on_room_read':
if (payload.roomId !== this.props.room.roomId) break;
this.setState({
notificationCount: this.props.room.getUnreadNotificationCount(),
});
break;
}
},
_onActiveRoomChange: function() {
this.setState({
selected: this.props.room.roomId === RoomViewStore.getRoomId(),
@ -95,15 +129,37 @@ module.exports = React.createClass({
componentWillMount: function() {
MatrixClientPeg.get().on("accountData", this.onAccountData);
MatrixClientPeg.get().on("Room.timeline", this.onRoomTimeline);
MatrixClientPeg.get().on("Room.name", this.onRoomName);
ActiveRoomObserver.addListener(this.props.room.roomId, this._onActiveRoomChange);
this.dispatcherRef = dis.register(this.onAction);
},
componentWillUnmount: function() {
const cli = MatrixClientPeg.get();
if (cli) {
MatrixClientPeg.get().removeListener("accountData", this.onAccountData);
MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
}
ActiveRoomObserver.removeListener(this.props.room.roomId, this._onActiveRoomChange);
dis.unregister(this.dispatcherRef);
},
// Do a simple shallow comparison of props and state to avoid unnecessary
// renders. The assumption made here is that only state and props are used
// in rendering this component and children.
//
// RoomList is frequently made to forceUpdate, so this decreases number of
// RoomTile renderings.
shouldComponentUpdate: function(newProps, newState) {
if (Object.keys(newProps).some((k) => newProps[k] !== this.props[k])) {
return true;
}
if (Object.keys(newState).some((k) => newState[k] !== this.state[k])) {
return true;
}
return false;
},
onClick: function(ev) {
@ -172,7 +228,7 @@ module.exports = React.createClass({
const myUserId = MatrixClientPeg.get().credentials.userId;
const me = this.props.room.currentState.members[myUserId];
const notificationCount = this.props.room.getUnreadNotificationCount();
const notificationCount = this.state.notificationCount;
// var highlightCount = this.props.room.getUnreadNotificationCount("highlight");
const notifBadges = notificationCount > 0 && this._shouldShowNotifBadge();
@ -188,6 +244,7 @@ module.exports = React.createClass({
'mx_RoomTile_invited': (me && me.membership == 'invite'),
'mx_RoomTile_menuDisplayed': this.state.menuDisplayed,
'mx_RoomTile_noBadges': !badges,
'mx_RoomTile_transparent': this.props.transparent,
});
const avatarClasses = classNames({
@ -199,9 +256,7 @@ module.exports = React.createClass({
'mx_RoomTile_badgeButton': this.state.badgeHover || this.state.menuDisplayed,
});
// XXX: We should never display raw room IDs, but sometimes the
// room name js sdk gives is undefined (cannot repro this -- k)
let name = this.props.room.name || this.props.room.roomId;
let name = this.state.roomName;
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
let badge;

View File

@ -28,26 +28,41 @@ module.exports = React.createClass({
room: PropTypes.object.isRequired,
},
getInitialState: function() {
return {
topic: null,
};
},
componentWillMount: function() {
const room = this.props.room;
const topic = room.currentState.getStateEvents('m.room.topic', '');
this._initialTopic = topic ? topic.getContent().topic : '';
this.setState({
topic: topic ? topic.getContent().topic : '',
});
},
getTopic: function() {
return this.refs.editor.getValue();
return this.state.topic;
},
_onValueChanged: function(value) {
this.setState({
topic: value,
});
},
render: function() {
const EditableText = sdk.getComponent("elements.EditableText");
return (
<EditableText ref="editor"
<EditableText
className="mx_RoomHeader_topic mx_RoomHeader_editable"
placeholderClassName="mx_RoomHeader_placeholder"
placeholder={_t("Add a topic")}
blurToCancel={false}
initialValue={this._initialTopic}
initialValue={this.state.topic}
onValueChanged={this._onValueChanged}
dir="auto" />
);
},

998
src/i18n/strings/bg.json Normal file
View File

@ -0,0 +1,998 @@
{
"OK": "ОК",
"Operation failed": "Операцията е неуспешна",
"Search": "Търсене",
"Custom Server Options": "Потребителски опции за сървър",
"Dismiss": "Затвори",
"powered by Matrix": "базирано на Matrix",
"Warning": "Предупреждение",
"Error": "Грешка",
"Remove": "Премахни",
"Close": "Затвори",
"Cancel": "Отказ",
"Send": "Изпрати",
"Edit": "Редактирай",
"Continue": "Продължи",
"Failed to change password. Is your password correct?": "Неуспешна промяна. Правилно ли сте въвели Вашата парола?",
"Unpin Message": "Откачи съобщението",
"Sun": "нд.",
"Mon": "пн.",
"Tue": "вт.",
"Wed": "ср.",
"Thu": "чт.",
"Fri": "пт.",
"Sat": "сб.",
"Jan": "ян.",
"Feb": "февр.",
"Mar": "март",
"Apr": "апр.",
"May": "май",
"Jun": "юни",
"Jul": "юли",
"Aug": "авг.",
"Sep": "септ.",
"Oct": "окт.",
"Nov": "ноем.",
"Dec": "дек.",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(day)s %(monthName)s %(fullYear)s, %(weekDayName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
"Online": "Онлайн",
"Failed to remove tag %(tagName)s from room": "Неуспешно премахване на %(tagName)s етикет от стаята",
"unknown error code": "неизвестен код за грешка",
"Failed to forget room %(errCode)s": "Неуспешно забравяне на стаята %(errCode)s",
"Mute": "Заглуши",
"Leave": "Напусни",
"Favourite": "Любим",
"Register": "Регистрация",
"Notifications": "Известия",
"Rooms": "Стаи",
"Add rooms to this community": "Добави стаи в тази общност",
"Unnamed room": "Стая без име",
"World readable": "Четимо за всички",
"Guests can join": "Гости могат да се присъединят",
"No rooms to show": "Няма стаи, които да бъдат показани",
"Failed to add tag %(tagName)s to room": "Неуспешно добавяне на %(tagName)s етикет в стаята",
"This email address is already in use": "Този имейл адрес е вече зает",
"This phone number is already in use": "Този телефонен номер е вече зает",
"Failed to verify email address: make sure you clicked the link in the email": "Неуспешно потвърждаване на имейл адреса: уверете се, че сте кликнали върху връзката в имейла",
"The platform you're on": "Платформата, която използвате",
"The version of Riot.im": "Версията на Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Независимо дали сте влезли с профила си или не (не записваме Вашето потребителско име)",
"Your language of choice": "Вашият език по избор",
"Which officially provided instance you are using, if any": "Кой официално-предоставен сървър използвате, ако има такъв",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Независимо дали използвате Richtext режим на Rich Text Editor",
"Your homeserver's URL": "Адрес на Вашия Home сървър",
"Your identity server's URL": "Адрес на Вашия сървър за самоличност",
"Analytics": "Статистика",
"The information being sent to us to help make Riot.im better includes:": "За да направим Riot по-добър, информацията изпратена до нас включва:",
"Call Failed": "Неуспешно повикване",
"Call": "Позвъни",
"Answer": "Отговори",
"You are already in a call.": "Вече сте в разговор.",
"VoIP is unsupported": "Не се поддържа VoIP",
"You cannot place VoIP calls in this browser.": "Не може да осъществите VoIP разговори в този браузър.",
"You cannot place a call with yourself.": "Не може да осъществите разговор със себе си.",
"Existing Call": "Съществуващ разговор",
"Conference calls are not supported in this client": "Групови разговори не се поддържат в тази програма",
"Conference calls are not supported in encrypted rooms": "Групови разговори не се поддържат в шифровани стаи",
"Warning!": "Внимание!",
"Conference calling is in development and may not be reliable.": "Груповите разговори са в процес на разработка и не са надеждни.",
"Review Devices": "Преглед на устройства",
"Failed to set up conference call": "Неуспешно осъществяване на групов разговор",
"Conference call failed.": "Неуспешен групов разговор.",
"The file '%(fileName)s' failed to upload": "Неуспешно качване на файл '%(fileName)s'",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файлът '%(fileName)s' надхвърля ограничението на размера за качване на този Home сървър",
"Upload Failed": "Качването е неуспешно",
"PM": "PM",
"AM": "AM",
"Who would you like to add to this community?": "Кого бихте желали да добавите в тaзи общност?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Предупреждение: Всеки човек, който добавяте в дадена общност, ще бъде публично видим за знаещите идентификатора на общността",
"Invite new community members": "Покана на нови членове в общността",
"Name or matrix ID": "Име или matrix ID",
"Invite to Community": "Покани в общността",
"Which rooms would you like to add to this community?": "Кои стаи бихте желали да добавите в тази общност?",
"Show these rooms to non-members on the community page and room list?": "Показване на тези стаи на не-членове в страницата на общността и в списъка със стаи?",
"Add rooms to the community": "Добави стаи в общността",
"Room name or alias": "Име или псевдоним на стая",
"Add to community": "Добави в общност",
"Failed to invite the following users to %(groupId)s:": "Следните потребители не могат да бъдат поканени в %(groupId)s:",
"Failed to invite users to community": "Потребителите не могат да бъдат поканени в общността",
"Failed to invite users to %(groupId)s": "Потребителите не могат да бъдат поканени в %(groupId)s",
"Failed to add the following rooms to %(groupId)s:": "Следните стаи не могат да бъдат добавени в %(groupId)s:",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot няма разрешение да Ви изпраща известия - моля проверете вашите настройки на браузъра",
"Riot was not given permission to send notifications - please try again": "Riot не е получил разрешение да изпраща известия - моля опитайте отново",
"Unable to enable Notifications": "Неупешно включване на известия",
"This email address was not found": "Този имейл адрес не беше открит",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Изглежда вашият имейл адрес не може да се асоциира с Matrix ID на този Home сървър.",
"Default": "По подразбиране",
"Restricted": "Ограничен",
"Moderator": "Модератор",
"Admin": "Администратор",
"Start a chat": "Започване на чат",
"Who would you like to communicate with?": "С кой бихте желали да си комуникирате?",
"Email, name or matrix ID": "Имейл, име или matrix ID",
"Start Chat": "Започни чат",
"Invite new room members": "Покана на нови членове в стаята",
"Who would you like to add to this room?": "Кого бихте желали да добавите в тази стая?",
"Send Invites": "Изпрати покани",
"Failed to invite user": "Неуспешна покана на потребителя",
"Failed to invite": "Неуспешна покана",
"Failed to invite the following users to the %(roomName)s room:": "Следните потребителите не успяха да бъдат добавени в %(roomName)s:",
"You need to be logged in.": "Трябва да влезете в профила си.",
"You need to be able to invite users to do that.": "За да извършите това, трябва да имате право да добавяте потребители.",
"Unable to create widget.": "Неуспешно създаване на приспособление.",
"Failed to send request.": "Неуспешно изпращане на заявката.",
"This room is not recognised.": "Стаята не е разпозната.",
"Power level must be positive integer.": "Нивото на достъп трябва да бъде позитивно число.",
"Call Anyway": "Позвъни въпреки това",
"Answer Anyway": "Отговори въпреки това",
"Call Timeout": "Изтекло време за повикване",
"The remote side failed to pick up": "Отсрещната страна не успя да отговори",
"Unable to capture screen": "Неуспешно заснемане на екрана",
"You are not in this room.": "Не сте в тази стая.",
"You do not have permission to do that in this room.": "Нямате достъп да направите това в тази стая.",
"Missing room_id in request": "Липсва room_id в заявката",
"Room %(roomId)s not visible": "Стая %(roomId)s не е видима",
"Missing user_id in request": "Липсва user_id в заявката",
"Failed to lookup current room": "Неуспешно намиране на текущата стая",
"/ddg is not a command": "/ddg не е команда",
"To use it, just wait for autocomplete results to load and tab through them.": "За използване, изчакайте зареждането на списъка с предложения и изберете от него.",
"Unrecognised room alias:": "Непознат псевдоним на стая:",
"Ignored user": "Игнориран потребител",
"You are now ignoring %(userId)s": "Вече игнорирате %(userId)s",
"Unignored user": "Неигнориран потребител",
"You are no longer ignoring %(userId)s": "Вече не игнорирате %(userId)s",
"Device already verified!": "Устройството е вече потвърдено!",
"WARNING: Device already verified, but keys do NOT MATCH!": "ВНИМАНИЕ: Устройстовото е потвърдено, но ключовете не съвпадат!",
"Verified key": "Потвърден ключ",
"Unrecognised command:": "Неразпозната команда:",
"Reason": "Причина",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прие поканата за %(displayName)s.",
"%(targetName)s accepted an invitation.": "%(targetName)s прие поканата.",
"%(senderName)s requested a VoIP conference.": "%(senderName)s заяви VoIP групов разговор.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s покани %(targetName)s.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s блокира %(targetName)s.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s смени своето име на %(displayName)s.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s си сложи име %(displayName)s.",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s премахна своето име (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s премахна своята профилна снимка.",
"%(senderName)s changed their profile picture.": "%(senderName)s промени своята профилна снимка.",
"%(senderName)s set a profile picture.": "%(senderName)s зададе снимка на профила си.",
"VoIP conference started.": "Започна VoIP групов разговор.",
"%(targetName)s joined the room.": "%(targetName)s се присъедини към стаята.",
"VoIP conference finished.": "Груповият разговор приключи.",
"%(targetName)s rejected the invitation.": "%(targetName)s отхвърли поканата.",
"%(targetName)s left the room.": "%(targetName)s напусна стаята.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s отблокира %(targetName)s.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s изгони %(targetName)s.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s оттегли поканата си за %(targetName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s смени темата на \"%(topic)s\".",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s премахна името на стаята.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s промени името на стаята на %(roomName)s.",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s изпрати снимка.",
"Someone": "Някой",
"(not supported by this browser)": "(не се поддържа от този браузър)",
"%(senderName)s answered the call.": "%(senderName)s отговори на повикването.",
"(no answer)": "(няма отговор)",
"(unknown failure: %(reason)s)": "(неизвестна грешка: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s прекрати разговора.",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s започна %(callType)s разговор.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s изпрати покана на %(targetDisplayName)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 направи бъдещата история на стаята видима за всички членове в нея.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s направи бъдещата история на стаята видима за всеки.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s направи бъдещата история на стаята видима по непознат начин (%(visibility)s).",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включи шифроване от край до край (алгоритъм %(algorithm)s).",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s от %(fromPowerLevel)s на %(toPowerLevel)s",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s смени нивото на достъп на %(powerLevelDiffText)s.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s смени закачените съобщения за стаята.",
"%(widgetName)s widget modified by %(senderName)s": "Приспособлението %(widgetName)s беше променено от %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "Приспособлението %(widgetName)s беше добавено от %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "Приспособлението %(widgetName)s беше премахнато от %(senderName)s",
"%(displayName)s is typing": "%(displayName)s пише",
"%(names)s and %(count)s others are typing|other": "%(names)s и %(count)s други пишат",
"%(names)s and %(count)s others are typing|one": "%(names)s и още един човек пишат",
"%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s пишат",
"Failure to create room": "Неуспешно създаване на стая",
"Server may be unavailable, overloaded, or you hit a bug.": "Сървърът може би е претоварен, недостъпен или се натъкнахте на проблем.",
"Send anyway": "Изпрати въпреки това",
"Unnamed Room": "Стая без име",
"Your browser does not support the required cryptography extensions": "Вашият браузър не поддържа необходимите разширения за шифроване",
"Not a valid Riot keyfile": "Невалиден файл с ключ за Riot",
"Authentication check failed: incorrect password?": "Неуспешна автентикация: неправилна парола?",
"Failed to join room": "Неуспешно присъединяване към стаята",
"Message Replies": "Отговори на съобщението",
"Message Pinning": "Функция за закачане на съобщения",
"Presence Management": "Управление на присъствието",
"Tag Panel": "Панел с етикети",
"Disable Emoji suggestions while typing": "Изключване на предложенията за емотиконите при писане",
"Use compact timeline layout": "Използване на компактно оформление за списъка със съобщения",
"Hide removed messages": "Скриване на премахнати съобщения",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Скриване на съобщения за присъединяване/напускане (не засяга покани/изгонвания/блокирания)",
"Hide avatar changes": "Скриване на информацията за промените на аватара",
"Hide display name changes": "Скриване на информацията за промените на името",
"Hide read receipts": "Скриване на потвържденията за прочитане на съобщение",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Показване на времето в 12-часов формат (напр. 2:30pm)",
"Always show message timestamps": "Винаги показвай часа на съобщението",
"Autoplay GIFs and videos": "Автоматично възпроизвеждане на GIF-файлове и видеа",
"Enable automatic language detection for syntax highlighting": "Включване на автоматично разпознаване на език за подчертаване на синтаксиса",
"Disable big emoji in chat": "Изключване на големи емотикони в чата",
"Don't send typing notifications": "Не показвай на другите, че в момента пиша",
"Automatically replace plain text Emoji": "Автоматично откриване и заместване на емотикони в текста",
"Mirror local video feed": "Показвай ми огледално моя видео образ",
"Disable Peer-to-Peer for 1:1 calls": "Изключване на Peer-to-Peer в 1:1 разговор",
"Opt out of analytics": "Отказване от събиране на статистически данни",
"Never send encrypted messages to unverified devices from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства",
"Never send encrypted messages to unverified devices in this room from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства в тази стая",
"Enable inline URL previews by default": "Включване по подразбиране на URL прегледи",
"Enable URL previews for this room (only affects you)": "Включване на URL прегледи за тази стая (засяга само Вас)",
"Enable URL previews by default for participants in this room": "Включване по подразбиране на URL прегледи за участници в тази стая",
"Room Colour": "Цвят на стая",
"Active call (%(roomName)s)": "Активен разговор (%(roomName)s)",
"unknown caller": "повикване от непознат",
"Incoming voice call from %(name)s": "Входящо гласово повикване от %(name)s",
"Incoming video call from %(name)s": "Входящо видео повикване от %(name)s",
"Incoming call from %(name)s": "Входящо повикване от %(name)s",
"Decline": "Откажи",
"Accept": "Приеми",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Съобщение е изпратено до +%(msisdn)s. Моля, въведете кода за потвърждение, което то съдържа",
"Incorrect verification code": "Неправилен код за потвърждение",
"Enter Code": "Въведи код",
"Submit": "Изпрати",
"Phone": "Телефон",
"Add phone number": "Добави номер",
"Add": "Добави",
"Failed to upload profile picture!": "Неуспешно качване на профилна снимка!",
"Upload new:": "Качи нов:",
"No display name": "Няма име",
"New passwords don't match": "Новите пароли не съвпадат",
"Passwords can't be empty": "Полето с парола не може да е празно",
"Export E2E room keys": "Експортирай E2E ключове за стая",
"Do you want to set an email address?": "Искате ли да зададете имейл адрес?",
"Current password": "Текуща парола",
"Password": "Парола",
"New Password": "Нова парола",
"Confirm password": "Потвърждаване на парола",
"Change Password": "Смяна на парола",
"Your home server does not support device management.": "Вашият Home сървър не поддръжа управление на устройства.",
"Unable to load device list": "Неуспешно зареждане на списък с устройства",
"Authentication": "Автентикация",
"Delete %(count)s devices|other": "Изтрий %(count)s устройства",
"Delete %(count)s devices|one": "Изтрий устройство",
"Device ID": "Идентификатор на устройство",
"Device Name": "Име на устройство",
"Last seen": "Последно видян",
"Select devices": "Избери устройства",
"Failed to set display name": "Неуспешно задаване на име",
"Disable Notifications": "Изключване на известия",
"Enable Notifications": "Включване на известия",
"Cannot add any more widgets": "Не могат да се добавят повече приспособления",
"The maximum permitted number of widgets have already been added to this room.": "Максимално разрешеният брой приспособления е вече добавен към тази стая.",
"Add a widget": "Добавяне на приспособление",
"Drop File Here": "Пусни файла тук",
"Drop file here to upload": "Пуснете файла тук, за да се качи",
" (unsupported)": " (не се поддържа)",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Присъединете се с <voiceText>глас</voiceText> или с <videoText>видео</videoText>.",
"Ongoing conference call%(supportedText)s.": "Текущ групов разговор %(supportedText)s.",
"%(senderName)s sent an image": "%(senderName)s изпрати снимка",
"%(senderName)s sent a video": "%(senderName)s изпрати видео",
"%(senderName)s uploaded a file": "%(senderName)s качи файл",
"Options": "Настройки",
"Undecryptable": "Невъзможно разшифроване",
"Encrypted by a verified device": "Шифровано от потвърдено устройство",
"Encrypted by an unverified device": "Шифровано от непотвърдено устройство",
"Unencrypted message": "Нешифровано съобщение",
"Please select the destination room for this message": "Моля, изберете стаята, в която искате да изпратите това съобщение",
"Blacklisted": "В черния списък",
"Verified": "Потвърдено",
"Unverified": "Непотвърдено",
"device id: ": "идентификатор на устройството: ",
"Disinvite": "Отмени поканата",
"Kick": "Изгони",
"Disinvite this user?": "Отмени поканата към този потребител?",
"Kick this user?": "Изгони този потребител?",
"Failed to kick": "Неуспешно изгонване",
"Unban": "Отблокирай",
"Ban": "Блокирай",
"Unban this user?": "Отблокирай този потребител?",
"Ban this user?": "Блокирай този потребител?",
"Failed to ban user": "Неуспешно блокиране на потребителя",
"Failed to mute user": "Неуспешно заглушаване на потребителя",
"Failed to toggle moderator status": "Неуспешна промяна на статуса на модератора",
"Failed to change power level": "Неуспешна промяна на нивото на достъп",
"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.": "След като си намалите нивото на достъп, няма да можете да възвърнете тази промяна. Ако сте последния потребител с привилегии в тази стая, ще бъде невъзможно да възвърнете привилегии си.",
"Are you sure?": "Сигурни ли сте?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Няма да можете да възвърнете тази промяна, тъй като повишавате този потребител до същото ниво на достъп като Вашето.",
"No devices with registered encryption keys": "Няма устройства с регистрирани ключове за шифроване",
"Devices": "Устройства",
"Unignore": "Премахни игнорирането",
"Ignore": "Игнорирай",
"Mention": "Спомени",
"Direct chats": "Директни чатове",
"User Options": "Опции на потребителя",
"Invite": "Покани",
"Unmute": "Премахни заглушаването",
"Make Moderator": "Направи модератор",
"Admin Tools": "Инструменти на администратора",
"Level:": "Ниво:",
"and %(count)s others...|other": "и %(count)s други...",
"and %(count)s others...|one": "и още един...",
"Invited": "Поканен",
"Filter room members": "Филтриране на членовете",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (ниво на достъп %(powerLevelNumber)s)",
"Attachment": "Прикачване",
"Upload Files": "Качи файлове",
"Are you sure you want to upload the following files?": "Сигурни ли сте, че искате да качите тези файлове?",
"Encrypted room": "Шифрована стая",
"Unencrypted room": "Нешифрована стая",
"Hangup": "Затвори",
"Voice call": "Гласово повикване",
"Video call": "Видео повикване",
"Hide Apps": "Скрий приложенията",
"Show Apps": "Покажи приложенията",
"Upload file": "Качи файл",
"Show Text Formatting Toolbar": "Показване на лентата с инструменти за форматиране на текст",
"Send an encrypted reply…": "Изпрати шифрован отговор…",
"Send a reply (unencrypted)…": "Отговори (нешифрованo)…",
"Send an encrypted message…": "Изпрати шифровано съобщение…",
"Send a message (unencrypted)…": "Изпрати съобщение (нешифровано)…",
"You do not have permission to post to this room": "Нямате разрешение да публикувате в тази стая",
"Turn Markdown on": "Включи Markdown",
"Turn Markdown off": "Изключи Markdown",
"Hide Text Formatting Toolbar": "Скриване на лентата с инструменти за форматиране на текст",
"Server error": "Сървърна грешка",
"Server unavailable, overloaded, or something else went wrong.": "Сървърът е недостъпен, претоварен или нещо друго се обърка.",
"Command error": "Грешка в командата",
"bold": "удебелен",
"italic": "курсивен",
"strike": "задраскан",
"underline": "подчертан",
"code": "код",
"quote": "цитат",
"bullet": "списък",
"numbullet": "номериран списък",
"Markdown is disabled": "Markdown е изключен",
"Markdown is enabled": "Markdown е включен",
"No pinned messages.": "Няма закачени съобщения.",
"Loading...": "Зареждане...",
"Pinned Messages": "Закачени съобщения",
"%(duration)ss": "%(duration)sсек",
"%(duration)sm": "%(duration)sмин",
"%(duration)sh": "%(duration)sч",
"%(duration)sd": "%(duration)sд",
"Online for %(duration)s": "Онлайн от %(duration)s",
"Idle for %(duration)s": "Неактивен от %(duration)s",
"Offline for %(duration)s": "Офлайн от %(duration)s",
"Unknown for %(duration)s": "Неизвестен от %(duration)s",
"Idle": "Неактивен",
"Offline": "Офлайн",
"Unknown": "Неизвестен",
"Replying": "Отговаря",
"Seen by %(userName)s at %(dateTime)s": "Видяно от %(userName)s в %(dateTime)s",
"Failed to set avatar.": "Неуспешно задаване на профилна снимка.",
"Save": "Запази",
"(~%(count)s results)|other": "(~%(count)s резултати)",
"(~%(count)s results)|one": "(~%(count)s резултат)",
"Join Room": "Присъедини се към стаята",
"Upload avatar": "Качи профилна снимка",
"Remove avatar": "Премахни профилната снимка",
"Settings": "Настройки",
"Forget room": "Забрави стаята",
"Show panel": "Покажи панелa",
"Drop here to favourite": "За любим пуснeте тук",
"Drop here to tag direct chat": "Пуснете тук, за да означите директен чат",
"Drop here to restore": "Пуснете тук за възстановяване",
"Drop here to demote": "Пуснете тук за понижаване",
"Drop here to tag %(section)s": "Пуснете тук, за да означите като %(section)s",
"Failed to set direct chat tag": "Неуспешно означаване на директен чат",
"Press <StartChatButton> to start a chat with someone": "Натиснете <StartChatButton>, за да започнете чат с някого",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Все още не сте в нито една стая! Натиснете <CreateRoomButton>, за да направите такава или <RoomDirectoryButton>, за да прегледате директорията",
"Community Invites": "Покани за общност",
"Invites": "Покани",
"Favourites": "Любими",
"People": "Хора",
"Low priority": "Нисък приоритет",
"Historical": "Архив",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не може да се потвърди, че адреса към който е изпратена тази покана е обвързан с акаунта Ви.",
"This invitation was sent to an email address which is not associated with this account:": "Поканата беше изпратена на имейл адрес, който не е свързан с този профил:",
"You may wish to login with a different account, or add this email to this account.": "Може да искате да влезете с друг профил или да добавите имейл адреса в този.",
"You have been invited to join this room by %(inviterName)s": "Вие сте поканен да се присъедините към тази стая от %(inviterName)s",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Желаете да <acceptText>приемете</acceptText> или да <declineText>откажете</declineText> тази покана?",
"Reason: %(reasonText)s": "Причина: %(reasonText)s",
"Rejoin": "Повторно присъединяване",
"You have been kicked from %(roomName)s by %(userName)s.": "Бяхте изгонен от %(roomName)s от %(userName)s.",
"You have been kicked from this room by %(userName)s.": "Бяхте изгонен от тази стая от %(userName)s.",
"You have been banned from %(roomName)s by %(userName)s.": "Бяхте блокиран в %(roomName)s от %(userName)s.",
"You have been banned from this room by %(userName)s.": "Бяхте блокиран в тази стая от %(userName)s.",
"This room": "В тази стая",
"%(roomName)s does not exist.": "%(roomName)s не съществува.",
"%(roomName)s is not accessible at this time.": "%(roomName)s не е достъпна към този момент.",
"You are trying to access %(roomName)s.": "Опитвате се да влезете в %(roomName)s.",
"You are trying to access a room.": "Опитвате се да влезете в стая.",
"<a>Click here</a> to join the discussion!": "<a>Натиснете тук</a>, за да се присъедините към дискусията!",
"This is a preview of this room. Room interactions have been disabled": "Това е преглед на стаята. Интеракции в нея са деактивирани",
"To change the room's avatar, you must be a": "За да смените снимката на стаята, трябва да бъдете",
"To change the room's name, you must be a": "За да смените името на стаята, трябва да бъдете",
"To change the room's main address, you must be a": "За да смените основния адрес на стаята, трябва да бъдете",
"To change the room's history visibility, you must be a": "За да смените видимостта на историята на стаята, трябва да бъдете",
"To change the permissions in the room, you must be a": "За да промените разрешенията в стаята, трябва да бъдете",
"To change the topic, you must be a": "За да смените темата, трябва да бъдете",
"To modify widgets in the room, you must be a": "За да промените приспособленията в стаята, трябва да бъдете",
"Failed to unban": "Неуспешно отблокиране",
"Banned by %(displayName)s": "Блокиран от %(displayName)s",
"Privacy warning": "Предупреждение за сигурност",
"Changes to who can read history will only apply to future messages in this room": "Промени по това кой може да чете историята ще се отнасят само за бъдещи съобщения в тази стая",
"The visibility of existing history will be unchanged": "Видимостта на историята до сега ще остане непроменена",
"End-to-end encryption is in beta and may not be reliable": "Шифроване от край до край е в бета версия и може да не е надеждно",
"Devices will not yet be able to decrypt history from before they joined the room": "Устройства все още не могат да разшифроват история от преди присъединяването към стая",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Веднъж включено, шифроването в стаята не може да бъде изключено (за сега)",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Шифровани съобщения не са видими за клиенти, които все още не поддържат шифроване",
"Enable encryption": "Включване на шифроване",
"(warning: cannot be disabled again!)": "(внимание: не може да бъде изключено в последствие!)",
"Encryption is enabled in this room": "Шифроването е включено в тази стая",
"Encryption is not enabled in this room": "Шифроването не е включено в тази стая",
"Privileged Users": "Потребители с привилегии",
"%(user)s is a": "%(user)s е",
"No users have specific privileges in this room": "Никой няма специфични привилегии в тази стая",
"Banned users": "Блокирани потребители",
"This room is not accessible by remote Matrix servers": "Тази стая не е достъпна за далечни Matrix сървъри",
"Leave room": "Напусни стаята",
"Tagged as: ": "Етикет: ",
"To link to a room it must have <a>an address</a>.": "За да дадете линк към стаята, тя трябва да има <a>адрес</a>.",
"Guests cannot join this room even if explicitly invited.": "Гости не могат да се присъединят към тази стая, дори изрично поканени.",
"Click here to fix": "Натиснете тук за поправяне",
"Who can access this room?": "Кой има достъп до тази стая?",
"Only people who have been invited": "Само хора, които са били поканени",
"Anyone who knows the room's link, apart from guests": "Всеки, който знае адреса на стаята (освен гости)",
"Anyone who knows the room's link, including guests": "Всеки, който знае адреса на стаята (включително гости)",
"Publish this room to the public in %(domain)s's room directory?": "Публично публикуване на тази стая в директорията на %(domain)s?",
"Who can read history?": "Кой може да чете историята?",
"Anyone": "Всеки",
"Members only (since the point in time of selecting this option)": "Само членове (от момента на избиране на тази опция)",
"Members only (since they were invited)": "Само членове (от момента, в който те са поканени)",
"Members only (since they joined)": "Само членове (от момента, в който са се присъединили)",
"Permissions": "Разрешения",
"The default role for new room members is": "По подразбиране ролята за нови членове в стаята е",
"To send messages, you must be a": "За да изпращате съобщения, трябва да бъдете",
"To invite users into the room, you must be a": "За да поканите потребители в стаята, трябва да бъдете",
"To configure the room, you must be a": "За да конфигурирате стаята, трябва да бъдете",
"To kick users, you must be a": "За да изгоните потребител, трябва да бъдете",
"To ban users, you must be a": "За да блокирате потребител, трябва да бъдете",
"To remove other users' messages, you must be a": "За да премахнете съобщения на друг потребител, трябва да бъдете",
"To send events of type <eventType/>, you must be a": "За да изпратите събития от вида <eventType/>, трябва да бъдете",
"Advanced": "Разширени",
"This room's internal ID is": "Вътрешният идентификатор на тази стая е",
"Add a topic": "Добавете тема",
"Jump to first unread message.": "Отиди до първото непрочетено съобщение.",
"Scroll to unread messages": "Отиди до непрочетените съобщения",
"Invalid alias format": "Невалиден формат на псевдонима",
"'%(alias)s' is not a valid format for an alias": "%(alias)s не е валиден формат на псевдоним",
"Invalid address format": "Невалиден формат на адреса",
"'%(alias)s' is not a valid format for an address": "%(alias)s не е валиден формат на адрес",
"not specified": "неопределен",
"not set": "незададен",
"Remote addresses for this room:": "Далечни адреси на тази стая:",
"Addresses": "Адреси",
"The main address for this room is": "Основният адрес на тази стая е",
"Local addresses for this room:": "Локалните адреси на тази стая са:",
"This room has no local addresses": "Тази стая няма локални адреси",
"New address (e.g. #foo:%(localDomain)s)": "Нов адрес (напр. #foo:%(localDomain)s)",
"Invalid community ID": "Невалиден идентификатор на общност",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' е невалиден идентификатор на общност",
"Flair": "Значка",
"Showing flair for these communities:": "Показване на значки за тези общности:",
"This room is not showing flair for any communities": "Тази стая не показва значки за нито една общност",
"New community ID (e.g. +foo:%(localDomain)s)": "Нов идентификатор на общност (напр. +foo:%(localDomain)s)",
"You have <a>enabled</a> URL previews by default.": "Вие сте <a>включил</a> URL прегледи по подразбиране.",
"You have <a>disabled</a> URL previews by default.": "Вие сте <a>изключил</a> URL прегледи по подразбиране.",
"URL previews are enabled by default for participants in this room.": "URL прегледи са включени по подразбиране за участниците в тази стая.",
"URL previews are disabled by default for participants in this room.": "URL прегледи са изключени по подразбиране за участниците в тази стая.",
"URL Previews": "URL прегледи",
"Error decrypting audio": "Грешка при разшифроване на аудио файл",
"Error decrypting attachment": "Грешка при разшифроване на прикачен файл",
"Decrypt %(text)s": "Разшифровай %(text)s",
"Download %(text)s": "Изтегли %(text)s",
"(could not connect media)": "(неуспешно свързване на медийните устройства)",
"Must be viewing a room": "Трябва да извършите това в стая",
"Usage": "Употреба",
"Remove from community": "Премахни от общността",
"Disinvite this user from community?": "Оттегляне на поканата към този потребител от общността?",
"Remove this user from community?": "Премахване на този потребител от общността?",
"Failed to remove user from community": "Неуспешно премахване на потребителя от тази общност",
"Filter community members": "Филтриране на членовете",
"Removing a room from the community will also remove it from the community page.": "Премахване на стая от общността ще бъде също премахната от страницата с общността.",
"Failed to remove room from community": "Неуспешно премахване на стаята от общността",
"Only visible to community members": "Видимо само за членове на общността",
"Filter community rooms": "Филтрирай стаи на общността",
"Community IDs cannot not be empty.": "Идентификаторите на общността не могат да бъдат празни.",
"Create Community": "Създай общност",
"Community Name": "Име на общност",
"Community ID": "Идентификатор на общност",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML за страница на Вашата общност</h1>\n<p>\n Използвайте дългото описание, за да въведете нови членове в общността, \n или да разпространите важни <a href=\"foo\">връзки</a>\n</p>\n<p>\n Можете дори да използвате 'img' тагове\n</p>\n",
"Add rooms to the community summary": "Добавете стаи към обобщението на общността",
"Add users to the community summary": "Добавете потребители към обобщението на общността",
"Failed to update community": "Неуспешно обновяване на общността",
"Leave Community": "Напусни общността",
"Community Settings": "Настройки на общността",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Тези стаи са показани на членове на общността на страницата на общността. Членовете на общността могат да се присъединят към стаите като натиснат върху тях.",
"%(inviter)s has invited you to join this community": "%(inviter)s Ви покани да се присъедините към тази общност",
"You are an administrator of this community": "Вие сте администратор на тази общност",
"You are a member of this community": "Вие сте член на тази общност",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Вашата общност няма дълго описание - HTML страница, която да се показва на членовете на общността. <br/>Натиснете тук, за да отворите настройките и да създадете такова!",
"Community %(groupId)s not found": "Общност %(groupId)s не е намерена",
"Create a new community": "Създаване на нова общност",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Създайте общност, за да групирате потребители и стаи! Изградете персонализирана начална страница, за да маркирате своето пространство в Matrix Вселената.",
"Join an existing community": "Присъединяване към съществуваща общност",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "За да се присъедините към вече съществуваща общност, трябва да знаете нейния идентификатор; той изглежда нещо подобно на <i>+example:matrix.org</i>.",
"Unknown (user, device) pair:": "Непозната двойка (потребител, устройство):",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Подписващият ключ, който сте предоставили, съвпада с подписващия ключ, който сте получили от устройството %(deviceId)s на %(userId)s. Устройството е маркирано като потвърдено.",
"Hide avatars in user and room mentions": "Скриване на аватара на потребители и стаи при споменаването им",
"Jump to message": "Отиди до съобщението",
"Jump to read receipt": "Отиди до потвърждението за прочитане",
"Revoke Moderator": "Премахване на правата на модератора",
"You should not yet trust it to secure data": "Все още не трябва да се доверявате на това, че ще защити Вашите данни",
"Invalid file%(extra)s": "Невалиден файл%(extra)s",
"Error decrypting image": "Грешка при разшифроване на снимка",
"This image cannot be displayed.": "Тази снимка не може да бъде показана.",
"Image '%(Body)s' cannot be displayed.": "Снимката '%(Body)s' не може да бъде показана.",
"Error decrypting video": "Грешка при разшифроване на видео",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s промени аватара на %(roomName)s",
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s премахна аватара на стаята.",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s промени аватара на стаята на <img/>",
"Copied!": "Копирано!",
"Failed to copy": "Неуспешно копиране",
"Add an Integration": "Добавяне на интеграция",
"Removed or unknown message type": "Премахнато или неизвестен тип съобщение",
"Message removed by %(userId)s": "Съобщението е премахнато от %(userId)s",
"Message removed": "Съобщението е премахнато",
"This Home Server would like to make sure you are not a robot": "Този Home сървър би искал да се увери, че не сте робот",
"Sign in with CAS": "Влез с CAS",
"To continue, please enter your password.": "За да продължите, моля, въведете своята парола.",
"Password:": "Парола:",
"An email has been sent to %(emailAddress)s": "Имейл беше изпратен на %(emailAddress)s",
"Please check your email to continue registration.": "Моля, проверете имейла си, за да продължите регистрацията.",
"Token incorrect": "Неправителен тоукън",
"A text message has been sent to %(msisdn)s": "Текстово съобщение беше изпратено на %(msisdn)s",
"Please enter the code it contains:": "Моля, въведете кода, който то съдържа:",
"Start authentication": "Започни автентикация",
"Username on %(hs)s": "Потребителско име на %(hs)s",
"User name": "Потребителско име",
"Mobile phone number": "Мобилен номер",
"Forgot your password?": "Забравена парола?",
"%(serverName)s Matrix ID": "%(serverName)s Matrix ID",
"Sign in with": "Влизане с",
"Email address": "Имейл адрес",
"Sign in": "Вход",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ако не посочите имейл адрес, няма да бъде възможно да възстановите Вашата парола. Сигурни ли сте?",
"Email address (optional)": "Имейл адрес (по избор)",
"You are registering with %(SelectedTeamName)s": "Регистрирате се с %(SelectedTeamName)s",
"Mobile phone number (optional)": "Мобилен номер (по избор)",
"Default server": "Сървър по подразбиране",
"Custom server": "Потребителски сървър",
"Home server URL": "Адрес на Home сървър",
"Identity server URL": "Адрес на сървър за самоличност",
"What does this mean?": "Какво означава това?",
"Failed to withdraw invitation": "Неуспешно оттегляне на поканата",
"Flair will appear if enabled in room settings": "Значката ще се покаже, ако е включена в настройките на стаята",
"Flair will not appear": "Значката няма да се покаже",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Сигурни ли сте, че искате да премахнете '%(roomName)s' от %(groupId)s?",
"Failed to remove '%(roomName)s' from %(groupId)s": "Неуспешно премахване на '%(roomName)s' от %(groupId)s",
"Something went wrong!": "Нещо се обърка!",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимостта на '%(roomName)s' в %(groupId)s не може да бъде обновена.",
"Visibility in Room List": "Видимост в списъка със стаи",
"Visible to everyone": "Видимо за всеки",
"Something went wrong when trying to get your communities.": "Нещо се обърка при зареждането на Вашите общности.",
"Display your community flair in rooms configured to show it.": "Показване на значката на общността в стаи, конфигурирани да я показват.",
"You're not currently a member of any communities.": "Към момента не сте член на нито една общност.",
"Unknown Address": "Неизвестен адрес",
"NOTE: Apps are not end-to-end encrypted": "ЗАБЕЛЕЖКА: Приложенията не са шифровани от край до край",
"Do you want to load widget from URL:": "Искате ли да заредите приспособление от URL адреса:",
"Allow": "Позволи",
"Delete Widget": "Изтриване на приспособление",
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Изтриването на приспособление го премахва за всички потребители в тази стая. Сигурни ли сте, че искате да изтриете това приспособление?",
"Delete widget": "Изтрий приспособлението",
"Revoke widget access": "Премахни достъпа на приспособлението",
"Minimize apps": "Минимизирай приложенията",
"Create new room": "Създай нова стая",
"Unblacklist": "Премахни от черния списък",
"Blacklist": "Добави в черен списък",
"Unverify": "Махни потвърждението",
"Verify...": "Потвърди...",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Вашето непотвърдено устройство '%(displayName)s' изисква ключове за шифроване.",
"I have verified my email address": "Потвърдих имейл адреса си",
"NOT verified": "НЕ е потвърдено",
"verified": "потвърдено",
"No results": "Няма резултати",
"Delete": "Изтрий",
"Communities": "Общности",
"Home": "Начална страница",
"Integrations Error": "Грешка при интеграциите",
"Could not connect to the integration server": "Неуспешно свързване със сървъра с интеграции",
"Manage Integrations": "Управление на интеграциите",
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sсе присъединиха %(count)s пъти",
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sсе присъединиха",
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)sсе присъедини %(count)s пъти",
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)sсе присъедини",
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sнапуснаха %(count)s пъти",
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sнапуснаха",
"%(oneUser)sleft %(count)s times|other": "%(oneUser)sнапусна %(count)s пъти",
"%(oneUser)sleft %(count)s times|one": "%(oneUser)sнапусна",
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sсе присъединиха и напуснаха %(count)s пъти",
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sсе присъединиха и напуснаха",
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sсе присъедини и напусна %(count)s пъти",
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sсе присъедини и напусна",
"%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sнапуснаха и се присъединиха отново %(count)s пъти",
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sнапуснаха и се присъединиха отново",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sнапусна и се присъедини отново %(count)s пъти",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sнапусна и се присъедини отново",
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)sотхвърлиха своите покани %(count)s пъти",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)sотхвърлиха своите покани",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sотхвърли своята покана %(count)s пъти",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sотхвърли своята покана",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)sоттеглиха своите покани %(count)s пъти",
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sоттеглиха своите покани",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sоттегли своята покана %(count)s пъти",
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sоттегли своята покана",
"were invited %(count)s times|other": "бяха поканени %(count)s пъти",
"were invited %(count)s times|one": "бяха поканени",
"was invited %(count)s times|other": "беше поканен %(count)s пъти",
"was invited %(count)s times|one": "беше поканен",
"were banned %(count)s times|other": "бяха блокирани %(count)s пъти",
"were banned %(count)s times|one": "бяха блокирани",
"was banned %(count)s times|other": "беше блокиран %(count)s пъти",
"was banned %(count)s times|one": "беше блокиран",
"were unbanned %(count)s times|other": "бяха отблокирани %(count)s пъти",
"were unbanned %(count)s times|one": "бяха отблокирани",
"was unbanned %(count)s times|other": "беше отблокиран %(count)s пъти",
"was unbanned %(count)s times|one": "беше отблокиран",
"were kicked %(count)s times|other": "бяха изгонени %(count)s пъти",
"were kicked %(count)s times|one": "бяха изгонени",
"was kicked %(count)s times|other": "беше изгонен %(count)s пъти",
"was kicked %(count)s times|one": "беше изгонен",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sсмениха своето име %(count)s пъти",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sсмениха своето име",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sсмени своето име %(count)s пъти",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sсмени своето име",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sсмениха своята профилна снимка %(count)s пъти",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sсмениха своята профилна снимка",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sсмени своята профилна снимка %(count)s пъти",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sсмени своята профилна снимка",
"%(items)s and %(count)s others|other": "%(items)s и %(count)s други",
"%(items)s and %(count)s others|one": "%(items)s и още един",
"%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s",
"collapse": "свий",
"expand": "разшири",
"Custom of %(powerLevel)s": "Персонализирано със стойност %(powerLevel)s",
"Custom level": "Персонализирано ниво",
"Custom": "Персонализиран",
"<a>In reply to</a> <pill>": "<a>В отговор на</a> <pill>",
"Room directory": "Директория със стаи",
"Start chat": "Започни чат",
"And %(count)s more...|other": "И %(count)s други...",
"ex. @bob:example.com": "напр. @bob:example.com",
"Add User": "Добави потребител",
"Matrix ID": "Matrix ID",
"Matrix Room ID": "Идентификатор на стаята",
"email address": "имейл адрес",
"Try using one of the following valid address types: %(validTypesList)s.": "Опитайте се да използвате един от следните видове валидни адреси: %(validTypesList)s.",
"You have entered an invalid address.": "Въвели сте невалиден адрес.",
"Create a new chat or reuse an existing one": "Създаване на нов чат или повторно използване на съществуващ",
"Start new chat": "Започни нов чат",
"You already have existing direct chats with this user:": "Вече имате налични директни чатове с този потребител:",
"Start chatting": "Започнете чата",
"Click on the button below to start chatting!": "Натиснете бутона по-долу, за да започнете чата!",
"Start Chatting": "Започнете чата",
"Confirm Removal": "Потвърдете премахването",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Идентификаторите на общността могат да съдържат само a-z, 0-9, или '=_-./'",
"Something went wrong whilst creating your community": "Нещо се обърка по време на създаването на Вашата общност",
"Example": "Пример",
"example": "пример",
"Create": "Създай",
"Create Room": "Създай стая",
"Room name (optional)": "Име на стая (по избор)",
"Advanced options": "Разширени настройки",
"Block users on other matrix homeservers from joining this room": "Не позволявай на потребители от други matrix Home сървъри да се присъединяват към тази стая",
"This setting cannot be changed later!": "Тази настройка не може да бъде променена по-късно!",
"Unknown error": "Неизвестна грешка",
"Incorrect password": "Неправилна парола",
"Deactivate Account": "Деактивация на профила",
"Deactivate my account": "Деактивирай моя профил",
"This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Това ще направи профила Ви перманентно неизползваем. Няма да можете да се регистрирате отново със същия потребителски идентификатор.",
"This action is irreversible.": "Това действие е необратимо.",
"Device name": "Име на устройство",
"Device key": "Ключ на устройство",
"In future this verification process will be more sophisticated.": "В бъдеще този процес на потвърждение ще бъде по-лесен.",
"Verify device": "Потвърди устройството",
"Start verification": "Започни потвърждението",
"Verification Pending": "Очакване на потвърждение",
"Verification": "Потвърждение",
"I verify that the keys match": "Потвърждавам, че ключовете съвпадат",
"An error has occurred.": "Възникна грешка.",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "Добавихте ново устройство '%(displayName)s', което изисква ключове за шифроване.",
"Share without verifying": "Сподели без потвърждение",
"Ignore request": "Игнорирай поканата",
"Loading device info...": "Зареждане на информация за устройството...",
"Encryption key request": "Заявка за ключ за шифроване",
"Otherwise, <a>click here</a> to send a bug report.": "В противен случай, <a>натиснете тук</a>, за да изпратите съобщение за грешка.",
"Report it": "Съобщи за нея",
"Bug Report": "Съобщаване за грешка",
"Unable to restore session": "Неуспешно възстановяване на сесията",
"Continue anyway": "Продължи въпреки това",
"Invalid Email Address": "Невалиден имейл адрес",
"This doesn't appear to be a valid email address": "Това не изглежда да е валиден имейл адрес",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Моля, проверете своя имейл адрес и натиснете връзката, която той съдържа. След като направите това, натиснете продължи.",
"Unable to add email address": "Неуспешно добавяне на имейл адрес",
"Unable to verify email address.": "Неуспешно потвърждение на имейл адрес.",
"Unable to accept invite": "Неуспешно приемане на поканата",
"Unable to reject invite": "Неуспешно отхвърляне на поканата",
"Unable to leave room": "Неуспешно напускане на стаята",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Беше направен опит да се зареди конкретна точка в хронологията на тази стая, но не я намери.",
"Unable to remove contact information": "Неуспешно премахване на информацията за контакти",
"This will allow you to reset your password and receive notifications.": "Това ще Ви позволи да възстановите Вашата парола и да получавате известия.",
"Skip": "Пропусни",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Потребителските имена могат да съдържат само букви, цифри, точки, тирета и долни черти.",
"Username not available": "Потребителското име е заето",
"Username invalid: %(errMessage)s": "Невалидно потребителско име: %(errMessage)s",
"An error occurred: %(error_string)s": "Възникна грешка: %(error_string)s",
"Username available": "Потребителското име не е заето",
"To get started, please pick a username!": "За да започнете, моля изберете потребителско име!",
"If you already have a Matrix account you can <a>log in</a> instead.": "Ако вече имате Matrix профил, можете да <a>влезете</a> с него.",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "В момента Вие блокирате непотвърдени устройства; за да изпращате съобщения до тези устройства, трябва да ги потвърдите.",
"Room contains unknown devices": "Стаята съдържа непознати устройства",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" съдържа устройства, който не сте виждали до сега.",
"Unknown devices": "Непознати устройства",
"Private Chat": "Личен чат",
"Public Chat": "Публичен чат",
"Alias (optional)": "Псевдоним (по избор)",
"Name": "Име",
"Topic": "Тема",
"Make this room private": "Направи тази стая лична",
"Share message history with new users": "Сподели историята на съобщенията с нови потребители",
"Encrypt room": "Шифровай стаята",
"You must <a>register</a> to use this functionality": "Трябва да се <a>регистрирате</a>, за да използвате тази функционалност",
"You must join the room to see its files": "Трябва да се присъедините към стаята, за да видите файловете, които съдържа",
"There are no visible files in this room": "Няма видими файлове в тази стая",
"Which rooms would you like to add to this summary?": "Кои стаи бихте искали да добавите в това обобщение?",
"Add to summary": "Добави в обобщението",
"Failed to add the following rooms to the summary of %(groupId)s:": "Неуспешно добавяне на следните стаи в обобщението на %(groupId)s:",
"Add a Room": "Добавяне на стая",
"Failed to remove the room from the summary of %(groupId)s": "Неуспешно премахване на стаята от обобщението на %(groupId)s",
"The room '%(roomName)s' could not be removed from the summary.": "Стаята '%(roomName)s' не може да бъде премахната от обобщението.",
"Who would you like to add to this summary?": "Кого бихте желали да добавите в това обобщение?",
"Failed to add the following users to the summary of %(groupId)s:": "Неуспешно добавяне на следните потребители в обобщението на %(groupId)s:",
"Add a User": "Добавяне на потребител",
"Failed to remove a user from the summary of %(groupId)s": "Неуспешно премахване на потребител от обобщението на %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "Потребителят '%(displayName)s' не може да бъде премахнат от обобщението.",
"Failed to upload image": "Неуспешно качване на снимката",
"Leave %(groupName)s?": "Напускане на %(groupName)s?",
"Featured Rooms:": "Препоръчани стаи:",
"Featured Users:": "Препоръчани потребители:",
"Long Description (HTML)": "Дълго описание (HTML)",
"Description": "Описание",
"This Home server does not support communities": "Този Home сървър не поддържа общности",
"Failed to load %(groupId)s": "Неуспешно зареждане на %(groupId)s",
"Reject invitation": "Отхвърли поканата",
"Are you sure you want to reject the invitation?": "Сигурни ли сте, че искате да отхвърлите поканата?",
"Failed to reject invitation": "Неуспешно отхвърляне на поканата",
"This room is not public. You will not be able to rejoin without an invite.": "Тази стая не е публична. Няма да можете да се присъедините отново без покана.",
"Are you sure you want to leave the room '%(roomName)s'?": "Сигурни ли сте, че искате да напуснете стаята '%(roomName)s'?",
"Failed to leave room": "Неуспешно напускане на стаята",
"Old cryptography data detected": "Бяха открити стари криптографски данни",
"Your Communities": "Вашите общности",
"Failed to fetch avatar URL": "Неуспешно изтегляне от адреса на аватара",
"Signed Out": "Излязохте",
"For security, this session has been signed out. Please sign in again.": "Поради мерки за сигурност, тази сесия е прекратена. Моля, влезте отново.",
"Cryptography data migrated": "Бяха мигрирани криптографските данни",
"Logout": "Излез",
"Sign out": "Изход",
"Error whilst fetching joined communities": "Грешка при извличането на общности, към които сте присъединени",
"You have no visible notifications": "Нямате видими известия",
"Scroll to bottom of page": "Отиди до края на страницата",
"Message not sent due to unknown devices being present": "Съобщението не е изпратено поради наличието на непознати устройства",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Покажи устройствата</showDevicesText>, <sendAnywayText>изпрати въпреки това</sendAnywayText> или <cancelText>откажи</cancelText>.",
"%(count)s of your messages have not been sent.|other": "Някои от Вашите съобщение не бяха изпратени.",
"%(count)s of your messages have not been sent.|one": "Вашето съобщение не беше изпратено.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Изпрати всички отново</resendText> или <cancelText>откажи всички</cancelText> сега. Също така може да изберете индивидуални съобщения, които да изпратите отново или да откажете.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Изпрати съобщението отново</resendText> или <cancelText>откажи съобщението</cancelText> сега.",
"Connectivity to the server has been lost.": "Връзката със сървъра е изгубена.",
"Sent messages will be stored until your connection has returned.": "Изпратените съобщения ще бъдат запаметени докато връзката Ви се възвърне.",
"%(count)s new messages|other": "%(count)s нови съобщения",
"%(count)s new messages|one": "%(count)s ново съобщение",
"Active call": "Активен разговор",
"Use with caution": "Внимавайте при използване",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Няма никой друг тук! Желаете ли да <inviteText>поканите други</inviteText> или да <nowarnText>изключите предупреждението, че стаята е празна</nowarnText>?",
"You seem to be uploading files, are you sure you want to quit?": "Изглежда, че качвате файлове. Сигурни ли сте, че искате да затворите програмата?",
"You seem to be in a call, are you sure you want to quit?": "Изглежда, че сте в разговор. Сигурни ли сте, че искате да излезете от програмата?",
"Failed to upload file": "Неуспешно качване на файлове",
"Server may be unavailable, overloaded, or the file too big": "Сървърът може би е недостъпен, претоварен или файлът е твърде голям",
"Search failed": "Търсенето е неуспешно",
"Server may be unavailable, overloaded, or search timed out :(": "Сървърът може би е недостъпен, претоварен или времето за търсене изтече :(",
"No more results": "Няма повече резултати",
"Unknown room %(roomId)s": "Неизвестна стая %(roomId)s",
"Room": "Стая",
"Failed to save settings": "Неуспешно запазване на настройките",
"Failed to reject invite": "Неуспешно отхвърляне на поканата",
"Reject all %(invitedRooms)s invites": "Отхвърли всички %(invitedRooms)s покани",
"Fill screen": "Запълни екрана",
"Click to unmute video": "Натиснете, за да включите звука на видеото",
"Click to mute video": "Натиснете, за да заглушите видеото",
"Click to unmute audio": "Натиснете, за да включите звука",
"Click to mute audio": "Натиснете, за да заглушите звука",
"Clear filter": "Изчисти филтър",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Беше направен опит да се зареди конкретна точка в хронологията на тази стая, но нямате разрешение да разгледате въпросното съобщение.",
"Failed to load timeline position": "Неуспешно зареждане на позицията в хронологията",
"Uploading %(filename)s and %(count)s others|other": "Качване на %(filename)s и %(count)s други",
"Uploading %(filename)s and %(count)s others|zero": "Качване на %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Качване на %(filename)s и %(count)s друг",
"Light theme": "Светла тема",
"Dark theme": "Тъмна тема",
"Status.im theme": "Тема Status.im",
"Can't load user settings": "Потребителските настройки не могат да бъдат заредени",
"Server may be unavailable or overloaded": "Сървърът може би е недостъпен или претоварен",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "За сигурност, излизането ще изтрие ключовете за шифроване от край до край от този браузър. Ако искате да бъде възможно да разшифровате Вашата история на разговорите от бъдещи Riot сесии, моля експортирайте Вашите ключове за стаите.",
"Success": "Успешно",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Вашата парола беше успешно сменена. Няма да получавате известия на други устройства, докато не влезете отново в профила си от тях",
"Remove Contact Information?": "Премахване на информацията за контакти?",
"Remove %(threePid)s?": "Премахни %(threePid)s?",
"Refer a friend to Riot:": "Покани приятел в Riot:",
"Interface Language": "Език на интерфейса",
"User Interface": "Потребителски интерфейс",
"Autocomplete Delay (ms):": "Забавяне на визуализацията на автоматичните подсказки (мс):",
"<not supported>": "<не се поддържа>",
"Import E2E room keys": "Импортирай E2E ключове за стая",
"Cryptography": "Криптография",
"Device ID:": "Идентификатор на устройството:",
"Device key:": "Ключ на устройството:",
"Ignored Users": "Игнорирани потребители",
"Found a bug?": "Намерихте грешка?",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot събира анонимни статистики, за да ни позволи да подобрим приложението.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Поверителността е важна за нас, затова за нашите статистики не събираме лични или идентифициращи Вас данни.",
"Learn more about how we use analytics.": "Научете повече за това как използваме статистическите данни.",
"Labs": "Експерименти",
"These are experimental features that may break in unexpected ways": "Това са експериментални функции , които могат да се счупят по неочаквани начини",
"Clear Cache": "Изчисти кеш",
"Clear Cache and Reload": "Изчисти кеша и зареди отново",
"Updates": "Нови версии",
"Check for update": "Провери за нова версия",
"Bulk Options": "Групови опции",
"Desktop specific": "Специфичен за работния плот",
"Start automatically after system login": "Автоматично стартиране след влизане в системата",
"No media permissions": "Няма разрешения за медийните устройства",
"You may need to manually permit Riot to access your microphone/webcam": "Може да се наложи ръчно да разрешите на Riot да получи достъп до Вашия микрофон/уеб камера",
"Missing Media Permissions, click here to request.": "Липсват разрешения за медийните устройства. Натиснете тук, за да ги поискате.",
"No Microphones detected": "Няма открити микрофони",
"No Webcams detected": "Няма открити уеб камери",
"Default Device": "Устройство по подразбиране",
"Microphone": "Микрофон",
"Camera": "Камера",
"VoIP": "VoIP",
"Email": "Имейл",
"Add email address": "Добави имейл адрес",
"Profile": "Профил",
"Display name": "Име/псевдоним",
"Account": "Акаунт",
"To return to your account in future you need to set a password": "За да се върнете в профила си в бъдеще, трябва да зададете парола",
"Logged in as:": "Влезли сте като:",
"Access Token:": "Тоукън за достъп:",
"click to reveal": "натиснете за показване",
"Homeserver is": "Home сървър:",
"Identity Server is": "Сървър за самоличност:",
"matrix-react-sdk version:": "Версия на matrix-react-sdk:",
"riot-web version:": "Версия на riot-web:",
"olm version:": "Версия на olm:",
"Failed to send email": "Неуспешно изпращане на имейл",
"The email address linked to your account must be entered.": "Имейл адресът, свързан с профила Ви, трябва да бъде въведен.",
"A new password must be entered.": "Трябва да бъде въведена нова парола.",
"New passwords must match each other.": "Новите пароли трябва да съвпадат една с друга.",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Имейл беше изпратен на %(emailAddress)s. След като проследите връзката, която съдържа, натиснете по-долу.",
"Your password has been reset": "Вашата парола беше възстановена",
"Return to login screen": "Връщане към страницата за влизане в профила",
"To reset your password, enter the email address linked to your account": "За да възстановите Вашата парола, въведете имейл адреса, свързан с профила Ви",
"New password": "Нова парола",
"Confirm your new password": "Потвърдете новата си парола",
"Send Reset Email": "Изпрати имейл за възстановяване на парола",
"Create an account": "Създаване на профил",
"This Home Server does not support login using email address.": "Този Home сървър не поддържа влизане в профила чрез имейл адрес.",
"Incorrect username and/or password.": "Неправилно потребителско име и/или парола.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Моля, обърнете внимание, че влизате в %(hs)s сървър, а не в matrix.org.",
"Guest access is disabled on this Home Server.": "Достъпът за гости е изключен на този Home сървър.",
"The phone number entered looks invalid": "Въведеният телефонен номер изглежда невалиден",
"This homeserver doesn't offer any login flows which are supported by this client.": "Този Home сървър не предлага методи за влизане, които се поддържат от този клиент.",
"Error: Problem communicating with the given homeserver.": "Грешка: Проблем при комуникацията с дадения Home сървър.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Не е възможно свързване към Home сървъра чрез HTTP, когато има HTTPS адрес в лентата на браузъра Ви. Или използвайте HTTPS или <a>включете функция небезопасни скриптове</a>.",
"Login as guest": "Влез като гост",
"Sign in to get started": "Влезте в профила си, за да започнете",
"Set a display name:": "Задаване на име:",
"Upload an avatar:": "Качване на профилна снимка:",
"This server does not support authentication with a phone number.": "Този сървър не поддържа автентикация с телефонен номер.",
"Missing password.": "Липсва парола.",
"Passwords don't match.": "Паролите не съвпадат.",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Паролата е твърде къса (мин. %(MIN_PASSWORD_LENGTH)s).",
"This doesn't look like a valid email address.": "Това не изглежда да е валиден имейл адрес.",
"This doesn't look like a valid phone number.": "Това не изглежда да е валиден телефонен номер.",
"You need to enter a user name.": "Трябва да въведете потребителско име.",
"An unknown error occurred.": "Възникна неизвестна грешка.",
"I already have an account": "Вече имам профил",
"Displays action": "Показва действие",
"Bans user with given id": "Блокира потребители с даден идентификатор",
"Unbans user with given id": "Отблокира потребител с даден идентификатор",
"Define the power level of a user": "Променя нивото на достъп на потребителя",
"Deops user with given id": "Отнема правата на потребител с даден идентификатор",
"Invites user with given id to current room": "Поканва потребител с даден идентификатор в текущата стая",
"Joins room with given alias": "Присъединяване към стая с даден псевдоним",
"Sets the room topic": "Задава темата на стаята",
"Kicks user with given id": "Изгонва потребителя с даден идентификатор",
"Changes your display nickname": "Сменя Вашия псевдоним",
"Searches DuckDuckGo for results": "Търси в DuckDuckGo за резултати",
"Changes colour scheme of current room": "Променя цветовата схема на текущата стая",
"Verifies a user, device, and pubkey tuple": "Потвърждава потребител, устройство или ключова двойка",
"Ignores a user, hiding their messages from you": "Игнорира потребител, скривайки съобщенията му от Вас",
"Stops ignoring a user, showing their messages going forward": "Спира игнорирането на потребител, показвайки съобщенията му занапред",
"Commands": "Команди",
"Results from DuckDuckGo": "Резултати от DuckDuckGo",
"Emoji": "Емотикони",
"Notify the whole room": "Извести всички в стаята",
"Room Notification": "Известие за стая",
"Users": "Потребители",
"unknown device": "неизвестно устройство",
"Ed25519 fingerprint": "Ed25519 отпечатък",
"User ID": "Потребителски идентификатор",
"Curve25519 identity key": "Curve25519 ключ за самоличност",
"Algorithm": "Алгоритъм",
"unencrypted": "нешифрован",
"Decryption error": "Грешка при разшифроването",
"Session ID": "Идентификатор на сесията",
"Claimed Ed25519 fingerprint key": "Заявен ключов отпечатък Ed25519",
"End-to-end encryption information": "Информация за шифроването от край до край",
"Event information": "Информация за събитието",
"Sender device information": "Информация за устройството на подателя",
"Passphrases must match": "Паролите трябва да съвпадат",
"Passphrase must not be empty": "Паролата не трябва да е празна",
"Export room keys": "Експортиране на ключове за стаята",
"Enter passphrase": "Въведи парола",
"Confirm passphrase": "Потвърди парола",
"Export": "Експортирай",
"Import room keys": "Импортиране на ключове за стая",
"File to import": "Файл за импортиране",
"Import": "Импортирай",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Също така записваме всяка страница, която използвате в приложението (в момента <CurrentPageHash>), браузъра, който използвате (<CurrentUserAgent>) и резолюцията на устройството (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Когато тази страница съдържа информация идентифицираща Вас (като например стая, потребител или идентификатор на група), тези данни биват премахнати преди да бъдат изпратени до сървъра.",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Има непознати устройства в тази стая. Ако продължите без да ги потвърдите, ще бъде възможно за някого да подслушва Вашия разговор.",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ВНИМАНИЕ: НЕУСПЕШНО ПОТВЪРЖДАВАНЕ НА КЛЮЧА! Ключът за подписване за %(userId)s и устройството %(deviceId)s е \"%(fprint)s\", което не съвпада с предоставения ключ \"%(fingerprint)s\". Това може да означава, че Вашата комуникация е прихваната!",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смяната на парола ще нулира всички ключове за шифроване от край до край на всички устройства, правейки историята на шифрования чат невъзможна за четене, освен ако първо не експортирате ключовете за стаята и ги импортирате отново след това. В бъдеще това ще бъде подобрено.",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "На път сте да бъдете отведени до друг сайт, където можете да удостоверите профила си за използване с %(integrationsUrl)s. Искате ли да продължите?",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Проверка за робот в момента не е налична на работния плот. Моля, използвайте <a>уеб браузър</a>",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Можете да използвате опциите за друг сървър, за да влезете в други Matrix сървъри като посочите различен Home сървър.",
"This allows you to use this app with an existing Matrix account on a different home server.": "Това Ви позволява да използвате това приложение със съществуващ Matrix профил на различен Home сървър.",
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Възможно е и да зададете друг сървър за самоличност, но това обикновено предотвратява намирането на други потребители по имейл адрес.",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Сигурни ли сте, че искате да премахнете (изтриете) това събитие? Забележете, че ако изтриете събитие за промяна на името на стая или тема, това може да обърне промяната.",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "За да потвърдите, че на това устройство може да се вярва, моля свържете се със собственика му по друг начин (напр. на живо или чрез телефонен разговор) и го попитайте дали ключът, който той вижда в неговите настройки на потребителя за това устройство, съвпада с ключа по-долу:",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ако съвпада, моля натиснете бутона за потвърждение по-долу. Ако не, то тогава някой друг имитира това устройство и вероятно искате вместо това да натиснете бутона за черен списък.",
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Засякохме грешка при опита за възстановяване на предишната Ви сесия. Ако продължите, ще трябва да влезете в профила си отново. Шифрованата история на чата няма да бъде четима.",
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ако преди сте използвали по-нова версия на Riot, Вашата сесия може да не бъде съвместима с текущата версия. Затворете този прозорец и се върнете в по-новата версия.",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Това ще бъде името на профила Ви на <span></span> Home сървъра, или можете да изберете <a>друг сървър</a>.",
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Препоръчваме Ви да минете през процеса за потвърждение за всяко устройство, за да потвърдите, че принадлежат на легитимен собственик. Ако предпочитате, можете да изпратите съобщение без потвърждение.",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Извършена е еднократна миграция на криптографски данни. Шифроването от край до край няма да работи, ако се върнете към по-стара версия на Riot. Ако искате да използвате криптография от край до край на по-стара версия, първо излезте от Riot. За да запазите историята на съобщенията, експортирайте и импортирайте отново Вашите ключове.",
"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. Това ще доведе до неправилна работа на криптографията от край до край в по-старата версия. Шифрованите от край до край съобщения, които са били обменени наскоро (при използването на по-стара версия), може да не успеят да бъдат разшифровани в тази версия. Това също може да доведе до неуспех в обмяната на съобщения в тази версия. Ако имате проблеми, излезте и влезте отново в профила си. За да запазите историята на съобщенията, експортирайте и импортирайте отново Вашите ключове.",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Възстановяването на парола ще нулира всички ключове за шифроване от край до край за всички устройства, правейки историята на шифрования чат невъзможна за четене, освен ако първо не експортирате Вашите ключове за стаята и ги импортирате отново след това. В бъдеще това ще бъде подобрено.",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Вие сте излязли от профила си от всички устройства и вече няма да получавате известия. За да включите известията отново, влезте в профила си от всички устройства",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Няма връзка с Home сървъра. Моля, проверете Вашата връзка. Уверете се, че <a>SSL сертификатът на Home сървъра</a> е надежден и че някое разширение на браузъра не блокира заявките.",
"none": "няма",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Този процес Ви позволява да експортирате във файл ключовете за съобщения в шифровани стаи. Така ще можете да импортирате файла в друг Matrix клиент, така че той също да може да разшифрова такива съобщения.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Експортираният файл ще позволи на всеки, който може да го прочете, да разшифрова всяко шифровано съобщение, което можете да видите. Трябва да го държите на сигурно място. За да направите това, трябва да въведете парола по-долу, която ще се използва за шифроване на експортираните данни. Ще бъде възможно да се импортират данните само с използване на същата парола.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Този процес позволява да импортирате ключове за шифроване, които преди сте експортирали от друг Matrix клиент. Тогава ще можете да разшифровате всяко съобщение, което другият клиент може да разшифрова.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Експортираният файл може да бъде предпазен с парола. Трябва да въведете парола тук, за да разшифровате файла.",
"Did you know: you can use communities to filter your Riot.im experience!": "Знаете ли, че: може да използвате общности, за да филтрирате Вашето Riot.im преживяване!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "За да създадете филтър, дръпнете и пуснете аватара на общността върху панела за филтриране в най-лявата част на екрана. По всяко време може да натиснете върху аватар от панела, за да видите само стаите и хората от тази общност.",
"Disable Community Filter Panel": "Изключи панела за филтриране на общности",
"Your key share request has been sent - please check your other devices for key share requests.": "Заявката за споделяне на ключ е изпратена. Моля, проверете заявките за споделяне на другите Ви устройства.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Заявки за споделяне на ключове се изпращат автоматично към другите Ви устройства. Ако сте ги отхвърлили от другите устройства, натиснете тук, за да заявите нови за тази сесия.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако другите Ви устройства нямат ключа за това съобщение, няма да можете да го разшифровате.",
"Key request sent.": "Заявката за ключ е изпратена.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Заявете отново ключове за шифроване</requestLink> от другите Ви устройства.",
"%(user)s is a %(userRole)s": "%(user)s е %(userRole)s"
}

View File

@ -315,7 +315,7 @@
"Unignore": "Deixa de ignorar",
"Ignore": "Ignora",
"Jump to read receipt": "Vés a l'últim missatge llegit",
"Mention": "Menció",
"Mention": "Menciona",
"Invite": "Convida",
"User Options": "Opcions d'usuari",
"Direct chats": "Xats directes",
@ -376,7 +376,7 @@
"Idle for %(duration)s": "Inactiu durant %(duration)s",
"Offline for %(duration)s": "Desconnectat durant %(duration)s",
"Unknown for %(duration)s": "Desconegut durant %(duration)s",
"Online": "En línia",
"Online": "Conectat",
"Idle": "Inactiu",
"Offline": "Desconnectat",
"Unknown": "Desconegut",
@ -445,7 +445,6 @@
"Encryption is enabled in this room": "L'encriptació està activada en aquesta sala",
"Encryption is not enabled in this room": "L'encriptació no està activada en aquesta sala",
"Privileged Users": "Usuaris amb privilegis",
"%(user)s is a": "L'usuari %(user)s és",
"No users have specific privileges in this room": "Cap usuari té privilegis específics en aquesta sala",
"Banned users": "Usuaris expulsats",
"This room is not accessible by remote Matrix servers": "Aquesta sala no és accessible per a servidors de Matrix remots",
@ -778,8 +777,6 @@
"Are you sure you want to leave the room '%(roomName)s'?": "Esteu segur que voleu sortir de la sala '%(roomName)s'?",
"Failed to leave room": "No s'ha pogut sortir de la sala",
"For security, this session has been signed out. Please sign in again.": "Per seguretat, aquesta sessió s'ha tancat. Torna a iniciar la sessió.",
"Cryptography data migrated": "S'han migrat les dades criptogràfiques",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "S'ha realitzat una migració puntual de les dades criptogràfiques. L'encriptació d'extrem a extrem no funcionarà si torneu a una versió anterior de Riot. Si necessiteu utilitzar l'encriptació d'extrem a extrem en una versió anterior, primer sortiu de Riot. Per poder llegir l'historial dels missatges encriptats, exporteu i torneu a importar les vostres claus.",
"Old cryptography data detected": "S'han detectat dades de criptografia antigues",
"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.": "S'han detectat dades d'una versió antiga de Riot. Això pot provocar que l'encriptació d'extrem a extrem no funcioni correctament a la versió anterior. Els missatges encriptats d'extrem a extrem que s'han intercanviat recentment mentre s'utilitzava la versió anterior no es poden desencriptar en aquesta versió. També pot provocar que els missatges intercanviats amb aquesta versió fallin. Si teniu problemes, tanqueu-lo i torneu-ho a engegar. Per poder llegir l'historial dels missatges encriptats, exporteu i torneu a importar les vostres claus.",
"Logout": "Surt",
@ -867,5 +864,16 @@
"Import": "Importa",
"The version of Riot.im": "La versió de Riot.im",
"Email": "Correu electrònic",
"Add email address": "Afegeix correu electrònic"
"Add email address": "Afegeix correu electrònic",
"I have verified my email address": "He verificat l'adreça de correu electrònic",
"Send Reset Email": "Envia email de reinici",
"Your homeserver's URL": "URL del teu homeserver",
"Your identity server's URL": "URL del teu servidor d'identitat",
"Analytics": "Analítiques",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.",
"Server may be unavailable or overloaded": "El servidor pot estar inaccessible o sobrecarregat",
"Report it": "Informa",
"Found a bug?": "Has trobat un error?",
"Display name": "Nom visible",
"Identity Server is": "El servidor d'identitat es"
}

View File

@ -417,7 +417,6 @@
"Use with caution": "Používejte s opatrností",
"User ID": "Uživatelské ID",
"User Interface": "Uživatelské rozhraní",
"%(user)s is a": "%(user)s je",
"User name": "Uživatelské jméno",
"Username invalid: %(errMessage)s": "Neplatné uživatelské jméno: %(errMessage)s",
"Users": "Uživatelé",
@ -947,8 +946,6 @@
"Addresses": "Adresy",
"collapse": "sbalit",
"expand": "rozbalit",
"Cryptography data migrated": "Šifrovaná data byla převedena",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Jednorázová migrace šifrovaných údajů dokončena. E2E šifrovaní vám nebude fungovat jakmile se vrátíte ke starší verzi programu Riot. Pokud plánujete používat šifrovaní ve starší verzi Riot, doporučujeme vám se nejdříve odhlásit. Aby jste si zachovali historii šifrovaných konverzací, exportujte a znovu importujte klíče místností.",
"Old cryptography data detected": "Nalezeny starší šifrované datové zprávy",
"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.": "Nalezeny datové zprávy ze starší verze Riot. Důsledkem bude, že E2E šifrování nebude ve starší verzi Riot správně fungovat. Šifrované zprávy ze starší verze nemusí být čitelné v nové verzi. Může dojít i k selhání zasílaní zpráv s touto verzí Riot. Pokud zaznamenáte některý z uvedených problému, odhlaste se a přihlaste znovu. Pro zachování historie zpráv exportujte a znovu importujte vaše klíče.",
"Warning": "Upozornění"

View File

@ -615,7 +615,6 @@
"Unnamed Room": "Unbenannter Raum",
"Unverified": "Nicht verifiziert",
"Upload new:": "Neue(s) hochladen:",
"%(user)s is a": "%(user)s ist ein",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (Berechtigungslevel %(powerLevelNumber)s)",
"Verified": "Verifiziert",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Möchtest du diese Einladung <acceptText>akzeptieren</acceptText> oder <declineText>ablehnen</declineText>?",
@ -936,7 +935,7 @@
"Display your community flair in rooms configured to show it.": "Zeige deinen Community-Flair in den Räumen, die es erlauben.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über keinen, von diesem Client unterstütztes Anmeldeverfahren.",
"Call Failed": "Anruf fehlgeschlagen",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht verifizierte Geräte. Wenn du ohne Verifizierung fortfährst, könnten Angreifer den Anruf mithören.",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht verifizierte Geräte. Wenn du fortfährst, ohne sie zu verifizieren, könnten Angreifer den Anruf mithören.",
"Review Devices": "Geräte ansehen",
"Call Anyway": "Trotzdem anrufen",
"Answer Anyway": "Trotzdem annehmen",
@ -946,10 +945,8 @@
"Addresses": "Adressen",
"collapse": "Verbergen",
"expand": "Erweitern",
"Cryptography data migrated": "Kryptographie-Schlüssel wurden übertragen",
"Old cryptography data detected": "Alte Kryptografiedaten erkannt",
"Warning": "Warnung",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Eine tiefgreifende Migration im Kontext der Verschlüsselungsdaten wurde durchgeführt. Ende-zu-Ende-Verschlüsselung wird nicht mehr funktionieren, wenn du zu einer älteren Version von Riot zurückkehrst. Wenn du Ende-zu-Ende-Verschlüssung bei einer älteren Version von Riot brauchst, melde dich bitte vorher ab. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel.",
"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.": "Es wurden Daten von einer älteren Version von Riot entdeckt. Dies wird zu Fehlern in der Ende-zu-Ende-Verschlüsselung der älteren Version geführt haben. Ende-zu-Ende verschlüsselte Nachrichten, die ausgetauscht wruden, während die ältere Version genutzt wurde, werden in dieser Version nicht entschlüsselbar sein. Es kann auch zu Fehlern mit Nachrichten führen, die mit dieser Version versendet werden. Wenn du Probleme feststellst, melde dich ab und wieder an. Um die Historie zu behalten, ex- und reimportiere deine Schlüssel.",
"Send an encrypted reply…": "Verschlüsselte Antwort senden…",
"Send a reply (unencrypted)…": "Antwort senden (unverschlüsselt)…",
@ -970,5 +967,29 @@
"Your homeserver's URL": "Die URL deines Homeservers",
"Your identity server's URL": "Die URL deines Identitätsservers",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"Tag Panel": "Beschriftungsfeld"
"Tag Panel": "Beschriftungsfeld",
"Message Replies": "Antworten auf Nachrichten",
"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.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.",
"Community IDs cannot not be empty.": "Community-IDs können nicht leer sein.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Geräte anzeigen</showDevicesText>, <sendAnywayText>trotzdem senden</sendAnywayText> oder <cancelText>abbrechen</cancelText>.",
"Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen sowie Raum, Nutzer oder Gruppen-ID enthalten, werden diese Daten entfernt bevor sie an den Server gesendet werden.",
"Whether or not you're logged in (we don't record your user name)": "Ob oder ob du nicht angemeldet bist (wir zeichnen deinen Benutzernamen nicht auf)",
"Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist",
"<a>In reply to</a> <pill>": "<a>Antwort zu</a> <pill>",
"This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s änderte den Anzeigenamen auf %(displayName)s.",
"Failed to set direct chat tag": "Fehler beim Setzen der Direkt-Chat-Markierung",
"Failed to remove tag %(tagName)s from room": "Fehler beim Entfernen des \"%(tagName)s\"-Tags von dem Raum",
"Failed to add tag %(tagName)s to room": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum",
"Did you know: you can use communities to filter your Riot.im experience!": "Wusstest du: Du kannst Communities nutzen um deine Riot.im-Erfahrung zu filtern!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Um einen Filter zu setzen, siehe einen Community-Bild auf das Filter-Panel ganz links. Du kannst jederzeit auf einen Avatar im Filter-Panel klicken um nur die Räume und Personen aus der Community zu sehen.",
"Clear filter": "Filter zurücksetzen",
"Disable Community Filter Panel": "Deaktivere Community-Filter-Panel",
"Your key share request has been sent - please check your other devices for key share requests.": "Deine Schlüssel-Teil-Anfragen wurden gesendet. Bitte prüfe deine anderen Geräte auf die Schlüssel-Teil-Anfragen.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Schlüssel-Anfragen wurden automatisch zu den anderen Geräten gesendet. Wenn du diese Anfragen auf deinen anderen Geräten abgelehnt oder verpasst hast, klicke hier um die Schlüssel für diese Sitzung erneut anzufragen.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Geräte keine Schlüssel für diese Nachricht haben, wirst du diese nicht entschlüsseln können.",
"Key request sent.": "Schlüssel-Anfragen gesendet.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "Verschlüsselungs-Schlüssel von deinen anderen Geräten <requestLink>erneut anfragen</requestLink>.",
"%(user)s is a %(userRole)s": "%(user)s ist ein %(userRole)s"
}

View File

@ -316,7 +316,6 @@
"Use with caution": "Χρησιμοποιήστε τα με προσοχή",
"User ID": "Αναγνωριστικό χρήστη",
"User Interface": "Διεπαφή χρήστη",
"%(user)s is a": "Ο %(user)s είναι",
"User name": "Όνομα χρήστη",
"Username invalid: %(errMessage)s": "Μη έγκυρο όνομα χρήστη: %(errMessage)s",
"Users": "Χρήστες",

View File

@ -203,6 +203,7 @@
"Don't send typing notifications": "Don't send typing notifications",
"Automatically replace plain text Emoji": "Automatically replace plain text Emoji",
"Mirror local video feed": "Mirror local video feed",
"Disable Community Filter Panel": "Disable Community Filter Panel",
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
"Opt out of analytics": "Opt out of analytics",
"Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
@ -264,6 +265,11 @@
"%(senderName)s sent a video": "%(senderName)s sent a video",
"%(senderName)s uploaded a file": "%(senderName)s uploaded a file",
"Options": "Options",
"Your key share request has been sent - please check your other devices for key share requests.": "Your key share request has been sent - please check your other devices for key share requests.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "If your other devices do not have the key for this message you will not be able to decrypt them.",
"Key request sent.": "Key request sent.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Re-request encryption keys</requestLink> from your other devices.",
"Undecryptable": "Undecryptable",
"Encrypted by a verified device": "Encrypted by a verified device",
"Encrypted by an unverified device": "Encrypted by an unverified device",
@ -381,9 +387,6 @@
"Drop here to restore": "Drop here to restore",
"Drop here to demote": "Drop here to demote",
"Drop here to tag %(section)s": "Drop here to tag %(section)s",
"Failed to set direct chat tag": "Failed to set direct chat tag",
"Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
"Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room",
"Press <StartChatButton> to start a chat with someone": "Press <StartChatButton> to start a chat with someone",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory",
"Community Invites": "Community Invites",
@ -434,8 +437,15 @@
"(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
"Encryption is enabled in this room": "Encryption is enabled in this room",
"Encryption is not enabled in this room": "Encryption is not enabled in this room",
"The default role for new room members is": "The default role for new room members is",
"To send messages, you must be a": "To send messages, you must be a",
"To invite users into the room, you must be a": "To invite users into the room, you must be a",
"To configure the room, you must be a": "To configure the room, you must be a",
"To kick users, you must be a": "To kick users, you must be a",
"To ban users, you must be a": "To ban users, you must be a",
"To remove other users' messages, you must be a": "To remove other users' messages, you must be a",
"Privileged Users": "Privileged Users",
"%(user)s is a": "%(user)s is a",
"%(user)s is a %(userRole)s": "%(user)s is a %(userRole)s",
"No users have specific privileges in this room": "No users have specific privileges in this room",
"Banned users": "Banned users",
"This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
@ -445,6 +455,7 @@
"To link to a room it must have <a>an address</a>.": "To link to a room it must have <a>an address</a>.",
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
"Click here to fix": "Click here to fix",
"To send events of type <eventType/>, you must be a": "To send events of type <eventType/>, you must be a",
"Who can access this room?": "Who can access this room?",
"Only people who have been invited": "Only people who have been invited",
"Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests",
@ -456,14 +467,6 @@
"Members only (since they were invited)": "Members only (since they were invited)",
"Members only (since they joined)": "Members only (since they joined)",
"Permissions": "Permissions",
"The default role for new room members is": "The default role for new room members is",
"To send messages, you must be a": "To send messages, you must be a",
"To invite users into the room, you must be a": "To invite users into the room, you must be a",
"To configure the room, you must be a": "To configure the room, you must be a",
"To kick users, you must be a": "To kick users, you must be a",
"To ban users, you must be a": "To ban users, you must be a",
"To remove other users' messages, you must be a": "To remove other users' messages, you must be a",
"To send events of type <eventType/>, you must be a": "To send events of type <eventType/>, you must be a",
"Advanced": "Advanced",
"This room's internal ID is": "This room's internal ID is",
"Add a topic": "Add a topic",
@ -763,6 +766,7 @@
"Leave": "Leave",
"Unable to leave room": "Unable to leave room",
"Community Settings": "Community Settings",
"Changes made to your community might not be seen by other users for up to 30 minutes.": "Changes made to your community might not be seen by other users for up to 30 minutes.",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.",
"Add rooms to this community": "Add rooms to this community",
"Featured Rooms:": "Featured Rooms:",
@ -784,12 +788,12 @@
"Failed to leave room": "Failed to leave room",
"Signed Out": "Signed Out",
"For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
"Cryptography data migrated": "Cryptography data migrated",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.",
"Old cryptography data detected": "Old cryptography data detected",
"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.": "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.",
"Logout": "Logout",
"Your Communities": "Your Communities",
"Did you know: you can use communities to filter your Riot.im experience!": "Did you know: you can use communities to filter your Riot.im experience!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.",
"Error whilst fetching joined communities": "Error whilst fetching joined communities",
"Create a new community": "Create a new community",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.",
@ -826,6 +830,7 @@
"Click to mute video": "Click to mute video",
"Click to unmute audio": "Click to unmute audio",
"Click to mute audio": "Click to mute audio",
"Clear filter": "Clear filter",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
"Failed to load timeline position": "Failed to load timeline position",
@ -984,5 +989,8 @@
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.",
"File to import": "File to import",
"Import": "Import"
"Import": "Import",
"Failed to set direct chat tag": "Failed to set direct chat tag",
"Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
"Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room"
}

View File

@ -639,7 +639,6 @@
"Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other",
"Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others",
"Upload new:": "Upload new:",
"%(user)s is a": "%(user)s is a",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
"Verified": "Verified",

View File

@ -417,7 +417,6 @@
"Encryption is enabled in this room": "Ĉifrado estas ŝaltita en tiu ĉi ĉambro",
"Encryption is not enabled in this room": "Ĉifrado ne estas ŝaltita en tiu ĉi ĉambro",
"Privileged Users": "Privilegiuloj",
"%(user)s is a": "%(user)s estas",
"No users have specific privileges in this room": "Neniuj uzantoj havas specialajn privilegiojn en tiu ĉi ĉambro",
"Banned users": "Forbaritaj uzantoj",
"This room is not accessible by remote Matrix servers": "Ĉi tiu ĉambro ne atingeblas por foraj serviloj de Matrix",
@ -752,8 +751,6 @@
"Are you sure you want to leave the room '%(roomName)s'?": "Ĉu vi certe volas forlasi la ĉambron %(roomName)s?",
"Failed to leave room": "Malsukcesis forlasi la ĉambron",
"Signed Out": "Adiaŭinta",
"Cryptography data migrated": "Kriptografiaj datumoj transmetiĝis",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Unufoja transmeto de kriptografiaj datumoj fariĝis. Ĝiscela ĉifrado ne funkcios se vi revenos al pli malnova versio de Riot. Se vi bezonas ĝiscelan ĉifradon ĉe pli malnova versio, adiaŭu unue. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.",
"Old cryptography data detected": "Malnovaj kriptografiaj datumoj troviĝis",
"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.": "Datumoj el malnova versio de Riot troviĝis. Ĉi tio malfunkciigos ĝiscelan ĉifradon en la malnova versio. Ĝiscele ĉifritaj mesaĝoj interŝanĝitaj freŝtempe per la malnova versio eble ne malĉifreblos. Tio povas kaŭzi malsukceson ankaŭ al mesaĝoj interŝanĝitaj kun tiu ĉi versio. Se vin trafos problemoj, adiaŭu kaj resalutu. Por reteni mesaĝan historion, elportu kaj reenportu viajn ŝlosilojn.",
"Logout": "Adiaŭi",
@ -944,5 +941,27 @@
"Import": "Enporti",
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Forigo de fenestraĵo efektiviĝos por ĉiuj uzantoj en ĉi tiu ĉambro. Ĉu vi certe volas ĝin forigi?",
"Unblacklist": "Repermesi legadon de ĉifritaj mesaĝoj",
"none": "neniu"
"none": "neniu",
"The version of Riot.im": "Tiu ĉi versio de Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Ĉu vi salutis aŭ ne (ni ne registras vian salutnomon)",
"Your language of choice": "Via preferata lingvo",
"The information being sent to us to help make Riot.im better includes:": "Informoj sendataj al ni por plibonigi la servon Riot.im inkluzivas:",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ŝanĝis sian vidigan nomon al %(displayName)s.",
"Send an encrypted reply…": "Sendi ĉifritan respondon…",
"Send a reply (unencrypted)…": "Sendi respondon (neĉifritan)…",
"Send an encrypted message…": "Sendi ĉifritan mesaĝon…",
"Send a message (unencrypted)…": "Sendi mesaĝon (neĉifritan)…",
"Replying": "Respondanta",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privato gravas al ni, tial ni ne kolektas personajn aŭ spureblajn datumojn por nia analizo.",
"Learn more about how we use analytics.": "Lernu pli pri nia uzo de analiziloj.",
"Your homeserver's URL": "La URL de via servilo",
"Your identity server's URL": "La URL de via identigan servilo",
"The platform you're on": "Via sistemtipo",
"Which officially provided instance you are using, if any": "Kiun oficiale disponeblan aperon vi uzas, se iun ajn",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Ĉu vi uzas la riĉtekstan reĝimon de la riĉteksta redaktilo aŭ ne",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Ni ankaŭ registras ĉiun paĝon, kiun vi uzas en la programo (nun <CurrentPageHash>), vian klientan aplikaĵon (<CurrentUserAgent>) kaj vian aparatan distingon (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kiam ĉi tiu paĝo enhavas identigeblajn informojn, ekzemple ĉambron, uzantan aŭ grupan identigilon, ĝi sendiĝas al la servilo sen tiuj.",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"Disable Community Filter Panel": "Malŝalti komunuman filtran breton",
"Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al ĉambro"
}

View File

@ -472,7 +472,6 @@
"Use with caution": "Usar con precaución",
"User ID": "Identificación de usuario",
"User Interface": "Interfaz de usuario",
"%(user)s is a": "%(user)s es un",
"User name": "Nombre de usuario",
"Username invalid: %(errMessage)s": "Nombre de usuario no válido: %(errMessage)s",
"Users": "Usuarios",
@ -571,5 +570,6 @@
"Nov": "Nov",
"Dec": "Dic",
"Warning": "Advertencia",
"Unpin Message": "Desmarcar Mensaje"
"Unpin Message": "Desmarcar Mensaje",
"Online": "Conectado"
}

View File

@ -121,11 +121,11 @@
"Import": "Inportatu",
"Never send encrypted messages to unverified devices from this device": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gailu honetatik",
"Verified": "Egiaztatuta",
"Blacklisted": "Zerrenda beltzean",
"Blacklisted": "Blokeatuta",
"unknown device": "gailu ezezaguna",
"Unverify": "Kendu egiaztaketa",
"Blacklist": "Sartu zerrenda beltzean",
"Unblacklist": "Atera zerrenda beltzean",
"Blacklist": "Blokeatu",
"Unblacklist": "Desblokeatu",
"Verify device": "Egiaztatu gailua",
"I verify that the keys match": "Gakoak bat datozela egiaztatu dut",
"Room contains unknown devices": "Gelan gailu ezezagunak daude",
@ -451,7 +451,6 @@
"Use with caution": "Erabili kontuz",
"User ID": "Erabiltzaile ID-a",
"User Interface": "Erabiltzaile interfazea",
"%(user)s is a": "%(user)s hau da:",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Erabiltzaile-izen baliogabea: %(errMessage)s",
"Users": "Erabiltzaileak",
@ -576,7 +575,7 @@
"This action is irreversible.": "Ez dago ekintza hau atzera egiterik.",
"To continue, please enter your password.": "Jarraitzeko sartu zure pasahitza.",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta zerrenda beltzera gehitu beharko zenuke.",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.",
"In future this verification process will be more sophisticated.": "etorkizunean egiaztaketa metodoa hobetuko da.",
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Errore bat gertatu da zure aurreko saioa berreskuratzen saiatzean. Jarraitzen baduzu berriro hasi beharko duzu saioa eta ezin izango duzu irakurri zifratutako historiala.",
"Unable to restore session": "Ezin izan da saioa berreskuratu",
@ -782,13 +781,13 @@
"You have been kicked from this room by %(userName)s.": "Gela honetatik kanporatu zaitu %(userName)s erabiltzaileak.",
"You have been banned from this room by %(userName)s.": "Gela honetatik debekatu zaitu %(userName)s erabiltzaileak.",
"You are trying to access a room.": "Gela bat atzitzen saiatzen ari zara.",
"To change the room's avatar, you must be a": "Gelaren abatara aldatzeko, hau izan behar zara:",
"To change the room's name, you must be a": "Gelaren izena aldatzeko, hau izan behar zara:",
"To change the room's main address, you must be a": "Gelaren helbide nagusia aldatzeko, hau izan behar zara:",
"To change the room's history visibility, you must be a": "Gelaren ikusgaitasuna aldatzeko, hau izan behar zara:",
"To change the permissions in the room, you must be a": "Gelaren baimenak aldatzeko, hau izan behar zara:",
"To change the topic, you must be a": "Mintzagaia aldatzeko, hau izan behar zara:",
"To modify widgets in the room, you must be a": "Gelaren trepetak aldatzeko, hau izan behar zara:",
"To change the room's avatar, you must be a": "Gelaren abatara aldatzeko:",
"To change the room's name, you must be a": "Gelaren izena aldatzeko:",
"To change the room's main address, you must be a": "Gelaren helbide nagusia aldatzeko:",
"To change the room's history visibility, you must be a": "Gelaren ikusgaitasuna aldatzeko:",
"To change the permissions in the room, you must be a": "Gelaren baimenak aldatzeko:",
"To change the topic, you must be a": "Mintzagaia aldatzeko:",
"To modify widgets in the room, you must be a": "Gelaren trepetak aldatzeko:",
"Members only (since the point in time of selecting this option)": "Kideek besterik ez (aukera hau hautatzen den unetik)",
"Members only (since they were invited)": "Kideek besterik ez (gonbidatu zaienetik)",
"Members only (since they joined)": "Kideek besterik ez (elkartu zirenetik)",
@ -821,7 +820,6 @@
"Long Description (HTML)": "Deskripzio luzea (HTML)",
"Description": "Deskripzioa",
"Community %(groupId)s not found": "Ez da %(groupId)s komunitatea aurkitu",
"Cryptography data migrated": "Kriptografia datuak migratuta",
"Old cryptography data detected": "Kriptografia datu zaharrak atzeman dira",
"Your Communities": "Zure komunitateak",
"Create a new community": "Sortu komunitate berria",
@ -942,7 +940,6 @@
"Try using one of the following valid address types: %(validTypesList)s.": "Saiatu baliozko helbide mota hauetako bat erabiltzen: %(validTypesList)s.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Komunitate IDak a-z, 0-9, edo '=_-./' karaktereak besterik ez ditu onartzen",
"Custom of %(powerLevel)s": "%(powerLevel)s pertsonalizatua",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Kriptografia datuen migrazio bat egon da. Muturretik muturrerako zifratzeak ez du funtzionatuko Riot bertsio zaharrago bat erabiltzen baduzu. Muturretik muturrerako zifratzea erabili behar baduzu bertsio zaharrago batean amaitu saioa Rioten lehenbizi. Mezuen historiala gordetzeko esportatu eta berriro inportatu zure gakoak.",
"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.",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Bdagoen komunitate batera elkartzeko, komunitatearen identifikatzailea jakin behar duzu; honen antza izango du <i>+adibidea:matrix.org</i>.",
@ -980,5 +977,20 @@
"This room is not public. You will not be able to rejoin without an invite.": "Gela hau ez da publikoa. Ezin izango zara berriro elkartu gonbidapenik gabe.",
"Community IDs cannot not be empty.": "Komunitate ID-ak ezin dira hutsik egon.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Erakutsi gailuak</showDevicesText>, <sendAnywayText>bidali hala ere</sendAnywayText> edo <cancelText>ezeztatu</cancelText>.",
"<a>In reply to</a> <pill>": "<a>honi erantzunez:</a> <pill>"
"<a>In reply to</a> <pill>": "<a>honi erantzunez:</a> <pill>",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s erabiltzaileak bere pantaila izena aldatu du %(displayName)s izatera.",
"Failed to set direct chat tag": "Huts egin du txat zuzenarenaren etiketa jartzean",
"Failed to remove tag %(tagName)s from room": "Huts egin du %(tagName)s etiketa gelatik kentzean",
"Failed to add tag %(tagName)s to room": "Huts egin du %(tagName)s etiketa gelara gehitzean",
"Clear filter": "Garbitu iragazkia",
"Disable Community Filter Panel": "Desgaitu komunitate-iragazi panela",
"Did you know: you can use communities to filter your Riot.im experience!": "Ba al zenekien? Komunitateak erabili ditzakezu zure Riot.im esperientzia iragazteko!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Iragazki bat ezartzeko, arrastatu komunitate baten abatarra pantailaren ezkerrean dagoen iragazki-panelera. Iragazki-paneleko abatar batean klik egin dezakezu komunitate horri lotutako gelak eta pertsonak besterik ez ikusteko.",
"Your key share request has been sent - please check your other devices for key share requests.": "Zure gakoa partekatzeko eskaria bidali da - egiaztatu zure beste gailuetan gakoa partekatzeko eskariak.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Gakoa partekatzeko eskariak automatikoki bidaltzen dira zure beste gailuetara. Zure beste gailuetan gakoa partekatzeko eskaria ukatu edo baztertu baduzu, egin klik hemen saio honetarako gakoak eskatzeko berriz ere.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Zure beste gailuek mezu honetarako gakoa ez badute ezin izango dute deszifratu.",
"Key request sent.": "Gako eskaria bidalita.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Berriz eskatu zifratze-gakoak</requestLink> zure beste gailuetatik.",
"%(user)s is a %(userRole)s": "%(user)s %(userRole)s da",
"Changes made to your community might not be seen by other users for up to 30 minutes.": "Zure komunitateari egindako aldaketak agian ez dira beste erabiltzaileentzat ikusgai egongo 30 minutu pasatu arte."
}

View File

@ -514,7 +514,6 @@
"Use with caution": "Käytä varoen",
"User ID": "Käyttäjätunniste",
"User Interface": "Käyttöliittymä",
"%(user)s is a": "%(user)s on",
"User name": "Käyttäjänimi",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s asetti aiheeksi \"%(topic)s\".",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan muuttaminen uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.",
@ -561,7 +560,7 @@
"Sep": "syyskuu",
"Oct": "lokakuu",
"Nov": "marraskuu",
"Dec": "jolukuu",
"Dec": "joulukuu",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Käyttäjänimet voivat sisältää vain kirjaimia, numeroita, pisteitä, viivoja ja alaviivoja.",
"To continue, please enter your password.": "Ole hyvä ja syötä salasanasi jatkaaksesi.",
"Verifies a user, device, and pubkey tuple": "Varmentaa käyttäjän, laitteen ja julkisen avaimen kolmikon",
@ -934,7 +933,6 @@
"Custom of %(powerLevel)s": "Valinnaiset %(powerLevel)s",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Varmistaaksesi että tähän laitteeseen voidaan luottaa, ole yhteydessä omistajaan jollain muulla tavalla (henkilökohtaisesti tai puhelimitse) ja pyydä heitä varmistamaan näkyykö Käyttäjäasetuksissa laite jolla on alla oleva avain:",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jos avain täsmää, valitse painike alla. Jos avain ei täsmää, niin joku muu salakuuntelee laitetta ja haluat todennäköisesti painaa estopainiketta.",
"Cryptography data migrated": "Salaustiedot siirretty",
"Old cryptography data detected": "Vanhat salaustiedot havaittu",
"Warning": "Varoitus",
"Access Token:": "Pääsykoodi:"

View File

@ -602,7 +602,6 @@
"unknown caller": "appelant inconnu",
"Unnamed Room": "Salon anonyme",
"Unverified": "Non vérifié",
"%(user)s is a": "%(user)s est un(e)",
"Username invalid: %(errMessage)s": "Nom d'utilisateur non valide : %(errMessage)s",
"Verified": "Vérifié",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Souhaitez-vous <acceptText>accepter</acceptText> ou <declineText>refuser</declineText> cette invitation ?",
@ -929,12 +928,12 @@
"Select devices": "Sélectionner les appareils",
"Something went wrong when trying to get your communities.": "Une erreur est survenue lors de l'obtention de vos communautés.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Ce serveur d'accueil n'offre aucun flux compatible avec ce client.",
"Flair": "Talents",
"Showing flair for these communities:": "Montre les talents pour ces communautés :",
"This room is not showing flair for any communities": "Ce salon n'affiche de talent pour aucune communauté",
"Flair will appear if enabled in room settings": "Les talents apparaîtront s'ils sont activés dans les paramètres du salon",
"Flair will not appear": "Les talents n'apparaîtront pas",
"Display your community flair in rooms configured to show it.": "Afficher vos talents de communauté dans les salons configurés pour les afficher.",
"Flair": "Badge",
"Showing flair for these communities:": "Ce salon affichera les badges pour ces communautés :",
"This room is not showing flair for any communities": "Ce salon n'affiche de badge pour aucune communauté",
"Flair will appear if enabled in room settings": "Les badges n'apparaîtront que s'ils sont activés dans les paramètres de chaque salon",
"Flair will not appear": "Les badges n'apparaîtront pas",
"Display your community flair in rooms configured to show it.": "Sélectionnez les badges dans les paramètres de chaque salon pour les afficher.",
"Tag Panel": "Panneau des étiquettes",
"Addresses": "Adresses",
"expand": "développer",
@ -947,8 +946,6 @@
"Call": "Appel",
"Answer": "Répondre",
"Send": "Envoyer",
"Cryptography data migrated": "Données de chiffrement migrées",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Une migration unique des données de chiffrement a été effectuée. Le chiffrement de bout-en-bout ne fonctionnera pas si vous revenez sur une version antérieure de Riot. Si vous avez besoin d'utiliser le chiffrement de bout-en-bout sur une ancienne version, déconnectez-vous de Riot. Pour conserver l'historique des messages, exportez et réimportez vos clés de chiffrement.",
"Old cryptography data detected": "Anciennes données de chiffrement détectées",
"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.": "Nous avons détecté des données d'une ancienne version de Riot. Le chiffrement de bout-en-bout n'aura pas fonctionné correctement sur l'ancienne version. Les messages chiffrés échangés récemment dans l'ancienne version ne sont peut-être pas déchiffrables dans cette version. Les échanges de message avec cette version peuvent aussi échouer. Si vous rencontrez des problèmes, déconnectez-vous puis reconnectez-vous. Pour conserver l'historique des messages, exportez puis réimportez vos clés de chiffrement.",
"Warning": "Attention",
@ -980,5 +977,20 @@
"This room is not public. You will not be able to rejoin without an invite.": "Ce salon n'est pas public. Vous ne pourrez pas y revenir sans invitation.",
"Community IDs cannot not be empty.": "Les identifiants de communauté ne peuvent pas être vides.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Afficher les appareils</showDevicesText>, <sendAnywayText>envoyer quand même</sendAnywayText> ou <cancelText>annuler</cancelText>.",
"<a>In reply to</a> <pill>": "<a>En réponse à</a> <pill>"
"<a>In reply to</a> <pill>": "<a>En réponse à</a> <pill>",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s a changé son nom affiché en %(displayName)s.",
"Failed to set direct chat tag": "Échec de l'ajout de l'étiquette discussion directe",
"Failed to remove tag %(tagName)s from room": "Échec de la suppression de l'étiquette %(tagName)s du salon",
"Failed to add tag %(tagName)s to room": "Échec de l'ajout de l'étiquette %(tagName)s au salon",
"Clear filter": "Supprimer les filtres",
"Did you know: you can use communities to filter your Riot.im experience!": "Le saviez-vous : vous pouvez utiliser les communautés pour filtrer votre expérience Riot.im !",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Pour activer un filtre, faites glisser un avatar de communauté sur le panneau des filtres tout à gauche de l'écran. Vous pouvez cliquer sur un avatar dans ce panneau quand vous le souhaitez afin de ne voir que les salons et les personnes associés à cette communauté.",
"Disable Community Filter Panel": "Désactiver le panneau de filtre de communauté",
"Your key share request has been sent - please check your other devices for key share requests.": "Votre demande de partage de clé a été envoyée - veuillez vérifier les demandes de partage de clé sur vos autres appareils.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Les demandes de partage de clé sont envoyées à vos autres appareils automatiquement. Si vous rejetez ou supprimez la demande de partage de clé sur vos autres appareils, cliquez ici pour redemander les clés pour cette session.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Si vos autres appareils n'ont pas la clé pour ce message, vous ne pourrez pas le déchiffrer.",
"Key request sent.": "Demande de clé envoyée.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Re-demander les clés de chiffrement</requestLink> depuis vos autres appareils.",
"%(user)s is a %(userRole)s": "%(user)s est %(userRole)s",
"Changes made to your community might not be seen by other users for up to 30 minutes.": "Les changements effectués sur votre communauté peuvent ne pas apparaître pour les autres utilisateurs avant 30 minutes."
}

View File

@ -417,7 +417,6 @@
"Encryption is enabled in this room": "O cifrado está habilitado en esta sala",
"Encryption is not enabled in this room": "O cifrado non se habilitou para esta sala",
"Privileged Users": "Usuarios con privilexios",
"%(user)s is a": "%(user)s é un",
"No users have specific privileges in this room": "Non hai usuarias con privilexios específicos en esta sala",
"Banned users": "Usuarias non permitidas",
"This room is not accessible by remote Matrix servers": "Esta sala non é accesible por servidores Matrix remotos",
@ -759,8 +758,6 @@
"Failed to leave room": "Algo fallou ao saír da sala",
"Signed Out": "Desconectada",
"For security, this session has been signed out. Please sign in again.": "Por seguridade, pechouse a sesión. Por favor, conéctese de novo.",
"Cryptography data migrated": "Migráronse os datos de cifrado",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Levouse a fin a mudanza de datos criptográficos. O cifrado extremo-a-extremo si volta a unha versión máis antiga de Riot. Si precisa utilizar criptografía de extremo-a-extremo en unha versión anterior, primeiro desconéctese de Riot. Para manter o histórico de mensaxes, exporte e volte a importar as súas chaves.",
"Old cryptography data detected": "Detectouse o uso de criptografía sobre datos antigos",
"Logout": "Desconectar",
"Your Communities": "As súas Comunidades",
@ -768,7 +765,7 @@
"Create a new community": "Crear unha nova comunidade",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuarias e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.",
"Join an existing community": "Unirse a unha comunidade existente",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para unirse a unha comunidade existente deberá coñecer o identificador de esa comunidade; terá un aspecto como <i>+exemplo:matrix.org</i>",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para unirse a unha comunidade existente deberá coñecer o identificador de esa comunidade; terá un aspecto como <i>+exemplo:matrix.org</i>.",
"You have no visible notifications": "Non ten notificacións visibles",
"Scroll to bottom of page": "Desplácese ate o final da páxina",
"Message not sent due to unknown devices being present": "Non se enviou a mensaxe porque hai dispositivos non coñecidos",
@ -973,5 +970,10 @@
"Your identity server's URL": "O URL da súa identidade no servidor",
"<a>In reply to</a> <pill>": "<a>En resposta a</a> <pill>",
"This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá voltar a ela sin un convite.",
"This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades"
"This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambiou o seu nome mostrado a %(displayName)s.",
"Clear filter": "Quitar filtro",
"Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo",
"Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala",
"Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala"
}

View File

@ -2,18 +2,18 @@
"Cancel": "Mégse",
"Search": "Keresés",
"OK": "Rendben",
"Custom Server Options": "Egyedi szerver beállítások",
"Dismiss": "Eltűntet",
"Custom Server Options": "Egyedi szerverbeállítások",
"Dismiss": "Eltüntet",
"Error": "Hiba",
"Failed to forget room %(errCode)s": "Nem lehet eltávolítani a szobát: %(errCode)s",
"Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s",
"Favourite": "Kedvenc",
"Mute": "Elnémít",
"Notifications": "Értesítések",
"Operation failed": "Művelet sikertelen",
"powered by Matrix": "Matrixon alapul",
"Remove": "Törlés",
"Operation failed": "Sikertelen művelet",
"powered by Matrix": "A Matrix hajtja",
"Remove": "Eltávolítás",
"Settings": "Beállítások",
"unknown error code": "ismeretlen hiba kód",
"unknown error code": "ismeretlen hibakód",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Elküldtük a szöveges üzenetet ide: +%(msisdn)s. Kérlek add meg az ellenőrző kódot ami benne van",
"Accept": "Elfogad",
"%(targetName)s accepted an invitation.": "%(targetName)s elfogadta a meghívást.",
@ -45,7 +45,7 @@
"Failed to change password. Is your password correct?": "Nem sikerült megváltoztatni a jelszót. Helyesen írtad be a jelszavadat?",
"Continue": "Folytatás",
"Create new room": "Új szoba létrehozása",
"Close": "Bezár",
"Close": "Bezárás",
"Room directory": "Szobák listája",
"Start chat": "Csevegés indítása",
"%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s",
@ -299,7 +299,7 @@
"Reason: %(reasonText)s": "Ok: %(reasonText)s",
"Revoke Moderator": "Moderátor visszahívása",
"Refer a friend to Riot:": "Ismerős meghívása a Riotba:",
"Register": "Regisztrál",
"Register": "Regisztráció",
"%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.",
"Reject invitation": "Meghívó elutasítása",
"Rejoin": "Újracsatlakozás",
@ -423,7 +423,6 @@
"Use with caution": "Használd körültekintéssel",
"User ID": "Felhasználói azonosító",
"User Interface": "Felhasználói felület",
"%(user)s is a": "%(user)s egy",
"User name": "Felhasználói név",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (szint: %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Felhasználói név érvénytelen: %(errMessage)s",
@ -598,7 +597,7 @@
"Drop file here to upload": "Feltöltéshez húzz ide egy fájlt",
" (unsupported)": " (nem támogatott)",
"Ongoing conference call%(supportedText)s.": "Folyamatban lévő konferencia hívás %(supportedText)s.",
"Online": "Elérhető",
"Online": "Online",
"Idle": "Várakozik",
"Offline": "Nem érhető el",
"Start chatting": "Csevegés indítása",
@ -771,7 +770,7 @@
"Unnamed room": "Névtelen szoba",
"World readable": "Nyilvános",
"Guests can join": "Vendégek is csatlakozhatnak",
"No rooms to show": "Nincsenek megjelenítendő szobák",
"No rooms to show": "Nincsenek megjeleníthető szobák",
"Invalid community ID": "Érvénytelen közösségi azonosító",
"'%(groupId)s' is not a valid community ID": "%(groupId)s nem egy érvényes közösségi azonosító",
"New community ID (e.g. +foo:%(localDomain)s)": "Új közösségi azonosító (pl.: +foo:%(localDomain)s)",
@ -890,7 +889,7 @@
"%(items)s and %(count)s others|other": "%(items)s és még %(count)s másik",
"%(items)s and %(count)s others|one": "%(items)s és még egy másik",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Az e-mail leküldésre került ide: %(emailAddress)s. Ha követte a levélben lévő linket kattints alább.",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(roomName)s szoba láthatóságát nem lehet frissíteni ebben a közösségben: %(groupId)s",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(roomName)s szoba láthatóságát nem lehet frissíteni ebben a közösségben: %(groupId)s.",
"Visibility in Room List": "Láthatóság a szoba listában",
"Visible to everyone": "Mindenki számára látható",
"Only visible to community members": "Csak a közösség számára látható",
@ -947,8 +946,6 @@
"Call": "Hívás",
"Answer": "Felvesz",
"Send": "Elküld",
"Cryptography data migrated": "Titkosítási adatok migrálva",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "A titkosítási adatok egyszeri migrációja megtörtént. Ha egy régebbi Riot verzióra állsz vissza a végponttól-végpontig titkosítás nem fog működni. Ha régi verzióval szeretnéd használni a végponttól-végpontig titkosítást először jelentkezz ki a Riotból. A régi üzenetek későbbi eléréséhez először mentsd ki a kulcsokat majd töltsd be újra.",
"Old cryptography data detected": "Régi titkosítási adatot találhatók",
"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.": "Régebbi Riot verzióból származó adatok találhatók. Ezek hibás működéshez vezethettek a végponttól-végpontig titkosításban régebbi verzióknál. A nemrég küldött/fogadott titkosított üzenetek ha a régi adatokat használták lehetséges hogy nem lesznek visszafejthetők ebben a verzióban. Ha problémákba ütközöl jelentkezz ki és vissza. A régi üzenetek elérésének biztosításához mentsd ki a kulcsokat és töltsd be újra.",
"Warning": "Figyelmeztetés",
@ -980,5 +977,19 @@
"This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Eszközök listája</showDevicesText>, <sendAnywayText>mindenképpen küld</sendAnywayText> vagy <cancelText>szakítsd meg</cancelText>.",
"Community IDs cannot not be empty.": "A közösségi azonosító nem lehet üres.",
"<a>In reply to</a> <pill>": "<a>Válaszolva neki</a> <pill>"
"<a>In reply to</a> <pill>": "<a>Válaszolva neki</a> <pill>",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s megváltoztatta a nevét erre: %(displayName)s.",
"Failed to set direct chat tag": "Nem sikerült a közvetlen beszélgetés jelzést beállítani",
"Failed to remove tag %(tagName)s from room": "Nem sikerült a szobáról eltávolítani ezt: %(tagName)s",
"Failed to add tag %(tagName)s to room": "Nem sikerült hozzáadni a szobához ezt: %(tagName)s",
"Clear filter": "Szűrő törlése",
"Disable Community Filter Panel": "Közösség keresési panel tiltása",
"Did you know: you can use communities to filter your Riot.im experience!": "Tudtad, hogy a közösségeket használhatod a Riot.im élmény fokozásához?",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "A szűrő beállításához húzd a közösség avatarját a szűrő panel fölé a képernyő bal szélén. A szűrő panelen az avatarra kattintva bármikor leszűrheted azokat a szobákat és embereket akik a megadott közösséghez tartoznak.",
"Your key share request has been sent - please check your other devices for key share requests.": "A kulcs megosztási kérést elküldtük - ellenőrizd a többi eszközödön a kulcs megosztási kéréseket.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "A kulcs megosztási kérelem automatikusan el lett küldve a többi eszközödre. Ha elutasítottad vagy törölted a kérést a másik eszközön ide kattintva újra kérheted a kulcsokat.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Ha a másik eszközödön nincs meg a kulcs az üzenet visszafejtéséhez akkor nem tudod visszafejteni.",
"Key request sent.": "Kulcs kérés elküldve.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Kulcsok újrakérése</requestLink> a többi eszközödtől.",
"%(user)s is a %(userRole)s": "%(user)s egy %(userRole)s"
}

View File

@ -53,7 +53,7 @@
"You cannot place VoIP calls in this browser.": "Non puoi effettuare chiamate VoIP con questo browser.",
"You cannot place a call with yourself.": "Non puoi chiamare te stesso.",
"Conference calls are not supported in this client": "Le chiamate di gruppo non sono supportate da questo client",
"Conference calls are not supported in encrypted rooms": "Le chiamate di gruppo non sono supportate nelle stanze con crittografia",
"Conference calls are not supported in encrypted rooms": "Le chiamate di gruppo non sono supportate nelle stanze criptate",
"Warning!": "Attenzione!",
"Sun": "Dom",
"Mon": "Lun",
@ -89,5 +89,220 @@
"Unpin Message": "Sblocca messaggio",
"Add rooms to this community": "Aggiungi stanze a questa community",
"Warning": "Attenzione",
"Unnamed room": "Stanza senza nome"
"Unnamed room": "Stanza senza nome",
"Online": "Online",
"The platform you're on": "La piattaforma in cui sei",
"The version of Riot.im": "La versione di Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Se hai eseguito l'accesso o meno (non registriamo il tuo nome utente)",
"Your language of choice": "La lingua scelta",
"Which officially provided instance you are using, if any": "Quale istanza fornita ufficialmente stai usando, se presente",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Se stai usando o meno la modalità Richtext dell'editor Rich Text",
"Your homeserver's URL": "L'URL del tuo homeserver",
"Your identity server's URL": "L'URL del tuo server di identità",
"Analytics": "Analitiche",
"The information being sent to us to help make Riot.im better includes:": "Le informazioni inviate per aiutarci a migliorare Riot.im includono:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Registriamo anche ogni pagina che usi nell'app (attualmente <CurrentPageHash>), il tuo User Agent (<CurrentUserAgent>) e la risoluzione del dispositivo (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Se questa pagina include informazioni identificabili, come una stanza, utente o ID di gruppo, questi dati sono rimossi prima che vengano inviati al server.",
"Call Failed": "Chiamata fallita",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ci sono dispositivi sconosciuti in questa stanza: se procedi senza verificarli, qualcuno avrà la possibilità di intercettare la tua chiamata.",
"Review Devices": "Revisiona i dispositivi",
"Call Anyway": "Chiama comunque",
"Answer Anyway": "Rispondi comunque",
"Call Timeout": "Scadenza chiamata",
"Existing Call": "Chiamata esistente",
"You are already in a call.": "Partecipi già ad una chiamata.",
"Conference calling is in development and may not be reliable.": "Le chiamate di gruppo sono in sviluppo e potrebbero essere inaffidabili.",
"Failed to set up conference call": "Impostazione della chiamata di gruppo fallita",
"Conference call failed.": "Chiamata di gruppo fallita.",
"%(senderName)s requested a VoIP conference.": "%(senderName)s ha richiesto una conferenza VoIP.",
"VoIP conference started.": "Conferenza VoIP iniziata.",
"VoIP conference finished.": "Conferenza VoIP terminata.",
"Ongoing conference call%(supportedText)s.": "Chiamata di gruppo in corso%(supportedText)s.",
"The file '%(fileName)s' failed to upload": "Invio del file '%(fileName)s' fallito",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Il file '%(fileName)s' supera il limite di dimensione inviabile da questo home server",
"Upload Failed": "Invio fallito",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"Who would you like to add to this community?": "Chi vuoi aggiungere a questa comunità?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Attenzione: qualsiasi persona aggiungi ad una comunità sarà visibile pubblicamente a chiunque conosca l'ID della comunità",
"Invite new community members": "Invita nuovi membri nella comunità",
"Name or matrix ID": "Nome o ID matrix",
"Which rooms would you like to add to this community?": "Quali stanze vuoi aggiungere a questa comunità?",
"Show these rooms to non-members on the community page and room list?": "Mostrare queste stanze ai non membri nella pagina comunità e all'elenco stanze?",
"Add rooms to the community": "Aggiungi stanze alla comunità",
"Room name or alias": "Nome stanza o alias",
"Add to community": "Aggiungi alla comunità",
"Failed to invite the following users to %(groupId)s:": "Invito ad unirsi in %(groupId)s fallito per i seguenti utenti:",
"Failed to invite users to community": "Invito degli utenti alla comunità fallito",
"Failed to invite users to %(groupId)s": "Invito degli utenti a %(groupId)s fallito",
"Failed to add the following rooms to %(groupId)s:": "Aggiunta a %(groupId)s fallita per le seguenti stanze:",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot non ha l'autorizzazione ad inviarti notifiche - controlla le impostazioni del browser",
"Riot was not given permission to send notifications - please try again": "Non è stata data a Riot l'autorizzazione ad inviare notifiche - riprova",
"Unable to enable Notifications": "Impossibile attivare le notifiche",
"This email address was not found": "Indirizzo email non trovato",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Il tuo indirizzo email sembra non essere associato ad un ID Matrix su questo homeserver.",
"Default": "Predefinito",
"Restricted": "Limitato",
"Moderator": "Moderatore",
"Start a chat": "Inizia una conversazione",
"Who would you like to communicate with?": "Con chi vorresti comunicare?",
"Email, name or matrix ID": "Email, nome o ID matrix",
"Start Chat": "Inizia conversazione",
"Invite new room members": "Invita nuovi membri nella stanza",
"Who would you like to add to this room?": "Chi vorresti aggiungere a questa stanza?",
"Send Invites": "Manda inviti",
"Failed to invite user": "Invito dell'utente fallito",
"Failed to invite": "Invito fallito",
"Failed to invite the following users to the %(roomName)s room:": "Invito nella stanza %(roomName)s fallito per i seguenti utenti:",
"You need to be logged in.": "Devi aver eseguito l'accesso.",
"You need to be able to invite users to do that.": "Devi potere invitare utenti per completare l'azione.",
"Unable to create widget.": "Impossibile creare il widget.",
"Failed to send request.": "Invio della richiesta fallito.",
"This room is not recognised.": "Stanza non riconosciuta.",
"You are not in this room.": "Non sei in questa stanza.",
"You do not have permission to do that in this room.": "Non hai l'autorizzazione per farlo in questa stanza.",
"Missing room_id in request": "Manca l'id_stanza nella richiesta",
"Must be viewing a room": "Devi vedere una stanza",
"Room %(roomId)s not visible": "Stanza %(roomId)s non visibile",
"Missing user_id in request": "Manca l'id_utente nella richiesta",
"Failed to lookup current room": "Impossibile cercare la stanza attuale",
"Usage": "Utilizzo",
"/ddg is not a command": "/ddg non è un comando",
"To use it, just wait for autocomplete results to load and tab through them.": "Per usarlo, attendi l'autocompletamento dei risultati e selezionali con tab.",
"Unrecognised room alias:": "Alias della stanza non riconosciuto:",
"Ignored user": "Utente ignorato",
"You are now ignoring %(userId)s": "Ora stai ignorando %(userId)s",
"Unignored user": "Utente ripreso in considerazione",
"You are no longer ignoring %(userId)s": "Non stai più ignorando %(userId)s",
"Unknown (user, device) pair:": "Coppia (utente, dispositivo) sconosciuta:",
"Device already verified!": "Dispositivo già verificato!",
"WARNING: Device already verified, but keys do NOT MATCH!": "ATTENZIONE: dispositivo già verificato, ma le chiavi NON CORRISPONDONO!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATTENZIONE: VERIFICA CHIAVI FALLITA! La chiave per %(userId)s e il dispositivo %(deviceId)s è \"%(fprint)s\" , la quale non corrisponde con la chiave fornita \"%(fingerprint)s\". Potrebbe significare che le tue comunicazioni vengono intercettate!",
"Verified key": "Chiave verificata",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dal dispositivo %(deviceId)s di %(userId)s . Dispositivo segnato come verificato.",
"Unrecognised command:": "Comando non riconosciuto:",
"Reason": "Motivo",
"%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitato %(targetName)s.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s ha bandito %(targetName)s.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha modificato il proprio nome in %(displayName)s.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha impostato il proprio nome a %(displayName)s.",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha rimosso il proprio nome visibile (%(oldDisplayName)s).",
"%(senderName)s removed their profile picture.": "%(senderName)s ha rimosso la propria immagine del profilo.",
"%(senderName)s changed their profile picture.": "%(senderName)s ha cambiato la propria immagine del profilo.",
"%(senderName)s set a profile picture.": "%(senderName)s ha impostato un'immagine del profilo.",
"%(targetName)s joined the room.": "%(targetName)s è entrato nella stanza.",
"%(targetName)s rejected the invitation.": "%(targetName)s ha rifiutato l'invito.",
"%(targetName)s left the room.": "%(targetName)s è uscito dalla stanza.",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha rimosso il ban a %(targetName)s.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s ha cacciato %(targetName)s.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha revocato l'invito per %(targetName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha modificato l'argomento in \"%(topic)s\".",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha rimosso il nome della stanza.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha modificato il nome della stanza in %(roomName)s.",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha inviato un'immagine.",
"Someone": "Qualcuno",
"(not supported by this browser)": "(non supportato da questo browser)",
"%(senderName)s answered the call.": "%(senderName)s ha risposto alla chiamata.",
"(could not connect media)": "(connessione del media non riuscita)",
"(no answer)": "(nessuna risposta)",
"(unknown failure: %(reason)s)": "(errore sconosciuto: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s ha terminato la chiamata.",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s ha avviato una chiamata %(callType)s .",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s da %(fromPowerLevel)s a %(toPowerLevel)s",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha cambiato il messaggio ancorato della stanza.",
"%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificato da %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s aggiunto da %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s rimosso da %(senderName)s",
"%(displayName)s is typing": "%(displayName)s sta scrivendo",
"%(names)s and %(count)s others are typing|other": "%(names)s e altri %(count)s stanno scrivendo",
"%(names)s and %(count)s others are typing|one": "%(names)s e un altro stanno scrivendo",
"%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s stanno scrivendo",
"Failure to create room": "Creazione della stanza fallita",
"Server may be unavailable, overloaded, or you hit a bug.": "Il server potrebbe essere non disponibile, sovraccarico o hai trovato un errore.",
"Send anyway": "Invia comunque",
"Send": "Invia",
"Unnamed Room": "Stanza senza nome",
"Your browser does not support the required cryptography extensions": "Il tuo browser non supporta l'estensione crittografica richiesta",
"Not a valid Riot keyfile": "Non è una chiave di Riot valida",
"Authentication check failed: incorrect password?": "Controllo di autenticazione fallito: password sbagliata?",
"Failed to join room": "Accesso alla stanza fallito",
"Presence Management": "Gestione della presenza",
"Tag Panel": "Pannello etichette",
"Disable Emoji suggestions while typing": "Disattiva i suggerimenti delle emoji durante la digitazione",
"Use compact timeline layout": "Usa impaginazione cronologia compatta",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Nascondi i messaggi di entrata/uscita (inviti/kick/ban esclusi)",
"Hide avatar changes": "Nascondi le modifiche dell'avatar",
"Hide display name changes": "Nascondi le modifiche del nome",
"Hide read receipts": "Nascondi le ricevute di lettura",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostra gli orari nel formato 12 ore (es. 2:30pm)",
"Autoplay GIFs and videos": "Riproduzione automatica di GIF e video",
"Enable automatic language detection for syntax highlighting": "Attiva la rilevazione automatica della lingua per l'evidenziazione della sintassi",
"Hide avatars in user and room mentions": "Nascondi gli avatar nelle citazioni di utente e stanza",
"Disable big emoji in chat": "Disattiva gli emoji grandi in chat",
"Don't send typing notifications": "Non inviare notifiche di composizione",
"Automatically replace plain text Emoji": "Sostituisci automaticamente le emoji testuali",
"Disable Community Filter Panel": "Disattiva il pannello filtro comunità",
"Disable Peer-to-Peer for 1:1 calls": "Disattiva il peer-to-peer per chiamate 1:1",
"Opt out of analytics": "Rifiuta le analitiche",
"Never send encrypted messages to unverified devices from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati",
"Never send encrypted messages to unverified devices in this room from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati in questa stanza",
"Enable inline URL previews by default": "Attiva le anteprime URL in modo predefinito",
"Enable URL previews for this room (only affects you)": "Attiva le anteprime URL in questa stanza (riguarda solo te)",
"Enable URL previews by default for participants in this room": "Attiva le anteprime URL in modo predefinito per i partecipanti in questa stanza",
"Room Colour": "Colore della stanza",
"Active call (%(roomName)s)": "Chiamata attiva (%(roomName)s)",
"unknown caller": "Chiamante sconosciuto",
"Incoming voice call from %(name)s": "Chiamata vocale in arrivo da %(name)s",
"Incoming video call from %(name)s": "Chiamata video in arrivo da %(name)s",
"Incoming call from %(name)s": "Chiamata in arrivo da %(name)s",
"Decline": "Rifiuta",
"Accept": "Accetta",
"Incorrect verification code": "Codice di verifica sbagliato",
"Enter Code": "Inserisci il codice",
"Submit": "Invia",
"Phone": "Telefono",
"Failed to upload profile picture!": "Invio dell'immagine profilo fallito!",
"Upload new:": "Invia nuovo:",
"No display name": "Nessun nome visibile",
"New passwords don't match": "Le nuove password non corrispondono",
"Passwords can't be empty": "Le password non possono essere vuote",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "La modifica della password ripristinerà qualsiasi chiave di cifratura end-to-end su tutti i dispositivi, rendendo illeggibile la cronologia delle chat, a meno che prima non esporti le tue chiavi della stanza e poi le importi. In futuro ciò verrà migliorato.",
"Export E2E room keys": "Esporta chiavi E2E della stanza",
"Do you want to set an email address?": "Vuoi impostare un indirizzo email?",
"Current password": "Password attuale",
"Password": "Password",
"New Password": "Nuova password",
"Confirm password": "Conferma password",
"Change Password": "Modifica password",
"Your home server does not support device management.": "Il tuo home server non supporta la gestione dei dispositivi.",
"Unable to load device list": "Impossibile caricare l'elenco dei dispositivi",
"Delete %(count)s devices|other": "Elimina %(count)s dispositivi",
"Delete %(count)s devices|one": "Elimina dispositivo",
"Device ID": "ID dispositivo",
"Device Name": "Nome dispositivo",
"Last seen": "Visto l'ultima volta",
"Select devices": "Seleziona i dispositivi",
"Failed to set display name": "Impostazione nome visibile fallita",
"Disable Notifications": "Disattiva le notifiche",
"Enable Notifications": "Attiva le notifiche",
"Cannot add any more widgets": "Impossibile aggiungere altri widget",
"The maximum permitted number of widgets have already been added to this room.": "Il numero massimo consentito di widget è già stato raggiunto in questa stanza.",
"Drop File Here": "Trascina file qui",
"Drop file here to upload": "Trascina un file qui per l'invio",
" (unsupported)": " (non supportato)",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Unisciti come <voiceText>voce</voiceText> o <videoText>video</videoText>.",
"%(senderName)s sent an image": "%(senderName)s ha inviato un'immagine",
"%(senderName)s sent a video": "%(senderName)s ha inviato un video",
"%(senderName)s uploaded a file": "%(senderName)s ha inviato un file",
"Options": "Opzioni",
"Your key share request has been sent - please check your other devices for key share requests.": "Richiesta di condivisione chiavi inviata - controlla i tuoi altri dispositivi per richieste di condivisione chiavi.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Le richieste di condivisione chiavi sono inviate automaticamente ai tuoi altri dispositivi. Se hai rifiutato o annullato la richiesta negli altri dispositivi, clicca qui per richiederle nuovamente.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Se i tuoi altri dispositivi non hanno la chiave per questo messaggio non potrai decriptarli.",
"Key request sent.": "Richiesta chiave inviata."
}

View File

@ -427,7 +427,6 @@
"Use with caution": "조심해주세요",
"User ID": "사용자 ID",
"User Interface": "사용자 인터페이스",
"%(user)s is a": "%(user)s는",
"User name": "사용자 이름",
"Username invalid: %(errMessage)s": "사용자 이름을 인식할 수 없어요: %(errMessage)s",
"Users": "사용자들",

1
src/i18n/strings/lt.json Normal file
View File

@ -0,0 +1 @@
{}

View File

@ -4,24 +4,24 @@
"%(targetName)s accepted an invitation.": "%(targetName)s apstiprināja uzaicinājumu.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s apstiprināja uzaicinājumu no %(displayName)s.",
"Account": "Konts",
"Access Token:": "Pieejas atslēga:",
"Access Token:": "Pieejas tokens:",
"Active call (%(roomName)s)": "Aktīvs zvans (%(roomName)s)",
"Add": "Pievienot",
"Add a topic": "Pievieno tematu",
"Add email address": "Pievieno Epasta adresi",
"Add email address": "Pievieno epasta adresi",
"Add phone number": "Pievieno tālruņa numuru",
"Admin": "Administrators",
"Admin Tools": "Administratora rīki",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Nav pieejas medija saturam. Klikšķini šeit, lai pieprasītu.",
"No Microphones detected": "Mikrofoni nav atrasti",
"No Webcams detected": "Webkameras nav atrastas",
"No media permissions": "Nav pieejas mediju saturam",
"Missing Media Permissions, click here to request.": "Nav atļauju piekļūt ierīcei. Klikšķini šeit, lai tās pieprasītu.",
"No Microphones detected": "Nav mikrofonu",
"No Webcams detected": "Nav webkameru",
"No media permissions": "Nav datu nesēju, kuriem atļauta piekļuve",
"You may need to manually permit Riot to access your microphone/webcam": "Tev varētu būt nepieciešams manuāli atļaut Riot pieslēgties tavam mikrofonam/webkamerai",
"Default Device": "Noklusējuma ierīce",
"Microphone": "Mikrofons",
"Camera": "Kamera",
"Advanced": "Īpašie",
"Advanced": "Papildus",
"Algorithm": "Algoritms",
"Hide removed messages": "Slēpt dzēstos ziņojumus",
"Always show message timestamps": "Vienmēr rādīt ziņojumu laika zīmogu",
@ -35,7 +35,7 @@
"Anyone": "Ikviens",
"Anyone who knows the room's link, apart from guests": "Ikviens, kurš zina adreses saiti uz istabu, izņemot viesus",
"Anyone who knows the room's link, including guests": "Ikviens, kurš zina adreses saiti uz istabu, tai skaitā arī viesi",
"Are you sure?": "Esi pārliecināts/a?",
"Are you sure?": "Vai tiešām to vēlies?",
"Are you sure you want to leave the room '%(roomName)s'?": "Vai tiešām vēlies pamest istabas: '%(roomName)s'?",
"Are you sure you want to reject the invitation?": "Vai tiešām vēlies noraidīt šo uzaicinājumu?",
"Are you sure you want to upload the following files?": "Vai tiešām vēlies augšuplādēt sekojošos failus?",
@ -44,14 +44,14 @@
"%(senderName)s banned %(targetName)s.": "%(senderName)s liedza pieeju %(targetName)s.",
"Ban": "Liegt pieeju (Bans)",
"Banned users": "Lietotāji, kuriem ir liegta pieeja (banotie)",
"Bans user with given id": "Liedz pieeju lietotājam pēc uzdotā ID (Bans)",
"Bans user with given id": "Bloķē (liedz pieeju) lietotāju pēc uzdotā ID (nobano)",
"Blacklisted": "Melnajā sarakstā iekļautie",
"Bug Report": "Paziņojums par kļūdu",
"Bulk Options": "Lielapjoma darbības",
"Call Timeout": "Zvana noilgums",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Neizdevās savienoties ar serveri. Lūdzu pārbaudi savu tīkla savienējumu un pārliecinies, ka tava <a>servera SSL sertifikāts</a> ir uzticams, kā arī pārlūkā instalētie paplašinājumi nebloķē pieprasījumus.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Neizdevās savienoties ar serveri izmantojot HTTP protokolu, kad tava pārlūka adreses laukā ir HTTPS saite. Tā vietā izmanto HTTPS savienojumu vai <a>iespējo nedrošos skriptus</a>.",
"Can't load user settings": "Neizdevās ielādēt lietotāja uzstādījumus",
"Bulk Options": "Grupveida darbību parametri",
"Call Timeout": "Zvana gaidīšanas noilgums",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Neizdodas savienoties ar bāzes serveri. Pārbaudi tīkla savienojumu un pārliecinies, ka <a> bāzes servera SSL sertifikāts</a> ir uzticams, kā arī pārlūkā instalētie paplašinājumi nebloķē pieprasījumus.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Neizdodas savienoties ar bāzes serveri izmantojot HTTP protokolu, kad Tava pārlūka adreses laukā norādīts HTTPS protokols. Tā vietā izmanto HTTPS vai <a>iespējo nedrošos skriptus</a>.",
"Can't load user settings": "Neizdevās ielādēt lietotāja iestatījumus",
"Change Password": "Paroles maiņa",
"%(senderName)s changed their profile picture.": "%(senderName)s nomainīja profila attēlu.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s nomainīja statusa līmeni %(powerLevelDiffText)s.",
@ -59,47 +59,47 @@
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s dzēsa istabas nosaukumu.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s nomainīja tēmas nosaukumu uz \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "Izmaiņas attiecībā uz to, kurš varēs lasīt vēstures ziņas, stāsies spēkā tikai uz ziņām,kuras vēl tiks pievienotas šajā istabā",
"Changes your display nickname": "Nomaina tavu publisko segvārdu (niku)",
"Changes your display nickname": "Nomaina Tavu publisko segvārdu (niku)",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles maiņa dzēsīs pašreizējās šifrēšanas atslēgas visās savstarpēji saistītajās ierīcēs, padarot čata vēsturi neizlasāmu, ja vien vien istabas atslēgas nav tikušas iepriekš eksportētas un no jauna importētas atpakaļ. Nākotnē to plānojam uzlabot.",
"Claimed Ed25519 fingerprint key": "Norādīta Ed25519 identificējošās zīmju virknes atslēga",
"Claimed Ed25519 fingerprint key": "Ed25519 pieprasītā nospieduma (fingerprint) atslēga",
"Clear Cache and Reload": "Iztīri kešatmiņu un pārlādē",
"Clear Cache": "Iztīri kešatmiņu",
"<a>Click here</a> to join the discussion!": "<a>Klikšķini šeit</a> lai pievienotos diskusijai!",
"Click here to fix": "Klikšķini šeit, lai izlabotu",
"Click to mute audio": "Klikšķini, lai izslēgtu skaņu",
"Click to mute video": "Klikšķini, lai izslēgtu video skaņu",
"click to reveal": "Klikšķini, lai atvērtu",
"Click to unmute video": "Klikšķini, lai ieslēgtu video skaņu",
"Click to unmute audio": "Klikšķini, lai ieslēgtu audio skaņu",
"Click to mute audio": "Klikšķini, lai audio skaņu izslēgtu",
"Click to mute video": "Klikšķini, lai video skaņu izslēgtu",
"click to reveal": "Klikšķini, lai atsegtu",
"Click to unmute video": "Klikšķini, lai video skaņu ieslēgtu",
"Click to unmute audio": "Klikšķini, lai audio skaņu ieslēgtu",
"Close": "Aizvērt",
"Command error": "Komandas kļūda",
"Commands": "Komandas",
"Conference call failed.": "Konferences zvans neizdevās.",
"Conference calling is in development and may not be reliable.": "Konferences zvans šobrīd atrodas izstrādes stadijā un var būt nestabils.",
"Conference calls are not supported in encrypted rooms": "Konferences zvani nav iespējami istabās, kurās tiek izmantota šifrēšana",
"Conference calls are not supported in this client": "Konferences zvani netiek atbalstīti šajā programmā",
"Conference calls are not supported in this client": "Konferences zvani šajā klienta programmā netiek atbalstīti",
"Confirm password": "Apstiprini paroli",
"Confirm your new password": "Apstiprini jauno paroli",
"Continue": "Turpināt",
"Could not connect to the integration server": "Neizdevās savienoties ar integrācijas serveri",
"%(count)s new messages|one": "jaunu ziņu skaits: %(count)s",
"%(count)s new messages|other": "%(count)s jaunas ziņas",
"Create a new chat or reuse an existing one": "Izveidot jaunu čatu vai izmantot eksistējošu",
"Create a new chat or reuse an existing one": "Izveidot jaunu čalu vai izmantot jau esošu",
"Create an account": "Reģistrēt kontu",
"Create Room": "Izveidot istabu",
"Cryptography": "Kriptogrāfija",
"Current password": "Pašreizējā parole",
"Curve25519 identity key": "Curve25519 identifikācijas atslēga",
"Custom": "Pielāgots",
"Custom level": "Speciāls līmenis",
"Custom level": "Īpašais līmenis",
"/ddg is not a command": "/ddg nav komanda",
"Deactivate Account": "Deaktivizēt kontu",
"Deactivate my account": "Deaktivizēt manu kontu",
"Deactivate Account": "Deaktivēt kontu",
"Deactivate my account": "Deaktivēt manu kontu",
"Decline": "Noraidīt",
"Decrypt %(text)s": "Atšifrēt %(text)s",
"Decryption error": "Atšifrēšanas kļūda",
"Delete": "Dzēst",
"Deops user with given id": "Noņemt operatora statusu lietotājam ar norādīto id",
"Deops user with given id": "Atceļ operatora statusu lietotājam ar norādīto ID",
"Default": "Noklusējuma",
"Device already verified!": "Ierīce ir jau verificēta!",
"Device ID": "Ierīces ID",
@ -111,13 +111,13 @@
"Direct chats": "Tiešie čati",
"Disable Notifications": "Atslēgt paziņojumus",
"Disinvite": "Atsaukt",
"Display name": "Redzamais vārds",
"Display name": "Attēlojamais vārds",
"Displays action": "Parāda darbību",
"Don't send typing notifications": "Nesūtīt paziņojumus",
"Download %(text)s": "Lejupielādēt tekstu: %(text)s",
"Drop File Here": "Ievelc failu šeit",
"Drop here to tag %(section)s": "Ievelc šeit uz birkas %(section)s",
"Ed25519 fingerprint": "Ed25519 identificējošā zīmju virkne",
"Drop here to tag %(section)s": "Nomest šeit, lai birkotu %(section)s",
"Ed25519 fingerprint": "Ed25519 nospiedums (fingerprint), zīmju virkne",
"Email": "Epasts",
"Email address": "Epasta adrese",
"Email address (optional)": "Epasta adrese (neobligāta)",
@ -138,13 +138,13 @@
"Enter passphrase": "Ievadi paroles frāzi",
"Error": "Kļūda",
"Error decrypting attachment": "Kļūda atšifrējot pielikumu",
"Error: Problem communicating with the given homeserver.": "Kļūda: Radās komunikācijas problēma ar norādīto serveri.",
"Error: Problem communicating with the given homeserver.": "Kļūda: Saziņas problēma ar norādīto bāzes serveri.",
"Event information": "Notikuma informācija",
"Existing Call": "Eksistējošs zvans",
"Existing Call": "Pašreizējā saruna (zvans)",
"Export": "Eksportēt",
"Export E2E room keys": "Eksportēt E2E istabas atslēgas",
"Failed to ban user": "Neizdevās liegt pieeju lietotājam",
"Failed to change password. Is your password correct?": "Neizdevās mainīt paroli. Vai tava parole ir pareiza?",
"Failed to ban user": "Neizdevās bloķēt (liegt pieeju) lietotāju",
"Failed to change password. Is your password correct?": "Neizdevās nomainīt paroli. Vai tā ir pareiza?",
"Failed to change power level": "Neizdevās mainīt statusa līmeni",
"Power level must be positive integer.": "Statusa līmenim ir jābūt pozitīvam skaitlim.",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tu nevarēsi atcelt šo darbību, jo šim lietotājam piešķir tādu pašu statusa līmeni, kāds ir Tev.",
@ -166,28 +166,28 @@
"Failed to set up conference call": "Neizdevās iestatīt konferences zvanu",
"Failed to toggle moderator status": "Neizdevās pārslēgt moderatora statusu",
"Failed to unban": "Neizdevās atcelt pieejas liegumu (atbanot)",
"Failed to upload file": "Neizdevās augšuplādēt failu",
"Failed to upload file": "Neizdevās augšupielādēt failu",
"Failed to upload profile picture!": "Neizdevās augšuplādēt profila attēlu!",
"Failed to verify email address: make sure you clicked the link in the email": "Neizdevās apstiprināt epasta adresi. Pārbaudi, vai Tu esi noklikšķinājis/usi saiti epasta ziņā",
"Failure to create room": "Neizdevās izveidot istabu",
"Favourite": "Favorīts",
"Favourite": "Tava izlase (favorīti)",
"Favourites": "Favorīti",
"Fill screen": "Aizpildīt ekrānu",
"Filter room members": "Filtrēt istabas biedrus",
"Forget room": "\"Aizmirst\" istabu",
"Forgot your password?": "Aizmirsi savu paroli?",
"Forgot your password?": "Aizmirsi paroli?",
"For security, this session has been signed out. Please sign in again.": "Drošības nolūkos, šī sesija ir beigusies. Lūdzu, pieraksties par jaunu.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Drošības nolūkos, izrakstīšanās dzēsīs jebkādas ierīce-ierīce šifrēšanas atslēgas no šī pārlūka. Ja Tu vēlies saglabāt iespēju atšifrēt tavu saziņas vēsturi no Riot nākotnes sesijām, lūdzu eksportē tavas istabas atslēgas, saglabājot tās drošā vietā.",
"Found a bug?": "Pamanīji kļūdu?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Šajā serverī viesu pierakstīšanās nav iespējama.",
"Guest access is disabled on this Home Server.": "Šajā bāzes serverī viesu pierakstīšanās nav iespējama.",
"Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai pat ja ir uzaicināti.",
"Hangup": "Aizturēt",
"Hide read receipts": "Slēpt izlasītās receptes",
"Hide Text Formatting Toolbar": "Slēpt teksta formatēšanas rīkjoslu",
"Historical": "Vēsturiskais",
"Home": "Mājup",
"Homeserver is": "Serveris ir",
"Homeserver is": "Bāzes serveris ir",
"Identity Server is": "Indentifikācijas serveris ir",
"I have verified my email address": "Mana epasta adrese ir verificēta",
"Import": "Importēt",
@ -198,7 +198,7 @@
"Incorrect username and/or password.": "Nepareizs lietotājvārds un/vai parole.",
"Incorrect verification code": "Nepareizs verifikācijas kods",
"Interface Language": "Saskarnes valoda",
"Invalid alias format": "Nepareizs aizstājējvārda formāts",
"Invalid alias format": "Nepareizs aizstājējvārda (aliases) formāts",
"Invalid address format": "Nepareizs adreses formāts",
"Invalid Email Address": "Nepareiza epasta adrese",
"Invalid file%(extra)s": "Nepareizs faila %(extra)s",
@ -214,11 +214,11 @@
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Pievienoties kā <voiceText>balss</voiceText> vai <videoText>video</videoText>.",
"Join Room": "Pievienoties istabai",
"%(targetName)s joined the room.": "%(targetName)s pievienojās istabai.",
"Joins room with given alias": "Pievieno istabai ar uzdoto aizstājējvārdu",
"Jump to first unread message.": "Pārlekt uz pirmo neizlasīto ziņu.",
"Joins room with given alias": "Pievienojas istabai ar minēto aliasi (pseidonīmu)",
"Jump to first unread message.": "Pāriet uz pirmo neizlasīto ziņu.",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s iespēra (kick) %(targetName)s.",
"Kick": "Iespert (kick)",
"Kicks user with given id": "Iesper (kick) lietotājam pēc norādītā id",
"Kicks user with given id": "Padzen (kick) lietotāju ar norādīto ID",
"Labs": "Laboratorija",
"Last seen": "Pēdējo reizi redzēts/a",
"Leave room": "Pamest istabu",
@ -226,7 +226,7 @@
"Level:": "Līmenis:",
"Local addresses for this room:": "Šīs istabas lokālās adreses:",
"Logged in as:": "Pierakstījās kā:",
"Login as guest": "Pierakstīties kā viesis",
"Login as guest": "Pierakstīties kā viesim",
"Logout": "Izrakstīties",
"Low priority": "Zema prioritāte",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uzstādīja nākotnes istabas ziņu vēsturi redzamu visi istabas biedri secībā, kādā tika uzaicināti.",
@ -240,7 +240,7 @@
"Turn Markdown off": "Izslēgt formatēšanas iespēju",
"Turn Markdown on": "Ieslēgt formatēšanas iespēju",
"matrix-react-sdk version:": "matrix-react-sdk versija:",
"The default role for new room members is": "Noklusējuma loma jaunam istabas biedram ir",
"The default role for new room members is": "Jauna istabas biedra statuss pēc noklusējuma ir",
"Message not sent due to unknown devices being present": "Ziņa nav nosūtīta, jo tika konstatēta nezināmu ierīču klātbūtne",
"Missing room_id in request": "Iztrūkstošs room_id pieprasījumā",
"Missing user_id in request": "Iztrūkstošs user_id pieprasījumā",
@ -248,7 +248,7 @@
"Mobile phone number (optional)": "Mobilā telefona numurs (nav obligāts)",
"Moderator": "Moderators",
"Must be viewing a room": "Jāapskata istaba",
"Mute": "Apklusināt",
"Mute": "Kluss (noklusināt)",
"%(serverName)s Matrix ID": "%(serverName)s Matrix ID",
"Name": "Vārds",
"Never send encrypted messages to unverified devices from this device": "Nekad nesūti no šīs ierīces šifrētas ziņas uz neverificētām ierīcēm",
@ -257,7 +257,7 @@
"New password": "Jauna parole",
"New passwords don't match": "Jaunās paroles nesakrīt",
"New passwords must match each other.": "Jaunajām parolēm ir jāsakrīt vienai ar otru.",
"none": "nekāds",
"none": "neviens",
"not set": "nav iestatījuma",
"not specified": "nav noteikts",
"Notifications": "Paziņojumi",
@ -269,7 +269,7 @@
"No more results": "Nav tālāko rezultātu",
"No results": "Nav rezultātu",
"No users have specific privileges in this room": "Nav lietotāju ar īpašām privilēģijām šajā istabā",
"OK": "LABI",
"OK": "Labs ir",
"olm version:": "olm versija:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Tiklīdz istabai tiks iespējota šifrēšana, tā vairs nebūs atslēdzama (pašlaik)",
"Only people who have been invited": "Vienīgi personas, kuras ir tikušas uzaicinātas",
@ -283,7 +283,7 @@
"Phone": "Telefons",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s nolika %(callType)s zvanu.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Lūdzu pārbaudi savu epastu un noklikšķini tajā esošo saiti. Tiklīdz tas ir izdarīts, klikšķini \"turpināt\".",
"Press <StartChatButton> to start a chat with someone": "Nospied <StartChatButton>, lai uzsāktu čatu ar kādu",
"Press <StartChatButton> to start a chat with someone": "Nospied <StartChatButton>, lai ar kādu uzsāktu čalošanu",
"Privacy warning": "Privātuma brīdinājums",
"Private Chat": "Privātais čats",
"Privileged Users": "Priviliģētie lietotāji",
@ -292,7 +292,7 @@
"Reason": "Iemesls",
"Reason: %(reasonText)s": "Iemesls: %(reasonText)s",
"Revoke Moderator": "Atcelt moderatoru",
"Refer a friend to Riot:": "Nosūtīt draugu uz Riot:",
"Refer a friend to Riot:": "Rekomendēt draugam Riot:",
"Register": "Reģistrēties",
"%(targetName)s rejected the invitation.": "%(targetName)s noraidīja uzaicinājumu.",
"Reject invitation": "Noraidīt uzaicinājumu",
@ -308,8 +308,8 @@
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles atiestatīšana atiestatīs visas ierīce-ierīce šifrēšanas atslēgas visās ierīcēs, padarot čata šifrēto ziņu vēsturi nelasāmu, ja vien Tu pirms tam neesi eksportējis savas istabas atslēgas un atkārtoti importējis tās atpakaļ. Nākotnē šo ir plānots uzlabot.",
"Results from DuckDuckGo": "Rezultāti no DuckDuckGo",
"Return to login screen": "Atgriezties uz pierakstīšanās lapu",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot nav atļauts nosūtīt Tev paziņojumus. Lūdzu pārbaudi sava pārlūka uzstādījumus",
"Riot was not given permission to send notifications - please try again": "Riot nav atļauts nosūtīt paziņojumus. Lūdzu mēģini vēlreiz.",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot nav atļauts nosūtīt Tev paziņojumus. Lūdzu pārbaudi sava pārlūka iestatījumus",
"Riot was not given permission to send notifications - please try again": "Riot nav piešķirta atļauja nosūtīt paziņojumus. Lūdzu mēģini vēlreiz",
"riot-web version:": "riot-web versija:",
"Unable to enable Notifications": "Nav iespējams iespējot paziņojumus",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Tu izrakstījies no visām ierīcēm un vairs nesaņemsi pašpiegādes (push) paziņojumus. Lai iespējotu paziņojumus, pieraksties atkārtoti katrā no ierīcēm",
@ -319,21 +319,20 @@
"Room %(roomId)s not visible": "Istaba %(roomId)s nav redzama",
"%(roomName)s does not exist.": "%(roomName)s neeksistē.",
"%(roomName)s is not accessible at this time.": "%(roomName)s šobrīd nav pieejama.",
"Seen by %(userName)s at %(dateTime)s": "Redzams %(userName)s %(dateTime)s",
"Seen by %(userName)s at %(dateTime)s": "Redzējis %(userName)s %(dateTime)s",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s nosūtīja attēlu.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.",
"%(senderName)s set a profile picture.": "%(senderName)s uzstādīja profila attēlu.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s uzstādīja redzamo vārdu uz: %(displayName)s.",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Tevis uzdotā pierakstīšanās atslēga sakrīt ar atslēgu, kuru Tu saņēmi no %(userId)s ierīces %(deviceId)s. Ierīce tika atzīmēta kā verificēta.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Faila '%(fileName)s' izmērs pārsniedz šī mājas servera augšupielādes lieluma ierobežojumu",
"The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās augšuplādēt",
"The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās nosūtīt (augšuplādēt)",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza ierīce-ierīce šifrēšanu (algorithm %(algorithm)s).",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s atcēla pieejas ierobežojumu (atbanoja) %(targetName)s.",
"Unknown room %(roomId)s": "Nezināma istaba %(roomId)s",
"Uploading %(filename)s and %(count)s others|zero": "Tiek augšuplādēts %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Tiek augšuplādēts %(filename)s un %(count)s citi",
"Uploading %(filename)s and %(count)s others|other": "Tiek augšuplādēts %(filename)s un %(count)s citi",
"%(user)s is a": "%(user)s ir",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Neatbilstošs lietotājvārds: %(errMessage)s",
"(unknown failure: %(reason)s)": "(nezināma kļūda: %(reason)s)",
@ -370,14 +369,14 @@
"Scroll to unread messages": "Aizritināt uz nelasītajām ziņām",
"Search": "Meklēt",
"Search failed": "Meklēšana neizdevās",
"Searches DuckDuckGo for results": "Meklē DuckDuckGo rezultātus",
"Searches DuckDuckGo for results": "Meklēšanai izmanto DuckDuckGo",
"Send anyway": "Nosūtīt jebkurā gadījumā",
"Sender device information": "Nosūtītāja ierīces informācija",
"Send Invites": "Nosūtīt uzaicinājumus",
"Send Reset Email": "Nosūtīt atiestatīšanas epastu",
"Server error": "Servera kļūda",
"Server may be unavailable or overloaded": "Serveris var nebūt pieejams vai ir pārslogots",
"Server may be unavailable, overloaded, or search timed out :(": "Serveris var nebūt pieejams, ir pārslogots, vai arī meklēšana beidzās ar savienojuma noilgumu :(",
"Server may be unavailable, overloaded, or search timed out :(": "Serveris izskatās nepieejams, ir pārslogots, vai arī meklēšana beidzās ar savienojuma noildzi :(",
"Server may be unavailable, overloaded, or the file too big": "Serveris var nebūt pieejams, ir pārslogots, vai arī faila izmērs ir par lielu",
"Server may be unavailable, overloaded, or you hit a bug.": "Serveris var nebūt pieejams, ir pārslogots, vai arī sastapi neparedzētu kļūdu.",
"Server unavailable, overloaded, or something else went wrong.": "Serveris nav pieejams, ir pārslogots, vai arī ir notikusi cita, neparedzēta, kļūda.",
@ -395,19 +394,19 @@
"Start authentication": "Sākt autentifikāciju",
"Start Chat": "Sākt čatu",
"Submit": "Iesniegt",
"Success": "Veiksmīgi",
"Success": "Izdevās",
"Tagged as: ": "Atzīmēts,kā: ",
"The main address for this room is": "Galvenā šīs istabas adrese ir",
"The phone number entered looks invalid": "Ievadītais telefona numurs izskatās nepareizs",
"This email address is already in use": "Šī epasta adrese jau tiek izmantota",
"This email address was not found": "Šāda epasta adrese nav atrasta",
"The email address linked to your account must be entered.": "Ir jāievada tavam kontam piesaistītā epasta adrese.",
"The remote side failed to pick up": "Neizdevās uzņemt attālināto pusi",
"This Home Server does not support login using email address.": "Šis serveris neatbalsta pierakstīšanos ar epasta adresi.",
"The email address linked to your account must be entered.": "Ir jāievada Tavam kontam piesaistītā epasta adrese.",
"The remote side failed to pick up": "Zvana adresāts neatbild",
"This Home Server does not support login using email address.": "Šis bāzes serveris neatbalsta pierakstīšanos ar epasta adresi.",
"This invitation was sent to an email address which is not associated with this account:": "Šis uzaicinājums tika nosūtīts uz epasta adresi, kura nav piesaistīta šim kontam:",
"This room has no local addresses": "Šai istabai nav lokālo adrešu",
"This room is not recognised.": "Šī istaba netika atpazīta.",
"These are experimental features that may break in unexpected ways": "Šīs ir eksperimentālās iespējas, kuras var būt dažādos veidos nestrādājošas",
"These are experimental features that may break in unexpected ways": "Šīs ir eksperimentālas funkcijas, kuras reizēm var novest pie negaidītiem rezultātiem",
"The visibility of existing history will be unchanged": "Esošās ziņu vēstures redzamība paliks nemainīga",
"This doesn't appear to be a valid email address": "Šī neizskatās pēc derīgas epasta adreses",
"This is a preview of this room. Room interactions have been disabled": "Šis ir esošās istabas priekšskatījums. Istabas mijiedarbība ir atspējota",
@ -416,16 +415,16 @@
"This room is not accessible by remote Matrix servers": "Šī istaba nav pieejama no attālinātajiem Matrix serveriem",
"This room's internal ID is": "Šīs istabas iekšējais ID ir",
"To link to a room it must have <a>an address</a>.": "Lai ieliktu saiti uz istabu, tai ir jābūt piešķirtai <a>adresei</a>.",
"To reset your password, enter the email address linked to your account": "Lai atiestatītu savu paroli, ievadi tavam kontam piesaistīto epasta adresi",
"To reset your password, enter the email address linked to your account": "Lai atiestatītu savu paroli, ievadi savam kontam piesaistīto epasta adresi",
"To use it, just wait for autocomplete results to load and tab through them.": "Lai to izmantotu, vienkārši gaidi, kamēr ielādējas automātiski ieteiktie rezultāti, un pārvietojies caur tiem.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Notika mēģinājums ielādēt šīs istabas specifisku laikpaziņojumu sadaļu, bet Tev nav atļaujas skatīt šo ziņu.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Notika mēģinājums ielādēt šīs istabas specifisku laikpaziņojumu sadaļu, bet tā netika atrasta.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Mēģinājums ielādēt šīs istabas čata vēstures izvēlēto posmu neizdevās, jo tas netika atrasts.",
"Unable to add email address": "Nav iespējams pievienot epasta adresi",
"Unable to remove contact information": "Nav iespējams dzēst kontaktinformāciju",
"Unable to verify email address.": "Nav iespējams apstiprināt epasta adresi.",
"Unban": "Atbanot",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Nav iespējams pārliecināties, ka šis uzaicinājums tika nosūtīts uz to pašu adresi, kura ir piesaistīta tavam kontam.",
"Unable to capture screen": "Nav iespējams uzņemt ekrānattēlu",
"Unable to capture screen": "Neizdevās uzņemt ekrānattēlu",
"Unable to load device list": "Nav iespējams ielādēt ierīču sarakstu",
"Undecryptable": "Neatšifrējams",
"Unencrypted room": "Nešifrēta istaba",
@ -439,14 +438,14 @@
"Unnamed Room": "Istaba bez nosaukuma",
"Cancel": "Atcelt",
"Create new room": "Izveidot jaunu istabu",
"Custom Server Options": "Īpaši servera uzstādījumi",
"Dismiss": "Noņemt",
"Custom Server Options": "Iestatāmie servera uzstādījumi",
"Dismiss": "Atteikums",
"You have <a>enabled</a> URL previews by default.": "Tev ir pēc noklusējuma <a>iespējots</a> URL adrešu priekšskatījums.",
"Unrecognised command:": "Neatpazīta komanda:",
"Unrecognised room alias:": "Neatpazīts istabas aizstājējvārds:",
"Unverified": "Neverificēts",
"Upload avatar": "Augšuplādē profila attēlu",
"Upload Failed": "Augšupielāde neizdevās",
"Upload Failed": "Nosūtīšana (augšupielāde) neizdevās",
"Upload Files": "Augšuplādē failus",
"Upload file": "Augšuplādē failu",
"Upload new:": "Augšuplādē jaunu:",
@ -481,11 +480,11 @@
"Who would you like to add to this room?": "Kuru vēlies pievienot šai istabai?",
"Who would you like to communicate with?": "Ar kuru vēlies komunicēt?",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Vai vēlies <acceptText>apstiprināt</acceptText> vai <declineText>noraidīt</declineText> šo uzaicinājumu?",
"You already have existing direct chats with this user:": "Tev jau ir eksistējošs tiešais čats ar šo lietotāju:",
"You are already in a call.": "Tu jau šobrīd atrodies zvanā.",
"You already have existing direct chats with this user:": "Tev jau ir viens tiešais čats ar šo lietotāju:",
"You are already in a call.": "Tu jau šobrīd esi sarunā.",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Šobrīd Tu vēl neatrodies nevienā istabā! Klikšķini <CreateRoomButton> lai izveidotu istabu, vai <RoomDirectoryButton>, lai skatītu istabu katalogu",
"You cannot place a call with yourself.": "Tu nevari veikt zvanu sev.",
"You cannot place VoIP calls in this browser.": "Tu nevari veikt VoIP zvanus šajā pārlūkā.",
"You cannot place a call with yourself.": "Nav iespējams piezvanīt sev.",
"You cannot place VoIP calls in this browser.": "VoIP zvani šajā pārlūkā netiek atbalstīti.",
"You do not have permission to post to this room": "Tev nav vajadzīgās atļaujas pievienot ziņas šajā istabā",
"You have <a>disabled</a> URL previews by default.": "URL priekšskatījums pēc noklusējuma Tev ir <a>atspējots</a>.",
"You may wish to login with a different account, or add this email to this account.": "Tu varētu, iespējams, vēlēties pierakstīties no cita konta vai piesaistīt šo epastu šim kontam.",
@ -518,10 +517,10 @@
"Oct": "Okt.",
"Nov": "Nov.",
"Dec": "Dec.",
"Set a display name:": "Iestatīt redzamo vārdu:",
"Set a display name:": "Iestatīt attēloto vārdu:",
"This image cannot be displayed.": "Šo attēlu nav iespējams parādīt.",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s nomainīja istabas attēlu uz <img/>",
"Upload an avatar:": "Augšuplādē profila attēlu:",
"Upload an avatar:": "Augšuplādē avataru (profila attēlu):",
"This server does not support authentication with a phone number.": "Šis serveris neatbalsta autentifikāciju pēc telefona numura.",
"Missing password.": "Trūkst parole.",
"Passwords don't match.": "Paroles nesakrīt.",
@ -530,14 +529,14 @@
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Lietotājvārdi drīkst saturēt vienīgi alfabēta burtus, skaitļus, punktus, defises un apakšsvītras.",
"An unknown error occurred.": "Notikusi neparedzēta kļūda.",
"I already have an account": "Man jau ir konts",
"Topic": "Tēma",
"Make Moderator": "Piešķirt moderatora līmeni",
"Topic": "Temats",
"Make Moderator": "Piešķirt moderatora statusu",
"Make this room private": "Padarīt šo istabu privātu",
"Share message history with new users": "Kopīgot ziņu vēsturi ar jauniem lietotājiem",
"Encrypt room": "Šifrēt istabu",
"There are no visible files in this room": "Nav redzamu failu šajā istabā",
"Room": "Istaba",
"Connectivity to the server has been lost.": "Savienojums ar serveri tika zaudēts.",
"Connectivity to the server has been lost.": "Savienojums ar serveri pārtrūka.",
"Sent messages will be stored until your connection has returned.": "Nosūtītās ziņas tiks saglabātas tiklīdz savienojums tiks atjaunots.",
"Active call": "Aktīvs zvans",
"bold": "trekns",
@ -550,10 +549,10 @@
"numbullet": "lode ar numuru",
"Please select the destination room for this message": "Lūdzu izvēlies šīs ziņas mērķa istabu",
"Room directory": "Istabu katalogs",
"Start chat": "Uzsākt čatu",
"Start chat": "Uzsākt čalošanu",
"New Password": "Jauna parole",
"Start automatically after system login": "Uzsākt automātiski pēc pierakstīšanās sistēmā",
"Desktop specific": "Darbvirsmai specifiski",
"Start automatically after system login": "Palaist programmu automātiski pie sistēmas ielādes",
"Desktop specific": "Darbvirsmai specifiskie",
"Analytics": "Analītika",
"Opt out of analytics": "Atteikties no analītikas",
"Options": "Iespējas",
@ -564,12 +563,12 @@
"Confirm passphrase": "Apstiprināt paroles frāzi",
"Import room keys": "Importēt istabas atslēgas",
"File to import": "Importējamais fails",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Šī darbība atļauj Tev eksportēt lokālā failā atslēgas tām ziņām, kuras Tu saņēmi šifrētās istabās. Pēc tam nākotnē Tu varēsi importēt šo failu citā Matrix klienta aplikācijā, lai tajā būtu iespējams atšifrēt šīs ziņas.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Eksportētais fails atļaus ikvienam, kurš to ir nolasījis, atšifrēt jebkuras tev redzamās šifrētās ziņas, tāpēc ievēro piesardzību, un glabā šo failu drošā vietā. Lai palīdzētu to nodrošināt, Tev ir jāievada paroles frāze, kura tiks izmantota eksportēto datu šifrēšanai. Datu importēšana būs iespējama tikai izmantojot šo pašu paroles frāzi.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Šis process ļauj Tev importēt tās šifrēšanas atslēgas, kuras Tu iepriekš eksportēji no citas Matrix klienta aplikācijas. Importētās atslēgas ļaus vajadzīgajā klienta aplikācijā lasīt atšifrētās ziņas.",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Šī darbība ļauj Tev uz lokālo failu eksportēt atslēgas priekš tām ziņām, kuras Tu saņēmi šifrētās istabās. Tu varēsi importēt šo failu citā Matrix klientā, lai tajā būtu iespējams lasīt šīs ziņas atšifrētas.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Eksportētais fails ļaus ikvienam, kurš to spēj lasīt, atšifrēt jebkuras Tavas šifrētās ziņas, tāpēc ievēro piesardzību, un glabā šo failu drošā vietā. Lai palīdzētu to nodrošināt, Tev jāievada paroles frāze, kura tiks izmantota eksportēto datu šifrēšanai. Datu importēšana būs iespējama tikai izmantojot šo pašu paroles frāzi.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Šis process ļaus Tev importēt šifrēšanas atslēgas, kuras Tu iepriekš eksportēji no cita Matrix klienta. Tas ļaus Tev atšifrēt čata vēsturi.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Eksporta fails būs aizsargāts ar paroles frāzi. Tā ir jāievada šeit, lai atšifrētu failu.",
"You must join the room to see its files": "Tev ir jāpievienojas istabai, lai redzētu tās failus",
"Start new chat": "Uzsākt jaunu čatu",
"Start new chat": "Uzsākt jaunu čalu",
"Failed to invite": "Neizdevās uzaicināt",
"Failed to invite user": "Neizdevās uzaicināt lietotāju",
"Confirm Removal": "Apstiprini dzēšanu",
@ -586,7 +585,7 @@
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ja tā sakrīt, tad nospied zemāk esošo verifikācijas pogu . Ja nesakrīt, tad kāds cits ir piekļuvis šai ierīcei un šādā gadījumā Tu, iespējams, vēlies izmantot \"melnais saraksts\" iespēju.",
"Verify device": "Verificēt ierīci",
"I verify that the keys match": "Es pārbaudu, vai atslēgas sakrīt",
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Mēs sastapāmies ar kļūdu, mēģinot atjaunot tavu iepriekšējo sesiju. Ja vēlies turpināt, tev ir jāpierakstās par jaunu un šifrēta čata ziņu vēsture nebūs izlasāma.",
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Atgadījās kļūda, mēģinot atjaunot tavu iepriekšējo sesiju. Ja vēlies turpināt, Tev ir jāpierakstās no jauna, taču šifrētā čata ziņu vēsture nebūs izlasāma.",
"Unable to restore session": "Nav iespējams atjaunot sesiju",
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ja Tu iepriekš izmantoji jaunāku Riot versiju, tava sesija var nebūt saderīga ar šo versiju. Aizver šo logu un atgriezies jaunākajā versijā.",
"Continue anyway": "Turpināt jebkurā gadījumā",
@ -596,7 +595,7 @@
"Blacklist": "Melnais saraksts",
"Unverify": "Atverificēt",
"Verify...": "Verificē...",
"ex. @bob:example.com": "piemēram, @janis:majaslapa.lv",
"ex. @bob:example.com": "piemēram, @valters:smaidu.lv",
"Add User": "Pievienot lietotāju",
"This Home Server would like to make sure you are not a robot": "Šis mājas serveris vēlas pārliecināties, ka Tu neesi robots",
"Sign in with CAS": "Pierakstīties ar CAS",
@ -606,7 +605,7 @@
"Please check your email to continue registration.": "Lūdzu pārbaudi savu epastu lai turpinātu reģistrāciju.",
"Token incorrect": "Nepareizs autentifikācijas kods",
"Please enter the code it contains:": "Lūdzu ievadi tajā ietverto kodu:",
"powered by Matrix": "spēcināts ar Matrix",
"powered by Matrix": "Tiek darbināts ar Matrix",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ja Tu nenorādīsi epasta adresi, tev nebūs iespējams izmantot paroles atiestatīšanu. Vai esi pārliecināts/a?",
"Default server": "Noklusējuma serveris",
"Custom server": "Īpašs serveris",
@ -617,18 +616,18 @@
"Error decrypting image": "Kļūda atšifrējot attēlu",
"Error decrypting video": "Kļūda atšifrējot video",
"Add an Integration": "Pievienot integrāciju",
"Removed or unknown message type": "Dzēsts vai nezināms ziņas veids",
"Removed or unknown message type": "Dzēsts vai nezināms ziņas tips",
"URL Previews": "URL adrešu priekšskatījumi",
"Drop file here to upload": "Ievelc failu šeit lai augšuplādētu",
" (unsupported)": " (netiek atbalstīts)",
"Online": "Tiešsaistē",
"Online": "Tiešsaistē (pieslēgumā)",
"Idle": "Dīkstāve",
"Offline": "Nav tiešsaistē",
"Updates": "Atjauninājumi",
"Check for update": "Pārbaudīt, vai ir atjauninājumi",
"Start chatting": "Sākt čatošanu",
"Start Chatting": "Sākt čatošanu",
"Click on the button below to start chatting!": "Klikšķini uz zemāk esošās pogas, lai uzsāktu čatošanu!",
"Offline": "Atsaistē (ārpus tīkla)",
"Updates": "Aktualizācijas",
"Check for update": "Pārbaudīt, vai ir aktualizācijas",
"Start chatting": "Sākt čalošanu",
"Start Chatting": "Sākt čalošanu",
"Click on the button below to start chatting!": "Klikšķini uz zemāk esošās pogas, lai uzsāktu čalošanu!",
"Username available": "Lietotājvārds ir pieejams",
"Username not available": "Lietotājvārds nav pieejams",
"Something went wrong!": "Kaut kas nogāja greizi!",
@ -651,23 +650,23 @@
"Cannot add any more widgets": "Nav iespējams pievienot vairāk vidžetu",
"Changes colour scheme of current room": "Nomaina pašreizējās istabas krāsu paleti",
"Delete widget": "Dzēst widžetu",
"Define the power level of a user": "Definēt lietotāja pakāpes līmeni",
"Define the power level of a user": "Definē lietotāja statusu",
"Do you want to load widget from URL:": "Vai vēlies ielādēt widžetu no URL:",
"Edit": "Labot",
"Edit": "Rediģēt",
"Enable automatic language detection for syntax highlighting": "Iespējot automātisko valodas noteikšanu sintakses iezīmējumiem",
"Hide Apps": "Slēpt aplikācijas",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Slēpt pievienoties/pamest ziņas (tas neietekmē uzaicinājumus, vai kick/bana darbības)",
"Integrations Error": "Integrācijas kļūda",
"Publish this room to the public in %(domain)s's room directory?": "Publicēt šo istabu publiskajā %(domain)s katalogā?",
"AM": "AM",
"PM": "PZ",
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "PIEZĪME: Aplikācijās nav ierīce-ierīce šifrēšanas",
"Sets the room topic": "Uzstāda istabas tēmas nosaukumu",
"Sets the room topic": "Uzstāda istabas tematu",
"Show Apps": "Rādīt aplikācijas",
"The maximum permitted number of widgets have already been added to this room.": "Atļautais vidžetu skaits jau ir sasniegts šai istabai.",
"To get started, please pick a username!": "Lai sāktu, lūdzu izvēlies lietotājvārdu!",
"Unable to create widget.": "Nav iespējams izveidot widžetu.",
"Unbans user with given id": "Atceļ pieejas liegumu (atbano) lietotāju pēc norādītā id",
"Unbans user with given id": "Atbloķē (atceļ pieejas liegumu) lietotāju pēc norādītā ID (atbano)",
"You are not in this room.": "Tu neatrodies šajā istabā.",
"You do not have permission to do that in this room.": "Tev nav atļaujas šai darbībai šajā istabā.",
"Verifies a user, device, and pubkey tuple": "Verificē lietotāju, ierīci, un publiskās atslēgas",
@ -683,5 +682,272 @@
"%(widgetName)s widget added by %(senderName)s": "%(senderName)s pievienoja %(widgetName)s vidžetu",
"%(widgetName)s widget removed by %(senderName)s": "%(senderName)s dzēsa vidžetu %(widgetName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robotu pārbaude šobrīd nav pieejama darbvirsmas versijā. Lūdzu izmanto <a>web pārlūku</a>",
"Revoke widget access": "Atsaukt vidžeta piekļuvi"
"Revoke widget access": "Atsaukt vidžeta piekļuvi",
"Unpin Message": "Atkabināt ziņu",
"Add rooms to this community": "Pievienot istabas šai kopienai",
"Failed to set direct chat tag": "Neizdevās tiešajam čatam uzstādīt birku",
"Warning": "Brīdinājums",
"Send": "Sūtīt",
"Leave": "Atstāt",
"Unnamed room": "Nenosaukta istaba",
"Guests can join": "Var pievienoties viesi",
"The platform you're on": "Izmantotā operētājsistēma",
"The version of Riot.im": "Riot.im versija",
"Whether or not you're logged in (we don't record your user name)": "Neatkarīgi no tā, vai esi vai neesi iegājis sistēmā (netiek fiksēts Tavs lietotājvārds)",
"Your language of choice": "Izvēlētā valoda",
"Which officially provided instance you are using, if any": "Kuru oficiāli izlaisto versiju izmantojat (ja to darat)",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Neatkarīgi no tā, vai izmantojat Richtext režīmu redaktorā Rich Text Editor",
"Your homeserver's URL": "Mājasservera URL adrese",
"Your identity server's URL": "Tava identitātes servera URL adrese",
"The information being sent to us to help make Riot.im better includes:": "Informācija, kura mums tiek nosūtīta, lai ļautu padarīt Riot.im labāku, ietver:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Mēs arī fiksējam katru lapu, kuru tu izmanto programmā (currently <CurrentPageHash>), Tavu lietotāja aģentu (<CurrentUserAgent>) un Tavas ierīces ekrāna izšķirtspēju (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ja šī lapa ietver identificējamu informāciju, tādu kā istaba, lietotājs, grupas ID, šie dati tiek noņemti pirms nosūtīšanas uz serveri.",
"Call Failed": "Zvans neizdevās",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Šajā istabā ir nepazīstamas ierīces: ja Tu turpināsi bez to pārbaudes, ir iespējams, ka kāda nepiederoša persona var noklausīties Tavas sarunas.",
"Review Devices": "Ierīču pārskats",
"Call Anyway": "Vienalga zvanīt",
"Answer Anyway": "Vienalga atbildēt",
"Call": "Zvans",
"Answer": "Atbildēt",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"Who would you like to add to this community?": "Kurus cilvēkus Tu vēlētos pievienot šai komūnai?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Brīdinājums: ikviens, kurš tiek pievienots komūnai būs publiski redzams visiem, kuri zin komūnas ID",
"Invite new community members": "Uzaicināt jaunus komūnas biedrus",
"Name or matrix ID": "Vārds vai Matrix ID",
"Invite to Community": "Uzaicināt komūnā",
"Which rooms would you like to add to this community?": "Kuras istabas vēlies pievienot šai komūnai?",
"Show these rooms to non-members on the community page and room list?": "Vai ne-biedriem rādīt komūnas lapā un istabu sarakstā šīs istabas?",
"Add rooms to the community": "Istabu pievienošana komūnai",
"Room name or alias": "Istabas nosaukums vai aliase",
"Add to community": "Pievienot komūnai",
"Failed to invite the following users to %(groupId)s:": "Neizdevās uzaicināt sekojošus lietotājus grupā %(groupId)s:",
"Failed to invite users to community": "Neizdevās uzaicināt lietotājus komūnā",
"Failed to invite users to %(groupId)s": "Neizdevās uzaicināt lietotājus grupā %(groupId)s:",
"Failed to add the following rooms to %(groupId)s:": "Neizdevās pievienot sekojošas istabas grupai %(groupId)s:",
"Restricted": "Ierobežots",
"Ignored user": "Ignorējams lietotājs",
"You are now ignoring %(userId)s": "Tagad Tu ignorē %(userId)s",
"Unignored user": "Neignorējams lietotājs",
"You are no longer ignoring %(userId)s": "Tu vairāk neignorē %(userId)s",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s nomainīja savu attēlojamo vārdu uz %(displayName)s.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s šai istabai nomainīja piekabinātās ziņas.",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s vidžets, kuru mainīja %(senderName)s",
"%(names)s and %(count)s others are typing|other": "%(names)s un %(count)s citi raksta",
"%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta",
"Message Replies": "Atbildes uz ziņām",
"Message Pinning": "Ziņu piekabināšana",
"Presence Management": "Klātbūtnes vadība",
"Tag Panel": "Birku panelis",
"Disable Emoji suggestions while typing": "Atspējot Emoji ieteikumus teksta rakstīšanas laikā",
"Hide avatar changes": "Slēpt avatara izmaiņas",
"Hide display name changes": "Slēpt attēlojamā vārda izmaiņas",
"Disable big emoji in chat": "Atspējot čatā lielos emoji",
"Mirror local video feed": "Spoguļots vietējā video attēlojums",
"Enable inline URL previews by default": "Ieslēgt URL adrešu priekšskatījumu pēc noklusējuma",
"Enable URL previews for this room (only affects you)": "Ieslēgt URL adrešu priekšskatījumus šai istabai (ietekmē tikai Tevi pašu)",
"Enable URL previews by default for participants in this room": "Ieslēgt URL adrešu priekšskatījumus pēc noklusējuma visiem šīs istabas dalībniekiem",
"Delete %(count)s devices|other": "Dzēst %(count)s ierīces",
"Delete %(count)s devices|one": "Dzēst ierīci",
"Select devices": "Izvēlēties ierīces",
"%(senderName)s sent an image": "%(senderName)s nosūtīja bildi",
"%(senderName)s sent a video": "%(senderName)s nosūtīja video",
"%(senderName)s uploaded a file": "%(senderName)s augšupielādēja failu",
"Disinvite this user?": "Atcelt ielūgumu šim lietotājam?",
"Kick this user?": "Padzīt šo lietotāju?",
"Unban this user?": "Atbloķēt šo lietotāju (atcelt liegumu šim lietotājam)?",
"Ban this user?": "Bloķēt šo lietotāju (uzlikt liegumu šim lietotājam)?",
"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.": "Jūs nevarēsiet atcelt šīs izmaiņas pēc sava statusa pazemināšanas. Gadījumā, ja esat pēdējais priviliģētais lietotājs istabā, būs neiespējami atgūt šīs privilēģijas.",
"Unignore": "Atcelt ignorēšanu",
"Ignore": "Ignorēt",
"Jump to read receipt": "Pāriet uz izlasīšanas apstiprinājumu",
"Mention": "Atsauce (pieminējums)",
"Invite": "Uzaicināt",
"User Options": "Lietotāja uzstādījumi",
"Send an encrypted reply…": "Sūtīt šifrētu atbildi…",
"Send a reply (unencrypted)…": "Sūtīt nešifrētu atbildi…",
"Send an encrypted message…": "Sūtīt šifrētu ziņu…",
"Send a message (unencrypted)…": "Sūtīt NEšifrētu ziņu…",
"Jump to message": "Pāriet uz ziņu",
"No pinned messages.": "Nav piestiprinātu ziņu.",
"Loading...": "Ielāde...",
"Pinned Messages": "Piestiprinātās ziņas",
"%(duration)ss": "%(duration)s sek",
"%(duration)sm": "%(duration)smin",
"%(duration)sh": "%(duration)sstundas",
"%(duration)sd": "%(duration)sdienas",
"Online for %(duration)s": "Pieslēgumā %(duration)s",
"Idle for %(duration)s": "Dīkstāvē (neaktīvs) %(duration)s",
"Offline for %(duration)s": "Atslēgumā %(duration)s",
"Unknown for %(duration)s": "Neskaidrā statusā %(duration)s",
"Unknown": "Neskaidrs statuss",
"Replying": "Atbildot uz",
"No rooms to show": "Nav istabu, kuras parādīt",
"World readable": "Pieejams ikvienam no visurienes",
"Remove avatar": "Dzēst avataru",
"Drop here to favourite": "Nomest šeit (atvilt uz šejieni), lai iekļautu izlasē (favorītos)",
"Drop here to tag direct chat": "Nomest šeit, lai pievienotu atzīmi \"Tiešais čats\"",
"Drop here to restore": "Nomest šeit, lai atgrieztu",
"Drop here to demote": "Nomest šeit, lai pazeminātu",
"Failed to remove tag %(tagName)s from room": "Neizdevās istabai noņemt birku %(tagName)s",
"Failed to add tag %(tagName)s to room": "Neizdevās istabai pievienot birku %(tagName)s",
"Community Invites": "Uzaicinājums uz komūnu",
"You have been kicked from this room by %(userName)s.": "%(userName)s padzina Tevi no šīs istabas.",
"You have been banned from this room by %(userName)s.": "%(userName)s nobloķēja Tevi (liedza piekļuvi) šajā istabā.",
"You are trying to access a room.": "Tu centies gūt piekļuvi istabai.",
"To change the room's avatar, you must be a": "Lai izmainītu istabas avatāru, Tev jābūt",
"To change the room's name, you must be a": "Lai izmainītu istabas nosaukumu, Tev jābūt",
"To change the room's main address, you must be a": "Lai izmainītu istabas pamatadresi, Tev jābūt",
"To change the room's history visibility, you must be a": "Lai izmainītu istabas vēstures redzamību, Tev jābūt",
"To change the permissions in the room, you must be a": "Lai istabā izmainītu atļaujas, Tev jābūt",
"To change the topic, you must be a": "Lai izmainītu tematu, Tev jābūt",
"To modify widgets in the room, you must be a": "Lai istabā izmainītu vidžetus, Tev jābūt",
"Banned by %(displayName)s": "Nobloķējis (liedzis piekļuvi) %(displayName)s",
"Members only (since the point in time of selecting this option)": "Tikai biedri (no šī parametra iestatīšanas brīža)",
"Members only (since they were invited)": "Tikai biedri (no to uzaicināšanas brīža)",
"Members only (since they joined)": "Tikai biedri (kopš pievienošanās)",
"To send messages, you must be a": "Lai sūtītu ziņas, Tev jābūt",
"To invite users into the room, you must be a": "Lai aicinātu istabā lietotājus, ir jābūt",
"To configure the room, you must be a": "Lai konfigurētu istabu, ir jābūt",
"To kick users, you must be a": "Lai padzītu lietotājus, ir jābūt",
"To ban users, you must be a": "Lai bloķētu (liegtu pieeju) lietotājiem, ir jābūt",
"To remove other users' messages, you must be a": "Lai dzēstu citu lietotāju ziņas, ir jābūt",
"To send events of type <eventType/>, you must be a": "Lai sūtītu <eventType/> tipa notikumus, ir jābūt",
"Addresses": "Adreses",
"Invalid community ID": "Nederīgs komūnas ID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' nav derīgs komūnas ID",
"Flair": "Gaidas (nojauta)",
"Showing flair for these communities:": "Parādīt Tavas gaidas šajās komūnās:",
"This room is not showing flair for any communities": "Šajā istabā neparādās gaidas, kas uzstādītas komūnās",
"New community ID (e.g. +foo:%(localDomain)s)": "Jaunās komūnas ID (piem. +foo:%(localDomain)s)",
"URL previews are enabled by default for participants in this room.": "URL adrešu priekšskats šīs istabas dalībniekiem ir iespējots pēc noklusējuma.",
"URL previews are disabled by default for participants in this room.": "ULR adrešu priešskats šīs istabas dalībniekiem pēc noklusējuma ir atspējots.",
"Copied!": "Nokopēts!",
"Failed to copy": "Nokopēt neizdevās",
"Message removed by %(userId)s": "Ziņu dzēsis %(userId)s",
"Message removed": "Ziņa dzēsta",
"An email has been sent to %(emailAddress)s": "Vēstule tika nosūtīta uz %(emailAddress)s",
"A text message has been sent to %(msisdn)s": "Teksta ziņa tika nosūtīts uz %(msisdn)s",
"Username on %(hs)s": "Lietotājvārds uz %(hs)s",
"Remove from community": "Izdzēst no komūnas",
"Disinvite this user from community?": "Atcelt šim lietotājam nosūtīto uzaicinājumu pievienoties komūnai?",
"Remove this user from community?": "Izdzēst šo lietotāju no kopienas?",
"Failed to withdraw invitation": "Neizdevās atcelt uzaicinājumu",
"Failed to remove user from community": "Neizdevās izdzēst lietotāju no kopienas",
"Filter community members": "Kopienas biedru filtrs",
"Flair will appear if enabled in room settings": "Gaidas parādīsies, ja tās iespējotas istabas iestatījumos",
"Flair will not appear": "Gaidas neparādīsies",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Vai tiešām vēlies izdzēst '%(roomName)s' no %(groupId)s?",
"Removing a room from the community will also remove it from the community page.": "Dzēšot istabu no kopienas tā tiks dzēsta arī no kopienas lapas.",
"Failed to remove room from community": "Neizdevās dzēst istabu no kopienas",
"Failed to remove '%(roomName)s' from %(groupId)s": "Neizdevās dzēst '%(roomName)s' no %(groupId)s",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Istabas '%(roomName)s' redzamību %(groupId)s nebija iespējams atjaunot.",
"Visibility in Room List": "Redzamība istabu sarakstā",
"Visible to everyone": "Redzama visiem",
"Only visible to community members": "Tikai komūnas dalībniekiem",
"Filter community rooms": "Kopienas istabu filtrs",
"Something went wrong when trying to get your communities.": "Kaut kas nogāja greizi, kad tika mēģināts attēlot Tavas kopienas.",
"Display your community flair in rooms configured to show it.": "Parādīt Tavas gaidas istabās, kurās to parādīšana iespējota.",
"You're not currently a member of any communities.": "Pašreiz Tu neesi neesi nevienas komūnas piederīgais.",
"Delete Widget": "Dzēst vidžetu",
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Vidžeta dzēšana to dzēš visiem šīs istabas lietotājiem. Vai tiešām vēlies dzēst šo vidžetu?",
"Minimize apps": "Minimizēt lietotājprogrammas",
"Communities": "Kopienas",
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)spievienojās %(count)s reizes",
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)spievienojās",
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)spievienojās %(count)s reizes",
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)s pievienojās",
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s izgāja %(count)s reizes",
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s izgāja (atvienojās)",
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s izgāja (atvienojās) %(count)s reizes",
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s izgāja",
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s pievienojās un izgāja %(count)s reizes",
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s pievienojās un izgāja",
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s pievienojās un izgāja %(count)s reizes",
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s pievienojās un izgāja",
"%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s izgāja un atkalpievienojās %(count)s reizes",
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s noraidīja uzaicinājumus %(count)s reizes",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s atsauca izsniegtos uzaicinājumus %(count)s reizes",
"were banned %(count)s times|other": "tika bloķēti (liegta piekļuve) %(count)s reizes",
"was banned %(count)s times|other": "tika bloķēts (liegta piekļuve) %(count)s reizes",
"were unbanned %(count)s times|other": "tika atbloķēti (atgriezta pieeja) %(count)s reizes",
"were kicked %(count)s times|other": "tika padzīti %(count)s reizes",
"collapse": "sakļaut",
"expand": "izvērst",
"Custom of %(powerLevel)s": "Lietotāja līmenis %(powerLevel)s",
"<a>In reply to</a> <pill>": "<a>Atbildē uz</a> <pill>",
"And %(count)s more...|other": "Un par %(count)s vairāk...",
"Matrix ID": "Matrix ID",
"Matrix Room ID": "Matrix istabas ID",
"email address": "e-pasta adrese",
"Try using one of the following valid address types: %(validTypesList)s.": "Mēģiniet izmantot vienu no sekojošiem pieļautajiem adrešu tipiem: %(validTypesList)s.",
"You have entered an invalid address.": "Ievadīta nederīga adrese.",
"Community IDs cannot not be empty.": "Kopienas IDs nevar būt tukšs.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Kopienas IDs var saturēt tikai simbolus a-z, 0-9, or '=_-./'",
"Something went wrong whilst creating your community": "Radot Tavu kopienu kaut kas nogāja greizi",
"Create Community": "Radīt kopienu",
"Community Name": "Kopienas nosaukums",
"Community ID": "Kopienas ID",
"example": "piemērs",
"Advanced options": "Papildus parametri",
"Block users on other matrix homeservers from joining this room": "Neļaut lietotājiem no citiem mājasserveriem pievienoties šai istabai",
"This setting cannot be changed later!": "Šo parametru vēlāk izmainīt nebūs iespējams!",
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s aizgājuši un atgriezušies",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s aizgājis un atgriezies %(count)s reizes",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s aizgājis un atgriezies",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s nepieņēma uzaicinājumus",
"were invited %(count)s times|one": "tika uzaicināti",
"was invited %(count)s times|other": "tika uzaicināta %(count)s reizes",
"was invited %(count)s times|one": "tika uzaicināts(a)",
"were unbanned %(count)s times|one": "tika atbloķēti (atcelts pieejas liegums)",
"was unbanned %(count)s times|other": "tika atbloķēts %(count)s reizes",
"was banned %(count)s times|one": "tika bloķēts",
"were banned %(count)s times|one": "tika bloķēti",
"was unbanned %(count)s times|one": "tika atbloķēts",
"were kicked %(count)s times|one": "tika padzīti",
"was kicked %(count)s times|other": "tika padzīts %(count)s reizes",
"was kicked %(count)s times|one": "tika padzīts",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s izmainīja savu lietotājvārdu %(count)s reizes",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s izmainīja savu lietotājvārdu",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>Tavas kopienas lapas HTML</h1>\n<p>\n Izmanto garāku aprakstu, lai iepazīstinātu jaunos lietoājus ar kopienu, \n vai padalies ar kādām attiecināmām <a href=\"foo\">web-saitēm</a>\n</p>\n<p>\n Vari izmantot arī 'img' birkas\n</p>\n",
"Add rooms to the community summary": "Pievienot istabas kopienas informatīvajā kopsavilkumā",
"Which rooms would you like to add to this summary?": "Kuras istabas vēlaties pievienot šim kopsavilkumam?",
"Add to summary": "Pievienot kopsavilkumam",
"Failed to add the following rooms to the summary of %(groupId)s:": "Neizdevās sekojošās istabas pievienot %(groupId)s kopsavilkumam:",
"Add a Room": "Pievienot istabu",
"Failed to remove the room from the summary of %(groupId)s": "Neizdevās dzēst istabu no %(groupId)s kopsavilkuma",
"The room '%(roomName)s' could not be removed from the summary.": "Istabu '%(roomName)s' neizdevās dzēst no kopsavilkuma.",
"Leave Community": "Atstāt kopienu",
"Unable to leave room": "Nav iespējams atstāt istabu",
"Community Settings": "Kopienas iestatījumi",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Šīs istabas tiek rādītas kopienas dalībniekiem šīs kopienas lapā. Kopienas dalībnieki var pievienoties istabām, uzklikšķinot uz tām.",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Jūsu kopienai nav plašāka HTML-lapas apraksta ko parādīt dalībniekiem.<br />Klikšķini šeit, lai atvērtu iestatījumus un to pievienotu!",
"Description": "Apraksts",
"Failed to load %(groupId)s": "Neizdevās ielādēt %(groupId)s",
"This Home server does not support communities": "Šis mitināšanas serveris neatbalsta kopienas",
"This room is not public. You will not be able to rejoin without an invite.": "Šīs istaba nav publiska. Tu nevari tajā ieiet bez uzaicinājuma.",
"Cryptography data migrated": "Sifrēšanas dati tika pārnesti",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Veikta vienreizēja šifrēšanas datu pārnese. Sifrēšana (end-to-end) nedarbosies, ja Tu atgriezīses pie vecākas Riot versijas. Ja nepieciešams izmantot end-to-end šifrēšanu, izmantojot vecāku versija, vispirms izraksties no Riot. Lai saglabātu ziņu vēsturi, eksportē un tad importē savas kripto-atslēgas.",
"Old cryptography data detected": "Tika uzieti novecojuši šifrēšanas dati",
"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.": "Uzieti dati no vecākas Riot versijas. Tas novedīs pie end-to-end šifrēšanas problēmām vecākajā versijā. Šajā versijā nevar tikt atšifrēti ziņojumi, kuri radīti izmantojot vecākajā versijā end-to-end šifrētas ziņas. Tas var arī novest pie ziņapmaiņas, kas veikta ar šo versiju. Ja rodas ķibeles, izraksties un par jaunu pieraksties sistēmā. Lai saglabātu ziņu vēsturi, eksportē un tad importē savas šifrēšanas atslēgas.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Radi kopienu, lai apvienotu lietotājus un istabas. Izveido mājaslapu, lai iezīmētu Matrix visumā savu klātbūtni, vietu un telpu.",
"Error whilst fetching joined communities": "Ielādējot kopienas radās kļūda",
"%(count)s of your messages have not been sent.|one": "Tava ziņa netika nosūtīta.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Parādīt ierīces</showDevicesText>, <sendAnywayText>vienalga nosūtīt</sendAnywayText> vai <cancelText>sūtīšanu atcelt</cancelText>.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Atkārtoti nosūtīt ziņu</resendText> vai <cancelText>atcelt sūtīšanu</cancelText>.",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Šeit neviena nav. Ja vēlies <inviteText>kādu uzaicināt</inviteText> vai <nowarnText>atslēgt paziņojumu par tukšu istabu</nowarnText>?",
"Light theme": "Gaiša tēma",
"Dark theme": "Tumša tēma",
"Status.im theme": "Status.im tēma",
"Ignored Users": "Ignorētie lietotāji",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privātumu augstu respektējam, tādēļ nevācam nekādus personas un identificējamus datus analītikas mērķiem.",
"Learn more about how we use analytics.": "Sīkāk par to, kā tiek izmantota analītika.",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Epasts ir nosūtīts uz %(emailAddress)s. Izmantojiet epastā nosūtīto tīmekļa saiti un tad noklišķiniet šeit zemāk.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Lūdzu ņem vērā, ka Tu pieraksties %(hs)s serverī, nevis matrix.org serverī.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Šis bāzes serveris neatbalsta nevienu pierakstīšanās metodi, kuru piedāvā šis Riot klients.",
"Sign in to get started": "Pierakstīties, lai sāktu",
"Ignores a user, hiding their messages from you": "Ignorē lietotāju, Tev nerādot viņa sūtītās ziņas",
"Stops ignoring a user, showing their messages going forward": "Atceļ lietotāja ignorēšanu, rādot viņa turpmāk sūtītās ziņas",
"Notify the whole room": "Paziņot visai istabai",
"Room Notification": "Istabas paziņojums"
}

View File

@ -41,7 +41,7 @@
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "Veranderingen aan wie de geschiedenis kan lezen worden alleen maar toegepast op toekomstige berichten in deze ruimte",
"Changes your display nickname": "Verandert jouw weergavenaam",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde chat geschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde gespreksgeschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.",
"Clear Cache and Reload": "Legen cache en herlaad",
"Clear Cache": "Legen cache",
"Click here to fix": "Klik hier om op te lossen",
@ -177,7 +177,7 @@
"Cryptography": "Cryptografie",
"Current password": "Huidig wachtwoord",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de ruimte verwijderd.",
"Create a new chat or reuse an existing one": "Maak een nieuwe chat aan of ga verder met een bestaande",
"Create a new chat or reuse an existing one": "Maak een nieuw gesprek aan of hergebruik een al bestaand gesprek",
"Create Room": "Maak een ruimte aan",
"Curve25519 identity key": "Curve25519-identiteitssleutel",
"/ddg is not a command": "/ddg is geen commando",
@ -450,7 +450,6 @@
"Use with caution": "Gebruik met behoedzaamheid",
"User ID": "Gebruikers-ID",
"User Interface": "Gebruikersinterface",
"%(user)s is a": "%(user)s is een",
"User name": "Gebruikersnaam",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (macht %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Gebruikersnaam ongeldig: %(errMessage)s",
@ -555,7 +554,7 @@
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het te exporteren bestand zal beveiligd zijn met een wachtzin. Je moet hier een wachtzin invoeren om het bestand te ontsleutelen.",
"You must join the room to see its files": "Je moet tot een ruimte toetreden om de bestanden te zien",
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s uitnodigingen afslaan",
"Start new chat": "Nieuwe chat starten",
"Start new chat": "Nieuw gesprek starten",
"Failed to invite": "Niet gelukt om uit te nodigen",
"Failed to invite user": "Niet gelukt om de gebruiker uit te nodigen",
"Failed to invite the following users to the %(roomName)s room:": "Niet gelukt om de volgende gebruikers voor de %(roomName)s ruimte uit te nodigen:",
@ -741,5 +740,259 @@
"Disinvite this user?": "Uitnodiging van deze gebruiker intrekken?",
"Kick this user?": "Deze gebruiker er uit zetten?",
"Unban this user?": "Deze gebruiker ontbannen?",
"Ban this user?": "Deze gebruiker bannen?"
"Ban this user?": "Deze gebruiker bannen?",
"Disable big emoji in chat": "Grote emoji in gesprekken uitzetten",
"Mirror local video feed": "Lokale video aanvoering ook op andere locaties (Mirrors) opslaan",
"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.": "Je kan deze actie niet ongedaan maken omdat je jezelf degradeert. Als je het laatste persoon met rechten bent, is het onmogelijk om de rechten terug te krijgen.",
"Unignore": "Niet meer negeren",
"Ignore": "Negeren",
"Jump to read receipt": "Naar het laatst gelezen bericht gaan",
"Mention": "Vermelden",
"Invite": "Uitnodigen",
"User Options": "Gebruikersopties",
"Send an encrypted reply…": "Verstuur een versleuteld antwoord…",
"Send a reply (unencrypted)…": "Verstuur een antwoord (onversleuteld)…",
"Send an encrypted message…": "Verstuur een versleuteld bericht…",
"Send a message (unencrypted)…": "Verstuur een bericht (onversleuteld)…",
"Jump to message": "Naar bericht gaan",
"No pinned messages.": "Geen gepinde berichten.",
"Loading...": "Laden...",
"Pinned Messages": "Gepinde Berichten",
"%(duration)ss": "%(duration)ss",
"%(duration)sm": "%(duration)sm",
"%(duration)sh": "%(duration)su",
"%(duration)sd": "%(duration)sd",
"Online for %(duration)s": "Online voor %(duration)s",
"Idle for %(duration)s": "Inactief voor %(duration)s",
"Offline for %(duration)s": "Offline voor %(duration)s",
"Unknown for %(duration)s": "Onbekend voor %(duration)s",
"Unknown": "Onbekend",
"Replying": "Aan het beantwoorden",
"No rooms to show": "Geen ruimtes om weer te geven",
"Unnamed room": "Ruimte zonder naam",
"World readable": "Leesbaar voor iedereen",
"Guests can join": "Gasten kunnen toetreden",
"Remove avatar": "Avatar verwijderen",
"To change the room's avatar, you must be a": "Om de avatar van de ruimte te verwijderen, moet het volgende zijn:",
"Drop here to favourite": "Hier laten vallen om aan favorieten toe te voegen",
"Drop here to tag direct chat": "Hier laten vallen om als privégesprek te markeren",
"Drop here to restore": "Hier laten vallen om te herstellen",
"Drop here to demote": "Hier laten vallen om te degraderen",
"Community Invites": "Gemeenschapsuitnodigingen",
"You have been kicked from this room by %(userName)s.": "Je bent uit deze ruimte gezet door %(userName)s.",
"You have been banned from this room by %(userName)s.": "Je bent uit deze ruimte verbannen door %(userName)s.",
"You are trying to access a room.": "Je probeert een ruimte te betreden.",
"To change the room's name, you must be a": "Om de ruimtenaam te veranderen moet je het volgende zijn:",
"To change the room's main address, you must be a": "Om het hoofdadres van deze ruimte te wijzigen moet je het volgende zijn:",
"To change the room's history visibility, you must be a": "Om de zichtbaarheid van de geschiedenis van de ruimte te veranderen moet je het volgende zijn:",
"To change the permissions in the room, you must be a": "Om de permissies in de ruimte te veranderen moet je het volgende zijn:",
"To change the topic, you must be a": "Om het onderwerp te veranderen moet je het volgende zijn:",
"To modify widgets in the room, you must be a": "Om een widget in de ruimte aan te passen moet je het volgende zijn:",
"Banned by %(displayName)s": "Verbannen door %(displayName)s",
"Members only (since the point in time of selecting this option)": "Alleen gebruikers (vanaf het moment dat deze optie wordt geselecteerd)",
"Members only (since they were invited)": "Alleen gebruikers (vanaf het moment dat ze uitgenodigd zijn)",
"Members only (since they joined)": "Alleen gebruikers (vanaf het moment dat ze toegetreden zijn)",
"To send messages, you must be a": "Om berichten te versturen moet je het volgende zijn:",
"To invite users into the room, you must be a": "Om gebruikers in de ruimte uit te nodigen moet je het volgende zijn:",
"To configure the room, you must be a": "Om de ruimte te configureren moet je het volgende zijn:",
"To kick users, you must be a": "Om gebruikers er uit te zetten moet je het volgende zijn:",
"To ban users, you must be a": "Om gebruikers te verbannen moet je het volgende zijn:",
"To remove other users' messages, you must be a": "Om de berichten van andere gebruikers te verwijderen moet je het volgende zijn:",
"To send events of type <eventType/>, you must be a": "Om gebeurtenissen van het type <eventType/> te versturen, moet je het volgende zijn:",
"Addresses": "Adressen",
"Invalid community ID": "Ongeldig gemeenschaps-ID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' is niet een geldig gemeenschaps-ID",
"Flair": "Badge",
"Showing flair for these communities:": "Badges voor deze gemeenschappen weergeven:",
"This room is not showing flair for any communities": "Deze ruimte geeft geen badges voor gemeenschappen weer",
"New community ID (e.g. +foo:%(localDomain)s)": "Nieuw gemeenschaps-ID (bv. +foo:%(localDomain)s)",
"URL previews are enabled by default for participants in this room.": "URL voorvertoning staat standaard aan voor deelnemers in deze ruimte.",
"URL previews are disabled by default for participants in this room.": "URL voorvertoning staat standaard uit voor deelnemers in deze ruimte.",
"Message removed by %(userId)s": "Bericht verwijderd door %(userId)s",
"Message removed": "Bericht verwijderd",
"An email has been sent to %(emailAddress)s": "Een e-mail is naar %(emailAddress)s verstuurd",
"A text message has been sent to %(msisdn)s": "Een tekstbericht is naar %(msisdn)s versuurd",
"Username on %(hs)s": "Gebruikersnaam op %(hs)s",
"Remove from community": "Verwijder van gemeenschap",
"Disinvite this user from community?": "Uitnodiging van de gemeenschap voor deze gebruiker intrekken?",
"Remove this user from community?": "Deze gebruiker van de gemeenschap verwijderen?",
"Failed to withdraw invitation": "Niet gelukt om de uitnodiging in te trekken",
"Failed to remove user from community": "Niet gelukt om de gebruiker van de gemeenschap te verwijderen",
"Filter community members": "Filter gemeenschapsleden",
"Flair will appear if enabled in room settings": "Badge zal worden weergeven als het aangezet is in de ruimte-instellingen",
"Flair will not appear": "Badge zal niet weergeven worden",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Weet je zeker dat je '%(roomName)s' van %(groupId)s wilt verwijderen?",
"Removing a room from the community will also remove it from the community page.": "Het verwijderen van de ruimte van de gemeenschap zal de ruimte ook van de gemeenschapspagina verwijderen.",
"Failed to remove room from community": "Niet gelukt om de ruimte van de gemeenschap te verwijderen",
"Failed to remove '%(roomName)s' from %(groupId)s": "Niet gelijkt om '%(roomName)s' van %(groupId)s te verwijderen",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "De zichtbaarheid van '%(roomName)s' in %(groupId)s kon niet geüpdatet worden.",
"Visibility in Room List": "Zichtbaarheid in Ruimte Lijst",
"Visible to everyone": "Zichtbaar voor iedereen",
"Only visible to community members": "Alleen zichtbaar voor gemeenschapsleden",
"Filter community rooms": "Gemeenschapsruimtes filteren",
"Something went wrong when trying to get your communities.": "Iets ging verkeerd tijdens het ophalen van je gemeenschappen.",
"Display your community flair in rooms configured to show it.": "Geef je gemeenschapsbadge weer in ruimtes die geconfigureerd zijn om het te weergeven.",
"You're not currently a member of any communities.": "Je bent momenteel niet een lid van een gemeenschap.",
"Minimize apps": "Applicaties minimaliseren",
"Communities": "Gemeenschappen",
"%(nameList)s %(transitionList)s": "%(nameList)s%(transitionList)s",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s traden %(count)s keer toe",
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s zijn toegetreden",
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)s trad %(count)s keer toe",
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)s is toegetreden",
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s gingen %(count)s keer weg",
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s gingen weg",
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s ging %(count)s keer weg",
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s ging weg",
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s traden toe en gingen weer weg voor %(count)s keer",
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s traden toe en gingen weer weg",
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s trad toe en ging weer weg voor %(count)s keer",
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s trad toe en ging weer weg",
"%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s ging weg en trad weer toe voor %(count)s keer",
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s gingen weg en kwamen weer terug",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s ging weg en kwam weer terug voor %(count)s keer",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s ging weg en kwam weer terug",
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s wezen hun uitnodiging af voor %(count)s keer",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s wezen hun uitnodiging af",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s wees %(count)s keer zijn of haar uitnodiging af",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s wees zijn of haar uitnodiging af",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "De uitnodigingen naar %(severalUsers)s zijn %(count)s keer ingetrokken",
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "De uitnodigingen voor %(severalUsers)s zijn ingetrokken",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "De uitnodiging van %(oneUser)s is %(count)s keer ingetrokken",
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "De uitnodiging van %(oneUser)s is ingetrokken",
"were invited %(count)s times|other": "was %(count)s keer uitgenodigd",
"were invited %(count)s times|one": "was uitgenodigd",
"was invited %(count)s times|other": "was %(count)s keer uitgenodigd",
"was invited %(count)s times|one": "was uitgenodigd",
"were banned %(count)s times|other": "was %(count)s keer verbannen",
"were banned %(count)s times|one": "was verbannen",
"was banned %(count)s times|other": "was %(count)s keer verbannen",
"was banned %(count)s times|one": "was verbannen",
"were unbanned %(count)s times|other": "zijn voor %(count)s keer ontbannen",
"was unbanned %(count)s times|other": "was %(count)s keer ontbannen",
"was unbanned %(count)s times|one": "was ontbannen",
"were kicked %(count)s times|other": "werden er %(count)s keer uitgezet",
"were kicked %(count)s times|one": "werden er uit gezet",
"was kicked %(count)s times|other": "was er %(count)s keer uitgezet",
"was kicked %(count)s times|one": "was er uit gezet",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s veranderden hun naam %(count)s keer",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s veranderden hun naam",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s veranderde zijn of haar naam %(count)s keer",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s veranderde zijn of haar naam",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s veranderden hun avatar %(count)s keer",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s veranderden hun avatar",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s veranderde zijn of haar avatar %(count)s keer",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s veranderde zijn of haar avatar",
"%(items)s and %(count)s others|other": "%(items)s en %(count)s anderen",
"%(items)s and %(count)s others|one": "%(items)s en één andere",
"collapse": "inklappen",
"expand": "openklappen",
"Custom of %(powerLevel)s": "Aangepast rank van %(powerLevel)s",
"Quote": "Citeren",
"And %(count)s more...|other": "En %(count)s meer...",
"Matrix ID": "Matrix ID",
"Matrix Room ID": "Matrix Ruimte ID",
"email address": "e-mailadres",
"Try using one of the following valid address types: %(validTypesList)s.": "Probeer één van de volgende geldige adrestypes: %(validTypesList)s.",
"You have entered an invalid address.": "Je hebt een ongeldig adres ingevoerd.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Een gemeenschaps-ID mag alleen de karakters a-z, 0-9, of '=_-./' bevatten.",
"Community IDs cannot not be empty.": "Een gemeenschaps-ID kan niet leeg zijn.",
"Something went wrong whilst creating your community": "Er is iets fout gegaan tijdens het aanmaken van je gemeenschap",
"Create Community": "Gemeenschap Aanmaken",
"Community Name": "Gemeenschapsnaam",
"Community ID": "Gemeenschap-ID",
"example": "voorbeeld",
"Advanced options": "Geavanceerde opties",
"Block users on other matrix homeservers from joining this room": "Gebruikers van andere matrix thuisservers niet toestaan om tot deze ruimte toe te treden",
"This setting cannot be changed later!": "Deze instelling kan niet later veranderd worden!",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML voor je gemeenschapspagina</h1>\n<p>\n Gebruik de lange beschrijving om nieuwe leden in de gemeenschap te introduceren of om belangrijke <a href=\"foo\">links</a> te verspreiden\n</p>\n<p>\n Je kan zelfs 'img' tags gebruiken\n</p>\n",
"Add rooms to the community summary": "Voeg ruimtes aan de gemeenschapssamenvatting toe",
"Which rooms would you like to add to this summary?": "Welke ruimtes zou je aan deze samenvatting willen toevoegen?",
"Add to summary": "Voeg aan samenvatting toe",
"Failed to add the following rooms to the summary of %(groupId)s:": "Het is niet gelukt om de volgende ruimtes aan de samenvatting van %(groupId)s toe te voegen:",
"Add a Room": "Voeg een ruimte toe",
"Failed to remove the room from the summary of %(groupId)s": "Het is niet gelukt om de ruimte van de samenvatting van %(groupId)s te verwijderen",
"The room '%(roomName)s' could not be removed from the summary.": "De ruimte '%(roomName)s' kan niet van de samenvatting verwijderd worden.",
"Add users to the community summary": "Voeg gebruikers aan de gemeenschapssamenvatting toe",
"Who would you like to add to this summary?": "Wie zou je aan de samenvatting toe willen voegen?",
"Failed to add the following users to the summary of %(groupId)s:": "Het is niet gelukt om de volgende gebruikers aan de samenvatting van %(groupId)s toe te voegen:",
"Add a User": "Voeg een Gebruiker toe",
"Failed to remove a user from the summary of %(groupId)s": "Het is niet gelukt om een gebruiker van de samenvatting van %(groupId)s te verwijderen",
"The user '%(displayName)s' could not be removed from the summary.": "De gebruiker '%(displayName)s' kon niet van de samenvatting verwijderd worden.",
"Failed to update community": "Het is niet gelukt om de gemeenschap te updaten",
"Unable to accept invite": "De uitnodiging kon niet geaccepteerd worden",
"Unable to reject invite": "De uitnodiging kon niet afgewezen worden",
"Leave Community": "Gemeenschap Verlaten",
"Leave %(groupName)s?": "%(groupName)s verlaten?",
"Leave": "Verlaten",
"Unable to leave room": "De ruimte kon niet verlaten worden",
"Community Settings": "Gemeenschapsinstellingen",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Deze ruimtes worden aan gemeenschapsleden getoond op de gemeenschapspagina. Gemeenschapsleden kunnen tot de ruimtes toetreden door er op te klikken.",
"%(inviter)s has invited you to join this community": "%(inviter)s heeft jou uitgenodigd om tot deze gemeenschap toe te treden",
"You are an administrator of this community": "Je bent een administrator van deze gemeenschap",
"You are a member of this community": "Je bent lid van deze gemeenschap",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Jouw gemeenschap heeft geen Lange Beschrijving (een HTML pagina dat aan de gemeenschapsleden wordt weergeven).<br/>Klik hier om de instellingen te openen en een Lange Beschrijving te maken!",
"Long Description (HTML)": "Lange Beschrijving (HTML)",
"Description": "Beschrijving",
"Community %(groupId)s not found": "Gemeenschap %(groupId)s is niet gevonden",
"This Home server does not support communities": "Deze Thuisserver ondersteunt geen gemeenschappen",
"Failed to load %(groupId)s": "Het is niet gelukt om %(groupId)s te laden",
"Cryptography data migrated": "Cryptografie gegevens zijn gemigreerd",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Een eenmalige migratie van cryptografie gegevens heeft plaatsgevonden. Eind-tot-eind versleuteling zal niet werken als je terug gaat naar een oudere versie van Riot. Log eerst uit op Riot als je eind-tot-eind versleuteling wil gebruiken op een oudere versie. Exporteer je sleutels en importeer ze achteraf weer als je de berichtgeschiedenis wilt behouden.",
"Old cryptography data detected": "Oude cryptografie gegevens gedetecteerd",
"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.": "Er zijn gegevens van een oudere versie van Riot gedetecteerd. Dit zal eind-tot-eind versleuteling laten storen in de oudere versie. Eind-tot-eind berichten dat recent zijn uitgewisseld zal misschien niet ontsleutelbaar zijn in deze versie. Dit zou er misschien ook voor kunnen zorgen dat berichten die zijn uitgewisseld in deze versie falen. Indien je problemen ervaart, log opnieuw in. Om de berichtgeschiedenis te behouden, exporteer de sleutels en importeer ze achteraf weer.",
"Your Communities": "Jouw Gemeenschappen",
"Error whilst fetching joined communities": "Er is een fout opgetreden tijdens het ophalen van de gemeenschappen waar je lid van bent",
"Create a new community": "Maak een nieuwe gemeenschap aan",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om gebruikers en ruimtes samen te groeperen! Bouw een aangepaste homepagina om je eigen plek in het Matrix universum te maken.",
"Join an existing community": "Treed tot een bestaande gemeenschap toe",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Je moet het gemeenschaps-ID weten om tot de gemeenschap toe te treden; dit zal er uitzien zoals <i>+voorbeeld:matrix.org</i>.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Toon apparaten</showDevicesText>, <sendAnywayText>Toch versturen</sendAnywayText> of <cancelText>annuleren</cancelText>.",
"%(count)s of your messages have not been sent.|one": "Je bericht was niet verstuurd.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "Nu alles <resendText>opnieuw versturen</resendText> of <cancelText>annuleren</cancelText>. Je kan ook individuele berichten selecteren om opnieuw te versturen of te annuleren.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "Nu <resendText>bericht opnieuw versturen</resendText> of <cancelText>bericht annuleren</cancelText>.",
"Warning": "Waarschuwing",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Er is niemand anders hier! Wil je <inviteText>anderen uitnodigen</inviteText> of <nowarnText>de waarschuwing over de lege ruimte stoppen</nowarnText>?",
"Light theme": "Licht thema",
"Dark theme": "Donker thema",
"Status.im theme": "Status.im thema",
"Ignored Users": "Genegeerde Gebruikers",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is belangrijk voor ons, dus we collecteren geen persoonlijke of identificeerbare gegevens voor onze gegevensanalyse.",
"Learn more about how we use analytics.": "Leer meer over hoe we gegevensanalyse gebruiken.",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Een e-mail is naar %(emailAddress)s verstuurd. Klik hieronder zodra je de link hebt gevolgd.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Merk op dat je aan het inloggen bent in de %(hs)s server, niet matrix.org.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Deze thuisserver heeft geen inlogmethodes die bij deze client ondersteunt worden.",
"Sign in to get started": "Log in om te beginnen",
"Ignores a user, hiding their messages from you": "Negeert een gebruiker, waardoor de berichten van de gebruiker onzichtbaar voor je worden",
"Stops ignoring a user, showing their messages going forward": "Stopt het negeren van een gebruiker, hierdoor worden de berichten van de gebruiker vanaf nu weer zichtbaar",
"Notify the whole room": "Notificeer de gehele ruimte",
"Room Notification": "Ruimte Notificatie",
"The information being sent to us to help make Riot.im better includes:": "De informatie dat naar ons wordt verstuurd om Riot.im beter te maken betrekt:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "We nemen ook elke pagina die je in de applicatie gebruikt (momenteel <CurrentPageHash>), je User Agent (<CurrentUserAgent>) en de resolutie van je apparaat (<CurrentDeviceResolution>) op.",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Waar deze pagina identificeerbare informatie bevat, zoals een ruimte, gebruiker of groep ID, zal deze data verwijderd worden voordat het naar de server gestuurd wordt.",
"The platform you're on": "Het platform waar je je op bevindt",
"The version of Riot.im": "De versie van Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Of je wel of niet ingelogd bent (we nemen niet je gebruikersnaam op)",
"Your language of choice": "De taal waarin de applicatie wordt weergeven",
"Which officially provided instance you are using, if any": "Welke officieel verschafte instantie je gebruikt, in dat het geval is",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Of je wel of niet gebruik maakt van de Richttext modus of de Rich Text Editor",
"Your homeserver's URL": "De URL van je thuisserver",
"Your identity server's URL": "De URL van je thuisserver",
"<a>In reply to</a> <pill>": "<a>Als antwoord op</a> <pill>",
"This room is not public. You will not be able to rejoin without an invite.": "Deze ruimte is niet publiekelijk. Je zal niet opnieuw kunnen toetreden zonder een uitnodiging.",
"were unbanned %(count)s times|one": "waren ontbant",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft zijn/haar weergavenaam veranderd naar %(displayName)s.",
"Disable Community Filter Panel": "Gemeenschapsfilterpaneel uitzetten",
"Your key share request has been sent - please check your other devices for key share requests.": "Je verzoek om sleutels te delen is verzonden - controleer je andere apparaten voor het verzoek.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Verzoeken om sleutels te delen worden automatisch naar andere apparaten verstuurd. Als je het verzoek hebt afgewezen of weg hebt geklikt, klik dan hier voor een nieuwe verzoek voor de sleutels van deze sessie.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Het is niet mogelijk om dit bericht te ontsleutelen als je andere apparaten er geen sleutel voor hebben.",
"Key request sent.": "Sleutel verzoek verstuurd.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Versleutelingssleutels opnieuw aanvragen</requestLink> van je andere apparaten.",
"%(user)s is a %(userRole)s": "%(user)s is een %(userRole)s",
"Did you know: you can use communities to filter your Riot.im experience!": "Wist je dat: je gemeenschappen kan gebruiken om je Riot.im ervaring te filteren!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Sleep een gemeenschapsavatar naar het filterpaneel helemaal aan de linkerkant van het scherm om een filter te maken. Je kan dan altijd op de avatar in het filterpaneel klikken om alleen de ruimtes en mensen te zien die met die gemeenschap geassocieerd zijn.",
"Clear filter": "Filter vrijmaken",
"Failed to set direct chat tag": "Het is niet gelukt om de 'privégesprek' label in te stellen",
"Failed to remove tag %(tagName)s from room": "Het is niet gelukt om de label %(tagName)s van de ruimte te verwijderen",
"Failed to add tag %(tagName)s to room": "Het is niet gelukt om de label %(tagName)s aan deze ruimte toe te voegen"
}

View File

@ -492,7 +492,6 @@
"Upload Files": "Prześlij pliki",
"Upload new:": "Prześlij nowy:",
"Use with caution": "Używać ostrożnie",
"%(user)s is a": "%(user)s jest",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (moc uprawnień administratorskich %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Niepoprawna nazwa użytkownika: %(errMessage)s",
"Verification Pending": "Oczekuje weryfikacji",

View File

@ -611,7 +611,6 @@
"Decline": "Recusar",
"Custom": "Personalizado",
"Add": "Adicionar",
"%(user)s is a": "%(user)s é um(a)",
"Unnamed Room": "Sala sem nome",
"The phone number entered looks invalid": "O número de telefone inserido parece ser inválido",
"Rejoin": "Voltar a participar da sala",

View File

@ -58,7 +58,7 @@
"Failed to change password. Is your password correct?": "Não foi possível mudar a senha. A sua senha está correta?",
"Failed to leave room": "Falha ao tentar deixar a sala",
"Failed to reject invitation": "Falha ao tentar rejeitar convite",
"Failed to set avatar.": "Falha ao tentar definir foto do perfil.",
"Failed to set avatar.": "Falha ao tentar definir a imagem do perfil.",
"Failed to unban": "Não foi possível desfazer o banimento",
"Failed to upload file": "Falha ao enviar o arquivo",
"Favourite": "Favorito",
@ -155,7 +155,7 @@
"unencrypted": "não criptografado",
"unknown device": "dispositivo desconhecido",
"unknown error code": "código de erro desconhecido",
"Upload avatar": "Enviar icone de perfil de usuário",
"Upload avatar": "Enviar uma imagem de perfil",
"Upload Files": "Enviar arquivos",
"Upload file": "Enviar arquivo",
"User ID": "Identificador de Usuário",
@ -492,7 +492,7 @@
"Drop file here to upload": "Arraste um arquivo aqui para enviar",
" (unsupported)": " (não suportado)",
"Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.",
"Online": "Online",
"Online": "Conectada/o",
"Idle": "Ocioso",
"Offline": "Offline",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O arquivo exportado irá permitir a qualquer pessoa que o acesse a descriptografar qualquer uma das mensagens criptografadas que você veja, portanto seja bastante cuidadosa(o) em manter este arquivo seguro. Para deixar este arquivo mais protegido, recomendamos que você insira uma senha abaixo, que será usada para criptografar o arquivo. Só será possível importar os dados usando exatamente a mesma senha.",
@ -615,7 +615,6 @@
"Unnamed Room": "Sala sem nome",
"Unverified": "Não verificado",
"Upload new:": "Enviar novo:",
"%(user)s is a": "%(user)s é um(a)",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nível de permissão %(powerLevelNumber)s)",
"Verified": "Verificado",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Você gostaria de <acceptText>aceitar</acceptText> ou <declineText>recusar</declineText> este convite?",
@ -655,5 +654,337 @@
"You are not in this room.": "Você não está nesta sala.",
"You do not have permission to do that in this room.": "Você não tem permissão para fazer isto nesta sala.",
"Ignored user": "Usuário ignorado",
"You are no longer ignoring %(userId)s": "Você parou de ignorar %(userId)s"
"You are no longer ignoring %(userId)s": "Você parou de ignorar %(userId)s",
"Edit": "Editar",
"Unpin Message": "Desafixar Mensagem",
"Add rooms to this community": "Adicionar salas na comunidade",
"The version of Riot.im": "A Versão do Riot.im",
"Whether or not you're logged in (we don't record your user name)": "Se você está ou não conectado (Nos não Gravaremos seu nome de usuário)",
"The platform you're on": "A plataforma que você está usando",
"Your language of choice": "O idioma que você selecionou",
"Which officially provided instance you are using, if any": "Qual instância oficial você está usando, se for o caso",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Se você está usando o editor de texto visual",
"Your homeserver's URL": "A URL do seu Servidor de Base (homeserver)",
"Your identity server's URL": "A URL do seu servidor de identidade",
"The information being sent to us to help make Riot.im better includes:": "As informações que estão sendo usadas para ajudar a melhorar o Riot.im incluem:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Nós também gravamos cada página que você usa no app (atualmente <CurrentPageHash>), o seu User Agent (<CurrentUserAgent>) e a resolução do seu dispositivo (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Quando esta página tem informação de identificação, como uma sala, ID de usuária/o ou de grupo, estes dados são removidos antes de serem enviados ao servidor.",
"Call Failed": "A chamada falhou",
"There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Há dispositivos desconhecidos nesta sala: se você continuar sem verificá-los, será possível alguém espiar sua chamada.",
"Review Devices": "Revisar dispositivos",
"Call Anyway": "Ligar assim mesmo",
"Answer Anyway": "Responder assim mesmo",
"Call": "Ligar",
"Answer": "Responder",
"PM": "PM",
"AM": "AM",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s de %(monthName)s de%(fullYear)s",
"Who would you like to add to this community?": "Quem você gostaria de adicionar a esta comunidade?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Atenção: qualquer pessoa que você adicionar a esta comunidade estará publicamente visível para todas as pessoas que conheçam o ID da comunidade",
"Invite new community members": "Convidar novos integrantes para a comunidade",
"Which rooms would you like to add to this community?": "Quais salas você quer adicionar a esta comunidade?",
"Show these rooms to non-members on the community page and room list?": "Exibir estas salas para não integrantes na página da comunidade e na lista de salas?",
"Room name or alias": "Nome da sala ou apelido",
"Unable to create widget.": "Não foi possível criar o widget.",
"You are now ignoring %(userId)s": "Você está agora ignorando %(userId)s",
"Unignored user": "Usuária/o não está sendo mais ignorada/o",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s alterou o seu nome público para %(displayName)s.",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s alterou as mensagens fixas da sala.",
"%(widgetName)s widget modified by %(senderName)s": "O widget %(widgetName)s foi modificado por %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "O widget %(widgetName)s foi criado por %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "O widget %(widgetName)s foi removido por %(senderName)s",
"%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras pessoas estão escrevendo",
"%(names)s and %(count)s others are typing|one": "%(names)s e uma outra pessoa estão escrevendo",
"Send": "Enviar",
"Message Replies": "Respostas",
"Message Pinning": "Fixar mensagem",
"Presence Management": "Gestão da presença",
"Tag Panel": "Painel de tags",
"Disable Emoji suggestions while typing": "Desativar sugestões de emojis enquanto estiver escrevendo",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensagens de entrada e de saída (não afeta convites, expulsões e banimentos)",
"Hide avatar changes": "Ocultar alterações da imagem de perfil",
"Hide display name changes": "Ocultar alterações de nome de usuária/o",
"Enable automatic language detection for syntax highlighting": "Ativar detecção automática de idioma para ressaltar erros de ortografia",
"Hide avatars in user and room mentions": "Ocultar avatars em menções a usuárias/os e a salas",
"Disable big emoji in chat": "Desativar emojis grandes na sala",
"Automatically replace plain text Emoji": "Substituir automaticamente os emojis em texto",
"Mirror local video feed": "Espelhar o feed de vídeo local",
"Enable inline URL previews by default": "Ativar, por padrão, a visualização de resumo de links",
"Enable URL previews for this room (only affects you)": "Ativar, para esta sala, a visualização de links (só afeta você)",
"Enable URL previews by default for participants in this room": "Ativar, para todas/os as/os integrantes desta sala, a visualização de links",
"Delete %(count)s devices|other": "Removar %(count)s dispositivos",
"Delete %(count)s devices|one": "Remover dispositivo",
"Select devices": "Selecionar dispositivos",
"Cannot add any more widgets": "Não é possível adicionar novos widgets",
"The maximum permitted number of widgets have already been added to this room.": "O número máximo de widgets permitidos já foi atingido nesta sala.",
"Add a widget": "Adicionar um widget",
"%(senderName)s sent an image": "%(senderName)s enviou uma imagem",
"%(senderName)s sent a video": "%(senderName)s enviou um vídeo",
"%(senderName)s uploaded a file": "%(senderName)s enviou um arquivo",
"Disinvite this user?": "Desconvidar esta/e usuária/o?",
"Kick this user?": "Excluir esta/e usuária/o?",
"Unban this user?": "Desfazer o banimento desta/e usuária/o?",
"Ban this user?": "Banir esta/e usuária/o?",
"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.": "Você não poderá desfazer esta alteração, já que está baixando suas próprias permissões. Se você for a última pessoa nesta sala, será impossível recuperar as permissões atuais.",
"Unignore": "Não ignorar mais",
"Ignore": "Ignorar",
"Jump to read receipt": "Ir para a confirmação de leitura",
"Mention": "Mencionar",
"Invite": "Convidar",
"User Options": "Opções de usuária/o",
"Hide Apps": "Ocultar Apps",
"Show Apps": "Mostrar Apps",
"Send an encrypted reply…": "Enviar uma resposta criptografada…",
"Send a reply (unencrypted)…": "Enviar uma resposta (não criptografada)…",
"Send an encrypted message…": "Enviar mensagem criptografada…",
"Send a message (unencrypted)…": "Enviar mensagem (não criptografada)…",
"Jump to message": "Pular para mensagem",
"No pinned messages.": "Não há mensagens fixas.",
"Loading...": "Carregando...",
"Pinned Messages": "Mensagens fixas",
"%(duration)ss": "%(duration)ss",
"%(duration)sm": "%(duration)sm",
"%(duration)sh": "%(duration)sh",
"%(duration)sd": "%(duration)sd",
"Online for %(duration)s": "Online há %(duration)s",
"Idle for %(duration)s": "Inativo há %(duration)s",
"Offline for %(duration)s": "Offline há %(duration)s",
"Unknown for %(duration)s": "Status desconhecido há %(duration)s",
"Unknown": "Desconhecido",
"Replying": "Respondendo",
"No rooms to show": "Nenhuma sala para mostrar",
"Unnamed room": "Sala sem nome",
"World readable": "Aberto publicamente à leitura",
"Guests can join": "Convidadas/os podem entrar",
"Remove avatar": "Remover a imagem de perfil",
"Drop here to favourite": "Arraste aqui para favoritar",
"Drop here to tag direct chat": "Arraste aqui para marcar como conversa direta",
"Drop here to restore": "Arraste aqui para restaurar",
"Drop here to demote": "Arraste aqui para reduzir privilégio",
"Community Invites": "Convites a comunidades",
"You have been kicked from this room by %(userName)s.": "Você foi excluída/o desta sala por %(userName)s.",
"You have been banned from this room by %(userName)s.": "Você foi banida/o desta sala por %(userName)s.",
"You are trying to access a room.": "Você está tentando acessar uma sala.",
"To change the room's avatar, you must be a": "Para alterar a imagem da sala, você deve ser um(a)",
"To change the room's name, you must be a": "Para mudar o nome da sala, você deve ser um(a)",
"To change the room's main address, you must be a": "Para mudar o endereço principal da sala, você deve ser um(a)",
"To change the room's history visibility, you must be a": "Para mudar a visibilidade do histórico desta sala, você deve ser um(a)",
"To change the permissions in the room, you must be a": "Para mudar as permissões nesta sala, você deve ser um(a)",
"To change the topic, you must be a": "Para alterar o tópico desta sala, você deve ser um(a)",
"To modify widgets in the room, you must be a": "Para alterar widgets nesta sala, você deve ser um(a)",
"Banned by %(displayName)s": "Banida/o por %(displayName)s",
"Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas em %(domain)s's?",
"Members only (since the point in time of selecting this option)": "Apenas integrantes (a partir do momento em que esta opção for selecionada)",
"Members only (since they were invited)": "Apenas integrantes (desde que foram convidadas/os)",
"Members only (since they joined)": "Apenas integrantes (desde que entraram na sala)",
"To send messages, you must be a": "Para enviar mensagens, você deve ser um(a)",
"To invite users into the room, you must be a": "Para convidar pessoas à sala, você deve ser um(a)",
"To configure the room, you must be a": "Para alterar configurações desta sala, você deve ser um(a)",
"To kick users, you must be a": "Para excluir pessoas desta sala, você deve ser um(a)",
"To ban users, you must be a": "Para banir pessoas desta sala, você deve ser um(a)",
"To remove other users' messages, you must be a": "Para apagar mensagens de outras pessoas nesta sala, você deve ser um(a)",
"To send events of type <eventType/>, you must be a": "Para enviar eventos do tipo <eventType/>, você deve ser um(a)",
"Addresses": "Endereços",
"Invalid community ID": "ID de comunidade inválido",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' não é um ID de comunidade válido",
"Flair": "Flair",
"Showing flair for these communities:": "Esta sala mostrará flairs para as seguintes comunidades:",
"This room is not showing flair for any communities": "Esta sala não está mostrando fairs para nenhuma comunidade",
"New community ID (e.g. +foo:%(localDomain)s)": "Novo ID de comunidade (p.ex: +foo:%(localDomain)s)",
"URL previews are enabled by default for participants in this room.": "Pré-visualizações de links estão ativadas por padrão para participantes desta sala.",
"URL previews are disabled by default for participants in this room.": "Pré-visualizações de links estão desativadas por padrão para participantes desta sala.",
"Copied!": "Copiado!",
"Failed to copy": "Não foi possível copiar",
"Message removed by %(userId)s": "Mensagem removida por %(userId)s",
"Message removed": "Mensagem removida",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robô está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>",
"An email has been sent to %(emailAddress)s": "Um email foi enviado para %(emailAddress)s",
"A text message has been sent to %(msisdn)s": "Uma mensagem de texto foi enviada para %(msisdn)s",
"Username on %(hs)s": "Nome de usuária/o em %(hs)s",
"%(serverName)s Matrix ID": "ID Matrix em %(serverName)s",
"Remove from community": "Remover da comunidade",
"Disinvite this user from community?": "Desconvidar esta pessoa da comunidade?",
"Remove this user from community?": "Remover esta pessoa da comunidade?",
"Failed to withdraw invitation": "Não foi possível retirar o convite",
"Failed to remove user from community": "Não foi possível remover esta pessoa da comunidade",
"Filter community members": "Filtrar participantes da comunidade",
"Flair will appear if enabled in room settings": "Os flairs aparecerão se estiverem ativados nas configurações da sala",
"Flair will not appear": "Os flairs não aparecerão",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Tem certeza que quer remover a sala '%(roomName)s' do grupo %(groupId)s?",
"Removing a room from the community will also remove it from the community page.": "Remover uma sala da comunidade também a removerá da página da comunidade.",
"Failed to remove room from community": "Não foi possível remover a sala da comunidade",
"Failed to remove '%(roomName)s' from %(groupId)s": "Não foi possível remover a sala '%(roomName)s' do grupo %(groupId)s",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "A visibilidade da sala '%(roomName)s' do grupo %(groupId)s não pôde ser atualizada.",
"Visibility in Room List": "Visibilidade na lista de salas",
"Visible to everyone": "Visível para todo mundo",
"Only visible to community members": "Apenas visível para integrantes da comunidade",
"Filter community rooms": "Filtrar salas da comunidade",
"Something went wrong when trying to get your communities.": "Algo deu errado quando estava carregando suas comunidades.",
"Display your community flair in rooms configured to show it.": "Mostrar o flair de sua comunidade em salas configuradas para isso.",
"You're not currently a member of any communities.": "Atualmente você não é integrante de nenhuma comunidade.",
"NOTE: Apps are not end-to-end encrypted": "Nota: os apps não são criptografados ponta-a-ponta",
"Do you want to load widget from URL:": "Você quer carregar o widget da URL:",
"Allow": "Permitir",
"Delete Widget": "Apagar widget",
"Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Remover um widget o remove para todas as pessoas desta sala. Tem certeza que quer remover este widget?",
"Delete widget": "Remover widget",
"Revoke widget access": "Retirar acesso ao widget",
"Minimize apps": "Minimizar apps",
"Communities": "Comunidades",
"Integrations Error": "Erro de integração",
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s entraram %(count)s vezes",
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s entraram",
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)s entrou %(count)s vezes",
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)s entrou",
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s saíram %(count)s vezes",
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s saíram",
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s saiu %(count)s vezes",
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s saiu",
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s entraram e saíram %(count)s vezes",
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s entraram e saíram",
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s entrou e saiu %(count)s vezes",
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s entrou e saiu",
"%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s saíram e entraram %(count)s vezes",
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s saíram e entraram",
"%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s saiu e entrou %(count)s vezes",
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s saiu e entrou",
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s rejeitaram seus convites %(count)s vezes",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s rejeitaram seus convites",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s rejeitou seu convite %(count)s vezes",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s rejeitou seu convite",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s tiveram seus convites retirados %(count)s vezes",
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s tiveram seus convites retirados",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s teve seus convites removidos %(count)s vezes",
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s teve seu convite removido",
"were invited %(count)s times|other": "foram convidadas/os %(count)s vezes",
"were invited %(count)s times|one": "foram convidadas/os",
"was invited %(count)s times|other": "foi convidada/o %(count)s vezes",
"was invited %(count)s times|one": "foi convidada/o",
"were banned %(count)s times|other": "foram banidas/os %(count)s vezes",
"were banned %(count)s times|one": "foram banidas/os",
"was banned %(count)s times|other": "foi banida/o %(count)s vezes",
"was banned %(count)s times|one": "foi banida/o",
"were unbanned %(count)s times|other": "tiveram seu banimento desfeito %(count)s vezes",
"were unbanned %(count)s times|one": "tiveram seu banimento desfeito",
"was unbanned %(count)s times|other": "teve seu banimento desfeito %(count)s vezes",
"was unbanned %(count)s times|one": "teve seu banimento desfeito",
"were kicked %(count)s times|other": "foram excluídas/os %(count)s vezes",
"were kicked %(count)s times|one": "foram excluídas/os",
"was kicked %(count)s times|other": "foi excluída/o %(count)s vezes",
"was kicked %(count)s times|one": "foi excluída/o",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s alteraram o seu nome %(count)s vezes",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s alteraram o seu nome",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s alterou o seu nome %(count)s vezes",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s alterou o seu nome",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s alteraram a sua imagem de perfil %(count)s vezes",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s alteraram a sua imagem de perfil",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s alterou a sua imagem de perfil %(count)s vezes",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s alterou a sua imagem de perfil",
"%(items)s and %(count)s others|other": "%(items)s e %(count)s outras",
"%(items)s and %(count)s others|one": "%(items)s e uma outra",
"collapse": "colapsar",
"expand": "expandir",
"Custom of %(powerLevel)s": "Personalizado de %(powerLevel)s",
"<a>In reply to</a> <pill>": "<a>Em resposta a</a> <pill>",
"And %(count)s more...|other": "E %(count)s mais...",
"Matrix ID": "ID Matrix",
"Matrix Room ID": "ID da sala Matrix",
"email address": "endereço de e-mail",
"Try using one of the following valid address types: %(validTypesList)s.": "Tente usar um dos seguintes tipos de endereço válidos: %(validTypesList)s.",
"You have entered an invalid address.": "Você entrou com um endereço inválido.",
"Community IDs cannot not be empty.": "IDs de comunidades não podem estar em branco.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "IDs de comunidade podem apenas ter os seguintes caracteres: a-z, 0-9, ou '=_-./'",
"Something went wrong whilst creating your community": "Algo deu errado ao criar sua comunidade",
"Create Community": "Criar comunidade",
"Community Name": "Nome da comunidade",
"Example": "Exemplo",
"Community ID": "ID da comunidade",
"example": "exemplo",
"Create": "Criar",
"Advanced options": "Opções avançadas",
"Block users on other matrix homeservers from joining this room": "Proibir pessoas de outros servidores matrix (homeservers) de ingressarem nesta sala",
"This setting cannot be changed later!": "Esta configuração não poderá ser desfeita posteriormente!",
"Loading device info...": "Carregando informações do dispositivo...",
"To get started, please pick a username!": "Para começar, escolha um nome de usuária/o!",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML para a página da sua comunidade</h1>\n<p>\n Use a descrição longa para apresentar a comunidade para novas/os integrantes ou partilhe <a href=\"foo\">links</a> importantes.\n</p>\n<p>\n Você pode até mesmo usar tags 'img' do HTML\n</p>\n",
"Add rooms to the community summary": "Adicionar salas para o índice da comunidade",
"Which rooms would you like to add to this summary?": "Quais salas você gostaria de adicionar a este índice?",
"Add to summary": "Adicionar ao índice",
"Failed to add the following rooms to the summary of %(groupId)s:": "Não foi possível adicionar as seguintes salas para o índice da comunidade %(groupId)s:",
"Add a Room": "Adicionar uma sala",
"Failed to remove the room from the summary of %(groupId)s": "Não foi possível remover a sala do índice da comunidade %(groupId)s",
"The room '%(roomName)s' could not be removed from the summary.": "A sala '%(roomName)s' não pôde ser removida do índice",
"Add users to the community summary": "Adicionar pessoas para o índice da comunidade",
"Who would you like to add to this summary?": "Quem você gostaria de adicionar a este índice?",
"Failed to add the following users to the summary of %(groupId)s:": "Não foi possível adicionar as seguintes pessoas para o índice da comunidade %(groupId)s:",
"Add a User": "Adicionar uma pessoa",
"Failed to remove a user from the summary of %(groupId)s": "Não foi possível remover uma pessoa do índice da comunidade %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "'%(displayName)s' não pôde ser removida/o do índice.",
"Failed to upload image": "O envio da imagem falhou",
"Failed to update community": "A atualização da comunidade falhou",
"Unable to accept invite": "Não foi possível aceitar o convite",
"Unable to reject invite": "Não foi possível rejeitar o convite",
"Leave Community": "Deixar a comunidade",
"Leave %(groupName)s?": "Quer sair da comunidade %(groupName)s?",
"Leave": "Sair",
"Unable to leave room": "Não foi possível sair da sala",
"Community Settings": "Configurações da comunidade",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Estas salas são exibidas para as/os integrantes da comunidade na página da comunidade. Integrantes da comunidade podem entrar nas salas ao clicar nas mesmas.",
"Featured Rooms:": "Salas em destaque:",
"Featured Users:": "Pessoas em destaque:",
"%(inviter)s has invited you to join this community": "%(inviter)s convidou você para entrar nesta comunidade",
"You are an administrator of this community": "Você é administrador(a) desta comunidade",
"You are a member of this community": "Você é um/a integrante desta comunidade",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Sua comunidade não tem uma descrição longa, ou seja, uma página HTML para ser exibida às pessoas que fazem parte da comunidade.<br />Clique aqui para abrir as configurações e criar uma!",
"Long Description (HTML)": "Descrição longa (HTML)",
"Description": "Descrição",
"Community %(groupId)s not found": "A comunidade %(groupId)s não foi encontrada",
"This Home server does not support communities": "Este servidor de base não permite comunidades",
"Failed to load %(groupId)s": "Não foi possível carregar a comunidade %(groupId)s",
"This room is not public. You will not be able to rejoin without an invite.": "Esta sala não é pública. Você não poderá voltar sem ser convidada/o.",
"Cryptography data migrated": "Dados de criptografia migrados",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Uma migração única de dados criptografados foi realizada. A criptografia ponta-a-ponta não vai funcionar se você voltar para uma versão anterior do Riot. Se você necessitar usar criptografia ponta-a-ponta em uma versão anterior, primeiro faça logout do Riot. Para manter o histórico de mensagens, exporte e reimporte suas chaves.",
"Old cryptography data detected": "Dados de criptografia antigos foram detectados",
"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.": "Dados de uma versão anterior do Riot foram detectados. Isso fará com que a criptografia ponta-a-ponta não funcione na versão anterior. Mensagens criptografadas ponta-a-ponta que foram trocadas recentemente usando a versão antiga do Riot talvez não possam ser decriptografadas nesta versão. Isso também pode fazer com que mensagens trocadas com esta versão falhem. Se você tiver problemas desta natureza, faça logout e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves de criptografia.",
"Your Communities": "Suas comunidades",
"Error whilst fetching joined communities": "Erro baixando comunidades das quais você faz parte",
"Create a new community": "Criar nova comunidade",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crie uma comunidade para agrupar em um mesmo local pessoas e salas! Monte uma página inicial personalizada para dar uma identidade ao seu espaço no universo Matrix.",
"Join an existing community": "Entrar numa comunidade existente",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para entrar em uma comunidade, você terá que conhecer o seu ID; um ID de comunidade normalmente tem este formato: <i>+exemplo:matrix.org</i>.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Exibir dispositivos</showDevicesText>, <sendAnywayText>enviar assim mesmo</sendAnywayText> ou <cancelText>cancelar</cancelText>.",
"%(count)s of your messages have not been sent.|one": "Sua mensagem não foi enviada.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Reenviar todas</resendText> ou <cancelText>cancelar todas</cancelText> agora. Você também pode selecionar mensagens individualmente a serem reenviadas ou canceladas.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Reenviar mensagem</resendText> ou <cancelText>cancelar mensagem</cancelText> agora.",
"Warning": "Atenção",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Não há mais ninguém aqui! Você deseja <inviteText>convidar outras pessoas</inviteText> ou <nowarnText>remover este alerta sobre a sala vazia</nowarnText>?",
"Clear filter": "Remover filtro",
"Light theme": "Tema claro",
"Dark theme": "Tema escuro",
"Status.im theme": "Tema Status.im",
"Autocomplete Delay (ms):": "Tempo para preenchimento automático (ms):",
"Ignored Users": "Usuárias/os ignoradas/os",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A privacidade é importante para nós, portanto nós não coletamos nenhum dado pessoa ou identificável para nossas estatísticas.",
"Learn more about how we use analytics.": "Saiba mais sobre como nós usamos os dados estatísticos.",
"Updates": "Atualizações",
"Check for update": "Verificar atualizações",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Um email foi enviado para %(emailAddress)s. Quando você tiver seguido o link que está nesta mensagem, clique abaixo.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Note que você está se conectando ao servidor %(hs)s, e não ao servidor matrix.org.",
"This homeserver doesn't offer any login flows which are supported by this client.": "Este servidor de base (homeserver) não oferece fluxos de login que funcionem neste cliente.",
"Sign in to get started": "Conecte-se para começar",
"Unbans user with given id": "Retira o banimento para a pessoa com este id",
"Define the power level of a user": "Definir o nível de permissões de um(a) usuário(a)",
"Sets the room topic": "Define o tópico da sala",
"Changes colour scheme of current room": "Altera o esquema de cores da sala atual",
"Verifies a user, device, and pubkey tuple": "Verifica um(a) usuário(a), dispositivo ou tuplo da chave pública",
"Ignores a user, hiding their messages from you": "Ignora um(a) usuário(a), ocultando suas mensagens de você",
"Stops ignoring a user, showing their messages going forward": "Deixa de ignorar um(a) usuário(a), exibindo suas mensagens daqui para frente",
"Notify the whole room": "Notifica a sala inteira",
"Room Notification": "Notificação da sala",
"Failed to set direct chat tag": "Falha ao definir esta conversa como direta",
"Failed to remove tag %(tagName)s from room": "Falha ao remover a tag %(tagName)s da sala",
"Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala",
"Did you know: you can use communities to filter your Riot.im experience!": "Você sabia? Você pode usar as comunidades para filtrar a sua experiência no Riot!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para criar um filtro, arraste a imagem de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na imagem de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade."
}

View File

@ -536,7 +536,7 @@
"Drop file here to upload": "Перетащите файл сюда для отправки",
" (unsupported)": " (не поддерживается)",
"Ongoing conference call%(supportedText)s.": "Установлен групповой вызов %(supportedText)s.",
"Online": "В сети",
"Online": "Онлайн",
"Idle": "Неактивен",
"Offline": "Не в сети",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s сменил аватар комнаты на <img/>",
@ -615,7 +615,6 @@
"Unnamed Room": "Комната без имени",
"Unverified": "Не проверено",
"Upload new:": "Отправить новый:",
"%(user)s is a": "%(user)s является",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (уровень доступа %(powerLevelNumber)s)",
"Verified": "Проверено",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Вы хотели бы <acceptText>подтвердить</acceptText> или <declineText>отклонить</declineText> это приглашение?",
@ -941,8 +940,6 @@
"Addresses": "Адреса",
"collapse": "свернуть",
"expand": "развернуть",
"Cryptography data migrated": "Миграция данных криптографии",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Выполнена одноразовая миграция данных криптографии. Сквозное шифрование не будет работать, если вы вернетесь к старой версии Riot. Если требуется использовать сквозную криптографию для более старой версии, сначала выйдите из Riot. Чтобы сохранить журнал сообщений, экспортируйте и повторно импортируйте ключи.",
"Old cryptography data detected": "Обнаружены старые криптографические данные",
"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. Это приведет к сбою криптографии в более ранней версии. В этой версии не могут быть расшифрованы сообщения, которые использовались недавно при использовании старой версии. Это также может привести к сбою обмена сообщениями с этой версией. Если возникают неполадки, выйдите и снова войдите в систему. Чтобы сохранить журнал сообщений, экспортируйте и повторно импортируйте ключи.",
"Warning": "Предупреждение",
@ -980,5 +977,20 @@
"This room is not public. You will not be able to rejoin without an invite.": "Эта комната не является публичной. Вы не сможете войти без приглашения.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Показать устройства</showDevicesText>, <sendAnywayText>отправить в любом случае</sendAnywayText> или <cancelText>отменить</cancelText>.",
"Community IDs cannot not be empty.": "ID сообществ не могут быть пустыми.",
"<a>In reply to</a> <pill>": "<a>В ответ на</a> <pill>"
"<a>In reply to</a> <pill>": "<a>В ответ на</a> <pill>",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s изменил отображаемое имя на %(displayName)s.",
"Failed to set direct chat tag": "Не удалось установить тег прямого чата",
"Failed to remove tag %(tagName)s from room": "Не удалось удалить тег %(tagName)s из комнаты",
"Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату",
"Clear filter": "Очистить фильтр",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Чтобы настроить фильтр, перетащите аватар сообщества на панель фильтров в левой части экрана. Вы можете нажать на аватар в панели фильтров в любое время, чтобы увидеть только комнаты и людей, связанных с этим сообществом.",
"Did you know: you can use communities to filter your Riot.im experience!": "Знаете ли вы: вы можете использовать сообщества, чтобы фильтровать в Riot.im!",
"Disable Community Filter Panel": "Отключить панель фильтра сообщества",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Если у других устройств нет ключа для этого сообщения, вы не сможете его расшифровать.",
"Key request sent.": "Запрос ключа отправлен.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Повторно запросить ключи шифрования</requestLink> с других устройств.",
"%(user)s is a %(userRole)s": "%(user)s является %(userRole)s",
"Your key share request has been sent - please check your other devices for key share requests.": "Ваш запрос на передачу ключей отправлен - пожалуйста, проверьте другие ваши устройства на запросы передачи ключей.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Запросы передачи ключей автоматически отправляются на другие устройства. Если вы отклонили или отменили запрос на передачу ключей на других устройствах, нажмите здесь, чтобы запросить ключи для этого сеанса повторно.",
"Changes made to your community might not be seen by other users for up to 30 minutes.": "Изменения, сделанные в вашем сообществе, могут не отображаться для других пользователей в течение 30 минут."
}

View File

@ -366,7 +366,6 @@
"Encryption is enabled in this room": "V tejto miestnosti je povolené šifrovanie",
"Encryption is not enabled in this room": "V tejto miestnosti nie je povolené šifrovanie",
"Privileged Users": "Poverení používatelia",
"%(user)s is a": "%(user)s je",
"No users have specific privileges in this room": "Žiadny používatelia nemajú v tejto miestnosti pridelené konkrétne poverenia",
"Banned users": "Používatelia, ktorým bol zakázaný vstup",
"This room is not accessible by remote Matrix servers": "Táto miestnosť nie je prístupná cez vzdialené Matrix servery",
@ -940,8 +939,6 @@
"Something went wrong when trying to get your communities.": "Niečo sa pokazilo pri získavaní vašich komunít.",
"collapse": "zbaliť",
"expand": "rozbaliť",
"Cryptography data migrated": "Kryptografické údaje zmigrované",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Práve bola vykonaná jednorázová migrácia kryptografických údajov. E2E šifrovanie vám nebude fungovať, ak sa vrátite k staršej verzii programu Riot. Ak plánujete použiť šifrovanie v staršej verzii Riot, mali by ste sa pred tým odhlásiť. Aby ste si zachovali históriu šifrovaných konverzácií, exportujte a znovu importujte kľúče miestností.",
"Old cryptography data detected": "Nájdené zastaralé kryptografické údaje",
"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.": "Boli nájdené údaje zo staršej verzie Riot. Toto spôsobí, že E2E šifrovanie nebude v staršej verzii Riot fungovať. Zašifrované správy prijaté a odoslané v poslednom čase cez staršiu verziu Riot nemusia byť čitateľné v tejto verzii Riot. Môže to tiež spôsobiť, že šifrované konverzácie nebudú s touto verziou Riot čitateľné. Ak spozorujete niektoré s týchto problémov, odhláste sa a opätovne sa prihláste prosím. Históriu šifrovaných konverzácií zachováte tak, že si exportujete a znovu importujete kľúče miestností.",
"Warning": "Upozornenie",
@ -977,5 +974,12 @@
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Či pri písaní správ používate rozbalenú lištu formátovania textu",
"Your homeserver's URL": "URL adresa vami používaného domovského servera",
"Your identity server's URL": "URL adresa vami používaného servera totožností",
"This room is not public. You will not be able to rejoin without an invite.": "Toto nie je verejne dostupná miestnosť. Bez pozvánky nebudete do nej môcť vstúpiť znovu."
"This room is not public. You will not be able to rejoin without an invite.": "Toto nie je verejne dostupná miestnosť. Bez pozvánky nebudete do nej môcť vstúpiť znovu.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s si zmenil zobrazované meno na %(displayName)s.",
"Failed to set direct chat tag": "Nepodarilo sa nastaviť značku priama konverzácia",
"Failed to remove tag %(tagName)s from room": "Z miestnosti sa nepodarilo odstrániť značku %(tagName)s",
"Failed to add tag %(tagName)s to room": "Miestnosti sa nepodarilo pridať značku %(tagName)s",
"<a>In reply to</a> <pill>": "<a>Odpoveď na</a> <pill>",
"Community IDs cannot not be empty.": "ID komunity nemôže ostať prázdne.",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Zobraziť zariadenia</showDevicesText>, <sendAnywayText>napriek tomu odoslať</sendAnywayText> alebo <cancelText>zrušiť</cancelText>."
}

View File

@ -1,7 +1,7 @@
{
"This email address is already in use": "Ова мејл адреса се већ користи",
"This phone number is already in use": "Овај број телефона се већ користи",
"Failed to verify email address: make sure you clicked the link in the email": "Нисам успео да потврдим мејл адресу, постарајте се да сте кликнули на везу у мејлу",
"Failed to verify email address: make sure you clicked the link in the email": "Нисам успео да проверим мејл адресу, постарајте се да сте кликнули на везу у мејлу",
"The remote side failed to pick up": "Друга страна није подигла слушалицу",
"Unable to capture screen": "Не могу да ухватим садржај екрана",
"Existing Call": "Постојећи позив",
@ -117,7 +117,7 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s је затражио VoIP конференцију.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s је позвао %(targetName)s.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s је бановао %(targetName)s.",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "УПОЗОРЕЊЕ: ПОТВРДА КЉУЧА НИЈЕ УСПЕЛА! Кључ потписивања за корисника %(userId)s и уређај %(deviceId)s је „%(fprint)s“ а то се не подудара са достављеним кључем „%(fingerprint)s“. Ово можда значи да се ваши разговори прате!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "УПОЗОРЕЊЕ: ПРОВЕРА КЉУЧА НИЈЕ УСПЕЛА! Кључ потписивања за корисника %(userId)s и уређај %(deviceId)s је „%(fprint)s“ а то се не подудара са достављеним кључем „%(fingerprint)s“. Ово можда значи да се ваши разговори прате!",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Кључ за потписивање који сте доставили се подудара са кључем за потписивање од корисника %(userId)s и уређаја %(deviceId)s. Уређај је означен као проверен.",
"%(senderName)s set their display name to %(displayName)s.": "Корисник %(senderName)s је себи поставио приказно име %(displayName)s.",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "Корисник %(senderName)s је себи уклонио приказно име %(oldDisplayName)s.",
@ -419,7 +419,6 @@
"Encryption is enabled in this room": "Шифровање је омогућено у овој соби",
"Encryption is not enabled in this room": "Шифровање није омогућено у овој соби",
"Privileged Users": "Овлашћени корисници",
"%(user)s is a": "%(user)s је",
"No users have specific privileges in this room": "Нема корисника са посебним овлашћењима у овој соби",
"Banned users": "Корисници са забраном приступа",
"This room is not accessible by remote Matrix servers": "Овој соби не могу приступити удаљени Матрикс сервери",
@ -567,8 +566,8 @@
"Create new room": "Направи нову собу",
"Unblacklist": "Скини са црног списка",
"Blacklist": "Стави на црни списак",
"Unverify": "Скини потврду",
"Verify...": отврди...",
"Unverify": "Означи непровереним",
"Verify...": ровери...",
"No results": "Нема резултата",
"Delete": "Обриши",
"Communities": "Заједнице",
@ -596,5 +595,404 @@
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s је одбило њихове позивнице %(count)s пута",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s је одбило њихове позивнице",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s је одбио позивницу %(count)s пута",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s је одбио позивницу"
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s је одбио позивницу",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "Корисницима %(severalUsers)s су позивнице повучене %(count)s пута",
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "Корисницима %(severalUsers)s су позивнице повучене",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "Кориснику %(oneUser)s је позивница повучена %(count)s пута",
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "Кориснику %(oneUser)s је позивница повучена",
"were invited %(count)s times|other": "су позвани %(count)s пута",
"were invited %(count)s times|one": "су позвани",
"was invited %(count)s times|other": "је позван %(count)s пута",
"was invited %(count)s times|one": "је позван",
"were banned %(count)s times|other": "забрањен приступ %(count)s пута",
"were banned %(count)s times|one": "забрањен приступ",
"was banned %(count)s times|other": "забрањен приступ %(count)s пута",
"was banned %(count)s times|one": "забрањен приступ",
"were unbanned %(count)s times|other": "дозвољен приступ %(count)s пута",
"were unbanned %(count)s times|one": "дозвољен приступ",
"was unbanned %(count)s times|other": "дозвољен приступ %(count)s пута",
"was unbanned %(count)s times|one": "дозвољен приступ",
"were kicked %(count)s times|other": "избачен %(count)s пута",
"were kicked %(count)s times|one": "избачен",
"was kicked %(count)s times|other": "избачен %(count)s пута",
"was kicked %(count)s times|one": "избачен",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s је променило своје име %(count)s пута",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s је променило своје име",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s је променило своје име %(count)s пута",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s је променило своје име",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s је променило свој аватар %(count)s пута",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s је променило свој аватар",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s је променило свој аватар %(count)s пута",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s је променило свој аватар",
"%(items)s and %(count)s others|other": "%(items)s и %(count)s других",
"%(items)s and %(count)s others|one": "%(items)s и још један",
"%(items)s and %(lastItem)s": "%(items)s и %(lastItem)s",
"collapse": "скупи",
"expand": "рашири",
"Custom of %(powerLevel)s": "Прилагођени ниво %(powerLevel)s",
"Custom level": "Прилагођени ниво",
"Quote": "Цитат",
"Room directory": "Фасцикла са собама",
"Start chat": "Започни ћаскање",
"And %(count)s more...|other": "И %(count)s других...",
"ex. @bob:example.com": "нпр.: @pera:domen.rs",
"Add User": "Додај корисника",
"Matrix ID": "Матрикс ИБ",
"Matrix Room ID": "ИБ Матрикс собе",
"email address": "мејл адреса",
"Try using one of the following valid address types: %(validTypesList)s.": "Пробајте са једним од следећих исправних типова адреса: %(validTypesList)s.",
"You have entered an invalid address.": "Унели сте неисправну адресу.",
"Create a new chat or reuse an existing one": "Започните ново ћаскање или искористите постојеће",
"Start new chat": "Започни ново ћаскање",
"You already have existing direct chats with this user:": "Већ имате постојећа директна ћаскања са овим корисником:",
"Start chatting": "Започни ћаскање",
"Click on the button below to start chatting!": "Кликните на дугме испод да бисте започели ћаскање!",
"Start Chatting": "Започни ћаскање",
"Confirm Removal": "Потврди уклањање",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Да ли сте сигурни да желите уклонити (обрисати) овај догађај? Знајте да брисање назива собе или мењање теме може опозвати измену.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ИБ-јеви заједнице могу садржати само знакове a-z, 0-9, или '=_-./'",
"Community IDs cannot not be empty.": "ИБ-јеви заједнице не могу бити празни.",
"Something went wrong whilst creating your community": "Нешто је пошло наопако приликом стварања ваше заједнице",
"Create Community": "Направи заједницу",
"Community Name": "Назив заједнице",
"Example": "Пример",
"Community ID": "ИБ заједнице",
"example": "пример",
"Create": "Направи",
"Create Room": "Направи собу",
"Room name (optional)": "Назив собе (изборно)",
"Advanced options": "Напредне опције",
"Block users on other matrix homeservers from joining this room": "Блокирај приступ соби корисницима са других матрикс кућних сервера",
"This setting cannot be changed later!": "Ово подешавање се не може променити касније!",
"Unknown error": "Непозната грешка",
"Incorrect password": "Нетачна лозинка",
"Deactivate Account": "Угаси налог",
"This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ово ће учинити ваш налог трајно неупотребљивим. Нећете моћи да се поново региструјете са истим корисничким ИБ-јем.",
"This action is irreversible.": "Ова радња се не може поништити.",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Да бисте проверили да се овом уређају може веровати, контактирајте власника користећи друге начине (нпр.: лично или преко телефонског позива) и питајте га да ли се кључ који види у корисничким подешавањима подудара са кључем испод:",
"Device name": "Назив уређаја",
"Device key": "Кључ уређаја",
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ако се подудара, притисните дугме за потврду провере испод. Ако се не подудара, неко други прислушкује овај уређај и вероватно желите да притиснете дугме за стављање на црни списак.",
"In future this verification process will be more sophisticated.": "У будућности ће овај поступак провере бити напреднији.",
"Verify device": "Провери уређај",
"I verify that the keys match": "Потврђујем да се кључеви подударају",
"An error has occurred.": "Догодила се грешка.",
"OK": "У реду",
"You added a new device '%(displayName)s', which is requesting encryption keys.": "Додали сте нови уређај „%(displayName)s“ који захтева кључеве за шифровање.",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Ваш непроверени уређај „%(displayName)s“ захтева кључеве за шифровање.",
"Start verification": "Започни проверу",
"Share without verifying": "Подели без провере",
"Ignore request": "Занемари захтев",
"Loading device info...": "Учитавам податке о уређају...",
"Encryption key request": "Захтев за кључ шифровања",
"Otherwise, <a>click here</a> to send a bug report.": "У супротном, <a>кликните овде</a> да бисте послали извештај о грешци.",
"Unable to restore session": "Не могу да повратим сесију",
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Наишли смо на грешку приликом опоравка ваше претходне сесије. Ако наставите, мораћете да се пријавите поново и ваш шифровани историјат ћаскања неће бити читљив.",
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ако сте претходно користили новије издање Riot-а, ваша сесија може бити некомпатибилна са овим издањем. Затворите овај прозор и вратите се на новије издање.",
"Continue anyway": "Ипак настави",
"Invalid Email Address": "Неисправна мејл адреса",
"This doesn't appear to be a valid email address": "Изгледа да ово није исправна мејл адреса",
"Verification Pending": "Чека се на проверу",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Проверите ваш мејл и кликните на везу унутар њега. Када ово урадите, кликните на дугме „настави“.",
"Unable to add email address": "Не могу да додам мејл адресу",
"Unable to verify email address.": "Не могу да проверим мејл адресу.",
"This will allow you to reset your password and receive notifications.": "Ово омогућава поновно постављање лозинке и примање обавештења.",
"Skip": "Прескочи",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Корисничка имена могу садржати само слова, бројеве, тачке, повлаке и доње црте.",
"Username not available": "Корисничко име није доступно",
"Username invalid: %(errMessage)s": "Корисничко име није исправно: %(errMessage)s",
"An error occurred: %(error_string)s": "Догодила се грешка: %(error_string)s",
"Username available": "Корисничко име је доступно",
"To get started, please pick a username!": "Да бисте кренули, изаберите корисничко име!",
"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.": "Ако већ имате Матрикс налог, можете се већ <a>пријавити</a>.",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Тренутно убацујете непроверене уређаје на црни списак. Да бисте им слали поруке, морате их проверити.",
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Предлажемо да прођете кроз поступак провере сваког уређаја да бисте потврдили да они припадају њиховим стварним власницима али можете поново послати поруку без провере, ако то желите.",
"Room contains unknown devices": "Соба садржи непознате уређаје",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "Соба „%(RoomName)s“ садржи уређаје које нисте видели пре.",
"Unknown devices": "Непознати уређаји",
"Private Chat": "Приватно ћаскање",
"Public Chat": "Јавно ћаскање",
"Custom": "Прилагођено",
"Alias (optional)": "Алијас (изборно)",
"Name": "Име",
"Topic": "Тема",
"Make this room private": "Учини ову собу приватном",
"Share message history with new users": "Подели историјат порука са новим корисницима",
"Encrypt room": "Шифруј собу",
"You must <a>register</a> to use this functionality": "Морате се <a>регистровати</a> да бисте користили ову могућност",
"You must join the room to see its files": "Морате приступити соби да бисте видели њене датотеке",
"There are no visible files in this room": "Нема видљивих датотека у овој соби",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML за страницу ваше заједнице</h1>\n<p>\n Користите дужи опис да бисте упознали нове чланове са заједницом, или поделили\n неке важне <a href=\"foo\">везе</a>\n</p>\n<p>\n Можете чак користити \"img\" ознаке\n</p>\n",
"Add rooms to the community summary": "Додај собе у кратак опис заједнице",
"Which rooms would you like to add to this summary?": "Које собе желите додати у овај кратак опис?",
"Add to summary": "Додај у кратак опис",
"Failed to add the following rooms to the summary of %(groupId)s:": "Нисам успео да додам следеће собе у кратак опис групе %(groupId)s:",
"Add a Room": "Додај собу",
"Failed to remove the room from the summary of %(groupId)s": "Нисам успео да уклоним собу из кратког описа групе %(groupId)s",
"The room '%(roomName)s' could not be removed from the summary.": "Соба „%(roomName)s“ се не може уклонити из кратког описа.",
"Add users to the community summary": "Додај кориснике у кратак опис заједнице",
"Who would you like to add to this summary?": "Да ли желите да додате у овај кратак опис?",
"Failed to add the following users to the summary of %(groupId)s:": "Нисам успео да додам следеће кориснике у кратак опис групе %(groupId)s:",
"Add a User": "Додај корисника",
"Failed to remove a user from the summary of %(groupId)s": "Нисам успео да уклоним корисника из кратког описа групе %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "Корисник „%(displayName)s“ се не може уклонити из кратког описа.",
"Failed to upload image": "Нисам успео да отпремим слику",
"Failed to update community": "Нисам успео да ажурирам заједницу",
"Unable to accept invite": "Не могу да прихватим позивницу",
"Unable to reject invite": "Не могу да одбијем позивницу",
"Leave Community": "Напусти заједницу",
"Leave %(groupName)s?": "Напустити %(groupName)s?",
"Leave": "Напусти",
"Unable to leave room": "Не могу да напустим собу",
"Community Settings": "Подешавања заједнице",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Ове собе су приказане члановима заједнице на страници заједнице. Чланови заједнице могу приступити собама кликом на њих.",
"Add rooms to this community": "Додај собе у ову заједницу",
"Featured Rooms:": "Издвојене собе:",
"Featured Users:": "Издвојени корисници:",
"%(inviter)s has invited you to join this community": "Корисник %(inviter)s вас је позвао у ову заједницу",
"You are an administrator of this community": "Ви сте администратор ове заједнице",
"You are a member of this community": "Ви сте члан ове заједнице",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Ваша заједница нема дуги опис, HTML страницу на којој су приказани чланови заједнице.<br />Кликните овде да бисте отворили подешавања и направили страницу!",
"Long Description (HTML)": "Дуги опис (HTML)",
"Description": "Опис",
"Community %(groupId)s not found": "Заједница %(groupId)s није нађена",
"This Home server does not support communities": "Овај кућни сервер не подржава заједнице",
"Failed to load %(groupId)s": "Нисам успео да учитам %(groupId)s",
"Reject invitation": "Одбиј позивницу",
"Are you sure you want to reject the invitation?": "Да ли сте сигурни да желите одбити позивницу?",
"Failed to reject invitation": "Нисам успео да одбијем позивницу",
"Are you sure you want to leave the room '%(roomName)s'?": "Да ли сте сигурни да желите напустити собу „%(roomName)s“?",
"Failed to leave room": "Нисам успео да напустим собу",
"Signed Out": "Одјављен",
"For security, this session has been signed out. Please sign in again.": "Зарад безбедности, одјављени сте из ове сесије. Пријавите се поново.",
"Cryptography data migrated": "Криптографски подаци су пренесени",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "Једноструко преношење криптографских података је обављено. Шифровање с краја на крај неће радити ако се вратите на старије издање Riot-а. Ако вам треба шифровање с краја на крај на старијем издању, прво се одјавите из Riot-а. Да бисте задржали историјат порука, извезите па поново увезите ваше кључеве.",
"Old cryptography data detected": "Нађени су стари криптографски подаци",
"The platform you're on": "Платформа коју користите",
"The version of Riot.im": "Riot.im издање",
"Whether or not you're logged in (we don't record your user name)": "Стање ваше пријављености (не памтимо ваше корисничко име)",
"Your language of choice": "Ваш жељени језик",
"Which officially provided instance you are using, if any": "Коју званичну инстанцу користите, ако користите",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Да ли користите режим богатог текста у уређивачу богатог текста",
"Your homeserver's URL": "Адреса вашег кућног сервера",
"Your identity server's URL": "Адреса вашег идентитеског сервера",
"Analytics": "Аналитика",
"The information being sent to us to help make Riot.im better includes:": "У податке које нам шаљете зарад побољшавања Riot.im-а спадају:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "Такође бележимо сваку страницу коју користите у апликацији (тренутно <CurrentPageHash>), ваш кориснички агент (<CurrentUserAgent>) и резолуцију вашег уређаја (<CurrentDeviceResolution>).",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ако страница садржи поверљиве податке (као што је назив собе, корисника или ИБ-ја групе), ти подаци се уклањају пре слања на сервер.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "Корисник %(oldDisplayName)s је променио приказно име у %(displayName)s.",
"Failed to set direct chat tag": "Нисам успео да поставим ознаку директног ћаскања",
"Failed to remove tag %(tagName)s from room": "Нисам успео да скинем ознаку %(tagName)s са собе",
"Failed to add tag %(tagName)s to room": "Нисам успео да додам ознаку %(tagName)s на собу",
"<a>In reply to</a> <pill>": "<a>Као одговор за</a> <pill>",
"This room is not public. You will not be able to rejoin without an invite.": "Ова соба није јавна. Нећете моћи да поново приступите без позивнице.",
"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-а су нађени. Ово ће узроковати лош рад шифровања с краја на крај у старијем издању. Размењене поруке које су шифроване с краја на крај у старијем издању је можда немогуће дешифровати у овом издању. Такође, ово може узроковати неуспешно размењивање порука са овим издањем. Ако доживите проблеме, одјавите се и пријавите се поново. Да бисте задржали историјат поруке, извезите па поново увезите ваше кључеве.",
"Logout": "Одјава",
"Your Communities": "Ваше заједнице",
"Error whilst fetching joined communities": "Грешка приликом добављања списка са приступљеним заједницама",
"Create a new community": "Направи нову заједницу",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Направите заједницу да бисте спојили кориснике и собе! Направите прилагођену почетну страницу да бисте означили ваш кутак у Матрикс универзуму.",
"Join an existing community": "Приступи већ постојећој заједници",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Да бисте приступили већ постојећој заједници, морате знати њен идентификатор заједнице. Ово изгледа нешто као <i>+primer:matrix.org</i>.",
"You have no visible notifications": "Немате видљивих обавештења",
"Scroll to bottom of page": "Превуци на дно странице",
"Message not sent due to unknown devices being present": "Порука се неће послати због присутности непознатих уређаја",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Прикажи уређаје</showDevicesText>, <sendAnywayText>ипак пошаљи</sendAnywayText> или <cancelText>откажи</cancelText>.",
"%(count)s of your messages have not been sent.|other": "Неке ваше поруке нису послате.",
"%(count)s of your messages have not been sent.|one": "Ваша порука није послата.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Пошаљи поново</resendText> или <cancelText>откажи све</cancelText> сада. Такође можете изабрати појединачне поруке за поновно слање или отказивање.",
"%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Поново пошаљи поруку</resendText> или <cancelText>откажи поруку</cancelText> сада.",
"Warning": "Упозорење",
"Connectivity to the server has been lost.": "Веза ка серверу је прекинута.",
"Sent messages will be stored until your connection has returned.": "Послате поруке биће сачуване док се веза не успостави поново.",
"%(count)s new messages|other": "%(count)s нових порука",
"%(count)s new messages|one": "%(count)s нова порука",
"Active call": "Текући позив",
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Нема других чланова! Да ли желите да <inviteText>позовете друге</inviteText> или да <nowarnText>склоните упозорење о празној соби</nowarnText>?",
"You seem to be uploading files, are you sure you want to quit?": "Изгледа да отпремате датотеке. Да ли сте сигурни да желите изаћи?",
"You seem to be in a call, are you sure you want to quit?": "Изгледа да сте у позиву. Да ли сте сигурни да желите изаћи?",
"Failed to upload file": "Нисам успео да отпремим датотеку",
"Server may be unavailable, overloaded, or the file too big": "Сервер је можда недоступан, преоптерећен или је датотека сувише велика",
"Search failed": "Претрага је неуспешна",
"Server may be unavailable, overloaded, or search timed out :(": "Сервер је можда недоступан, преоптерећен или је истекло време претраживања :(",
"No more results": "Нема више резултата",
"Unknown room %(roomId)s": "Непозната соба %(roomId)s",
"Room": "Соба",
"Failed to save settings": "Нисам успео да сачувам подешавања",
"Failed to reject invite": "Нисам успео да одбацим позивницу",
"Fill screen": "Испуни екран",
"Click to unmute video": "Кликни да појачаш видео",
"Click to mute video": "Кликни да утишаш видео",
"Click to unmute audio": "Кликни да појачаш звук",
"Click to mute audio": "Кликни да утишаш звук",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Покушао сам да учитам одређену тачку у временској линији ове собе али ви немате овлашћења за преглед наведене поруке.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Покушао сам да учитам одређену тачку у временској линији ове собе али нисам могао да је нађем.",
"Failed to load timeline position": "Нисам могао да учитам позицију у временској линији",
"Uploading %(filename)s and %(count)s others|other": "Отпремам датотеку %(filename)s и још %(count)s других",
"Uploading %(filename)s and %(count)s others|zero": "Отпремам датотеку %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Отпремам датотеку %(filename)s и %(count)s других датотека",
"Light theme": "Светла тема",
"Dark theme": "Тамна тема",
"Status.im theme": "Status.im тема",
"Can't load user settings": "Не могу да учитам корисничка подешавања",
"Server may be unavailable or overloaded": "Сервер је недоступан или је преоптерећен",
"Sign out": "Одјави ме",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Зарад безбедности, одјава ће обрисати све кључеве за шифровање с краја на крај, на овом прегледачу. Ако желите да дешифрујете историјат вашег ћаскања из будућих Riot сесија, извезите ваше кључеве и чувајте их.",
"Failed to change password. Is your password correct?": "Нисам успео да променим лозинку. Да ли је ваша лозинка тачна?",
"Success": "Успех",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ваша лозинка је успешно промењена. Нећете добијати пуш обавештења на вашим другим уређајима док се поново не пријавите на њима",
"Remove Contact Information?": "Уклонити контакт податке?",
"Remove %(threePid)s?": "Уклонити %(threePid)s?",
"Unable to remove contact information": "Не могу да уклоним контакт податке",
"Refer a friend to Riot:": "Кажите пријатељу за Riot:",
"Interface Language": "Језик интерфејса",
"User Interface": "Кориснички интерфејс",
"Autocomplete Delay (ms):": "Застој самодопуњавања (мс):",
"<not supported>": "<није подржано>",
"Import E2E room keys": "Увези E2E кључеве собе",
"Cryptography": "Криптографија",
"Device ID:": "ИБ уређаја:",
"Device key:": "Кључ уређаја:",
"Ignored Users": "Занемарени корисници",
"Bug Report": "Извештај о грешци",
"Found a bug?": "Нашли сте грешку?",
"Report it": "Пријавите је",
"Riot collects anonymous analytics to allow us to improve the application.": "Riot прикупља анонимне податке о коришћењу да бисмо побољшали апликацију.",
"Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Приватност је веома важна нама те не сакупљамо било какве податке личне природе у нашој аналитици.",
"Learn more about how we use analytics.": "Сазнајте више о нашем начину употребе аналитике.",
"Labs": "Лабораторије",
"These are experimental features that may break in unexpected ways": "Ово су пробне могућности које се могу поломити на непредвидљиве начине",
"Use with caution": "Опрезно користите",
"Deactivate my account": "Деактивирај мој налог",
"Clear Cache": "Очисти кеш",
"Clear Cache and Reload": "Очисти кеш и поново учитај",
"Updates": "Ажурирања",
"Check for update": "Провери да ли има ажурирања",
"Reject all %(invitedRooms)s invites": "Одбиј све позивнице за собе %(invitedRooms)s",
"Bulk Options": "Вишеструке опције",
"Desktop specific": "Само за стоне уређаје",
"Start automatically after system login": "Самостално покрећи након пријаве на систем",
"No media permissions": "Нема овлашћења за медије",
"You may need to manually permit Riot to access your microphone/webcam": "Можда ћете морати да ручно доделите овлашћења Riot-у за приступ микрофону/веб камери",
"Missing Media Permissions, click here to request.": "Недостају овлашћења за медије, кликните овде да затражите.",
"No Microphones detected": "Нема уочених микрофона",
"No Webcams detected": "Нема уочених веб камера",
"Default Device": "Подразумевани уређај",
"Microphone": "Микрофон",
"Camera": "Камера",
"VoIP": "VoIP",
"Email": "Мејл",
"Add email address": "Додај мејл адресу",
"Notifications": "Обавештења",
"Profile": "Профил",
"Display name": "Приказно име",
"Account": "Налог",
"To return to your account in future you need to set a password": "Да бисте се вратили у ваш налог у будућности, морате поставити лозинку",
"Logged in as:": "Пријављени као:",
"Access Token:": "Приступни жетон:",
"click to reveal": "кликни за приказ",
"Homeserver is": "Кућни сервер је",
"Identity Server is": "Идентитетски сервер је",
"matrix-react-sdk version:": "matrix-react-sdk издање:",
"riot-web version:": "riot-web издање:",
"olm version:": "olm издање:",
"Failed to send email": "Нисам успео да пошаљем мејл",
"The email address linked to your account must be entered.": "Морате унети мејл адресу која је везана за ваш налог.",
"A new password must be entered.": "Морате унети нову лозинку.",
"New passwords must match each other.": "Нове лозинке се морају подударати.",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Опоравак ваше лозинке ће тренутно поново поставити кључеве за шифровање с краја на крај, на свим вашим уређајима. Ово ће учинити шифровани историјат ћаскања нечитљивим осим ако прво не извезете ваше кључеве собе па их онда увезете касније. Ово ће бити побољшано у будућности.",
"An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Мејл је послат на адресу %(emailAddress)s. Када будете испратили везу у њему, кликните испод.",
"I have verified my email address": "Потврдио сам своју мејл адресу",
"Your password has been reset": "Ваша лозинка је опорављена",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Одјављени сте са свих ваших уређаја и више нећете примати пуш обавештења. Да бисте поново омогућили обавештења, одјавите се и пријавите поново на сваком вашем уређају",
"Return to login screen": "Врати ме на екран за пријаву",
"To reset your password, enter the email address linked to your account": "Да бисте опоравили вашу лозинку, унесите мејл адресу повезану са вашим налогом",
"New password": "Нова лозинка",
"Confirm your new password": "Потврдите вашу нову лозинку",
"Send Reset Email": "Пошаљи мејл за опоравак",
"Create an account": "Направи налог",
"This Home Server does not support login using email address.": "Овај кућни сервер не подржава пријављивање преко мејл адресе.",
"Incorrect username and/or password.": "Нетачно корисничко име и/или лозинка.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Знајте да се пријављујете на сервер %(hs)s, не на matrix.org.",
"Guest access is disabled on this Home Server.": "Гостински приступ је онемогућен на овом кућном серверу.",
"The phone number entered looks invalid": "Унети број телефона не изгледа исправно",
"This homeserver doesn't offer any login flows which are supported by this client.": "Овај кућни сервер не пружа било који начин пријаве унутар овог клијента.",
"Error: Problem communicating with the given homeserver.": "Грешка: проблем у комуницирању са датим кућним сервером.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Не могу да се повежем на кућни сервер преко HTTP-а када се користи HTTPS адреса у траци вашег прегледача. Или користите HTTPS или <a>омогућите небезбедне скрипте</a>.",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не могу да се повежем на кућни сервер. Проверите вашу интернет везу, постарајте се да верујете <a>SSL сертификату кућног сервера</a> и да проширење прегледача не блокира захтеве.",
"Login as guest": "Пријави се као гост",
"Sign in to get started": "Пријави се да почнеш",
"Failed to fetch avatar URL": "Нисам успео да добавим адресу аватара",
"Set a display name:": "Постави приказно име:",
"Upload an avatar:": "Отпреми аватар:",
"This server does not support authentication with a phone number.": "Овај сервер не подржава идентификацију преко броја мобилног.",
"Missing password.": "Недостаје лозинка.",
"Passwords don't match.": "Лозинке се не подударају.",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Лозинка је сувише кратка (најмање %(MIN_PASSWORD_LENGTH)s).",
"This doesn't look like a valid email address.": "Мејл адреса не изгледа исправно.",
"This doesn't look like a valid phone number.": "Број телефона не изгледа исправно.",
"You need to enter a user name.": "Морате унети корисничко име.",
"An unknown error occurred.": "Непозната грешка се догодила.",
"I already have an account": "Већ имам налог",
"Displays action": "Приказује радњу",
"Bans user with given id": "Забрањује приступ кориснику са датим иб-јем",
"Unbans user with given id": "Скида забрану приступа кориснику са датим иб-јем",
"Define the power level of a user": "Дефинише ниво моћи корисника",
"Deops user with given id": "Укида админа за корисника са датим иб-јем",
"Invites user with given id to current room": "Позива корисника са датим иб-јем у тренутну собу",
"Joins room with given alias": "Приступа соби са датим алијасем",
"Sets the room topic": "Поставља тему собе",
"Kicks user with given id": "Избацује корисника са датим иб-јем",
"Changes your display nickname": "Мења ваш приказни надимак",
"Searches DuckDuckGo for results": "Претражује DuckDuckGo за резултате",
"Changes colour scheme of current room": "Мења шему боје у тренутној соби",
"Verifies a user, device, and pubkey tuple": "Проверава корисника, уређај и торку јавног кључа",
"Ignores a user, hiding their messages from you": "Занемарује корисника и тиме скрива њихове поруке од вас",
"Stops ignoring a user, showing their messages going forward": "Престаје са занемаривањем корисника и тиме приказује њихове поруке одсад",
"Commands": "Наредбе",
"Results from DuckDuckGo": "Резултати са DuckDuckGo-а",
"Emoji": "Емоџи",
"Notify the whole room": "Обавести све у соби",
"Room Notification": "Собно обавештење",
"Users": "Корисници",
"unknown device": "непознати уређај",
"NOT verified": "НИЈЕ проверен",
"verified": "проверен",
"Verification": "Провера",
"Ed25519 fingerprint": "Ed25519 отисак прста",
"User ID": "Кориснички ИБ",
"Curve25519 identity key": "Curve25519 идентитески кључ",
"none": "ништа",
"Claimed Ed25519 fingerprint key": "Наводни Ed25519 кључ отиска прста",
"Algorithm": "Алгоритам",
"unencrypted": "нешифрован",
"Decryption error": "Грешка дешифровања",
"Session ID": "ИБ сесије",
"End-to-end encryption information": "Подаци о шифровању с краја на крај",
"Event information": "Подаци о догађају",
"Sender device information": "Подаци о уређају пошиљаоца",
"Passphrases must match": "Фразе се морају подударати",
"Passphrase must not be empty": "Фразе не смеју бити празне",
"Export room keys": "Извези кључеве собе",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ова радња вам омогућава да извезете кључеве за примљене поруке у шифрованим собама у локалну датотеку. Онда ћете моћи да увезете датотеку у други Матрикс клијент, у будућности, тако да ће тај клијент моћи да дешифрује ове поруке.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Извезена датотека ће дозволити свима који је могу прочитати да дешифрују било које шифроване поруке које можете видети те бисте требали да будете пажљиви и да је осигурате. Да бисмо вам помогли са тиме, требало би да унесете фразу испод са којом ће извезени подаци бити шифровани. Поновни увоз података ће бити могућ само уз коришћење исте фразе.",
"Enter passphrase": "Унеси фразу",
"Confirm passphrase": "Потврди фразу",
"Export": "Извези",
"Import room keys": "Увези кључеве собе",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ова радња вам омогућава да увезете кључеве за шифровање које сте претходно извезли из другог Матрикс клијента. Након тога ћете моћи да дешифрујете било коју поруку коју је други клијент могао да дешифрује.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Извезена датотека ће бити заштићена са фразом. Требало би да унесете фразу овде, да бисте дешифровали датотеку.",
"File to import": "Датотека за увоз",
"Import": "Увези",
"Disable Community Filter Panel": "Онемогући површ за филтрирање заједнице",
"Did you know: you can use communities to filter your Riot.im experience!": "Да ли сте знали: можете користити заједнице за филтрирање вашег Riot.im искуства!",
"Clear filter": "Очисти филтер",
"Your key share request has been sent - please check your other devices for key share requests.": "Ваш захтев за дељење кључа је послат. Проверите да ли има захтева за дељење кључа на осталим вашим уређајима.",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Захтеви за дељење кључа се самостално шаљу на остале ваше уређаје. Ако сте одбили или одбацили захтев за дељење кључа на неком другом вашем уређају, кликните овде да бисте затражили поново кључеве за ову сесију.",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако остали ваши уређаји немају кључ за ову поруку, нећете моћи да је дешифрујете.",
"Key request sent.": "Захтев за дељење кључа послат.",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Поново затражи кључеве за шифровање</requestLink> са осталих ваших уређаја.",
"%(user)s is a %(userRole)s": "Корисник %(user)s је у улози %(userRole)s",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Да бисте поставили филтер, повуците аватар заједнице на површ филтрирања скроз на леву страну екрана. Можете кликнути на аватар у површи филтрирања било када да бисте видели само собе и особе везане за ту заједницу."
}

View File

@ -10,7 +10,7 @@
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Saknar mediebehörigheter, klicka för att begära.",
"No Microphones detected": "Ingen mikrofon hittades",
"No Webcams detected": "Ingen kamera hittades",
"No Webcams detected": "Ingen webbkamera hittades",
"No media permissions": "Inga mediebehörigheter",
"You may need to manually permit Riot to access your microphone/webcam": "Du måste manuellt tillåta Riot att komma åt din mikrofon/kamera",
"Default Device": "Standardenhet",
@ -364,7 +364,7 @@
"Delete widget": "Ta bort widget",
"Define the power level of a user": "Definiera anseende för en användare",
"Do you want to load widget from URL:": "Vill du ladda widgeten från URL:",
"Edit": "Redigera",
"Edit": "Editera",
"Enable automatic language detection for syntax highlighting": "Aktivera automatisk språkdetektering för syntaxmarkering",
"Hide Apps": "Dölj Appar",
"Integrations Error": "Integrationsfel",
@ -382,8 +382,46 @@
"The phone number entered looks invalid": "Telefonnumret ser felaktigt ut",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnyckeln du angav matchar signeringsnyckeln som mottogs från enheten %(deviceId)s som tillhör %(userId)s. Enheten är markerad som verifierad.",
"This email address is already in use": "Den här epostadressen är redan i bruk",
"This email address was not found": "Den här epostadressen fanns inte",
"This email address was not found": "Den här epostadressen finns inte",
"The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Filen '%(fileName)s' överskrider serverns största tillåtna filstorlek",
"The file '%(fileName)s' failed to upload": "Filen '%(fileName)s' kunde inte laddas upp"
"The file '%(fileName)s' failed to upload": "Filen '%(fileName)s' kunde inte laddas upp",
"Online": "Aktiv",
"Unnamed room": "Namnlöst rum",
"World readable": "Alla kan läsa",
"Guests can join": "Gäster kan bli medlem i rummet",
"No rooms to show": "Inga fler rum att visa",
"This phone number is already in use": "Detta telefonnummer är redan i bruk",
"The version of Riot.im": "Versionen av Riot.im",
"Call Failed": "Samtal misslyckades",
"Call Anyway": "Ring ändå",
"Call": "Ring",
"Answer": "Svara",
"You are already in a call.": "Du är redan i ett samtal.",
"You cannot place a call with yourself.": "Du kan inte ringa till dig själv.",
"Warning!": "Varning!",
"Upload Failed": "Uppladdning misslyckades",
"Sun": "Sön",
"Mon": "Mån",
"Tue": "Tis",
"Wed": "Ons",
"Thu": "Tors",
"Fri": "Fre",
"Sat": "Lör",
"Jan": "Jan",
"Feb": "Feb",
"Mar": "Mar",
"Apr": "Apr",
"May": "Maj",
"Jun": "Jun",
"Jul": "Juli",
"Aug": "Aug",
"Sep": "Sep",
"Oct": "Okt",
"Nov": "Nov",
"Dec": "Dec",
"Name or matrix ID": "Namn eller matrix ID",
"Invite to Community": "",
"Unable to enable Notifications": "Det går inte att aktivera Notifieringar",
"Failed to invite user": "Misslyckades med att bjuda in användaren"
}

View File

@ -392,7 +392,6 @@
"Rejoin": "กลับเข้าร่วม",
"This room": "ห้องนี้",
"Unnamed Room": "ห้องที่ยังไม่ได้ตั้งชื่อ",
"%(user)s is a": "%(user)s เป็น",
"(~%(count)s results)|one": "(~%(count)s ผลลัพท์)",
"(~%(count)s results)|other": "(~%(count)s ผลลัพท์)",
"Missing Media Permissions, click here to request.": "ไม่มีสิทธิ์เข้าถึงสื่อ, คลิกที่นี่เพื่อขอสิทธิ์",

View File

@ -418,7 +418,6 @@
"Use with caution": "Dikkatli kullan",
"User ID": "Kullanıcı ID",
"User Interface": "Kullanıcı Arayüzü",
"%(user)s is a": "%(user)s bir",
"User name": "Kullanıcı ismi",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (güç %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Kullanıcı ismi geçersiz : %(errMessage)s",

View File

@ -125,7 +125,7 @@
"Success": "成功",
"The default role for new room members is": "此聊天室新成员的默认角色是",
"The main address for this room is": "此聊天室的主要地址是",
"This email address is already in use": "此邮箱地址已被使用",
"This email address is already in use": "此邮箱地址已被使用",
"This email address was not found": "未找到此邮箱地址",
"The email address linked to your account must be entered.": "必须输入和你账号关联的邮箱地址。",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "文件 '%(fileName)s' 超过了此主服务器的上传大小限制",
@ -422,7 +422,7 @@
"This room has no local addresses": "这个聊天室没有本地地址",
"This doesn't appear to be a valid email address": "这看起来不是一个合法的电子邮件地址",
"This is a preview of this room. Room interactions have been disabled": "这是这个聊天室的一个预览。聊天室交互已禁用",
"This phone number is already in use": "此电话号码已被使用",
"This phone number is already in use": "此电话号码已被使用",
"This room": "这个聊天室",
"This room is not accessible by remote Matrix servers": "这个聊天室无法被远程 Matrix 服务器访问",
"This room's internal ID is": "这个聊天室的内部 ID 是",
@ -507,7 +507,6 @@
"Unrecognised room alias:": "无法识别的聊天室别名:",
"Use with caution": "谨慎使用",
"User Interface": "用户界面",
"%(user)s is a": "%(user)s 是一个",
"User name": "用户名",
"(no answer)": "(没有回答)",
"(warning: cannot be disabled again!)": "(警告:无法再被禁用!)",
@ -646,7 +645,7 @@
"Answer Anyway": "无论如何接听",
"Call": "呼叫",
"Answer": "接听",
"Invite new community members": "邀请新社区成员",
"Invite new community members": "邀请新社区成员",
"Invite to Community": "邀请到社区",
"Room name or alias": "聊天室名称或别名",
"Ignored user": "忽视用户",
@ -735,5 +734,24 @@
"Dark theme": "深色主题",
"Status.im theme": "Status.im 主题",
"Ignored Users": "忽视用户",
"Room Notification": "聊天室通知"
"Room Notification": "聊天室通知",
"The platform you're on": "您使用的平台是",
"The version of Riot.im": "Riot.im 的版本是",
"Whether or not you're logged in (we don't record your user name)": "您是否登录了(我们不会记录你的用户名)",
"Your language of choice": "您选择的语言是",
"Which officially provided instance you are using, if any": "您正在使用的任何官方 Riot 实现(如果有的话)",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "您是否正在使用富文本编辑器的富文本模式",
"Your homeserver's URL": "您的主服务器的链接",
"Your identity server's URL": "您的身份认证服务器的链接",
"The information being sent to us to help make Riot.im better includes:": "将要为帮助 Riot.im 发展而发送的信息包含:",
"We also record each page you use in the app (currently <CurrentPageHash>), your User Agent (<CurrentUserAgent>) and your device resolution (<CurrentDeviceResolution>).": "我们也记录了您在本应用中使用的页面(目前为 <CurrentPageHash> User Agent<CurrentUserAgent>)和设备的分辨率(<CurrentDeviceResolution>)。",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "这个页面中含有可能能用于识别您身份的信息,比如聊天室、用户或群组 ID在它们发送到服务器上之前这些数据会被移除。",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s%(monthName)s %(day)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s%(monthName)s %(day)s %(fullYear)s",
"%(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?": "您想把谁添加到这个社区内?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:您添加的用户对一切知道这个社区的 ID 的人公开",
"Name or matrix ID": "名称或 Matrix ID",
"Which rooms would you like to add to this community?": "您想把哪个聊天室添加到这个社区中?"
}

View File

@ -188,7 +188,7 @@
"Sun": "星期日",
"Mon": "星期一",
"Tue": "星期二",
"Online": "線",
"Online": "",
"Idle": "閒置",
"Offline": "下線",
"%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s 更改了聊天室的圖像為 <img/>",
@ -453,7 +453,6 @@
"Use with caution": "謹慎使用",
"User ID": "使用者 ID",
"User Interface": "使用者介面",
"%(user)s is a": "%(user)s 是一個",
"User name": "使用者名稱",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s權限等級 %(powerLevelNumber)s",
"Username invalid: %(errMessage)s": "使用者名稱無效:%(errMessage)s",
@ -700,7 +699,7 @@
"Name or matrix ID": "名稱或 matrix ID",
"Invite to Community": "邀請到社群",
"Which rooms would you like to add to this community?": "您想要新增哪個聊天室到此社群?",
"Show these rooms to non-members on the community page and room list?": "在社群頁面與聊天室清單上顯示這些聊天室給非成員?",
"Show these rooms to non-members on the community page and room list?": "在社群頁面與聊天室清單上顯示這些聊天室給非社群成員?",
"Add rooms to the community": "新增聊天室到社群",
"Room name or alias": "聊天室名稱或別名",
"Add to community": "新增到社群",
@ -936,8 +935,6 @@
"Community %(groupId)s not found": "找不到社群 %(groupId)s",
"This Home server does not support communities": "這個家伺服器不支援社群",
"Failed to load %(groupId)s": "載入 %(groupId)s 失敗",
"Cryptography data migrated": "加密資料已遷移",
"A one-off migration of cryptography data has been performed. End-to-end encryption will not work if you go back to an older version of Riot. If you need to use end-to-end cryptography on an older version, log out of Riot first. To retain message history, export and re-import your keys.": "加密資料的一次性遷移已經執行。若您回到舊版本的 Riot端到端加密將不會運作。若您需要在舊版本上使用端到端加密先登出 Riot。要保留訊息歷史匯出再重新匯入您的金鑰。",
"Old cryptography data detected": "偵測到舊的加密資料",
"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 的資料。這將會造成舊版的端到端加密失敗。在此版本中使用最近在舊版本交換的金鑰可能無法解密訊息。這也會造成與此版本的訊息交換失敗。若您遇到問題,請登出並重新登入。要保留訊息歷史,請匯出並重新匯入您的金鑰。",
"Your Communities": "您的社群",
@ -980,5 +977,20 @@
"This room is not public. You will not be able to rejoin without an invite.": "這個聊天室並未公開。您在沒有邀請的情況下將無法重新加入。",
"Community IDs cannot not be empty.": "社群 ID 不能為空。",
"<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>顯示裝置</showDevicesText>、<sendAnywayText>無論如何都要傳送</sendAnywayText>或<cancelText>取消</cancelText>。",
"<a>In reply to</a> <pill>": "<a>回覆給</a> <pill>"
"<a>In reply to</a> <pill>": "<a>回覆給</a> <pill>",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他們的顯示名稱為 %(displayName)s 。",
"Failed to set direct chat tag": "設定直接聊天標籤失敗",
"Failed to remove tag %(tagName)s from room": "從聊天室移除標籤 %(tagName)s 失敗",
"Failed to add tag %(tagName)s to room": "新增標籤 %(tagName)s 到聊天室失敗",
"Did you know: you can use communities to filter your Riot.im experience!": "您知道嗎:您可以使用社群來強化您的 Riot.im 使用體驗!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "要設定過濾器,拖曳社群大頭貼到位於螢幕最左邊的過濾器面板。您可以在任何時候在過濾器面板中的大頭貼上點按以檢視與該社群關聯的聊天室與夥伴。",
"Clear filter": "清除過濾器",
"Disable Community Filter Panel": "停用社群過濾面板",
"Your key share request has been sent - please check your other devices for key share requests.": "您的金鑰分享請求已傳送,請檢查您的其他裝置來看看金鑰分享請求。",
"Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "金鑰分享請求已自動傳送到您的其他裝置。若您在您的其他裝置上回絕了金鑰分享請求,點按這裡以再次請求這個工作階段的金鑰。",
"If your other devices do not have the key for this message you will not be able to decrypt them.": "若您的其他裝置沒有這個訊息的金鑰,您將無法將它們解密。",
"Key request sent.": "金鑰請求已傳送。",
"<requestLink>Re-request encryption keys</requestLink> from your other devices.": "從您的其他裝置<requestLink>重新請求加密金鑰</requestLink>。",
"%(user)s is a %(userRole)s": "%(user)s 是 %(userRole)s",
"Changes made to your community might not be seen by other users for up to 30 minutes.": "其他使用者在最多 30 分鐘內可能不會慨到您對社群所做的變更。"
}

View File

@ -188,6 +188,11 @@ export const SETTINGS = {
displayName: _td('Mirror local video feed'),
default: false,
},
"TagPanel.disableTagPanel": {
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
displayName: _td('Disable Community Filter Panel'),
default: false,
},
"theme": {
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
default: "light",

View File

@ -27,10 +27,11 @@ function memberEventDiff(ev) {
const content = ev.getContent();
const prevContent = ev.getPrevContent();
diff.isJoin = content.membership === 'join' && prevContent.membership !== 'ban';
diff.isPart = content.membership === 'leave' && ev.getStateKey() === ev.getSender();
const isMembershipChanged = content.membership !== prevContent.membership;
diff.isJoin = isMembershipChanged && content.membership === 'join';
diff.isPart = isMembershipChanged && content.membership === 'leave' && ev.getStateKey() === ev.getSender();
const isJoinToJoin = content.membership === prevContent.membership && content.membership === 'join';
const isJoinToJoin = !isMembershipChanged && content.membership === 'join';
diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname;
diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url;
return diff;

View File

@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import EventEmitter from 'events';
import Promise from 'bluebird';
const BULK_REQUEST_DEBOUNCE_MS = 200;
@ -28,8 +29,9 @@ const GROUP_PROFILES_CACHE_BUST_MS = 1800000; // 30 mins
/**
* Stores data used by <Flair/>
*/
class FlairStore {
class FlairStore extends EventEmitter {
constructor(matrixClient) {
super();
this._matrixClient = matrixClient;
this._userGroups = {
// $userId: ['+group1:domain', '+group2:domain', ...]
@ -152,19 +154,29 @@ class FlairStore {
return this._groupProfiles[groupId];
}
// No request yet, start one
if (!this._groupProfilesPromise[groupId]) {
this._groupProfilesPromise[groupId] = matrixClient.getGroupProfile(groupId);
// A request is ongoing, wait for it to complete and return the group profile.
if (this._groupProfilesPromise[groupId]) {
try {
await this._groupProfilesPromise[groupId];
} catch (e) {
// Don't log the error; this is done below
return null;
}
return this._groupProfiles[groupId];
}
// No request yet, start one
console.log('FlairStore: Request group profile of ' + groupId);
this._groupProfilesPromise[groupId] = matrixClient.getGroupProfile(groupId);
let profile;
try {
profile = await this._groupProfilesPromise[groupId];
} catch (e) {
console.log('Failed to get group profile for ' + groupId, e);
console.log('FlairStore: Failed to get group profile for ' + groupId, e);
// Don't retry, but allow a retry when the profile is next requested
delete this._groupProfilesPromise[groupId];
return;
return null;
}
this._groupProfiles[groupId] = {
@ -175,12 +187,24 @@ class FlairStore {
};
delete this._groupProfilesPromise[groupId];
/// XXX: This is verging on recreating a third "Flux"-looking Store. We really
/// should replace FlairStore with a Flux store and some async actions.
console.log('FlairStore: Emit updateGroupProfile for ' + groupId);
this.emit('updateGroupProfile');
setTimeout(() => {
delete this._groupProfiles[groupId];
this.refreshGroupProfile(matrixClient, groupId);
}, GROUP_PROFILES_CACHE_BUST_MS);
return this._groupProfiles[groupId];
}
refreshGroupProfile(matrixClient, groupId) {
// Invalidate the cache
delete this._groupProfiles[groupId];
// Fetch new profile data, and cache it
return this.getGroupProfileCached(matrixClient, groupId);
}
}
if (global.singletonFlairStore === undefined) {

View File

@ -27,6 +27,48 @@ function parseRoomsResponse(response) {
return response.chunk.map((apiRoom) => groupRoomFromApiObject(apiRoom));
}
// The number of ongoing group requests
let ongoingRequestCount = 0;
// This has arbitrarily been set to a small number to lower the priority
// of doing group-related requests because we care about other important
// requests like hitting /sync.
const LIMIT = 3; // Maximum number of ongoing group requests
// FIFO queue of functions to call in the backlog
const backlogQueue = [
// () => {...}
];
// Pull from the FIFO queue
function checkBacklog() {
const item = backlogQueue.shift();
if (typeof item === 'function') item();
}
// Limit the maximum number of ongoing promises returned by fn to LIMIT and
// use a FIFO queue to handle the backlog.
function limitConcurrency(fn) {
return new Promise((resolve, reject) => {
const item = () => {
ongoingRequestCount++;
resolve();
};
if (ongoingRequestCount >= LIMIT) {
// Enqueue this request for later execution
backlogQueue.push(item);
} else {
item();
}
})
.then(fn)
.then((result) => {
ongoingRequestCount--;
checkBacklog();
return result;
});
}
/**
* Stores the group summary for a room and provides an API to change it and
* other useful group APIs that may have an effect on the group summary.
@ -56,23 +98,24 @@ export default class GroupStore extends EventEmitter {
this._fetchResourcePromise = {};
this._resourceFetcher = {
[GroupStore.STATE_KEY.Summary]: () => {
return MatrixClientPeg.get()
.getGroupSummary(this.groupId);
return limitConcurrency(
() => MatrixClientPeg.get().getGroupSummary(this.groupId),
);
},
[GroupStore.STATE_KEY.GroupRooms]: () => {
return MatrixClientPeg.get()
.getGroupRooms(this.groupId)
.then(parseRoomsResponse);
return limitConcurrency(
() => MatrixClientPeg.get().getGroupRooms(this.groupId).then(parseRoomsResponse),
);
},
[GroupStore.STATE_KEY.GroupMembers]: () => {
return MatrixClientPeg.get()
.getGroupUsers(this.groupId)
.then(parseMembersResponse);
return limitConcurrency(
() => MatrixClientPeg.get().getGroupUsers(this.groupId).then(parseMembersResponse),
);
},
[GroupStore.STATE_KEY.GroupInvitedMembers]: () => {
return MatrixClientPeg.get()
.getGroupInvitedUsers(this.groupId)
.then(parseMembersResponse);
return limitConcurrency(
() => MatrixClientPeg.get().getGroupInvitedUsers(this.groupId).then(parseMembersResponse),
);
},
};

302
src/stores/RoomListStore.js Normal file
View File

@ -0,0 +1,302 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import {Store} from 'flux/utils';
import dis from '../dispatcher';
import DMRoomMap from '../utils/DMRoomMap';
import Unread from '../Unread';
/**
* A class for storing application state for categorising rooms in
* the RoomList.
*/
class RoomListStore extends Store {
static _listOrders = {
"m.favourite": "manual",
"im.vector.fake.invite": "recent",
"im.vector.fake.recent": "recent",
"im.vector.fake.direct": "recent",
"m.lowpriority": "recent",
"im.vector.fake.archived": "recent",
};
constructor() {
super(dis);
this._init();
this._getManualComparator = this._getManualComparator.bind(this);
this._recentsComparator = this._recentsComparator.bind(this);
}
_init() {
// Initialise state
this._state = {
lists: {
"im.vector.fake.invite": [],
"m.favourite": [],
"im.vector.fake.recent": [],
"im.vector.fake.direct": [],
"m.lowpriority": [],
"im.vector.fake.archived": [],
},
ready: false,
};
}
_setState(newState) {
this._state = Object.assign(this._state, newState);
this.__emitChange();
}
__onDispatch(payload) {
switch (payload.action) {
// Initialise state after initial sync
case 'MatrixActions.sync': {
if (!(payload.prevState !== 'PREPARED' && payload.state === 'PREPARED')) {
break;
}
this._matrixClient = payload.matrixClient;
this._generateRoomLists();
}
break;
case 'MatrixActions.Room.tags': {
if (!this._state.ready) break;
this._generateRoomLists();
}
break;
case 'MatrixActions.Room.timeline': {
if (!this._state.ready ||
!payload.isLiveEvent ||
!payload.isLiveUnfilteredRoomTimelineEvent ||
!this._eventTriggersRecentReorder(payload.event)
) break;
this._generateRoomLists();
}
break;
// When an event is decrypted, it could mean we need to reorder the room
// list because we now know the type of the event.
case 'MatrixActions.Event.decrypted': {
// We may not have synced or done an initial generation of the lists
if (!this._matrixClient || !this._state.ready) break;
const roomId = payload.event.getRoomId();
// We may have decrypted an event without a roomId (e.g to_device)
if (!roomId) break;
const room = this._matrixClient.getRoom(roomId);
// We somehow decrypted an event for a room our client is unaware of
if (!room) break;
const liveTimeline = room.getLiveTimeline();
const eventTimeline = room.getTimelineForEvent(payload.event.getId());
// Either this event was not added to the live timeline (e.g. pagination)
// or it doesn't affect the ordering of the room list.
if (liveTimeline !== eventTimeline ||
!this._eventTriggersRecentReorder(payload.event)
) break;
this._generateRoomLists();
}
break;
case 'MatrixActions.accountData': {
if (payload.event_type !== 'm.direct') break;
this._generateRoomLists();
}
break;
case 'MatrixActions.RoomMember.membership': {
if (!this._matrixClient || payload.member.userId !== this._matrixClient.credentials.userId) break;
this._generateRoomLists();
}
break;
// This could be a new room that we've been invited to, joined or created
// we won't get a RoomMember.membership for these cases if we're not already
// a member.
case 'MatrixActions.Room': {
if (!this._state.ready || !this._matrixClient.credentials.userId) break;
this._generateRoomLists();
}
break;
case 'RoomListActions.tagRoom.pending': {
// XXX: we only show one optimistic update at any one time.
// Ideally we should be making a list of in-flight requests
// that are backed by transaction IDs. Until the js-sdk
// supports this, we're stuck with only being able to use
// the most recent optimistic update.
this._generateRoomLists(payload.request);
}
break;
case 'RoomListActions.tagRoom.failure': {
// Reset state according to js-sdk
this._generateRoomLists();
}
break;
case 'on_logged_out': {
// Reset state without pushing an update to the view, which generally assumes that
// the matrix client isn't `null` and so causing a re-render will cause NPEs.
this._init();
this._matrixClient = null;
}
break;
}
}
_generateRoomLists(optimisticRequest) {
const lists = {
"im.vector.fake.invite": [],
"m.favourite": [],
"im.vector.fake.recent": [],
"im.vector.fake.direct": [],
"m.lowpriority": [],
"im.vector.fake.archived": [],
};
const dmRoomMap = DMRoomMap.shared();
// If somehow we dispatched a RoomListActions.tagRoom.failure before a MatrixActions.sync
if (!this._matrixClient) return;
this._matrixClient.getRooms().forEach((room, index) => {
const me = room.getMember(this._matrixClient.credentials.userId);
if (!me) return;
if (me.membership == "invite") {
lists["im.vector.fake.invite"].push(room);
} else if (me.membership == "join" || me.membership === "ban" ||
(me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) {
// Used to split rooms via tags
let tagNames = Object.keys(room.tags);
if (optimisticRequest && optimisticRequest.room === room) {
// Remove old tag
tagNames = tagNames.filter((tagName) => tagName !== optimisticRequest.oldTag);
// Add new tag
if (optimisticRequest.newTag &&
!tagNames.includes(optimisticRequest.newTag)
) {
tagNames.push(optimisticRequest.newTag);
}
}
if (tagNames.length) {
for (let i = 0; i < tagNames.length; i++) {
const tagName = tagNames[i];
lists[tagName] = lists[tagName] || [];
lists[tagName].push(room);
}
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
lists["im.vector.fake.direct"].push(room);
} else {
lists["im.vector.fake.recent"].push(room);
}
} else if (me.membership === "leave") {
lists["im.vector.fake.archived"].push(room);
} else {
console.error("unrecognised membership: " + me.membership + " - this should never happen");
}
});
Object.keys(lists).forEach((listKey) => {
let comparator;
switch (RoomListStore._listOrders[listKey]) {
case "recent":
comparator = this._recentsComparator;
break;
case "manual":
default:
comparator = this._getManualComparator(listKey, optimisticRequest);
break;
}
lists[listKey].sort(comparator);
});
this._setState({
lists,
ready: true, // Ready to receive updates via Room.tags events
});
}
_eventTriggersRecentReorder(ev) {
return ev.getTs() && (
Unread.eventTriggersUnreadCount(ev) ||
ev.getSender() === this._matrixClient.credentials.userId
);
}
_tsOfNewestEvent(room) {
for (let i = room.timeline.length - 1; i >= 0; --i) {
const ev = room.timeline[i];
if (this._eventTriggersRecentReorder(ev)) {
return ev.getTs();
}
}
// we might only have events that don't trigger the unread indicator,
// in which case use the oldest event even if normally it wouldn't count.
// This is better than just assuming the last event was forever ago.
if (room.timeline.length && room.timeline[0].getTs()) {
return room.timeline[0].getTs();
} else {
return Number.MAX_SAFE_INTEGER;
}
}
_recentsComparator(roomA, roomB) {
// XXX: We could use a cache here and update it when we see new
// events that trigger a reorder
return this._tsOfNewestEvent(roomB) - this._tsOfNewestEvent(roomA);
}
_lexicographicalComparator(roomA, roomB) {
return roomA.name > roomB.name ? 1 : -1;
}
_getManualComparator(tagName, optimisticRequest) {
return (roomA, roomB) => {
let metaA = roomA.tags[tagName];
let metaB = roomB.tags[tagName];
if (optimisticRequest && roomA === optimisticRequest.room) metaA = optimisticRequest.metaData;
if (optimisticRequest && roomB === optimisticRequest.room) metaB = optimisticRequest.metaData;
// Make sure the room tag has an order element, if not set it to be the bottom
const a = metaA.order;
const b = metaB.order;
// Order undefined room tag orders to the bottom
if (a === undefined && b !== undefined) {
return 1;
} else if (a !== undefined && b === undefined) {
return -1;
}
return a == b ? this._lexicographicalComparator(roomA, roomB) : ( a > b ? 1 : -1);
};
}
getRoomLists() {
return this._state.lists;
}
}
if (global.singletonRoomListStore === undefined) {
global.singletonRoomListStore = new RoomListStore();
}
export default global.singletonRoomListStore;

View File

@ -55,6 +55,7 @@ class TagOrderStore extends Store {
const tagOrderingEventContent = tagOrderingEvent ? tagOrderingEvent.getContent() : {};
this._setState({
orderedTagsAccountData: tagOrderingEventContent.tags || null,
removedTagsAccountData: tagOrderingEventContent.removedTags || null,
hasSynced: true,
});
this._updateOrderedTags();
@ -70,6 +71,7 @@ class TagOrderStore extends Store {
this._setState({
orderedTagsAccountData: payload.event_content ? payload.event_content.tags : null,
removedTagsAccountData: payload.event_content ? payload.event_content.removedTags : null,
});
this._updateOrderedTags();
break;
@ -87,9 +89,18 @@ class TagOrderStore extends Store {
// Optimistic update of a moved tag
this._setState({
orderedTags: payload.request.tags,
removedTagsAccountData: payload.request.removedTags,
});
break;
}
case 'TagOrderActions.removeTag.pending': {
// Optimistic update of a removed tag
this._setState({
removedTagsAccountData: payload.request.removedTags,
});
this._updateOrderedTags();
break;
}
case 'select_tag': {
let newTags = [];
// Shift-click semantics
@ -165,13 +176,15 @@ class TagOrderStore extends Store {
_mergeGroupsAndTags() {
const groupIds = this._state.joinedGroupIds || [];
const tags = this._state.orderedTagsAccountData || [];
const removedTags = new Set(this._state.removedTagsAccountData || []);
const tagsToKeep = tags.filter(
(t) => t[0] !== '+' || groupIds.includes(t),
(t) => (t[0] !== '+' || groupIds.includes(t)) && !removedTags.has(t),
);
const groupIdsToAdd = groupIds.filter(
(groupId) => !tags.includes(groupId),
(groupId) => !tags.includes(groupId) && !removedTags.has(groupId),
);
return tagsToKeep.concat(groupIdsToAdd);
@ -181,6 +194,10 @@ class TagOrderStore extends Store {
return this._state.orderedTags;
}
getRemovedTagsAccountData() {
return this._state.removedTagsAccountData;
}
getStoreId() {
// Generate a random ID to prevent this store from clobbering its
// state with redundant remote echos.

View File

@ -0,0 +1,190 @@
import React from 'react';
import ReactDOM from 'react-dom';
import expect, {createSpy} from 'expect';
import Promise from 'bluebird';
import * as testUtils from '../../../test-utils';
import sdk from 'matrix-react-sdk';
const WrappedRoomSettings = testUtils.wrapInMatrixClientContext(sdk.getComponent('views.rooms.RoomSettings'));
import MatrixClientPeg from '../../../../src/MatrixClientPeg';
import SettingsStore from '../../../../src/settings/SettingsStore';
describe('RoomSettings', () => {
let parentDiv = null;
let sandbox = null;
let client = null;
let roomSettings = null;
const room = testUtils.mkStubRoom('!DdJkzRliezrwpNebLk:matrix.org');
function expectSentStateEvent(roomId, eventType, expectedEventContent) {
let found = false;
for (const call of client.sendStateEvent.calls) {
const [
actualRoomId,
actualEventType,
actualEventContent,
] = call.arguments.slice(0, 3);
if (roomId === actualRoomId && actualEventType === eventType) {
expect(actualEventContent).toEqual(expectedEventContent);
found = true;
break;
}
}
expect(found).toBe(true);
}
beforeEach(function(done) {
testUtils.beforeEach(this);
sandbox = testUtils.stubClient();
client = MatrixClientPeg.get();
client.credentials = {userId: '@me:domain.com'};
client.setRoomName = createSpy().andReturn(Promise.resolve());
client.setRoomTopic = createSpy().andReturn(Promise.resolve());
client.setRoomDirectoryVisibility = createSpy().andReturn(Promise.resolve());
// Covers any room state event (e.g. name, avatar, topic)
client.sendStateEvent = createSpy().andReturn(Promise.resolve());
// Covers room tagging
client.setRoomTag = createSpy().andReturn(Promise.resolve());
client.deleteRoomTag = createSpy().andReturn(Promise.resolve());
// Covers any setting in the SettingsStore
// (including local client settings not stored via matrix)
SettingsStore.setValue = createSpy().andReturn(Promise.resolve());
parentDiv = document.createElement('div');
document.body.appendChild(parentDiv);
const gatherWrappedRef = (r) => {roomSettings = r;};
// get use wrappedRef because we're using wrapInMatrixClientContext
ReactDOM.render(
<WrappedRoomSettings
wrappedRef={gatherWrappedRef}
room={room}
/>,
parentDiv,
done,
);
});
afterEach((done) => {
if (parentDiv) {
ReactDOM.unmountComponentAtNode(parentDiv);
parentDiv.remove();
parentDiv = null;
}
sandbox.restore();
done();
});
it('should not set when no setting is changed', (done) => {
roomSettings.save().then(() => {
expect(client.sendStateEvent).toNotHaveBeenCalled();
expect(client.setRoomTag).toNotHaveBeenCalled();
expect(client.deleteRoomTag).toNotHaveBeenCalled();
done();
});
});
// XXX: Apparently we do call SettingsStore.setValue
xit('should not settings via the SettingsStore when no setting is changed', (done) => {
roomSettings.save().then(() => {
expect(SettingsStore.setValue).toNotHaveBeenCalled();
done();
});
});
it('should set room name when it has changed', (done) => {
const name = "My Room Name";
roomSettings.setName(name);
roomSettings.save().then(() => {
expect(client.setRoomName.calls[0].arguments.slice(0, 2))
.toEqual(['!DdJkzRliezrwpNebLk:matrix.org', name]);
done();
});
});
it('should set room topic when it has changed', (done) => {
const topic = "this is a topic";
roomSettings.setTopic(topic);
roomSettings.save().then(() => {
expect(client.setRoomTopic.calls[0].arguments.slice(0, 2))
.toEqual(['!DdJkzRliezrwpNebLk:matrix.org', topic]);
done();
});
});
it('should set history visibility when it has changed', (done) => {
const historyVisibility = "translucent";
roomSettings.setState({
history_visibility: historyVisibility,
});
roomSettings.save().then(() => {
expectSentStateEvent(
"!DdJkzRliezrwpNebLk:matrix.org",
"m.room.history_visibility", {history_visibility: historyVisibility},
);
done();
});
});
// XXX: Can't test this because we `getRoomDirectoryVisibility` in `componentWillMount`
xit('should set room directory publicity when set to true', (done) => {
const isRoomPublished = true;
roomSettings.setState({
isRoomPublished,
}, () => {
roomSettings.save().then(() => {
expect(client.setRoomDirectoryVisibility.calls[0].arguments.slice(0, 2))
.toEqual("!DdJkzRliezrwpNebLk:matrix.org", isRoomPublished ? "public" : "private");
done();
});
});
});
it('should set power levels when changed', (done) => {
roomSettings.onPowerLevelsChanged(42, "invite");
roomSettings.save().then(() => {
expectSentStateEvent(
"!DdJkzRliezrwpNebLk:matrix.org",
"m.room.power_levels", { invite: 42 },
);
done();
});
});
it('should set event power levels when changed', (done) => {
roomSettings.onPowerLevelsChanged(42, "event_levels_m.room.message");
roomSettings.save().then(() => {
// We expect all state events to be set to the state_default (50)
// See powerLevelDescriptors in RoomSettings
expectSentStateEvent(
"!DdJkzRliezrwpNebLk:matrix.org",
"m.room.power_levels", {
events: {
'm.room.message': 42,
'm.room.avatar': 50,
'm.room.name': 50,
'm.room.canonical_alias': 50,
'm.room.history_visibility': 50,
'm.room.power_levels': 50,
'm.room.topic': 50,
'im.vector.modular.widgets': 50,
},
},
);
done();
});
});
});

View File

@ -68,6 +68,8 @@ export function createTestClient() {
return {
getHomeserverUrl: sinon.stub(),
getIdentityServerUrl: sinon.stub(),
getDomain: sinon.stub().returns("matrix.rog"),
getUserId: sinon.stub().returns("@userId:matrix.rog"),
getPushActionsForEvent: sinon.stub(),
getRoom: sinon.stub().returns(mkStubRoom()),
@ -81,6 +83,7 @@ export function createTestClient() {
paginateEventTimeline: sinon.stub().returns(Promise.resolve()),
sendReadReceipt: sinon.stub().returns(Promise.resolve()),
getRoomIdForAlias: sinon.stub().returns(Promise.resolve()),
getRoomDirectoryVisibility: sinon.stub().returns(Promise.resolve()),
getProfileInfo: sinon.stub().returns(Promise.resolve({})),
getAccountData: (type) => {
return mkEvent({
@ -244,6 +247,7 @@ export function mkStubRoom(roomId = null) {
roomId: roomId,
getAvatarUrl: () => 'mxc://avatar.url/image.png',
}),
getMembersWithMembership: sinon.stub().returns([]),
getJoinedMembers: sinon.stub().returns([]),
getPendingEvents: () => [],
getLiveTimeline: () => stubTimeline,
@ -252,8 +256,16 @@ export function mkStubRoom(roomId = null) {
hasMembershipState: () => null,
currentState: {
getStateEvents: sinon.stub(),
mayClientSendStateEvent: sinon.stub().returns(true),
maySendStateEvent: sinon.stub().returns(true),
members: [],
},
tags: {
"m.favourite": {
order: 0.5,
},
},
setBlacklistUnverifiedDevices: sinon.stub(),
};
}
@ -284,7 +296,7 @@ export function wrapInMatrixClientContext(WrappedComponent) {
}
render() {
return <WrappedComponent {...this.props} />;
return <WrappedComponent ref={this.props.wrappedRef} {...this.props} />;
}
}
return Wrapper;