diff --git a/CHANGELOG.md b/CHANGELOG.md
index b5e596144e..090f5a49da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,53 @@
+Changes in [0.10.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.3) (2017-09-06)
+=====================================================================================================
+[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.3-rc.2...v0.10.3)
+
+ * No changes
+
+Changes in [0.10.3-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.3-rc.2) (2017-09-05)
+===============================================================================================================
+[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.3-rc.1...v0.10.3-rc.2)
+
+ * Fix plurals in translations
+ [\#1358](https://github.com/matrix-org/matrix-react-sdk/pull/1358)
+ * Fix typo
+ [\#1357](https://github.com/matrix-org/matrix-react-sdk/pull/1357)
+ * Update from Weblate.
+ [\#1356](https://github.com/matrix-org/matrix-react-sdk/pull/1356)
+
+Changes in [0.10.3-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.3-rc.1) (2017-09-01)
+===============================================================================================================
+[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.2...v0.10.3-rc.1)
+
+ * Fix room change sometimes being very slow
+ [\#1354](https://github.com/matrix-org/matrix-react-sdk/pull/1354)
+ * apply shouldHideEvent fn to onRoomTimeline for RoomStatusBar
+ [\#1346](https://github.com/matrix-org/matrix-react-sdk/pull/1346)
+ * text4event widget modified, used to show widget added each time.
+ [\#1345](https://github.com/matrix-org/matrix-react-sdk/pull/1345)
+ * separate concepts of showing and managing RRs to fix regression
+ [\#1352](https://github.com/matrix-org/matrix-react-sdk/pull/1352)
+ * Make staging widgets work with live and vice versa.
+ [\#1350](https://github.com/matrix-org/matrix-react-sdk/pull/1350)
+ * Avoid breaking /sync with uncaught exceptions
+ [\#1349](https://github.com/matrix-org/matrix-react-sdk/pull/1349)
+ * we need to pass whether it is an invite RoomSubList explicitly (i18n)
+ [\#1343](https://github.com/matrix-org/matrix-react-sdk/pull/1343)
+ * Percent encoding isn't a valid thing within _t
+ [\#1348](https://github.com/matrix-org/matrix-react-sdk/pull/1348)
+ * Fix spurious notifications
+ [\#1339](https://github.com/matrix-org/matrix-react-sdk/pull/1339)
+ * Unbreak password reset with a non-default HS
+ [\#1347](https://github.com/matrix-org/matrix-react-sdk/pull/1347)
+ * Remove unnecessary 'load' on notif audio element
+ [\#1341](https://github.com/matrix-org/matrix-react-sdk/pull/1341)
+ * _tJsx returns a React Object, the sub fn must return a React Object
+ [\#1340](https://github.com/matrix-org/matrix-react-sdk/pull/1340)
+ * Fix deprecation warning about promise.defer()
+ [\#1292](https://github.com/matrix-org/matrix-react-sdk/pull/1292)
+ * Fix click to insert completion
+ [\#1331](https://github.com/matrix-org/matrix-react-sdk/pull/1331)
+
Changes in [0.10.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.2) (2017-08-24)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.1...v0.10.2)
diff --git a/package.json b/package.json
index 548349f802..38a647ff67 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
- "version": "0.10.2",
+ "version": "0.10.3",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@@ -73,7 +73,6 @@
"react-addons-css-transition-group": "15.3.2",
"react-dom": "^15.4.0",
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
- "react-sticky": "^6.0.1",
"sanitize-html": "^1.14.1",
"text-encoding-utf-8": "^1.0.1",
"url": "^0.11.0",
diff --git a/src/ActiveRoomObserver.js b/src/ActiveRoomObserver.js
new file mode 100644
index 0000000000..d6fbb460b5
--- /dev/null
+++ b/src/ActiveRoomObserver.js
@@ -0,0 +1,77 @@
+/*
+Copyright 2017 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 RoomViewStore from './stores/RoomViewStore';
+
+/**
+ * Consumes changes from the RoomViewStore and notifies specific things
+ * about when the active room changes. Unlike listening for RoomViewStore
+ * changes, you can subscribe to only changes relevant to a particular
+ * room.
+ *
+ * TODO: If we introduce an observer for something else, factor out
+ * the adding / removing of listeners & emitting into a common class.
+ */
+class ActiveRoomObserver {
+ constructor() {
+ this._listeners = {};
+
+ this._activeRoomId = RoomViewStore.getRoomId();
+ // TODO: We could self-destruct when the last listener goes away, or at least
+ // stop listening.
+ this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate.bind(this));
+ }
+
+ addListener(roomId, listener) {
+ if (!this._listeners[roomId]) this._listeners[roomId] = [];
+ this._listeners[roomId].push(listener);
+ }
+
+ removeListener(roomId, listener) {
+ if (this._listeners[roomId]) {
+ const i = this._listeners[roomId].indexOf(listener);
+ if (i > -1) {
+ this._listeners[roomId].splice(i, 1);
+ }
+ } else {
+ console.warn("Unregistering unrecognised listener (roomId=" + roomId + ")");
+ }
+ }
+
+ _emit(roomId) {
+ if (!this._listeners[roomId]) return;
+
+ for (const l of this._listeners[roomId]) {
+ l.call();
+ }
+ }
+
+ _onRoomViewStoreUpdate() {
+ // emit for the old room ID
+ if (this._activeRoomId) this._emit(this._activeRoomId);
+
+ // update our cache
+ this._activeRoomId = RoomViewStore.getRoomId();
+
+ // and emit for the new one
+ if (this._activeRoomId) this._emit(this._activeRoomId);
+ }
+}
+
+if (global.mx_ActiveRoomObserver === undefined) {
+ global.mx_ActiveRoomObserver = new ActiveRoomObserver();
+}
+export default global.mx_ActiveRoomObserver;
diff --git a/src/DateUtils.js b/src/DateUtils.js
index 5508e30362..77f3644f6f 100644
--- a/src/DateUtils.js
+++ b/src/DateUtils.js
@@ -30,18 +30,6 @@ function getDaysArray() {
];
}
-function getLongDaysArray() {
- return [
- _t('Sunday'),
- _t('Monday'),
- _t('Tuesday'),
- _t('Wednesday'),
- _t('Thursday'),
- _t('Friday'),
- _t('Saturday'),
- ];
-}
-
function getMonthsArray() {
return [
_t('Jan'),
@@ -108,38 +96,6 @@ module.exports = {
});
},
- formatDateSeparator: function(date) {
- const days = getDaysArray();
- const longDays = getLongDaysArray();
- const months = getMonthsArray();
-
- const today = new Date();
- const yesterday = new Date();
- yesterday.setDate(today.getDate() - 1);
-
- if (date.toDateString() === today.toDateString()) {
- return _t('Today');
- } else if (date.toDateString() === yesterday.toDateString()) {
- return _t('Yesterday');
- } else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
- return longDays[date.getDay()];
- } else if (today.getTime() - date.getTime() < 365 * 24 * 60 * 60 * 1000) {
- return _t('%(weekDayName)s, %(monthName)s %(day)s', {
- weekDayName: days[date.getDay()],
- monthName: months[date.getMonth()],
- day: date.getDate(),
- fullYear: date.getFullYear(),
- });
- } else {
- return _t('%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s', {
- weekDayName: days[date.getDay()],
- monthName: months[date.getMonth()],
- day: date.getDate(),
- fullYear: date.getFullYear(),
- });
- }
- },
-
formatTime: function(date, showTwelveHour=false) {
if (showTwelveHour) {
return twelveHourTime(date);
diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js
index 87e714083b..63ee5fa480 100644
--- a/src/HtmlUtils.js
+++ b/src/HtmlUtils.js
@@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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,13 +32,28 @@ emojione.imagePathPNG = 'emojione/png/';
// Use SVGs for emojis
emojione.imageType = 'svg';
+const SIMPLE_EMOJI_PATTERN = /([\ud800-\udbff])([\udc00-\udfff])/;
const EMOJI_REGEX = new RegExp(emojione.unicodeRegexp+"+", "gi");
const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;
+/*
+ * Return true if the given string contains emoji
+ * Uses a much, much simpler regex than emojione's so will give false
+ * positives, but useful for fast-path testing strings to see if they
+ * need emojification.
+ * unicodeToImage uses this function.
+ */
+export function containsEmoji(str) {
+ return SIMPLE_EMOJI_PATTERN.test(str);
+}
+
/* modified from https://github.com/Ranks/emojione/blob/master/lib/js/emojione.js
* because we want to include emoji shortnames in title text
*/
export function unicodeToImage(str) {
+ // fast path
+ if (!containsEmoji(str)) return str;
+
let replaceWith, unicode, alt, short, fname;
const mappedUnicode = emojione.mapUnicodeToShort();
@@ -393,7 +409,6 @@ export function bodyToHtml(content, highlights, opts) {
}
safeBody = sanitizeHtml(body, sanitizeHtmlParams);
safeBody = unicodeToImage(safeBody);
- safeBody = addCodeCopyButton(safeBody);
}
finally {
delete sanitizeHtmlParams.textFilter;
@@ -412,23 +427,6 @@ export function bodyToHtml(content, highlights, opts) {
return ;
}
-function addCodeCopyButton(safeBody) {
- // Adds 'copy' buttons to pre blocks
- // Note that this only manipulates the markup to add the buttons:
- // we need to add the event handlers once the nodes are in the DOM
- // since we can't save functions in the markup.
- // This is done in TextualBody
- const el = document.createElement("div");
- el.innerHTML = safeBody;
- const codeBlocks = Array.from(el.getElementsByTagName("pre"));
- codeBlocks.forEach(p => {
- const button = document.createElement("span");
- button.className = "mx_EventTile_copyButton";
- p.appendChild(button);
- });
- return el.innerHTML;
-}
-
export function emojifyText(text) {
return {
__html: unicodeToImage(escape(text)),
diff --git a/src/Skinner.js b/src/Skinner.js
index f47572ba01..1fe12f85ab 100644
--- a/src/Skinner.js
+++ b/src/Skinner.js
@@ -84,6 +84,9 @@ class Skinner {
// behaviour with multiple copies of files etc. is erratic at best.
// XXX: We can still end up with the same file twice in the resulting
// JS bundle which is nonideal.
+// See https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
+// or https://nodejs.org/api/modules.html#modules_module_caching_caveats
+// ("Modules are cached based on their resolved filename")
if (global.mxSkinner === undefined) {
global.mxSkinner = new Skinner();
}
diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js
index 0790a5766e..147707b6fc 100644
--- a/src/components/structures/LoggedInView.js
+++ b/src/components/structures/LoggedInView.js
@@ -81,10 +81,6 @@ export default React.createClass({
// stash the MatrixClient in case we log out before we are unmounted
this._matrixClient = this.props.matrixClient;
- // _scrollStateMap is a map from room id to the scroll state returned by
- // RoomView.getScrollState()
- this._scrollStateMap = {};
-
CallMediaHandler.loadDevices();
document.addEventListener('keydown', this._onKeyDown);
@@ -116,10 +112,6 @@ export default React.createClass({
return Boolean(MatrixClientPeg.get());
},
- getScrollStateForRoom: function(roomId) {
- return this._scrollStateMap[roomId];
- },
-
canResetTimelineInRoom: function(roomId) {
if (!this.refs.roomView) {
return true;
@@ -248,7 +240,6 @@ export default React.createClass({
opacity={this.props.middleOpacity}
collapsedRhs={this.props.collapse_rhs}
ConferenceHandler={this.props.ConferenceHandler}
- scrollStateMap={this._scrollStateMap}
/>;
if (!this.props.collapse_rhs) right_panel = ;
break;
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index bbe345933e..c142d6958c 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -38,7 +38,6 @@ import linkifyMatrix from "../../linkify-matrix";
import * as Lifecycle from '../../Lifecycle';
// LifecycleStore is not used but does listen to and dispatch actions
require('../../stores/LifecycleStore');
-import RoomViewStore from '../../stores/RoomViewStore';
import PageTypes from '../../PageTypes';
import createRoom from "../../createRoom";
@@ -214,9 +213,6 @@ module.exports = React.createClass({
componentWillMount: function() {
SdkConfig.put(this.props.config);
- this._roomViewStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdated);
- this._onRoomViewStoreUpdated();
-
if (!UserSettingsStore.getLocalSetting('analyticsOptOut', false)) Analytics.enable();
// Used by _viewRoom before getting state from sync
@@ -353,7 +349,6 @@ module.exports = React.createClass({
UDEHandler.stopListening();
window.removeEventListener("focus", this.onFocus);
window.removeEventListener('resize', this.handleResize);
- this._roomViewStoreToken.remove();
},
componentDidUpdate: function() {
@@ -587,10 +582,6 @@ module.exports = React.createClass({
}
},
- _onRoomViewStoreUpdated: function() {
- this.setState({ currentRoomId: RoomViewStore.getRoomId() });
- },
-
_setPage: function(pageType) {
this.setState({
page_type: pageType,
@@ -677,6 +668,7 @@ module.exports = React.createClass({
this.focusComposer = true;
const newState = {
+ currentRoomId: roomInfo.room_id || null,
page_type: PageTypes.RoomView,
thirdPartyInvite: roomInfo.third_party_invite,
roomOobData: roomInfo.oob_data,
diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js
index aad4e1957a..e5884973c6 100644
--- a/src/components/structures/MessagePanel.js
+++ b/src/components/structures/MessagePanel.js
@@ -61,6 +61,9 @@ module.exports = React.createClass({
// for pending messages.
ourUserId: React.PropTypes.string,
+ // true to suppress the date at the start of the timeline
+ suppressFirstDateSeparator: React.PropTypes.bool,
+
// whether to show read receipts
showReadReceipts: React.PropTypes.bool,
@@ -514,10 +517,10 @@ module.exports = React.createClass({
_wantsDateSeparator: function(prevEvent, nextEventDate) {
if (prevEvent == null) {
- // First event in the panel always wants a DateSeparator
- return true;
+ // first event in the panel: depends if we could back-paginate from
+ // here.
+ return !this.props.suppressFirstDateSeparator;
}
-
const prevEventDate = prevEvent.getDate();
if (!nextEventDate || !prevEventDate) {
return false;
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index 87bed1ed08..2a6cf0aee4 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -47,6 +47,7 @@ import KeyCode from '../../KeyCode';
import UserProvider from '../../autocomplete/UserProvider';
import RoomViewStore from '../../stores/RoomViewStore';
+import RoomScrollStateStore from '../../stores/RoomScrollStateStore';
let DEBUG = false;
let debuglog = function() {};
@@ -156,6 +157,22 @@ module.exports = React.createClass({
if (this.unmounted) {
return;
}
+
+ if (!initial && this.state.roomId !== RoomViewStore.getRoomId()) {
+ // RoomView explicitly does not support changing what room
+ // is being viewed: instead it should just be re-mounted when
+ // switching rooms. Therefore, if the room ID changes, we
+ // ignore this. We either need to do this or add code to handle
+ // saving the scroll position (otherwise we end up saving the
+ // scroll position against the wrong room).
+
+ // Given that doing the setState here would cause a bunch of
+ // unnecessary work, we just ignore the change since we know
+ // that if the current room ID has changed from what we thought
+ // it was, it means we're about to be unmounted.
+ return;
+ }
+
const newState = {
roomId: RoomViewStore.getRoomId(),
roomAlias: RoomViewStore.getRoomAlias(),
@@ -163,7 +180,6 @@ module.exports = React.createClass({
roomLoadError: RoomViewStore.getRoomLoadError(),
joining: RoomViewStore.isJoining(),
initialEventId: RoomViewStore.getInitialEventId(),
- initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
forwardingEvent: RoomViewStore.getForwardingEvent(),
shouldPeek: RoomViewStore.shouldPeek(),
@@ -189,6 +205,25 @@ module.exports = React.createClass({
// the RoomView instance
if (initial) {
newState.room = MatrixClientPeg.get().getRoom(newState.roomId);
+ if (newState.room) {
+ newState.unsentMessageError = this._getUnsentMessageError(newState.room);
+ newState.showApps = this._shouldShowApps(newState.room);
+ this._onRoomLoaded(newState.room);
+ }
+ }
+
+ if (this.state.roomId === null && newState.roomId !== null) {
+ // Get the scroll state for the new room
+
+ // If an event ID wasn't specified, default to the one saved for this room
+ // in the scroll state store. Assume initialEventPixelOffset should be set.
+ if (!newState.initialEventId) {
+ const roomScrollState = RoomScrollStateStore.getScrollState(newState.roomId);
+ if (roomScrollState) {
+ newState.initialEventId = roomScrollState.focussedEvent;
+ newState.initialEventPixelOffset = roomScrollState.pixelOffset;
+ }
+ }
}
// Clear the search results when clicking a search result (which changes the
@@ -197,22 +232,20 @@ module.exports = React.createClass({
newState.searchResults = null;
}
- // Store the scroll state for the previous room so that we can return to this
- // position when viewing this room in future.
- if (this.state.roomId !== newState.roomId) {
- this._updateScrollMap(this.state.roomId);
- }
+ this.setState(newState);
+ // At this point, newState.roomId could be null (e.g. the alias might not
+ // have been resolved yet) so anything called here must handle this case.
- this.setState(newState, () => {
- // At this point, this.state.roomId could be null (e.g. the alias might not
- // have been resolved yet) so anything called here must handle this case.
- if (initial) {
- this._onHaveRoom();
- }
- });
+ // We pass the new state into this function for it to read: it needs to
+ // observe the new state but we don't want to put it in the setState
+ // callback because this would prevent the setStates from being batched,
+ // ie. cause it to render RoomView twice rather than the once that is necessary.
+ if (initial) {
+ this._setupRoom(newState.room, newState.roomId, newState.joining, newState.shouldPeek);
+ }
},
- _onHaveRoom: function() {
+ _setupRoom: function(room, roomId, joining, shouldPeek) {
// if this is an unknown room then we're in one of three states:
// - This is a room we can peek into (search engine) (we can /peek)
// - This is a room we can publicly join or were invited to. (we can /join)
@@ -228,23 +261,15 @@ module.exports = React.createClass({
// about it). We don't peek in the historical case where we were joined but are
// now not joined because the js-sdk peeking API will clobber our historical room,
// making it impossible to indicate a newly joined room.
- const room = this.state.room;
- if (room) {
- this.setState({
- unsentMessageError: this._getUnsentMessageError(room),
- showApps: this._shouldShowApps(room),
- });
- this._onRoomLoaded(room);
- }
- if (!this.state.joining && this.state.roomId) {
+ if (!joining && roomId) {
if (this.props.autoJoin) {
this.onJoinButtonClicked();
- } else if (!room && this.state.shouldPeek) {
- console.log("Attempting to peek into room %s", this.state.roomId);
+ } else if (!room && shouldPeek) {
+ console.log("Attempting to peek into room %s", roomId);
this.setState({
peekLoading: true,
});
- MatrixClientPeg.get().peekInRoom(this.state.roomId).then((room) => {
+ MatrixClientPeg.get().peekInRoom(roomId).then((room) => {
this.setState({
room: room,
peekLoading: false,
@@ -340,7 +365,9 @@ module.exports = React.createClass({
this.unmounted = true;
// update the scroll map before we get unmounted
- this._updateScrollMap(this.state.roomId);
+ if (this.state.roomId) {
+ RoomScrollStateStore.setScrollState(this.state.roomId, this._getScrollState());
+ }
if (this.refs.roomView) {
// disconnect the D&D event listeners from the room view. This
@@ -617,18 +644,6 @@ module.exports = React.createClass({
});
},
- _updateScrollMap(roomId) {
- // No point updating scroll state if the room ID hasn't been resolved yet
- if (!roomId) {
- return;
- }
- dis.dispatch({
- action: 'update_scroll_state',
- room_id: roomId,
- scroll_state: this._getScrollState(),
- });
- },
-
onRoom: function(room) {
if (!room || room.roomId !== this.state.roomId) {
return;
diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js
index 3ea699798e..ae3ffe66e3 100644
--- a/src/components/structures/ScrollPanel.js
+++ b/src/components/structures/ScrollPanel.js
@@ -17,7 +17,6 @@ limitations under the License.
var React = require("react");
var ReactDOM = require("react-dom");
var GeminiScrollbar = require('react-gemini-scrollbar');
-import { StickyContainer } from 'react-sticky';
import Promise from 'bluebird';
var KeyCode = require('../../KeyCode');
@@ -78,52 +77,111 @@ if (DEBUG_SCROLL) {
* scroll down further. If stickyBottom is disabled, we just save the scroll
* offset as normal.
*/
-export default class ScrollPanel extends StickyContainer {
+module.exports = React.createClass({
+ displayName: 'ScrollPanel',
- constructor() {
- super();
- this.onResize = this.onResize.bind(this);
- this.onScroll = this.onScroll.bind(this);
- }
+ propTypes: {
+ /* stickyBottom: if set to true, then once the user hits the bottom of
+ * the list, any new children added to the list will cause the list to
+ * scroll down to show the new element, rather than preserving the
+ * existing view.
+ */
+ stickyBottom: React.PropTypes.bool,
- componentWillMount() {
+ /* startAtBottom: if set to true, the view is assumed to start
+ * scrolled to the bottom.
+ * XXX: It's likley this is unecessary and can be derived from
+ * stickyBottom, but I'm adding an extra parameter to ensure
+ * behaviour stays the same for other uses of ScrollPanel.
+ * If so, let's remove this parameter down the line.
+ */
+ startAtBottom: React.PropTypes.bool,
+
+ /* onFillRequest(backwards): a callback which is called on scroll when
+ * the user nears the start (backwards = true) or end (backwards =
+ * false) of the list.
+ *
+ * This should return a promise; no more calls will be made until the
+ * promise completes.
+ *
+ * The promise should resolve to true if there is more data to be
+ * retrieved in this direction (in which case onFillRequest may be
+ * called again immediately), or false if there is no more data in this
+ * directon (at this time) - which will stop the pagination cycle until
+ * the user scrolls again.
+ */
+ onFillRequest: React.PropTypes.func,
+
+ /* onUnfillRequest(backwards): a callback which is called on scroll when
+ * there are children elements that are far out of view and could be removed
+ * without causing pagination to occur.
+ *
+ * This function should accept a boolean, which is true to indicate the back/top
+ * of the panel and false otherwise, and a scroll token, which refers to the
+ * first element to remove if removing from the front/bottom, and last element
+ * to remove if removing from the back/top.
+ */
+ onUnfillRequest: React.PropTypes.func,
+
+ /* onScroll: a callback which is called whenever any scroll happens.
+ */
+ onScroll: React.PropTypes.func,
+
+ /* onResize: a callback which is called whenever the Gemini scroll
+ * panel is resized
+ */
+ onResize: React.PropTypes.func,
+
+ /* className: classnames to add to the top-level div
+ */
+ className: React.PropTypes.string,
+
+ /* style: styles to add to the top-level div
+ */
+ style: React.PropTypes.object,
+ },
+
+ getDefaultProps: function() {
+ return {
+ stickyBottom: true,
+ startAtBottom: true,
+ onFillRequest: function(backwards) { return Promise.resolve(false); },
+ onUnfillRequest: function(backwards, scrollToken) {},
+ onScroll: function() {},
+ };
+ },
+
+ componentWillMount: function() {
this._pendingFillRequests = {b: null, f: null};
this.resetScrollState();
- }
+ },
- componentDidMount() {
- this.checkFillState();
- }
+ componentDidMount: function() {
+ this.checkScroll();
+ },
- componentDidUpdate() {
+ componentDidUpdate: function() {
// after adding event tiles, we may need to tweak the scroll (either to
// keep at the bottom of the timeline, or to maintain the view after
// adding events to the top).
//
// This will also re-check the fill state, in case the paginate was inadequate
this.checkScroll();
- }
+ },
- componentWillUnmount() {
+ componentWillUnmount: function() {
// set a boolean to say we've been unmounted, which any pending
// promises can use to throw away their results.
//
// (We could use isMounted(), but facebook have deprecated that.)
this.unmounted = true;
- }
+ },
- onScroll(ev) {
+ onScroll: function(ev) {
var sn = this._getScrollNode();
debuglog("Scroll event: offset now:", sn.scrollTop,
"_lastSetScroll:", this._lastSetScroll);
- // Set the node and notify subscribers of the StickyContainer
- // By extending StickyContainer, we can set the scroll node to be that of the
- // ScrolPanel to allow any `` children to be sticky, namely DateSeparators.
- this.node = sn;
- // Update subscribers - arbitrarily nested `` children
- this.notifySubscribers(ev);
-
// Sometimes we see attempts to write to scrollTop essentially being
// ignored. (Or rather, it is successfully written, but on the next
// scroll event, it's been reset again).
@@ -159,27 +217,27 @@ export default class ScrollPanel extends StickyContainer {
this.props.onScroll(ev);
this.checkFillState();
- }
+ },
- onResize() {
+ onResize: function() {
this.props.onResize();
this.checkScroll();
this.refs.geminiPanel.forceUpdate();
- }
+ },
// after an update to the contents of the panel, check that the scroll is
// where it ought to be, and set off pagination requests if necessary.
- checkScroll() {
+ checkScroll: function() {
this._restoreSavedScrollState();
this.checkFillState();
- }
+ },
// return true if the content is fully scrolled down right now; else false.
//
// note that this is independent of the 'stuckAtBottom' state - it is simply
// about whether the the content is scrolled down right now, irrespective of
// whether it will stay that way when the children update.
- isAtBottom() {
+ isAtBottom: function() {
var sn = this._getScrollNode();
// there seems to be some bug with flexbox/gemini/chrome/richvdh's
@@ -189,7 +247,7 @@ export default class ScrollPanel extends StickyContainer {
// that we're at the bottom when we're still a few pixels off.
return sn.scrollHeight - Math.ceil(sn.scrollTop) <= sn.clientHeight + 3;
- }
+ },
// returns the vertical height in the given direction that can be removed from
// the content box (which has a height of scrollHeight, see checkFillState) without
@@ -222,17 +280,17 @@ export default class ScrollPanel extends StickyContainer {
// |#########| - |
// |#########| |
// `---------' -
- _getExcessHeight(backwards) {
+ _getExcessHeight: function(backwards) {
var sn = this._getScrollNode();
if (backwards) {
return sn.scrollTop - sn.clientHeight - UNPAGINATION_PADDING;
} else {
return sn.scrollHeight - (sn.scrollTop + 2*sn.clientHeight) - UNPAGINATION_PADDING;
}
- }
+ },
// check the scroll state and send out backfill requests if necessary.
- checkFillState() {
+ checkFillState: function() {
if (this.unmounted) {
return;
}
@@ -271,10 +329,10 @@ export default class ScrollPanel extends StickyContainer {
// need to forward-fill
this._maybeFill(false);
}
- }
+ },
// check if unfilling is possible and send an unfill request if necessary
- _checkUnfillState(backwards) {
+ _checkUnfillState: function(backwards) {
let excessHeight = this._getExcessHeight(backwards);
if (excessHeight <= 0) {
return;
@@ -315,10 +373,10 @@ export default class ScrollPanel extends StickyContainer {
this.props.onUnfillRequest(backwards, markerScrollToken);
}, UNFILL_REQUEST_DEBOUNCE_MS);
}
- }
+ },
// check if there is already a pending fill request. If not, set one off.
- _maybeFill(backwards) {
+ _maybeFill: function(backwards) {
var dir = backwards ? 'b' : 'f';
if (this._pendingFillRequests[dir]) {
debuglog("ScrollPanel: Already a "+dir+" fill in progress - not starting another");
@@ -350,7 +408,7 @@ export default class ScrollPanel extends StickyContainer {
this.checkFillState();
}
}).done();
- }
+ },
/* get the current scroll state. This returns an object with the following
* properties:
@@ -366,9 +424,9 @@ export default class ScrollPanel extends StickyContainer {
* the number of pixels the bottom of the tracked child is above the
* bottom of the scroll panel.
*/
- getScrollState() {
+ getScrollState: function() {
return this.scrollState;
- }
+ },
/* reset the saved scroll state.
*
@@ -382,46 +440,46 @@ export default class ScrollPanel extends StickyContainer {
* no use if no children exist yet, or if you are about to replace the
* child list.)
*/
- resetScrollState() {
+ resetScrollState: function() {
this.scrollState = {stuckAtBottom: this.props.startAtBottom};
- }
+ },
/**
* jump to the top of the content.
*/
- scrollToTop() {
+ scrollToTop: function() {
this._setScrollTop(0);
this._saveScrollState();
- }
+ },
/**
* jump to the bottom of the content.
*/
- scrollToBottom() {
+ scrollToBottom: function() {
// the easiest way to make sure that the scroll state is correctly
// saved is to do the scroll, then save the updated state. (Calculating
// it ourselves is hard, and we can't rely on an onScroll callback
// happening, since there may be no user-visible change here).
this._setScrollTop(Number.MAX_VALUE);
this._saveScrollState();
- }
+ },
/**
* Page up/down.
*
* mult: -1 to page up, +1 to page down
*/
- scrollRelative(mult) {
+ scrollRelative: function(mult) {
var scrollNode = this._getScrollNode();
var delta = mult * scrollNode.clientHeight * 0.5;
this._setScrollTop(scrollNode.scrollTop + delta);
this._saveScrollState();
- }
+ },
/**
* Scroll up/down in response to a scroll key
*/
- handleScrollKey(ev) {
+ handleScrollKey: function(ev) {
switch (ev.keyCode) {
case KeyCode.PAGE_UP:
if (!ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {
@@ -447,7 +505,7 @@ export default class ScrollPanel extends StickyContainer {
}
break;
}
- }
+ },
/* Scroll the panel to bring the DOM node with the scroll token
* `scrollToken` into view.
@@ -460,7 +518,7 @@ export default class ScrollPanel extends StickyContainer {
* node (specifically, the bottom of it) will be positioned. If omitted, it
* defaults to 0.
*/
- scrollToToken(scrollToken, pixelOffset, offsetBase) {
+ scrollToToken: function(scrollToken, pixelOffset, offsetBase) {
pixelOffset = pixelOffset || 0;
offsetBase = offsetBase || 0;
@@ -482,11 +540,11 @@ export default class ScrollPanel extends StickyContainer {
// ... then make it so.
this._restoreSavedScrollState();
- }
+ },
// set the scrollTop attribute appropriately to position the given child at the
// given offset in the window. A helper for _restoreSavedScrollState.
- _scrollToToken(scrollToken, pixelOffset) {
+ _scrollToToken: function(scrollToken, pixelOffset) {
/* find the dom node with the right scrolltoken */
var node;
var messages = this.refs.itemlist.children;
@@ -518,9 +576,9 @@ export default class ScrollPanel extends StickyContainer {
this._setScrollTop(scrollNode.scrollTop + scrollDelta);
}
- }
+ },
- _saveScrollState() {
+ _saveScrollState: function() {
if (this.props.stickyBottom && this.isAtBottom()) {
this.scrollState = { stuckAtBottom: true };
debuglog("ScrollPanel: Saved scroll state", this.scrollState);
@@ -558,9 +616,9 @@ export default class ScrollPanel extends StickyContainer {
} else {
debuglog("ScrollPanel: unable to save scroll state: found no children in the viewport");
}
- }
+ },
- _restoreSavedScrollState() {
+ _restoreSavedScrollState: function() {
var scrollState = this.scrollState;
var scrollNode = this._getScrollNode();
@@ -570,9 +628,9 @@ export default class ScrollPanel extends StickyContainer {
this._scrollToToken(scrollState.trackedScrollToken,
scrollState.pixelOffset);
}
- }
+ },
- _setScrollTop(scrollTop) {
+ _setScrollTop: function(scrollTop) {
var scrollNode = this._getScrollNode();
var prevScroll = scrollNode.scrollTop;
@@ -594,12 +652,12 @@ export default class ScrollPanel extends StickyContainer {
debuglog("ScrollPanel: set scrollTop:", scrollNode.scrollTop,
"requested:", scrollTop,
"_lastSetScroll:", this._lastSetScroll);
- }
+ },
/* get the DOM node which has the scrollTop property we care about for our
* message panel.
*/
- _getScrollNode() {
+ _getScrollNode: function() {
if (this.unmounted) {
// this shouldn't happen, but when it does, turn the NPE into
// something more meaningful.
@@ -607,91 +665,21 @@ export default class ScrollPanel extends StickyContainer {
}
return this.refs.geminiPanel.scrollbar.getViewElement();
- }
+ },
- render() {
+ render: function() {
// TODO: the classnames on the div and ol could do with being updated to
// reflect the fact that we don't necessarily contain a list of messages.
// it's not obvious why we have a separate div and ol anyway.
- return (
-
-
-
- {this.props.children}
-
-
-
- );
- }
-}
-
-ScrollPanel.propTypes = {
- /* stickyBottom: if set to true, then once the user hits the bottom of
- * the list, any new children added to the list will cause the list to
- * scroll down to show the new element, rather than preserving the
- * existing view.
- */
- stickyBottom: React.PropTypes.bool,
-
- /* startAtBottom: if set to true, the view is assumed to start
- * scrolled to the bottom.
- * XXX: It's likley this is unecessary and can be derived from
- * stickyBottom, but I'm adding an extra parameter to ensure
- * behaviour stays the same for other uses of ScrollPanel.
- * If so, let's remove this parameter down the line.
- */
- startAtBottom: React.PropTypes.bool,
-
- /* onFillRequest(backwards): a callback which is called on scroll when
- * the user nears the start (backwards = true) or end (backwards =
- * false) of the list.
- *
- * This should return a promise; no more calls will be made until the
- * promise completes.
- *
- * The promise should resolve to true if there is more data to be
- * retrieved in this direction (in which case onFillRequest may be
- * called again immediately), or false if there is no more data in this
- * directon (at this time) - which will stop the pagination cycle until
- * the user scrolls again.
- */
- onFillRequest: React.PropTypes.func,
-
- /* onUnfillRequest(backwards): a callback which is called on scroll when
- * there are children elements that are far out of view and could be removed
- * without causing pagination to occur.
- *
- * This function should accept a boolean, which is true to indicate the back/top
- * of the panel and false otherwise, and a scroll token, which refers to the
- * first element to remove if removing from the front/bottom, and last element
- * to remove if removing from the back/top.
- */
- onUnfillRequest: React.PropTypes.func,
-
- /* onScroll: a callback which is called whenever any scroll happens.
- */
- onScroll: React.PropTypes.func,
-
- /* onResize: a callback which is called whenever the Gemini scroll
- * panel is resized
- */
- onResize: React.PropTypes.func,
-
- /* className: classnames to add to the top-level div
- */
- className: React.PropTypes.string,
-
- /* style: styles to add to the top-level div
- */
- style: React.PropTypes.object,
-};
-
-ScrollPanel.defaultProps = {
- stickyBottom: true,
- startAtBottom: true,
- onFillRequest: function(backwards) { return Promise.resolve(false); },
- onUnfillRequest: function(backwards, scrollToken) {},
- onScroll: function() {},
-};
+ return (
+
+
+ {this.props.children}
+
+
+
+ );
+ },
+});
diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js
index ebd9784b6f..862c3f46d0 100644
--- a/src/components/structures/TimelinePanel.js
+++ b/src/components/structures/TimelinePanel.js
@@ -1147,6 +1147,7 @@ var TimelinePanel = React.createClass({
highlightedEventId={ this.props.highlightedEventId }
readMarkerEventId={ this.state.readMarkerEventId }
readMarkerVisible={ this.state.readMarkerVisible }
+ suppressFirstDateSeparator={ this.state.canBackPaginate }
showUrlPreview={ this.props.showUrlPreview }
showReadReceipts={ this.props.showReadReceipts }
ourUserId={ MatrixClientPeg.get().credentials.userId }
diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js
index 3c139f77a6..e67991ac12 100644
--- a/src/components/structures/UserSettings.js
+++ b/src/components/structures/UserSettings.js
@@ -729,6 +729,7 @@ module.exports = React.createClass({
// to rebind the onChange each time we render
const onChange = (e) => {
if (e.target.checked) {
+ this._syncedSettings[setting.id] = setting.value;
UserSettingsStore.setSyncedSetting(setting.id, setting.value);
}
dis.dispatch({
@@ -741,7 +742,7 @@ module.exports = React.createClass({
type="radio"
name={ setting.id }
value={ setting.value }
- defaultChecked={ this._syncedSettings[setting.id] === setting.value }
+ checked={ this._syncedSettings[setting.id] === setting.value }
onChange={ onChange }
/>
diff --git a/src/components/views/elements/EmojiText.js b/src/components/views/elements/EmojiText.js
index cb6cd2ef5e..faab0241ae 100644
--- a/src/components/views/elements/EmojiText.js
+++ b/src/components/views/elements/EmojiText.js
@@ -1,5 +1,6 @@
/*
Copyright 2016 Aviral Dasgupta
+ Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -15,12 +16,19 @@
*/
import React from 'react';
-import {emojifyText} from '../../../HtmlUtils';
+import {emojifyText, containsEmoji} from '../../../HtmlUtils';
export default function EmojiText(props) {
const {element, children, ...restProps} = props;
- restProps.dangerouslySetInnerHTML = emojifyText(children);
- return React.createElement(element, restProps);
+
+ // fast path: simple regex to detect strings that don't contain
+ // emoji and just return them
+ if (containsEmoji(children)) {
+ restProps.dangerouslySetInnerHTML = emojifyText(children);
+ return React.createElement(element, restProps);
+ } else {
+ return React.createElement(element, restProps, children);
+ }
}
EmojiText.propTypes = {
diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js
index 58273bee67..a58422e840 100644
--- a/src/components/views/messages/TextualBody.js
+++ b/src/components/views/messages/TextualBody.js
@@ -113,14 +113,8 @@ module.exports = React.createClass({
}
}, 10);
}
- // add event handlers to the 'copy code' buttons
- const buttons = ReactDOM.findDOMNode(this).getElementsByClassName("mx_EventTile_copyButton");
- for (let i = 0; i < buttons.length; i++) {
- buttons[i].onclick = (e) => {
- const copyCode = buttons[i].parentNode.getElementsByTagName("code")[0];
- this.copyToClipboard(copyCode.textContent);
- };
- }
+
+ this._addCodeCopyButton();
}
},
@@ -257,6 +251,19 @@ module.exports = React.createClass({
}
},
+ _addCodeCopyButton() {
+ // Add 'copy' buttons to pre blocks
+ ReactDOM.findDOMNode(this).querySelectorAll('.mx_EventTile_body pre').forEach((p) => {
+ const button = document.createElement("span");
+ button.className = "mx_EventTile_copyButton";
+ button.onclick = (e) => {
+ const copyCode = button.parentNode.getElementsByTagName("code")[0];
+ this.copyToClipboard(copyCode.textContent);
+ };
+ p.appendChild(button);
+ });
+ },
+
onCancelClick: function(event) {
this.setState({ widgetHidden: true });
// FIXME: persist this somewhere smarter than local storage
diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js
index 27001ac954..ff656ed793 100644
--- a/src/components/views/rooms/RoomList.js
+++ b/src/components/views/rooms/RoomList.js
@@ -63,7 +63,6 @@ module.exports = React.createClass({
propTypes: {
ConferenceHandler: React.PropTypes.any,
collapsed: React.PropTypes.bool.isRequired,
- currentRoom: React.PropTypes.string,
searchFilter: React.PropTypes.string,
},
@@ -88,6 +87,7 @@ module.exports = React.createClass({
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);
this.refreshRoomList();
@@ -155,6 +155,7 @@ module.exports = React.createClass({
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);
}
// cancel any pending calls to the rate_limited_funcs
@@ -224,6 +225,11 @@ module.exports = React.createClass({
this._delayedRefreshRoomList();
},
+ onEventDecrypted: function(ev) {
+ // An event being decrypted may mean we need to re-order the room list
+ this._delayedRefreshRoomList();
+ },
+
onAccountData: function(ev) {
if (ev.getType() == 'm.direct') {
this._delayedRefreshRoomList();
diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js
index 97568a52a1..a6065d8e92 100644
--- a/src/components/views/rooms/RoomTile.js
+++ b/src/components/views/rooms/RoomTile.js
@@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 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.
@@ -27,6 +28,8 @@ var RoomNotifs = require('../../../RoomNotifs');
var FormattingUtils = require('../../../utils/FormattingUtils');
import AccessibleButton from '../elements/AccessibleButton';
var UserSettingsStore = require('../../../UserSettingsStore');
+import ActiveRoomObserver from '../../../ActiveRoomObserver';
+import RoomViewStore from '../../../stores/RoomViewStore';
module.exports = React.createClass({
displayName: 'RoomTile',
@@ -39,7 +42,6 @@ module.exports = React.createClass({
room: React.PropTypes.object.isRequired,
collapsed: React.PropTypes.bool.isRequired,
- selected: React.PropTypes.bool.isRequired,
unread: React.PropTypes.bool.isRequired,
highlight: React.PropTypes.bool.isRequired,
isInvite: React.PropTypes.bool.isRequired,
@@ -58,6 +60,7 @@ module.exports = React.createClass({
badgeHover : false,
menuDisplayed: false,
notifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId),
+ selected: this.props.room.roomId === RoomViewStore.getRoomId(),
});
},
@@ -87,8 +90,15 @@ module.exports = React.createClass({
}
},
+ _onActiveRoomChange: function() {
+ this.setState({
+ selected: this.props.room.roomId === RoomViewStore.getRoomId(),
+ });
+ },
+
componentWillMount: function() {
MatrixClientPeg.get().on("accountData", this.onAccountData);
+ ActiveRoomObserver.addListener(this.props.room.roomId, this._onActiveRoomChange);
},
componentWillUnmount: function() {
@@ -96,6 +106,7 @@ module.exports = React.createClass({
if (cli) {
MatrixClientPeg.get().removeListener("accountData", this.onAccountData);
}
+ ActiveRoomObserver.removeListener(this.props.room.roomId, this._onActiveRoomChange);
},
onClick: function(ev) {
@@ -174,7 +185,7 @@ module.exports = React.createClass({
var classes = classNames({
'mx_RoomTile': true,
- 'mx_RoomTile_selected': this.props.selected,
+ 'mx_RoomTile_selected': this.state.selected,
'mx_RoomTile_unread': this.props.unread,
'mx_RoomTile_unreadNotify': notifBadges,
'mx_RoomTile_highlight': mentionBadges,
@@ -221,7 +232,7 @@ module.exports = React.createClass({
'mx_RoomTile_badgeShown': badges || this.state.badgeHover || this.state.menuDisplayed,
});
- if (this.props.selected) {
+ if (this.state.selected) {
let nameSelected = {name} ;
label = { nameSelected }
;
diff --git a/src/components/views/voip/CallPreview.js b/src/components/views/voip/CallPreview.js
new file mode 100644
index 0000000000..132e29bd34
--- /dev/null
+++ b/src/components/views/voip/CallPreview.js
@@ -0,0 +1,97 @@
+/*
+Copyright 2017 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import RoomViewStore from '../../../stores/RoomViewStore';
+import CallHandler from '../../../CallHandler';
+import dis from '../../../dispatcher';
+import sdk from '../../../index';
+
+module.exports = React.createClass({
+ displayName: 'CallPreview',
+
+ propTypes: {
+ // A Conference Handler implementation
+ // Must have a function signature:
+ // getConferenceCallForRoom(roomId: string): MatrixCall
+ ConferenceHandler: React.PropTypes.object,
+ },
+
+ getInitialState: function() {
+ return {
+ roomId: RoomViewStore.getRoomId(),
+ activeCall: CallHandler.getAnyActiveCall(),
+ };
+ },
+
+ componentWillMount: function() {
+ this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate);
+ this.dispatcherRef = dis.register(this._onAction);
+ },
+
+ componentWillUnmount: function() {
+ if (this._roomStoreToken) {
+ this._roomStoreToken.remove();
+ }
+ dis.unregister(this.dispatcherRef);
+ },
+
+ _onRoomViewStoreUpdate: function(payload) {
+ if (RoomViewStore.getRoomId() === this.state.roomId) return;
+ this.setState({
+ roomId: RoomViewStore.getRoomId(),
+ });
+ },
+
+ _onAction: function(payload) {
+ switch (payload.action) {
+ // listen for call state changes to prod the render method, which
+ // may hide the global CallView if the call it is tracking is dead
+ case 'call_state':
+ this.setState({
+ activeCall: CallHandler.getAnyActiveCall(),
+ });
+ break;
+ }
+ },
+
+ _onCallViewClick: function() {
+ const call = CallHandler.getAnyActiveCall();
+ if (call) {
+ dis.dispatch({
+ action: 'view_room',
+ room_id: call.groupRoomId || call.roomId,
+ });
+ }
+ },
+
+ render: function() {
+ const callForRoom = CallHandler.getCallForRoom(this.state.roomId);
+ const showCall = (this.state.activeCall && this.state.activeCall.call_state === 'connected' && !callForRoom);
+
+ if (showCall) {
+ const CallView = sdk.getComponent('voip.CallView');
+ return (
+
+ );
+ }
+ return null;
+ },
+});
+
diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json
new file mode 100644
index 0000000000..044d4b1b5c
--- /dev/null
+++ b/src/i18n/strings/ca.json
@@ -0,0 +1,68 @@
+{
+ "People": "Gent",
+ "Add a widget": "Afegeix un giny",
+ "af": "Afrikaans",
+ "ar-ae": "Àrab (Emirats Àrabs Units)",
+ "ar-bh": "Àrab (Bahrain)",
+ "ar-dz": "Àrab (Algèria)",
+ "ar-eg": "Àrab (Egipte)",
+ "ar-iq": "Àrab (Iraq)",
+ "ar-jo": "Àrab (Jordània)",
+ "ar-kw": "Àrab (Kuwait)",
+ "ar-lb": "Àrab (Líban)",
+ "ar-ly": "Àrab (Líbia)",
+ "ar-ma": "Àrab (Marroc)",
+ "ar-om": "Àrab (Oman)",
+ "ar-qa": "Àrab (Qatar)",
+ "ar-sa": "Àrab (Aràbia Saudita)",
+ "ca": "Català",
+ "cs": "Txec",
+ "de-at": "Alemany (Àustria)",
+ "de-ch": "Alemany (Suïssa)",
+ "de": "Alemany",
+ "de-li": "Alemany (Liechtenstein)",
+ "el": "Grec",
+ "de-lu": "Alemany (Luxemburg)",
+ "en-au": "Anglès (Austràlia)",
+ "Account": "Compte",
+ "VoIP": "Veu IP",
+ "No Microphones detected": "No s'ha detectat cap micròfon",
+ "No Webcams detected": "No s'ha detectat cap càmera web",
+ "Microphone": "Micròfon",
+ "Camera": "Càmera",
+ "Advanced": "Avançat",
+ "Algorithm": "Algoritme",
+ "Hide removed messages": "Amaga els missatges esborrats",
+ "Always show message timestamps": "Mostra sempre la marca de temps del missatge",
+ "Alias (optional)": "Àlies (opcional)",
+ "and": "i",
+ "An email has been sent to": "S'ha enviat un correu electrònic a",
+ "Cancel": "Cancel·la",
+ "Close": "Tanca",
+ "Create new room": "Crea una nova sala",
+ "Direct Chat": "Xat directe",
+ "Error": "Error",
+ "Failed to forget room %(errCode)s": "No s'ha pogut oblidar la sala %(errCode)s",
+ "Failed to join the room": "No s'ha pogut unir a la sala",
+ "Favourite": "Favorit",
+ "Mute": "Silenciat",
+ "Room directory": "Directori de sales",
+ "Settings": "Paràmetres",
+ "Start chat": "Inicia un xat",
+ "Failed to change password. Is your password correct?": "Hi ha hagut un error al canviar la vostra contrasenya. És correcte la vostra contrasenya?",
+ "Continue": "Continua",
+ "Custom Server Options": "Opcions de servidor personalitzat",
+ "Dismiss": "Omet",
+ "Notifications": "Notificacions",
+ "Remove": "Elimina",
+ "unknown error code": "codi d'error desconegut",
+ "Sunday": "Diumenge",
+ "Monday": "Dilluns",
+ "Tuesday": "Dimarts",
+ "Wednesday": "Dimecres",
+ "Thursday": "Dijous",
+ "Friday": "Divendres",
+ "Saturday": "Dissabte",
+ "OK": "D'acord",
+ "Welcome page": "Pàgina de benvinguda"
+}
diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json
index 797b045386..7951779e75 100644
--- a/src/i18n/strings/cs.json
+++ b/src/i18n/strings/cs.json
@@ -18,7 +18,7 @@
"Start Chat": "Začít chat",
"This room": "Tato místnost",
"Unencrypted room": "Nezašifrovaná místnost",
- "Failed to upload file": "Nahrát soubor",
+ "Failed to upload file": "Nahrání souboru se nezdařilo",
"Video call": "Videohovor",
"Voice call": "Telefonát",
"Sun": "Ne",
@@ -49,7 +49,7 @@
"Cancel": "Storno",
"Direct Chat": "Přímý chat",
"Error": "Chyba",
- "Failed to join the room": "Nepodařilo se vstoupit do místnosti",
+ "Failed to join the room": "Vstup do místnosti se nezdařil",
"Favourite": "V oblíbených",
"Mute": "Ztišit",
"Continue": "Pokračovat",
@@ -111,5 +111,114 @@
"Attachment": "Příloha",
"Autoplay GIFs and videos": "Automaticky přehrávat GIFy a videa",
"Bug Report": "Hlášení o chybě",
- "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zdali je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci."
+ "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zdali je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci.",
+ "Anyone who knows the room's link, apart from guests": "Kdokoliv, kdo má odkaz na místnost, kromě hostů",
+ "Anyone who knows the room's link, including guests": "Kdokoliv, kdo má odkaz na místnost, a to i hosté",
+ "Banned users": "Vykázaní uživatelé",
+ "Ban": "Vykázat",
+ "Bans user with given id": "Vykáže uživatele s daným id",
+ "Bulk Options": "Hromadné volby",
+ "Can't load user settings": "Nelze načíst uživatelské nastavení",
+ "Cannot add any more widgets": "Nelze přidat žádné další widgety",
+ "Change Password": "Změnit heslo",
+ "%(senderName)s changed their profile picture.": "%(senderName)s změnil/a svůj profilový obrázek.",
+ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s změnil/a název místnosti na %(roomName)s.",
+ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstranil/a název místnosti.",
+ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s změnil/a téma na \"%(topic)s\".",
+ "Changes to who can read history will only apply to future messages in this room": "Změny viditelnosti historie budou platné až pro budoucí zprávy v této místnosti",
+ "Changes your display nickname": "Změní vaši zobrazovanou přezdívku",
+ "Changes colour scheme of current room": "Změní barevné schéma aktuální místnosti",
+ "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.": "V současnosti změna hesla resetuje všechny šifrovací klíče na všech zařízeních, což vám znepřístupní historii zašifrovaných chatů, pokud si nejprve nevyexportujete klíče svých místností a pak je do nich znova nevložíte. Toto bude v budoucnu lépe ošetřeno.",
+ "Clear Cache and Reload": "Vymazat vyrovnávací paměť a načíst znovu",
+ "Clear Cache": "Vymazat vyrovnávací paměť",
+ "Click here to join the discussion!": "Kliknutím zde se přidáte k diskuzi!",
+ "Command error": "Chyba příkazu",
+ "Commands": "Příkazy",
+ "Conference call failed.": "Konferenční hovor selhal.",
+ "Conference calling is in development and may not be reliable.": "Konferenční hovory jsou stále ve vývoji a nemusí být spolehlivé.",
+ "Conference calls are not supported in encrypted rooms": "V šifrovaných místnostech nejsou konferenční hovory podporovány",
+ "Conference calls are not supported in this client": "V tomto klientovi nejsou konferenční hovory podporovány",
+ "Confirm password": "Potvrďte heslo",
+ "Confirm your new password": "Potvrďte své nové heslo",
+ "Could not connect to the integration server": "Nepodařilo se spojit se začleňovacím serverem",
+ "%(count)s new messages|one": "%(count)s nová zpráva",
+ "%(count)s new messages|other": "%(count)s nových zpráv",
+ "Create an account": "Vytvořit účet",
+ "Create Room": "Vytvořit místnost",
+ "Cryptography": "Kryptografie",
+ "Current password": "Současné heslo",
+ "Custom": "Vlastní",
+ "Custom level": "Vlastní úroveň",
+ "/ddg is not a command": "/ddg není příkazem",
+ "Deactivate Account": "Deaktivovat účet",
+ "Deactivate my account": "Deaktivovat můj účet",
+ "Decline": "Odmítnout",
+ "Decrypt %(text)s": "Dešifrovat %(text)s",
+ "Decryption error": "Chyba dešifrování",
+ "Delete": "Vymazat",
+ "Delete widget": "Vymazat widget",
+ "Default": "Výchozí",
+ "Device already verified!": "Zařízení již bylo ověřeno!",
+ "Device ID": "ID zařízení",
+ "Device ID:": "ID zařízení:",
+ "device id: ": "id zařízení: ",
+ "Device key:": "Klíč zařízení:",
+ "Devices": "Zařízení",
+ "Direct chats": "Přímé chaty",
+ "Disable Notifications": "Vypnout upozornění",
+ "disabled": "vypnuto",
+ "Disinvite": "Odvolat pozvání",
+ "Display name": "Zobrazované jméno",
+ "Don't send typing notifications": "Neupozorňovat ostatní, že píšu",
+ "Download %(text)s": "Stáhnout %(text)s",
+ "Drop File Here": "Přetáhněte soubor sem",
+ "Edit": "Upravit",
+ "Email": "E-mail",
+ "Email address": "E-mailová adresa",
+ "Email address (optional)": "E-mailová adresa (nepovinná)",
+ "Email, name or matrix ID": "E-mail, jméno nebo matrix ID",
+ "Emoji": "Emodži",
+ "Enable automatic language detection for syntax highlighting": "Zapnout kvůli zvýrazňování syntaxe automatické rozpoznávání jazyka",
+ "Enable encryption": "Zapnout šifrování",
+ "Enable Notifications": "Zapnout upozornění",
+ "enabled": "zapnuto",
+ "Encrypted by a verified device": "Zašifrováno ověřeným zařízením",
+ "Encrypted by an unverified device": "Zašifrováno neověřeným zařízením",
+ "Encrypted messages will not be visible on clients that do not yet implement encryption": "Zašifrované zprávy nepůjde vidět v klientech, kteří šifrování ještě nezavedli",
+ "Encrypted room": "Zašifrovaná místnost",
+ "Encryption is enabled in this room": "V této místnosti je zapnuto šifrování",
+ "Encryption is not enabled in this room": "V této místnosti není zapnuto šifrování",
+ "%(senderName)s ended the call.": "%(senderName)s ukončil/a hovor.",
+ "End-to-end encryption information": "Informace o end-to-end šifrování",
+ "End-to-end encryption is in beta and may not be reliable": "End-to-end šifrování je v raném vývoji a nemusí být spolehlivé",
+ "Enter Code": "Zadejte kód",
+ "Enter passphrase": "Zadejte heslo",
+ "Error decrypting attachment": "Chyba při dešifrování přílohy",
+ "Error: Problem communicating with the given homeserver.": "Chyba: problém v komunikaci s daným domovským serverem.",
+ "Event information": "Informace o události",
+ "Existing Call": "Probíhající hovor",
+ "Export": "Exportovat",
+ "Export E2E room keys": "Exportovat E2E klíče místnosti",
+ "Failed to ban user": "Nepodařilo se vykázat uživatele",
+ "Failed to delete device": "Nepodařilo se vymazat zařízení",
+ "Failed to join room": "Vstup do místnosti se nezdařil",
+ "Failed to kick": "Vykopnutí se nezdařilo",
+ "Failed to leave room": "Opuštění místnosti se nezdařilo",
+ "Failed to mute user": "Ztlumení uživatele se nezdařilo",
+ "Failed to send email": "Odeslání e-mailu se nezdařilo",
+ "Failed to save settings": "Uložení nastavení se nezdařilo",
+ "Failed to reject invitation": "Odmítnutí pozvánky se nezdařilo",
+ "Failed to reject invite": "Odmítnutí pozvání se nezdařilo",
+ "Failed to register as guest:": "Registrace jako host se nezdařila:",
+ "Failed to send request.": "Odeslání žádosti se nezdařilo.",
+ "Failed to set avatar.": "Nastavení avataru se nezdařilo.",
+ "Failed to set display name": "Nastavení zobrazovaného jména se nezdařilo",
+ "Failed to set up conference call": "Nastavení konferenčního hovoru se nezdařilo",
+ "Failed to toggle moderator status": "Změna statusu moderátora se nezdařila",
+ "Failed to unban": "Odvolání vykázání se nezdařilo",
+ "Failed to upload profile picture!": "Nahrání profilového obrázku se nezdařilo",
+ "Failure to create room": "Vytvoření místnosti se nezdařilo",
+ "Forget room": "Zapomenout místnost",
+ "Forgot your password?": "Zapomněl/a jste své heslo?",
+ "For security, this session has been signed out. Please sign in again.": "Z bezpečnostních důvodů bylo toto přihlášení ukončeno. Přihlašte se prosím znovu."
}
diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json
index 30c7540f43..09ba57b329 100644
--- a/src/i18n/strings/de_DE.json
+++ b/src/i18n/strings/de_DE.json
@@ -293,12 +293,12 @@
"Riot was not given permission to send notifications - please try again": "Riot hat keine Berechtigung für das Senden von Benachrichtigungen erhalten - bitte erneut versuchen",
"This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet",
"This email address was not found": "Diese E-Mail-Adresse konnte nicht gefunden werden",
- "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Homeserver",
+ "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Heimserver",
"The file '%(fileName)s' failed to upload": "Das Hochladen der Datei '%(fileName)s' schlug fehl",
"The remote side failed to pick up": "Die Gegenstelle konnte nicht abheben",
"This phone number is already in use": "Diese Telefonnummer wird bereits verwendet",
"Unable to restore previous session": "Die vorherige Sitzung konnte nicht wiederhergestellt werden",
- "Unable to capture screen": "Der Bildschirm konnte nicht aufgenommen werden.",
+ "Unable to capture screen": "Der Bildschirm konnte nicht aufgenommen werden",
"Unable to enable Notifications": "Benachrichtigungen konnten nicht aktiviert werden",
"Upload Failed": "Upload fehlgeschlagen",
"VoIP is unsupported": "VoIP wird nicht unterstützt",
@@ -549,7 +549,7 @@
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal verlassen und wieder neu betreten",
"%(severalUsers)sleft and rejoined": "%(severalUsers)shaben den Raum verlassen und wieder neu betreten",
"%(oneUser)sleft left and rejoined": "%(oneUser)sging und trat erneut bei",
- "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s mal abgelehnt",
+ "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s-mal abgelehnt",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt",
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt",
"%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung abgelehnt",
@@ -557,7 +557,7 @@
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)swurde die Einladung %(repeats)s mal wieder entzogen",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)szogen ihre Einladungen zurück",
"%(oneUser)shad their invitation withdrawn": "%(oneUser)swurde die ursprüngliche Einladung wieder entzogen",
- "were invited %(repeats)s times": "wurden %(repeats)s mal eingeladen",
+ "were invited %(repeats)s times": "wurden %(repeats)s-mal eingeladen",
"was invited %(repeats)s times": "wurde %(repeats)s mal eingeladen",
"were invited": "wurden eingeladen",
"were banned %(repeats)s times": "wurden %(repeats)s-mal aus dem Raum verbannt",
@@ -906,7 +906,7 @@
"You are a member of these groups:": "Du bist Mitglied in folgenden Gruppen:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Gruppe um deine Community darzustellen! Definiere eine Menge von Räumen und deine eigene angepasste Startseite um deinen Bereich im Matrix-Universum zu markieren.",
"Join an existing group": "Trete eine existierenden Gruppe bei",
- "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Um einer bereits vorhandenen Gruppe beitreten zu können, muss dir die Gruppen-Kennung bekannt sein. Diese sieht ungefähr so aus: '+example:matrix.org '.",
+ "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Um einer bereits vorhandenen Gruppe beitreten zu können, muss dir die Gruppen-Kennung bekannt sein. Diese sieht aus wie +example:matrix.org .",
"Featured Rooms:": "Hervorgehobene Räume:",
"Error whilst fetching joined groups": "Fehler beim Laden beigetretener Gruppen",
"Featured Users:": "Hervorgehobene Nutzer:",
@@ -924,5 +924,8 @@
"NOTE: Apps are not end-to-end encrypted": "BEACHTE: Apps sind nicht Ende-zu-Ende verschlüsselt",
"%(widgetName)s widget added by %(senderName)s": "Widget \"%(widgetName)s\" von %(senderName)s hinzugefügt",
"%(widgetName)s widget removed by %(senderName)s": "Widget \"%(widgetName)s\" von %(senderName)s entfernt",
- "Robot check is currently unavailable on desktop - please use a web browser ": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen Webbrowser verwenden"
+ "Robot check is currently unavailable on desktop - please use a web browser ": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen Webbrowser verwenden",
+ "%(widgetName)s widget modified by %(senderName)s": "Das Widget '%(widgetName)s' wurde von %(senderName)s bearbeitet",
+ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
+ "%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s"
}
diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json
index 7d80c84355..e8a7e3a1fc 100644
--- a/src/i18n/strings/es.json
+++ b/src/i18n/strings/es.json
@@ -42,7 +42,7 @@
"Banned users": "Usuarios bloqueados",
"Bans user with given id": "Bloquear usuario por ID",
"Blacklisted": "En lista negra",
- "Bug Report": "Reporte de error",
+ "Bug Report": "Reporte de fallo",
"Bulk Options": "Opciones masivas",
"Call Timeout": "Tiempo de espera de la llamada",
"Can't connect to homeserver - please check your connectivity and ensure your homeserver's SSL certificate is trusted.": "No se puede conectar con el servidor - Por favor verifique su conexión y asegúrese de que su certificado SSL del servidor sea confiable.",
@@ -128,7 +128,7 @@
"Failed to delete device": "Falló al borrar el dispositivo",
"Failed to forget room %(errCode)s": "Falló al olvidar la sala %(errCode)s",
"Failed to join room": "Falló al unirse a la sala",
- "Failed to join the room": "Falló al unirse a la sala",
+ "Failed to join the room": "Error al unirse a la sala",
"Failed to kick": "Falló al expulsar",
"Failed to leave room": "Falló al dejar la sala",
"Failed to load timeline position": "Falló al cargar el historico",
diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json
index 50f3b5b63a..8738303a1a 100644
--- a/src/i18n/strings/eu.json
+++ b/src/i18n/strings/eu.json
@@ -658,7 +658,7 @@
"%(oneUser)sleft and rejoined %(repeats)s times": "Erabiltzaile %(oneUser)s %(repeats)s aldiz atera eta berriro elkartu da",
"%(severalUsers)sleft and rejoined": "%(severalUsers)s erabiltzaile atera eta berriro elkartu dira",
"%(oneUser)sleft and rejoined": "Erabiltzaile %(oneUser)s atera eta berriro sartu da",
- "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers) erabiltzaileen gonbidapenak %(repeats)s aldiz atzera bota dira",
+ "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)s erabiltzaileen gonbidapenak %(repeats)s aldiz atzera bota dira",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "Erabiltzaile %(oneUser)sen gonbidapena %(repeats)s aldiz bota da atzera",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s erabiltzaileen gonbidapena atzera bota da",
"%(oneUser)shad their invitation withdrawn": "Erabiltzaile %(oneUser)sen gonbidapena atzera bota da",
diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json
index 0967ef424b..4d0c0ecbd4 100644
--- a/src/i18n/strings/fi.json
+++ b/src/i18n/strings/fi.json
@@ -1 +1,97 @@
-{}
+{
+ "a room": "huone",
+ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Numeroon +%(msisdn)s on lähetetty tekstiviesti. Ole hyvä ja syötä sen sisältämä varmennuskoodi",
+ "Accept": "Hyväksy",
+ "Cancel": "Peruuta",
+ "Close": "Sulje",
+ "Create new room": "Luo uusi huone",
+ "Custom Server Options": "Omat palvelinasetukset",
+ "Direct Chat": "Suora viestittely",
+ "Dismiss": "Hylkää",
+ "Drop here %(toAction)s": "Pudota tänne %(toAction)s",
+ "Error": "Virhe",
+ "Failed to forget room %(errCode)s": "Huoneen unohtaminen epäonnistui %(errCode)s",
+ "Failed to join the room": "Huoneeseen liittyminen epäonnistui",
+ "Favourite": "Suosikki",
+ "Mute": "Vaimenna",
+ "Notifications": "Ilmoitukset",
+ "Operation failed": "Toiminto epäonnistui",
+ "Please Register": "Ole hyvä ja rekisteröidy",
+ "Remove": "Poista",
+ "Room directory": "Huonehakemisto",
+ "Search": "Haku",
+ "Settings": "Asetukset",
+ "Start chat": "Aloita keskustelu",
+ "unknown error code": "tuntematon virhekoodi",
+ "Sunday": "Sunnuntai",
+ "Monday": "Maanantai",
+ "Tuesday": "Tiistai",
+ "Wednesday": "Keskiviikko",
+ "Thursday": "Torstai",
+ "Friday": "Perjantai",
+ "Saturday": "Lauantai",
+ "Welcome page": "Tervetulosivu",
+ "Failed to change password. Is your password correct?": "Salasanan muuttaminen epäonnistui. Onko salasanasi oikein?",
+ "Continue": "Jatka",
+ "powered by Matrix": "Matrix-pohjainen",
+ "Active call (%(roomName)s)": "Aktivoi puhelu (%(roomName)s)",
+ "Add": "Lisää",
+ "Add a topic": "Lisää aihe",
+ "Add email address": "Lisää sähköpostiosoite",
+ "Add phone number": "Lisää puhelinnumero",
+ "Admin": "Ylläpitäjä",
+ "Admin tools": "Ylläpitotyökalut",
+ "Allow": "Salli",
+ "And %(count)s more...": "Ja %(count)s lisää...",
+ "VoIP": "VoIP",
+ "Missing Media Permissions, click here to request.": "Mediaoikeudet puuttuvat. Klikkaa tästä pyytääksesi oikeudet.",
+ "No Microphones detected": "Mikrofonia ei löytynyt",
+ "No Webcams detected": "Webkameraa ei löytynyt",
+ "No media permissions": "Ei mediaoikeuksia",
+ "You may need to manually permit Riot to access your microphone/webcam": "Sinun täytyy ehkä manuaalisesti sallia mikrofonin/webkameran käyttö",
+ "Default Device": "Oletuslaite",
+ "Microphone": "Mikrofoni",
+ "Camera": "Kamera",
+ "Advanced": "Kehittyneet",
+ "Algorithm": "Algoritmi",
+ "Hide removed messages": "Piilota poistetut viestit",
+ "Always show message timestamps": "Näytä aina viestien aikaleimat",
+ "Authentication": "Autentikointi",
+ "Alias (optional)": "Alias (valinnainen)",
+ "all room members": "kaikki huoneen jäsenet",
+ "all room members, from the point they are invited": "kaikki huoneen jäsenet, alkaen kutsusta",
+ "all room members, from the point they joined": "kaikki huoneen jäsenet, liittymisestä lähtien",
+ "and": "ja",
+ "%(items)s and %(remaining)s others": "%(items)s ja %(remaining)s lisää",
+ "%(items)s and one other": "%(items)s ja yksi lisää",
+ "%(items)s and %(lastItem)s": "%(items)s ja %(lastItem)s",
+ "and %(count)s others....other": "ja %(count)s lisää...",
+ "and %(count)s others....one": "ja yksi lisää...",
+ "%(names)s and %(lastPerson)s are typing": "%(names)s ja %(lastPerson)s kirjoittavat",
+ "%(names)s and one other are typing": "%(names)s ja yksi muu kirjoittavat",
+ "%(names)s and %(count)s others are typing": "%(names)s ja %(count)s muuta kirjoittavat",
+ "An email has been sent to": "Sähköposti on lähetetty osoitteeseen",
+ "A new password must be entered.": "Sinun täytyy syöttää uusi salasana.",
+ "%(senderName)s answered the call.": "%(senderName)s vastasi puheluun.",
+ "anyone": "kuka tahansa",
+ "An error has occurred.": "Virhe.",
+ "Anyone": "Kaikki",
+ "Anyone who knows the room's link, apart from guests": "Kaikki jotka tietävät huoneen osoitteen, paitsi vieraat",
+ "Anyone who knows the room's link, including guests": "Kaikki jotka tietävät huoneen osoitteen, mukaanlukien vieraat",
+ "Are you sure?": "Oletko varma?",
+ "Are you sure you want to leave the room '%(roomName)s'?": "Oletko varma että haluat poistua huoneesta '%(roomName)s'?",
+ "Are you sure you want to reject the invitation?": "Oletko varma että haluat hylätä kutsun?",
+ "Are you sure you want to upload the following files?": "Oletko varma että haluat ladata seuraavat tiedostot?",
+ "Attachment": "Liite",
+ "Autoplay GIFs and videos": "Toista automaattisesti GIF-animaatiot ja videot",
+ "%(senderName)s banned %(targetName)s.": "%(senderName)s antoi porttikiellon käyttäjälle %(targetName)s.",
+ "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Yhdistäminen kotipalvelimeen epäonnistui. Ole hyvä ja tarkista verkkoyhteytesi ja varmista että kotipalvelimen SSL-sertifikaatti on luotettu, ja että jokin selaimen lisäosa ei estä pyyntöjen lähettämisen.",
+ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts .": "Yhdistäminen kotipalveluun HTTP:n avulla ei ole mahdollista kun selaimen osoitepalkissa on HTTPS URL. Käytä joko HTTPS tai salli turvattomat skriptit .",
+ "Can't load user settings": "Käyttäjäasetusten lataaminen epäonnistui",
+ "Change Password": "Muuta salasana",
+ "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s muutti näyttönimensä %(oldDisplayName)s -> %(displayName)s.",
+ "%(senderName)s changed their profile picture.": "%(senderName)s muutti profiilikuvansa.",
+ "%(targetName)s accepted an invitation.": "%(targetName)s hyväksyi kutsun.",
+ "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hyväksyi kutsun käyttäjän %(displayName)s puolesta.",
+ "Account": "Tili"
+}
diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json
index c29bde5be0..3dcef42c58 100644
--- a/src/i18n/strings/hu.json
+++ b/src/i18n/strings/hu.json
@@ -835,7 +835,7 @@
"You are a member of these groups:": "Ezeknek a csoportoknak vagy a tagja:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Hozz létre csoportot a közösség meghatározásához! Jelölj ki szobákat és saját kezdőoldalt amivel meghatározhatod a territóriumodat a Matrix univerzumában.",
"Join an existing group": "Csatlakozz meglévő csoporthoz",
- "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Ahhoz, hogy meglévő csoporthoz csatlakozhass tudnod kell a csoport azonosítóját ami valahogy így nézhet ki: +példa:matrix.org .",
+ "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Ahhoz, hogy meglévő csoporthoz csatlakozhass tudnod kell a csoport azonosítóját ami valahogy így nézhet ki: +example:matrix.org .",
"Featured Rooms:": "Kiemelt szobák:",
"Error whilst fetching joined groups": "Hiba a csatlakozott csoportok betöltésénél",
"Featured Users:": "Kiemelt felhasználók:",
@@ -852,5 +852,6 @@
"The maximum permitted number of widgets have already been added to this room.": "A maximálisan megengedett számú kisalkalmazás már hozzá van adva a szobához.",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s hozzáadta",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s eltávolította",
- "Robot check is currently unavailable on desktop - please use a web browser ": "Robot ellenőrzés az asztali verzióban nem érhető el - használd a web böngészőt "
+ "Robot check is currently unavailable on desktop - please use a web browser ": "Robot ellenőrzés az asztali verzióban nem érhető el - használd a web böngészőt ",
+ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s módosította"
}
diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json
index 23b06dca28..3620c31816 100644
--- a/src/i18n/strings/nl.json
+++ b/src/i18n/strings/nl.json
@@ -13,9 +13,9 @@
"Algorithm": "Algoritme",
"Always show message timestamps": "Laat altijd tijdstempels van berichten zien",
"Authentication": "Authenticatie",
- "all room members": "alle kamer leden",
- "all room members, from the point they are invited": "alle kamer leden, vanaf het moment dat ze uitgenodigt zijn",
- "all room members, from the point they joined": "alle kamer leden, vanaf het moment dat ze toegetreden zijn",
+ "all room members": "alle kamerleden",
+ "all room members, from the point they are invited": "alle kamerleden, vanaf het moment dat ze uitgenodigt zijn",
+ "all room members, from the point they joined": "alle kamerleden, vanaf het moment dat ze toegetreden zijn",
"an address": "een adres",
"and": "en",
"%(items)s and %(remaining)s others": "%(items)s en %(remaining)s andere",
@@ -26,13 +26,13 @@
"%(names)s and %(lastPerson)s are typing": "%(names)s en %(lastPerson)s zijn aan het typen",
"%(names)s and one other are typing": "%(names)s en één andere zijn aan het typen",
"%(names)s and %(count)s others are typing": "%(names)s en %(count)s andere zijn aan het typen",
- "An email has been sent to": "Er is een email verzonden naar",
+ "An email has been sent to": "Er is een e-mail verzonden naar",
"A new password must be entered.": "Er moet een nieuw wachtwoord worden ingevoerd.",
- "%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audio gesprek.",
+ "%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audiogesprek.",
"anyone": "iedereen",
"An error has occurred.": "Er is een fout opgetreden.",
- "Anyone who knows the room's link, apart from guests": "Iedereen die de kamer link weet, behalve gasten",
- "Anyone who knows the room's link, including guests": "Iedereen die de kamer link weet, inclusief gasten",
+ "Anyone who knows the room's link, apart from guests": "Iedereen die de kamerlink weet, behalve gasten",
+ "Anyone who knows the room's link, including guests": "Iedereen die de kamerlink weet, inclusief gasten",
"Are you sure?": "Weet je het zeker?",
"Are you sure you want to reject the invitation?": "Weet je zeker dat je de uitnodiging wilt weigeren?",
"Are you sure you want upload the following files?": "Weet je zeker dat je de volgende bestanden wilt uploaden?",
@@ -41,21 +41,21 @@
"%(senderName)s banned %(targetName)s.": "%(senderName)s heeft %(targetName)s verbannen.",
"Ban": "Verban",
"Banned users": "Verbannen gebruikers",
- "Bans user with given id": "Verbant de gebruiker met de gegeven id",
+ "Bans user with given id": "Verbant de gebruiker met het gegeven ID",
"Blacklisted": "Buitengesloten",
"Bug Report": "Bug report",
"Bulk Options": "Bulk opties",
"Call Timeout": "Gesprek time-out",
"Can't connect to homeserver - please check your connectivity and ensure your homeserver's SSL certificate is trusted.": "Kan niet met de homeserver verbinden - controleer alsjeblieft je verbinding en wees zeker dat je homeserver's SSL certificaat vertrouwd wordt.",
- "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts .": "Kan niet met de homeserver verbinden via HTTP wanneer er een HTTPS URL in je browser balk staat. Gebruik HTTPS of activeer onveilige scripts .",
- "Can't load user settings": "Kan de gebruiker instellingen niet laden",
+ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts .": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of activeer onveilige scripts .",
+ "Can't load user settings": "Kan de gebruikersinstellingen niet laden",
"Change Password": "Wachtwoord veranderen",
- "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s heeft zijn of haar weergave naam veranderd van %(oldDisplayName)s naar %(displayName)s.",
- "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profiel foto veranderd.",
+ "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam veranderd van %(oldDisplayName)s naar %(displayName)s.",
+ "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto veranderd.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.",
- "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de kamer naam van %(roomName)s gewijzigd.",
+ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de kamernaam van %(roomName)s gewijzigd.",
"%(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 historie kan lezen worden alleen maar toegepast op toekomstige berichten in deze kamer",
+ "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 kamer",
"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 kamer sleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.",
"Clear Cache and Reload": "Legen cache en herlaad",
@@ -67,16 +67,16 @@
"click to reveal": "klik om te laten zien",
"Click to unmute video": "Klik om de demping van de video op te heffen",
"Click to unmute audio": "Klik om het dempen van het geluid op te heffen",
- "Command error": "Opdracht fout",
+ "Command error": "Opdrachtfout",
"Commands": "Opdrachten",
- "Conference call failed.": "Conferentie gesprek mislukt.",
- "Conference calling is in development and may not be reliable.": "Conferentie gesprekken zijn nog in ontwikkelingen en kunnen onbetrouwbaar zijn.",
- "Conference calls are not supported in encrypted rooms": "Conferentie gesprekken worden niet ondersteunt in versleutelde kamers",
- "Conference calls are not supported in this client": "Conferentie gesprekken worden niet ondersteunt in deze client",
+ "Conference call failed.": "Conferentiegesprek mislukt.",
+ "Conference calling is in development and may not be reliable.": "Conferentiegesprekken zijn nog in ontwikkelingen en kunnen onbetrouwbaar zijn.",
+ "Conference calls are not supported in encrypted rooms": "Conferentiegesprekken worden niet ondersteunt in versleutelde kamers",
+ "Conference calls are not supported in this client": "Conferentiegesprekken worden niet ondersteunt in deze client",
"Confirm password": "Bevestigen wachtwoord",
"Confirm your new password": "Bevestig je nieuwe wachtwoord",
"Continue": "Doorgaan",
- "Could not connect to the integration server": "Mislukt om te verbinden met de integratie server",
+ "Could not connect to the integration server": "Mislukt om te verbinden met de integratieserver",
"Cancel": "Annuleren",
"a room": "een ruimte",
"Accept": "Accepteren",
@@ -182,20 +182,20 @@
"tag as %(tagName)s": "Met %(tagName)s labelen",
"tag direct chat": "Privéchat labelen",
"Tagged as: ": "Gelabeld als: ",
- "Sun": "Zon",
- "Mon": "Maa",
- "Tue": "Din",
- "Wed": "Woe",
- "Thu": "Don",
- "Fri": "Vrij",
- "Sat": "Zat",
+ "Sun": "Zo",
+ "Mon": "Ma",
+ "Tue": "Di",
+ "Wed": "Wo",
+ "Thu": "Do",
+ "Fri": "Vr",
+ "Sat": "Za",
"Jan": "Jan",
"Feb": "Feb",
- "Mar": "Maa",
+ "Mar": "Mrt",
"Apr": "Apr",
"May": "Mei",
- "Jun": "Juni",
- "Jul": "Juli",
+ "Jun": "Jun",
+ "Jul": "Jul",
"Aug": "Aug",
"Sep": "Sep",
"Oct": "Okt",
@@ -214,7 +214,7 @@
"Current password": "Huidig wachtwoord",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de kamer verwijderd.",
"Create a new chat or reuse an existing one": "Maak een nieuwe chat aan of ga verder met een bestaande",
- "Create Room": "Maak een kamer",
+ "Create Room": "Maak een kamer aan",
"Curve25519 identity key": "Curve25519-identiteitssleutel",
"/ddg is not a command": "/ddg is geen commando",
"Deactivate Account": "Account Deactiveren",
@@ -239,7 +239,7 @@
"Don't send typing notifications": "Geen typnotificatie sturen",
"Download %(text)s": "%(text)s Downloaden",
"Drop File Here": "Plaats Bestand Hier",
- "Ed25519 fingerprint": "Ed25519 vingerafdruk",
+ "Ed25519 fingerprint": "Ed25519-vingerafdruk",
"Email": "E-mail",
"Email address": "E-mailadres",
"Email address (optional)": "E-mailadres (optioneel)",
@@ -249,22 +249,22 @@
"Deops user with given id": "Ontmachtigd gebruiker met het gegeven ID",
"Default": "Standaard",
"Disable inline URL previews by default": "URL-voorvertoningen standaard uitschakelen",
- "Displays action": "Weergeeft actie",
+ "Displays action": "Geeft actie weer",
"Drop here to tag %(section)s": "Hiernaartoe verplaatsen om %(section)s te etiketteren",
- "Email, name or matrix ID": "E-mail, naam of matrix ID",
+ "Email, name or matrix ID": "E-mail, naam of matrix-ID",
"Emoji": "Emoji",
"Enable encryption": "Versleuteling inschakelen",
"Enable Notifications": "Notificaties inschakelen",
"enabled": "ingeschakeld",
- "Encrypted by a verified device": "Versleuteld bij een geverifieerd apparaat",
- "Encrypted by an unverified device": "Versleuteld bij een niet geverifieerd apparaat",
+ "Encrypted by a verified device": "Versleuteld door een geverifieerd apparaat",
+ "Encrypted by an unverified device": "Versleuteld door een niet-geverifieerd apparaat",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Versleutelde berichten zullen nog niet zichtbaar zijn op applicaties die geen versleuteling ondersteunen",
"Encrypted room": "Versleutelde ruimte",
"Encryption is enabled in this room": "Versleuteling is ingeschakeld in deze ruimte",
"Encryption is not enabled in this room": "Versleuteling is niet ingeschakeld in deze ruimte",
"%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.",
- "End-to-end encryption information": "Eind-tot-eind versleuteling informatie",
- "End-to-end encryption is in beta and may not be reliable": "Eind-tot-eind versleuteling is nog in beta en kan onbetrouwbaar zijn",
+ "End-to-end encryption information": "end-to-endbeveiligingsinformatie",
+ "End-to-end encryption is in beta and may not be reliable": "End-to-endbeveiliging is nog in bèta en kan onbetrouwbaar zijn",
"Enter Code": "Voer code in",
"Enter passphrase": "Voer wachtzin in",
"Error decrypting attachment": "Fout tijdens het ontsleutelen van de bijlage",
@@ -272,14 +272,14 @@
"Event information": "Gebeurtenis-informatie",
"Existing Call": "Bestaande oproep",
"Export": "Exporteren",
- "Export E2E room keys": "Exporteer E2E ruimte sleutels",
+ "Export E2E room keys": "Exporteer E2E-ruimte-sleutels",
"Failed to ban user": "Niet gelukt om de gebruiker te verbannen",
"Failed to change power level": "Niet gelukt om het machtsniveau te wijzigen",
"Failed to delete device": "Niet gelukt om het apparaat te verwijderen",
- "Failed to fetch avatar URL": "Niet gelukt om de avatar URL op te halen",
+ "Failed to fetch avatar URL": "Niet gelukt om de avatar-URL op te halen",
"Failed to join room": "Niet gelukt om tot de ruimte toe te treden",
"Failed to leave room": "Niet gelukt om de ruimte te verlaten",
- "Failed to load timeline position": "Niet gelukt om de tijdlijn positie te laden",
+ "Failed to load timeline position": "Niet gelukt om de tijdlijnpositie te laden",
"Failed to lookup current room": "Niet gelukt om de huidige ruimte op te zoeken",
"Failed to mute user": "Niet gelukt om de gebruiker te dempen",
"Failed to register as guest:": "Niet gelukt om als gast te registreren:",
@@ -300,17 +300,17 @@
"favourite": "favoriet",
"Favourites": "Favorieten",
"Fill screen": "Scherm vullen",
- "Filter room members": "Ruimte leden filteren",
+ "Filter room members": "Ruimteleden filteren",
"Forget room": "Ruimte vergeten",
"Forgot your password?": "Wachtwoord vergeten?",
"For security, this session has been signed out. Please sign in again.": "Voor veiligheidsredenen is deze sessie uitgelogd. Log alsjeblieft opnieuw in.",
- "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.": "In verband met veiligheidsredenen zullen alle eind-tot-eind versleutelingssleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.",
+ "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.": "In verband met veiligheidsredenen zullen alle end-to-endbeveiligingsleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.",
"Found a bug?": "Een fout gevonden?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s",
- "Guest access is disabled on this Home Server.": "Gast toegang is uitgeschakeld op deze thuisserver.",
+ "Guest access is disabled on this Home Server.": "Gasttoegang is uitgeschakeld op deze thuisserver.",
"Guests can't set avatars. Please register.": "Gasten kunnen geen avatars instellen. Registreer je alsjeblieft.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Gast gebruikers kunnen geen nieuwe ruimtes aanmaken. Registreer je om een nieuwe ruimte aan te maken en een gesprek te starten.",
- "Guest users can't upload files. Please register to upload.": "Gast gebruikers kunnen geen bestanden uploaden. Registreer je om te uploaden.",
+ "Guest users can't upload files. Please register to upload.": "Gastgebruikers kunnen geen bestanden uploaden. Registreer je om te uploaden.",
"Guests can't use labs features. Please register.": "Gasten kunnen geen labs mogelijkheden gebruiken. Registreer je alsjeblieft.",
"Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.",
"had": "had",
@@ -323,22 +323,22 @@
"Identity Server is": "Identiteitsserver is",
"I have verified my email address": "Ik heb mijn e-mailadres geverifieerd",
"Import": "Importeren",
- "Import E2E room keys": "E2E ruimte sleutels importeren",
+ "Import E2E room keys": "E2E-ruimte-sleutels importeren",
"Incoming call from %(name)s": "Inkomende oproep van %(name)s",
"Incoming video call from %(name)s": "Inkomende video-oproep van %(name)s",
"Incoming voice call from %(name)s": "Inkomende spraakoproep van %(name)s",
"Incorrect username and/or password.": "Incorrecte gebruikersnaam en/of wachtwoord.",
- "Incorrect verification code": "Incorrecte verificatie code",
- "Interface Language": "Interface Taal",
- "Invalid alias format": "Ongeldig naam formaat",
- "Invalid address format": "Ongeldig adres formaat",
+ "Incorrect verification code": "Incorrecte verificatiecode",
+ "Interface Language": "Interfacetaal",
+ "Invalid alias format": "Ongeldig naamformaat",
+ "Invalid address format": "Ongeldig adresformaat",
"Invalid Email Address": "Ongeldig e-mailadres",
"Invalid file%(extra)s": "Ongeldig bestand%(extra)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s heeft %(targetName)s uitgenodigd.",
"Invite new room members": "Nieuwe ruimte leden uitnodigen",
"Invited": "Uitgenodigd",
"Invites": "Uitnodigingen",
- "Invites user with given id to current room": "Nodigt de gebruiker met het gegeven id uit in de huidige ruimte",
+ "Invites user with given id to current room": "Nodigt de gebruiker met het gegeven ID uit in de huidige ruimte",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is niet een geldig formaat voor een adres",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is niet een geldig formaat voor een naam",
"%(displayName)s is typing": "%(displayName)s is aan het typen",
@@ -362,17 +362,17 @@
"Login as guest": "Als gast inloggen",
"Logout": "Uitloggen",
"Low priority": "Lage prioriteit",
- "%(senderName)s made future room history visible to": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor",
+ "%(senderName)s made future room history visible to": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor",
"Manage Integrations": "Integraties beheren",
- "Markdown is disabled": "Opmaak is uitgeschakeld",
- "Markdown is enabled": "Opmaak ingeschakeld",
- "matrix-react-sdk version:": "matrix-react-sdk versie:",
+ "Markdown is disabled": "Markdown is uitgeschakeld",
+ "Markdown is enabled": "Markdown ingeschakeld",
+ "matrix-react-sdk version:": "matrix-react-sdk-versie:",
"Members only": "Alleen leden",
"Message not sent due to unknown devices being present": "Bericht niet verzonden doordat er een onbekende apparaten aanwezig zijn",
"Missing room_id in request": "Het room_id mist in het verzoek",
"Missing user_id in request": "De user_id mist in het verzoek",
- "Mobile phone number": "Mobiel telefoonnummer",
- "Mobile phone number (optional)": "Mobiel telefoonnummer (optioneel)",
+ "Mobile phone number": "Mobiele-telefoonnummer",
+ "Mobile phone number (optional)": "Mobiele-telefoonnummer (optioneel)",
"Never send encrypted messages to unverified devices from this device": "Nooit versleutelde berichten vanaf dit apparaat naar niet geverifieerde apparaten versturen",
"Never send encrypted messages to unverified devices in this room": "Nooit versleutelde berichten naar niet geverifieerde apparaten sturen in deze ruimte",
"Never send encrypted messages to unverified devices in this room from this device": "Nooit vanaf dit apparaat versleutelde berichten naar niet geverifieerde apparaten in deze ruimte sturen",
@@ -391,18 +391,18 @@
"Failed to kick": "Niet gelukt om te er uit te zetten",
"Press to start a chat with someone": "Druk op om een gesprek met iemand te starten",
"Remove %(threePid)s?": "%(threePid)s verwijderen?",
- "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP gesprek aangevraagd.",
+ "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.",
"Report it": "Melden",
- "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.": "Het wachtwoord veranderen betekent momenteel dat alle eind-tot-eind versleutelingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.",
+ "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.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.",
"restore": "herstellen",
"Results from DuckDuckGo": "Resultaten van DuckDuckGo",
"Return to app": "Naar de app terugkeren",
"Return to login screen": "Naar het inlogscherm terugkeren",
- "Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen permissie om je notificaties te versturen - controleer je browser instellingen",
+ "Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen permissie om je notificaties te versturen - controleer je browserinstellingen",
"Riot was not given permission to send notifications - please try again": "Riot heeft geen permissie gekregen om notificaties te versturen - probeer het opnieuw",
"riot-web version:": "riot-web versie:",
"Room %(roomId)s not visible": "Ruimte %(roomId)s is niet zichtbaar",
- "Room Colour": "Ruimte Kleur",
+ "Room Colour": "Ruimtekleur",
"Room contains unknown devices": "De ruimte bevat onbekende apparaten",
"Room name (optional)": "Ruimtenaam (optioneel)",
"%(roomName)s does not exist.": "%(roomName)s bestaat niet.",
@@ -418,27 +418,27 @@
"Send a message (unencrypted)": "Stuur een bericht (onversleuteld)",
"Send an encrypted message": "Stuur een versleuteld bericht",
"Send anyway": "Alsnog versturen",
- "Sender device information": "Afzender apparaat informatie",
- "Send Reset Email": "Stuur Reset E-mail",
+ "Sender device information": "Afzenderapparaatinformatie",
+ "Send Reset Email": "Stuur Reset-E-mail",
"sent an image": "stuurde een afbeelding",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s stuurde een afbeelding.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.",
"sent a video": "stuurde een video",
- "Server error": "Server fout",
+ "Server error": "Serverfout",
"Server may be unavailable or overloaded": "De server kan onbereikbaar of overbelast zijn",
"Server may be unavailable, overloaded, or search timed out :(": "De server is misschien onbereikbaar, overbelast of het zoeken duurde te lang :(",
"Server may be unavailable, overloaded, or the file too big": "De server is misschien onbereikbaar, overbelast of het bestand is te groot",
"Server may be unavailable, overloaded, or you hit a bug.": "De server is misschien onbereikbaar, overbelast of je bent tegen een fout aangelopen.",
"Server unavailable, overloaded, or something else went wrong.": "De server is onbereikbaar, overbelast of iets anders ging fout.",
- "Session ID": "Sessie ID",
+ "Session ID": "Sessie-ID",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s heeft %(targetName)s de ruimte uitgestuurd.",
"Kick": "Er uit sturen",
- "Kicks user with given id": "Stuurt de gebruiker met het gegeven id er uit",
+ "Kicks user with given id": "Stuurt de gebruiker met het gegeven ID er uit",
"%(senderName)s set a profile picture.": "%(senderName)s heeft een profielfoto ingesteld.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam naar %(displayName)s veranderd.",
"Set": "Instellen",
"Show panel": "Paneel weergeven",
- "Show Text Formatting Toolbar": "Tekst Opmaak Werkbalk Weergeven",
+ "Show Text Formatting Toolbar": "Tekstopmaakwerkbalk Weergeven",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Laat de tijd in twaalf uur formaat zien (bijv. 2:30pm)",
"Signed Out": "Uitgelogd",
"Sign in": "Inloggen",
@@ -448,8 +448,8 @@
"since they were invited": "sinds ze zijn uitgenodigd",
"Some of your messages have not been sent.": "Een paar van je berichten zijn niet verstuurd.",
"Someone": "Iemand",
- "Sorry, this homeserver is using a login which is not recognised ": "Sorry, deze thuisserver gebruikt een inlog methode die niet wordt herkend. ",
- "The default role for new room members is": "De standaard rol voor nieuwe ruimteleden is",
+ "Sorry, this homeserver is using a login which is not recognised ": "Sorry, deze thuisserver gebruikt een inlogmethode die niet wordt herkend. ",
+ "The default role for new room members is": "De standaardrol voor nieuwe ruimteleden is",
"The main address for this room is": "Het hoofdadres voor deze ruimte is",
"The phone number entered looks invalid": "Het telefoonnummer dat ingevoerd is ziet er ongeldig uit",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "De versleutelingssleutel die je hebt verstrekt komt overeen met de versleutelingssleutel die je hebt ontvangen van %(userId)s's apparaat %(deviceId)s. Apparaat is gemarkeerd als geverifieerd.",
@@ -469,10 +469,10 @@
"These are experimental features that may break in unexpected ways": "Dit zijn experimentele functies die misschien kunnen breken op onverwachte manieren",
"The visibility of existing history will be unchanged": "De zichtbaarheid van de bestaande geschiedenis zal onveranderd blijven",
"This doesn't appear to be a valid email address": "Het ziet er niet naar uit dat dit een geldig e-mailadres is",
- "This is a preview of this room. Room interactions have been disabled": "Dit is een voorvertoning van de ruimte. Ruimte interacties zijn uitgeschakeld",
+ "This is a preview of this room. Room interactions have been disabled": "Dit is een voorvertoning van de ruimte. Ruimte-interacties zijn uitgeschakeld",
"This phone number is already in use": "Dit telefoonnummer is al in gebruik",
"This room": "Deze ruimte",
- "This room is not accessible by remote Matrix servers": "Deze ruimte is niet toegankelijk voor afgelegen Matrix servers",
+ "This room is not accessible by remote Matrix servers": "Deze ruimte is niet toegankelijk voor afgelegen Matrix-servers",
"This room's internal ID is": "Het interne ID van deze ruimte is",
"times": "keer",
"To ban users": "om gebruikers te verbannen",
@@ -495,8 +495,8 @@
"To use it, just wait for autocomplete results to load and tab through them.": "Om het te gebruiken, wacht tot de automatisch aangevulde resultaten geladen zijn en tab er doorheen.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Je probeerde een specifiek punt in de tijdlijn van deze ruimte te laden maar je hebt niet de permissie om de desbetreffende berichten te zien.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Het is niet gelukt om een specifiek punt in de tijdlijn van deze ruimte te laden.",
- "Turn Markdown off": "Doe opmaak uit",
- "Turn Markdown on": "Zet opmaak aan",
+ "Turn Markdown off": "Zet Markdown uit",
+ "Turn Markdown on": "Zet Markdown aan",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft eind-tot-eind versleuteling aangezet (algoritme %(algorithm)s).",
"Unable to add email address": "Niet mogelijk om e-mailadres toe te voegen",
"Unable to remove contact information": "Niet mogelijk om contactinformatie te verwijderen",
@@ -511,7 +511,7 @@
"Undecryptable": "Niet ontsleutelbaar",
"Unencrypted room": "Ontsleutelde ruimte",
"unencrypted": "ontsleuteld",
- "Unencrypted message": "Niet versleuteld bericht",
+ "Unencrypted message": "Niet-versleuteld bericht",
"unknown caller": "onbekende beller",
"Unknown command": "Onbekende commando",
"unknown device": "Onbekend apparaat",
@@ -533,25 +533,25 @@
"Upload file": "Bestand uploaden",
"Upload new:": "Nieuwe uploaden:",
"Usage": "Gebruik",
- "Use compact timeline layout": "Gebruik een compacte tijdlijn indeling",
+ "Use compact timeline layout": "Gebruik een compacte tijdlijnindeling",
"Use with caution": "Gebruik met behoedzaamheid",
- "User ID": "Gebruiker ID",
- "User Interface": "Gebruiker Interface",
+ "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",
"Users": "Gebruikers",
"User": "Gebruiker",
- "Verification Pending": "Verificatie Wachtend",
+ "Verification Pending": "Verificatie Uitstaand",
"Verification": "Verificatie",
"verified": "geverifieerd",
"Verified": "Geverifieerd",
"Verified key": "Geverifieerde sleutel",
"Video call": "Video-oproep",
"Voice call": "Spraakoproep",
- "VoIP conference finished.": "VoIP vergadering beëindigd.",
- "VoIP conference started.": "VoIP vergadering gestart.",
+ "VoIP conference finished.": "VoIP-vergadering beëindigd.",
+ "VoIP conference started.": "VoIP-vergadering gestart.",
"VoIP is unsupported": "VoIP is niet ondersteund",
"(could not connect media)": "(kan media niet verbinden)",
"(no answer)": "(geen antwoord)",
@@ -559,27 +559,27 @@
"(warning: cannot be disabled again!)": "(waarschuwing: kan niet meer uitgezet worden!)",
"Warning!": "Waarschuwing!",
"WARNING: Device already verified, but keys do NOT MATCH!": "WAARSCHUWING: Apparaat al geverifieerd, maar de sleutels KOMEN NIET OVEREEN!",
- "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!": "WAARSCHUWING: SLEUTEL VERIFICATIE IS MISLUKT! De ondertekende sleutel voor %(userId)s en apparaat %(deviceId)s is \"%(fprint)s\" wat niet overeenkomt met de verschafte sleutel \"%(fingerprints)s\". Dit kan betekenen dat je communicatie onderschept wordt!",
+ "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!": "WAARSCHUWING: SLEUTELVERIFICATIE IS MISLUKT! De ondertekende sleutel voor %(userId)s en apparaat %(deviceId)s is \"%(fprint)s\" wat niet overeenkomt met de verschafte sleutel \"%(fingerprint)s\". Dit kan betekenen dat je communicatie onderschept wordt!",
"Who can access this room?": "Wie heeft toegang tot deze ruimte?",
"Who can read history?": "Wie kan de geschiedenis lezen?",
"Who would you like to add to this room?": "Wie wil je aan deze ruimte toevoegen?",
"Who would you like to communicate with?": "Met wie zou je willen communiceren?",
- "%(senderName)s withdrew %(targetName)s's invitation.": "%(sernderName)s trok %(targetName)s's uitnodiging terug.",
+ "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trok %(targetName)s's uitnodiging terug.",
"Would you like to accept or decline this invitation?": "Wil je deze uitnodiging accepteren of afwijzen ?",
- "You already have existing direct chats with this user:": "Je hebt al bestaande privé gesprekken met deze gebruiker:",
+ "You already have existing direct chats with this user:": "Je hebt al bestaande privé-gesprekken met deze gebruiker:",
"You are already in a call.": "Je bent al in gesprek.",
"You're not in any rooms yet! Press to make a room or to browse the directory": "Je zit nog niet in een ruimte! Druk op om een ruimte te maken of om door de catalogus te bladeren",
"You are trying to access %(roomName)s.": "Je probeert in %(roomName)s toe te treden.",
"You cannot place a call with yourself.": "Je kan geen spraakoproep met jezelf maken.",
- "You cannot place VoIP calls in this browser.": "Je kan geen VoIP oproepen in deze browser doen.",
+ "You cannot place VoIP calls in this browser.": "Je kan geen VoIP-oproepen in deze browser doen.",
"You do not have permission to post to this room": "Je hebt geen permissie om in deze ruimte te praten",
"You have been banned from %(roomName)s by %(userName)s.": "Je bent verbannen van %(roomName)s door %(userName)s.",
"You have been invited to join this room by %(inviterName)s": "Je bent in deze ruimte uitgenodigd door %(inviterName)s",
"You have been kicked from %(roomName)s by %(userName)s.": "Je bent uit %(roomName)s gezet door %(userName)s.",
"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": "Je bent op alle apparaten uitgelegd en je zal niet langer notificaties ontvangen. Om notificaties weer aan te zetten, log op elk apparaat opnieuw in",
- "You have disabled URL previews by default.": "Je hebt URL voorvertoningen standaard uitgezet .",
- "You have enabled URL previews by default.": "Je hebt URL voorvertoningen standaard aangezet .",
- "You have entered an invalid contact. Try using their Matrix ID or email address.": "Je hebt een ongeldig contact ingevoerd. Probeer zijn of haar Matrix ID of e-mailadres te gebruiken.",
+ "You have disabled URL previews by default.": "Je hebt URL-voorvertoningen standaard uitgezet .",
+ "You have enabled URL previews by default.": "Je hebt URL-voorvertoningen standaard aangezet .",
+ "You have entered an invalid contact. Try using their Matrix ID or email address.": "Je hebt een ongeldig contact ingevoerd. Probeer zijn of haar Matrix-ID of e-mailadres te gebruiken.",
"You have no visible notifications": "Je hebt geen zichtbare notificaties",
"You may wish to login with a different account, or add this email to this account.": "Je wilt misschien met een ander account inloggen of deze e-mail aan je account toevoegen.",
"you must be a": "wat je moet zijn is een",
@@ -587,14 +587,14 @@
"You need to be able to invite users to do that.": "Je moet bevoegd zijn om gebruikers uit te nodigen om dat te doen.",
"You need to be logged in.": "Je moet ingelogd zijn.",
"You need to enter a user name.": "Je moet een gebruikersnaam invoeren.",
- "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Het ziet er naar uit dat je e-mailadres niet met een Matrix ID geassocieerd is op deze thuisserver.",
+ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Het ziet er naar uit dat je e-mailadres niet met een Matrix-ID geassocieerd is op deze thuisserver.",
"Your password has been reset": "Je wachtwoord is gereset",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Je wachtwoord is succesvol veranderd. Je zal geen notificaties op andere apparaten ontvangen totdat je er opnieuw inlogd",
"You seem to be in a call, are you sure you want to quit?": "Het ziet er naar uit dat je in een gesprek zit, weet je zeker dat je wilt afsluiten?",
"You seem to be uploading files, are you sure you want to quit?": "Het ziet er naar uit dat je bestanden aan het uploaden bent, weet je zeker dat je wilt afsluiten?",
"You should not yet trust it to secure data": "Je moet het nog niet vertrouwen om gegevens te beveiligen",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Je zal deze verandering niet terug kunnen draaien omdat je de gebruiker naar hetzelfde machtsniveau als jezelf promoot.",
- "Your home server does not support device management.": "Je thuisserver ondersteund geen apparaat beheer.",
+ "Your home server does not support device management.": "Je thuisserver ondersteund geen apparaatbeheer.",
"This server does not support authentication with a phone number.": "Deze server ondersteunt geen authenticatie met een telefoonnummer.",
"Missing password.": "Het wachtwoord mist.",
"Passwords don't match.": "De wachtwoorden komen niet overeen.",
@@ -633,10 +633,10 @@
"%(severalUsers)sjoined": "%(severalUsers)s zijn toegretreden",
"%(oneUser)sjoined": "%(oneUser)s is toegetreden",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s zijn %(repeats)s vertrokken",
- "%(oneUser)sleft %(repeats)s times": "%(oneUser) is %(repeats)s vertrokken",
+ "%(oneUser)sleft %(repeats)s times": "%(oneUser)s is %(repeats)s vertrokken",
"%(severalUsers)sleft": "%(severalUsers)s zijn vertrokken",
"%(oneUser)sleft": "%(oneUser)s is vertrokken",
- "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers) zijn %(repeats)s toegetreden en weer vertrokken",
+ "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)szijn %(repeats)s toegetreden en weer vertrokken",
"%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s is %(repeats)s keer toegetreden en vertrokken",
"%(severalUsers)sjoined and left": "%(severalUsers)s zijn toegetreden en vertrokken",
"%(oneUser)sjoined and left": "%(oneUser)s is toegetreden en weer vertrokken",
@@ -644,14 +644,14 @@
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)s is %(repeats)s keer vertrokken en opnieuw toegetreden",
"%(severalUsers)sleft and rejoined": "%(severalUsers)s zijn vertrokken en opnieuw toegetreden",
"%(oneUser)sleft and rejoined": "%(oneUser)s is vertrokken en opnieuw toegetreden",
- "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s hebben hun uitnodiging uitnodiging %(repeats)s keer afgewezen",
+ "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s hebben hun uitnodiging %(repeats)s keer afgewezen",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)s heeft zijn of haar uitnodiging %(repeats)s keer afgewezen",
"%(severalUsers)srejected their invitations": "%(severalUsers)s hebben hun uitnodiging afgewezen",
"%(oneUser)srejected their invitation": "%(oneUser)s heeft zijn of haar uitnodiging afgewezen",
- "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers) hun uitnodiging is %(repeats)s keer terug getrokken",
+ "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)shun uitnodiging is %(repeats)s keer terug getrokken",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)s zijn of haar uitnodiging is %(repeats)s keer terug getrokken",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s hun uitnodiging is terug getrokken",
- "%(oneUser)shad their invitation withdrawn": "%(oneUser) zijn of haar uitnodiging is terug getrokken",
+ "%(oneUser)shad their invitation withdrawn": "%(oneUser)szijn of haar uitnodiging is terug getrokken",
"were invited %(repeats)s times": "is %(repeats)s keer uitgenodigd",
"was invited %(repeats)s times": "was %(repeats)s keer uitgenodigd",
"were invited": "waren uitgenodigd",
@@ -672,27 +672,27 @@
"%(oneUser)schanged their name %(repeats)s times": "%(oneUser)s heeft zijn of haar naam %(repeats)s keer aangepast",
"%(severalUsers)schanged their name": "%(severalUsers)s hebben hun naam aangepast",
"%(oneUser)schanged their name": "%(oneUser)s heeft zijn of haar naam aangepast",
- "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers) hebben hun avatar %(repeats)s keer aangepast",
+ "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)shebben hun avatar %(repeats)s keer aangepast",
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)s heeft zijn of haar avatar %(repeats)s keer aangepast",
"%(severalUsers)schanged their avatar": "%(severalUsers)s hebben hun avatar aangepast",
"%(oneUser)schanged their avatar": "%(oneUser)s heeft zijn of haar avatar aangepast",
- "Please select the destination room for this message": "Selecteer de destinatie ruimte voor dit bericht",
+ "Please select the destination room for this message": "Selecteer de destinatie-ruimte voor dit bericht",
"New Password": "Nieuw wachtwoord",
- "Start automatically after system login": "Start automatisch na systeem aanmelding",
- "Desktop specific": "Desktop specifiek",
- "Analytics": "Analisaties",
- "Opt out of analytics": "Uitschrijven voor gegevens analisaties",
+ "Start automatically after system login": "Start automatisch na systeem-aanmelding",
+ "Desktop specific": "Desktop-specifiek",
+ "Analytics": "Gegevensanalyse",
+ "Opt out of analytics": "Uitschrijven voor gegevensanalyse",
"Options": "Opties",
- "Riot collects anonymous analytics to allow us to improve the application.": "Riot verzameld anonieme analisaties dat het mogelijk maakt om de applicatie te verbeteren.",
+ "Riot collects anonymous analytics to allow us to improve the application.": "Riot verzameld anonieme gegevensanalyse die het mogelijk maakt om de applicatie te verbeteren.",
"Passphrases must match": "Wachtzinnen moeten overeenkomen",
"Passphrase must not be empty": "Wachtzin mag niet leeg zijn",
"Export room keys": "Ruimtesleutels exporteren",
"Confirm passphrase": "Wachtzin bevestigen",
"Import room keys": "Ruimtesleutels importeren",
"File to import": "Bestand om te importeren",
- "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.": "Dit proces maakt het mogelijk om de sleutels van je ontvangen berichten in versleutelde ruimtes naar een lokaal bestand te exporteren. Je zal daarna in de toekomst het bestand in een ander Matrix programma kunnen importeren zodat dat programma ook deze berichten kan ontsleutelen.",
- "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.": "Het geëxporteerde bestand zal het voor iedereen dat het kan lezen mogelijk maken om alle berichten die jij kan zien te ontsleutelen, je zal daarom voorzichtig moeten zijn en het veilig houden. Om hiermee te helpen zou je een wachtzin moeten invoeren hieronder, deze zal dan gebruikt worden om de geëxporteerde gegevens dte versleutelen. Het is dan alleen mogelijk om de gegevens te importeren met hetzelfde wachtwoord.",
- "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dit proces maakt het mogelijk om versleutelingssleutels die je eerst had geëxporteerd vanaf een ander Matrix programma te importeren. Je zal daarna alle berichten kunnen ontsleutelen die het andere programma ook kon ontsleutelen.",
+ "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.": "Dit proces maakt het mogelijk om de sleutels van je ontvangen berichten in versleutelde ruimtes naar een lokaal bestand te exporteren. Je zal daarna in de toekomst het bestand in een ander Matrix-programma kunnen importeren zodat dat programma ook deze berichten kan ontsleutelen.",
+ "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.": "Het geëxporteerde bestand zal het voor iedereen dat het kan lezen mogelijk maken om alle berichten die jij kan zien te ontsleutelen, je zal daarom voorzichtig moeten zijn en het veilig houden. Om hiermee te helpen zou je een wachtzin moeten invoeren hieronder, deze zal dan gebruikt worden om de geëxporteerde gegevens te versleutelen. Het is dan alleen mogelijk om de gegevens te importeren met hetzelfde wachtwoord.",
+ "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dit proces maakt het mogelijk om versleutelingssleutels die je eerst had geëxporteerd vanaf een ander Matrix-programma te importeren. Je zal daarna alle berichten kunnen ontsleutelen die het andere programma ook kon ontsleutelen.",
"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",
@@ -705,7 +705,7 @@
"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.": "Weet je zeker dat je deze gebeurtenis wilt verwijderen? Wees er wel van bewust dat als je een ruimtenaam of onderwerp verwijderd je de verandering ongedaan kunt maken.",
"Unknown error": "Onbekende fout",
"Incorrect password": "Incorrect wachtwoord",
- "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dit zal je account permanent onbruikbaar maken. Je zal ook niet opnieuw kunnen registreren met hetzelfde gebruikers ID.",
+ "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dit zal je account permanent onbruikbaar maken. Je zal ook niet opnieuw kunnen registreren met hetzelfde gebruikers-ID.",
"This action is irreversible.": "Deze actie is onomkeerbaar.",
"To continue, please enter your password.": "Om verder te gaan, voer je wachtwoord in.",
"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:": "Om te verifiëren dat dit apparaat vertrouwd kan worden, contacteer de eigenaar op een andere manier (bijv. persoonlijk of via een telefoontje) en vraag of de sleutel die ze zien in de Gebruikersinstellingen voor dit apparaat overeenkomt met de onderstaande sleutel:",
@@ -734,8 +734,8 @@
"Add User": "Gebruiker Toevoegen",
"This Home Server would like to make sure you are not a robot": "Deze thuisserver wil er zeker van zijn dat je geen robot bent",
"Sign in with CAS": "Inloggen met CAS",
- "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Je kan de aangepaste server opties gebruiken om bij andere Matrix servers in te loggen door een andere thuisserver URL te specificeren.",
- "This allows you to use this app with an existing Matrix account on a different home server.": "Dit maakt het mogelijk om deze applicatie te gebruiken met een bestaand Matrix account op een andere thuisserver.",
+ "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Je kan de aangepaste server opties gebruiken om bij andere Matrix-servers in te loggen door een andere thuisserver-URL te specificeren.",
+ "This allows you to use this app with an existing Matrix account on a different home server.": "Dit maakt het mogelijk om deze applicatie te gebruiken met een bestaand Matrix-account op een andere thuisserver.",
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Je kan ook een aangepaste identiteitsserver instellen maar dit zal waarschijnlijk interactie met gebruikers gebaseerd op een e-mailadres voorkomen.",
"Please check your email to continue registration.": "Bekijk je e-mail om door te gaan met de registratie.",
"Token incorrect": "Bewijs incorrect",
@@ -743,10 +743,10 @@
"Please enter the code it contains:": "Voer de code in die het bevat:",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Als je geen e-mailadres specificeert zal je niet je wachtwoord kunnen resetten. Weet je het zeker?",
"You are registering with %(SelectedTeamName)s": "Je registreert je met %(SelectedTeamName)s",
- "Default server": "Standaard server",
+ "Default server": "Standaardserver",
"Custom server": "Aangepaste server",
- "Home server URL": "Thuisserver URL",
- "Identity server URL": "Identiteitsserver URL",
+ "Home server URL": "Thuisserver-URL",
+ "Identity server URL": "Identiteitsserver-URL",
"What does this mean?": "Wat betekent dit?",
"Error decrypting audio": "Fout met het ontsleutelen van de audio",
"Error decrypting image": "Fout met het ontsleutelen van de afbeelding",
@@ -754,20 +754,20 @@
"This image cannot be displayed.": "Deze afbeelding kan niet worden weergeven.",
"Error decrypting video": "Fout met het ontsleutelen van de video",
"Add an Integration": "Voeg een integratie toe",
- "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?": "Je wordt zo naar een derde-partij website verbonden zodat je het account kan legitimeren voor gebruik met %(integrationsUrl)s. Wil je doorgaan?",
- "Removed or unknown message type": "Verwijderd of onbekend bericht type",
- "Disable URL previews by default for participants in this room": "Zet URL voorvertoningen standaard uit voor deelnemers aan deze ruimte",
- "Disable URL previews for this room (affects only you)": "Zet URL voorvertoningen uit voor deze ruimte (heeft alleen effect op jou)",
- "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL voorvertoningen staan standaard %(globalDisableUrlPreview)s voor deelnemers aan deze ruimte.",
- "URL Previews": "URL Voorvertoningen",
- "Enable URL previews for this room (affects only you)": "URL voorvertoningen in deze ruimte aanzetten (heeft alleen effect op jou)",
+ "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?": "Je wordt zo naar een derde-partij-website verbonden zodat je het account kan legitimeren voor gebruik met %(integrationsUrl)s. Wil je doorgaan?",
+ "Removed or unknown message type": "Verwijderd of onbekend berichttype",
+ "Disable URL previews by default for participants in this room": "Zet URL-voorvertoningen standaard uit voor deelnemers aan deze ruimte",
+ "Disable URL previews for this room (affects only you)": "Zet URL-voorvertoningen uit voor deze ruimte (heeft alleen effect op jou)",
+ "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL-voorvertoningen staan standaard %(globalDisableUrlPreview)s voor deelnemers aan deze ruimte.",
+ "URL Previews": "URL-Voorvertoningen",
+ "Enable URL previews for this room (affects only you)": "URL-voorvertoningen in deze ruimte aanzetten (heeft alleen effect op jou)",
"Drop file here to upload": "Bestand hier laten vallen om te uploaden",
" (unsupported)": " (niet ondersteund)",
"Ongoing conference call%(supportedText)s.": "Lopend vergaderingsgesprek %(supportedText)s.",
"for %(amount)ss": "voor %(amount)ss",
"for %(amount)sm": "voor %(amount)sm",
"for %(amount)sh": "voor %(amount)su",
- "for %(amount)sd": "for %(amound)sd",
+ "for %(amount)sd": "for %(amount)sd",
"Online": "Online",
"Idle": "Afwezig",
"Offline": "Offline",
@@ -783,9 +783,9 @@
"Username not available": "Gebruikersnaam niet beschikbaar",
"Something went wrong!": "Iets ging niet goed!",
"This will be your account name on the homeserver, or you can pick a different server .": "Dit zal je account naam worden op de thuisserver of je kan een verschillende server pakken.",
- "If you already have a Matrix account you can log in instead.": "Als je al een Matrix account hebt kan je in plaats daarvan inloggen .",
- "Your browser does not support the required cryptography extensions": "Je browser ondersteunt de benodigde cryptografie extensies niet",
- "Not a valid Riot keyfile": "Niet een geldig Riot sleutelbestand",
+ "If you already have a Matrix account you can log in instead.": "Als je al een Matrix-account hebt kan je in plaats daarvan inloggen .",
+ "Your browser does not support the required cryptography extensions": "Je browser ondersteunt de benodigde cryptografie-extensies niet",
+ "Not a valid Riot keyfile": "Niet een geldig Riot-sleutelbestand",
"Authentication check failed: incorrect password?": "Authenticatie controle gefaald: incorrect wachtwoord?",
"Disable Peer-to-Peer for 1:1 calls": "Peer-to-Peer voor 1:1 oproepen uitschakelen",
"Do you want to set an email address?": "Wil je een e-mailadres instellen?",
@@ -795,7 +795,7 @@
"Start verification": "Verificatie starten",
"Share without verifying": "Delen zonder verificatie",
"Ignore request": "Verzoek negeren",
- "You added a new device '%(displayName)s', which is requesting encryption keys.": "Je hebt een nieuwe apparaat '%(displayName)s' toegevoegd die om versleutelingssleutels vraagt.",
+ "You added a new device '%(displayName)s', which is requesting encryption keys.": "Je hebt een nieuw apparaat '%(displayName)s' toegevoegd dat om versleutelingssleutels vraagt.",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Je niet geverifieerde apparaat '%(displayName)s' vraagt naar versleutelingssleutels.",
"Encryption key request": "Verzoek voor versleutelingssleutel",
"Define the power level of a user": "Definieer het machtsniveau van een gebruiker",
@@ -806,18 +806,18 @@
"Delete widget": "Widget verwijderen",
"Do you want to load widget from URL:": "Wil je de widget laden van de URL:",
"Edit": "Wijzigen",
- "Enable automatic language detection for syntax highlighting": "Automatische taaldetectie voor zinsbouw markeringen aanzetten",
+ "Enable automatic language detection for syntax highlighting": "Automatische taaldetectie voor zinsbouwmarkeringen aanzetten",
"Hide Apps": "Apps verbergen",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Toetreed/verlaat berichten verbergen (uitnodigingen/verwijderingen/verbanningen zullen ongeschonden blijven)",
"Hide avatar and display name changes": "Avatar en weergavenaam wijzigingen verbergen",
- "Integrations Error": "Integraties Fout",
+ "Integrations Error": "Integratiesfout",
"Publish this room to the public in %(domain)s's room directory?": "Deze ruimte publiekelijk maken in %(domain)s's ruimte catalogus?",
"Matrix Apps": "Matrix Apps",
"AM": "AM",
"PM": "PM",
- "NOTE: Apps are not end-to-end encrypted": "OPMERKING: Apps zijn niet eind-tot-eind versleuteld",
+ "NOTE: Apps are not end-to-end encrypted": "OPMERKING: Apps zijn niet end-to-endbeveiligd",
"Revoke widget access": "Toegang tot widget intrekken",
- "Sets the room topic": "Wijzigt het ruimte onderwerp",
+ "Sets the room topic": "Wijzigt het ruimte-onderwerp",
"Show Apps": "Apps Weergeven",
"The maximum permitted number of widgets have already been added to this room.": "Het maximum aantal toegestane widgets is al aan deze ruimte toegevoegd.",
"To get started, please pick a username!": "Om te beginnen, kies een gebruikersnaam!",
@@ -826,24 +826,24 @@
"You are not in this room.": "Je zit niet in deze ruimte.",
"You do not have permission to do that in this room.": "Je hebt geen permissie om dat te doen in deze ruimte.",
"Verifies a user, device, and pubkey tuple": "Verifieert een gebruiker, apparaat en pubkey tupel",
- "Autocomplete Delay (ms):": "Automatisch aanvullen vertraging (ms):",
+ "Autocomplete Delay (ms):": "Automatisch-aanvullen-vertraging (ms):",
"This Home server does not support groups": "Deze thuisserver ondersteunt geen groepen",
"Loading device info...": "Apparaat info aan het laden...",
"Groups": "Groepen",
"Create a new group": "Maak een nieuwe groep",
"Create Group": "Groep Aanmaken",
- "Group Name": "Groepnaam",
+ "Group Name": "Groepsnaam",
"Example": "Voorbeeld",
"Create": "Creëer",
- "Group ID": "Groep ID",
+ "Group ID": "Groeps-ID",
"+example:%(domain)s": "+voorbeeld:%(domain)s",
- "Group IDs must be of the form +localpart:%(domain)s": "Groep IDs moeten er als +lokaalgedeelte:%(domain)s uit zien",
- "It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Het is momenteel mogelijk om groepen op je eigen thuisserver aan te maken: gebruik een groep ID dat eindigt met %(domain)s",
+ "Group IDs must be of the form +localpart:%(domain)s": "Groeps-IDs moeten er als +lokaalgedeelte:%(domain)s uit zien",
+ "It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Het is momenteel mogelijk om groepen op je eigen thuisserver aan te maken: gebruik een groeps-ID dat eindigt met %(domain)s",
"Room creation failed": "Het aanmaken van de ruimte is niet gelukt",
"You are a member of these groups:": "Je bent een deelnemer van deze groepen:",
- "Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Maak een groep aan om je gemeenschap te representateren! Defineer een set van ruimtes en maak je eigen aangepaste homepagina om je eigen plek in het Matrix universum te creëren.",
+ "Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Maak een groep aan om je gemeenschap te representateren! Defineer een set van ruimtes en maak je eigen aangepaste homepagina om je eigen plek in het Matrix-universum te creëren.",
"Join an existing group": "Treed tot een bestaande groep toe",
- "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Om tot een bestaande groep toe te treden moet je groep identificatie weten; dit zal er ongeveer uit zien als +voorbeeld:matrix.org .",
+ "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Om tot een bestaande groep toe te treden moet je groepsidentificatie weten; dit zal er ongeveer uit zien als +voorbeeld:matrix.org .",
"Featured Rooms:": "Prominente Ruimtes:",
"Error whilst fetching joined groups": "Er is een fout opgetreden tijdens het ophalen van de tot toegretreden groepen",
"Featured Users:": "Prominente Gebruikers:",
@@ -851,8 +851,9 @@
"Automatically replace plain text Emoji": "Automatisch normale tekst vervangen met Emoji",
"Failed to upload image": "Het is niet gelukt om de afbeelding te uploaden",
"Failed to update group": "Het is niet gelukt om de groep bij te werken",
- "Hide avatars in user and room mentions": "Avatars in gebruiker en ruimte vermeldingen verbergen",
- "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget toegevoegd door %(senderName)s",
- "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget verwijderd door %(senderName)s",
- "Robot check is currently unavailable on desktop - please use a web browser ": "Robot check is momenteel niet beschikbaar op de desktop - gebruik in plaats daarvan een webbrowser "
+ "Hide avatars in user and room mentions": "Avatars in gebruiker- en ruimte-vermeldingen verbergen",
+ "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget toegevoegd door %(senderName)s",
+ "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget verwijderd door %(senderName)s",
+ "Robot check is currently unavailable on desktop - please use a web browser ": "Robot-check is momenteel niet beschikbaar op de desktop - gebruik in plaats daarvan een webbrowser ",
+ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget aangepast door %(senderName)s"
}
diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json
index 724fa24564..42142b181d 100644
--- a/src/i18n/strings/pl.json
+++ b/src/i18n/strings/pl.json
@@ -1,6 +1,6 @@
{
"Ignore request": "Zignoruj żądanie",
- "Start verification": "Rozpocznij weryfikacje",
+ "Start verification": "Rozpocznij weryfikację",
"Skip": "Pomiń",
"This will allow you to reset your password and receive notifications.": "To pozwoli Ci zresetować Twoje hasło i otrzymać powiadomienia.",
"Your browser does not support the required cryptography extensions": "Twoja przeglądarka nie wspiera wymaganych rozszerzeń kryptograficznych",
@@ -14,20 +14,20 @@
"This image cannot be displayed.": "Ten obrazek nie może zostać wyświetlony.",
"Default server": "Domyślny serwer",
"A text message has been sent to": "Wiadomość tekstowa została wysłana do",
- "Add User": "Dodaj Użytkownika",
+ "Add User": "Dodaj użytkownika",
"Verify...": "Zweryfikuj...",
- "Unknown Address": "Nieznany Adres",
+ "Unknown Address": "Nieznany adres",
"Unknown devices": "Nieznane urządzenia",
"Verify device": "Zweryfikuj urządzenie",
"Device key": "Klucz urządzenia",
- "Device Name": "Nazwa Urządzenia",
+ "Device Name": "Nazwa urządzenia",
"Device name": "Nazwa urządzenia",
"To continue, please enter your password.": "Aby kontynuować, proszę wprowadzić swoje hasło.",
"Incorrect password": "Nieprawidłowe hasło",
"Unknown error": "Nieznany błąd",
"Start new chat": "Rozpocznij nową konwersację",
"Options": "Opcje",
- "New Password": "Nowe Hasło",
+ "New Password": "Nowe hasło",
"Room directory": "Spis pokojów",
"Start chat": "Rozpocznij rozmowę",
"Welcome page": "Strona powitalna",
@@ -67,8 +67,8 @@
"User": "Użytkownik",
"Users": "Użytkownicy",
"User name": "Nazwa użytkownika",
- "User ID": "ID Użytkownika",
- "User Interface": "Interfejs Użytkownika",
+ "User ID": "ID użytkownika",
+ "User Interface": "Interfejs użytkownika",
"Usage": "Użycie",
"Upload file": "Prześlij plik",
"Unban": "Odbanuj",
@@ -106,7 +106,7 @@
"unknown error code": "nieznany kod błędu",
"OK": "OK",
"Custom Server Options": "Niestandardowe opcje serwera",
- "Dismiss": "Zdymisjonować",
+ "Dismiss": "Zamknij",
"Failed to forget room %(errCode)s": "Nie mogłem zapomnieć o pokoju %(errCode)s",
"Failed to join the room": "Nie udało się dołączyć do pokoju",
"Favourite": "Ulubiony",
@@ -161,5 +161,676 @@
"%(senderName)s banned %(targetName)s.": "%(senderName)s zbanował %(targetName)s.",
"Ban": "Zbanuj",
"Bans user with given id": "Zbanuj użytkownika o podanym id",
- "Blacklisted": "Umieszczono na czarnej liście"
+ "Blacklisted": "Umieszczono na czarnej liście",
+ "Add a widget": "Dodaj widżet",
+ "Allow": "Pozwól",
+ "Missing Media Permissions, click here to request.": "Brakuje uprawnień mediów. Kliknij tutaj, aby ich zażądać.",
+ "and %(count)s others...|other": "i %(count)s innych...",
+ "and %(count)s others...|one": "i jeszcze jedno...",
+ "Bug Report": "Raport błędu",
+ "Bulk Options": "Masowe opcje",
+ "Call Timeout": "Upłynął limit czasu połączenia",
+ "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nie można nawiązać połączenia z serwerem - proszę sprawdź twoje połączenie, upewnij się, że certyfikat SSL serwera jest zaufany, i że dodatki przeglądarki nie blokują żądania.",
+ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts .": "Nie można nawiązać połączenia z serwerem przy użyciu HTTP podczas korzystania z HTTPS dla bieżącej strony. Użyj HTTPS lub włącz niebezpieczne skrypty .",
+ "Can't load user settings": "Nie można załadować ustawień użytkownika",
+ "Cannot add any more widgets": "Nie można dodać już więcej widżetów",
+ "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s zmienił swoją nazwę z %(oldDisplayName)s na %(displayName)s.",
+ "%(senderName)s changed their profile picture.": "%(senderName)s zmienił swoje zdjęcie profilowe.",
+ "fo": "Farerski",
+ "rm": "Retoromański",
+ "tn": "Tswana",
+ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom mocy %(powerLevelDiffText)s.",
+ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.",
+ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął nazwę pokoju.",
+ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił temat na \"%(topic)s\".",
+ "Changes to who can read history will only apply to future messages in this room": "Zmiany w dostępie do historii będą dotyczyć tylko przyszłych wiadomości w tym pokoju",
+ "Changes your display nickname": "Zmień swój pseudonim",
+ "Changes colour scheme of current room": "Zmień schemat kolorystyczny bieżącego pokoju",
+ "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.": "Zmiana hasła zresetuje klucze szyfrowania końcówka-do-końcówki na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
+ "Claimed Ed25519 fingerprint key": "Przedstawiony odcisk klucza Ed25519",
+ "Clear Cache and Reload": "Wyczyść pamięć podręczną i przeładuj",
+ "Clear Cache": "Wyczyść pamięć podręczną",
+ "Click here to join the discussion!": "Kliknij tutaj , aby dołączyć do dyskusji!",
+ "Click here to fix": "Kliknij tutaj, aby naprawić",
+ "Click to mute audio": "Kliknij, aby wyciszyć dźwięk",
+ "Click to mute video": "Kliknij, aby wyłączyć obraz",
+ "click to reveal": "kliknij, aby ujawnić",
+ "Click to unmute video": "Kliknij, aby włączyć obraz",
+ "Click to unmute audio": "Kliknij, aby włączyć dźwięk",
+ "Command error": "Błąd polecenia",
+ "Commands": "Polecenia",
+ "Conference call failed.": "Połączenie konferencyjne nie powiodło się.",
+ "Conference calling is in development and may not be reliable.": "Rozmowy konferencyjne są w trakcie opracowywania i mogą nie działać poprawnie.",
+ "Conference calls are not supported in encrypted rooms": "Połączenia konferencyjne nie są obsługiwane w zaszyfrowanych pokojach",
+ "Conference calls are not supported in this client": "Połączenia konferencyjne nie są obsługiwane w tym kliencie",
+ "Could not connect to the integration server": "Nie można połączyć się z serwerem integracji",
+ "Create a new chat or reuse an existing one": "Utwórz nowy czat lub użyj istniejącego",
+ "Curve25519 identity key": "Curve25519 klucz tożsamości",
+ "Custom": "Własny",
+ "Custom level": "Własny poziom",
+ "/ddg is not a command": "/ddg nie jest poleceniem",
+ "Deactivate Account": "Dezaktywuj konto",
+ "Deactivate my account": "Dezaktywuj moje konto",
+ "Decline": "Odrzuć",
+ "Decrypt %(text)s": "Odszyfruj %(text)s",
+ "Decryption error": "Błąd odszyfrowywania",
+ "Delete widget": "Usuń widżet",
+ "demote": "zdegraduj",
+ "Default": "Domyślny",
+ "Define the power level of a user": "Zdefiniuj poziom mocy użytkownika",
+ "Device already verified!": "Urządzenie jest już zweryfikowane!",
+ "Device ID": "Identyfikator urządzenia",
+ "Device ID:": "Identyfikator urządzenia:",
+ "device id: ": "identyfikator urządzenia: ",
+ "Device key:": "Klucz urządzenia:",
+ "Devices will not yet be able to decrypt history from before they joined the room": "Urządzenia nie będą mogły odszyfrowywać historii sprzed dołączenia do pokoju",
+ "Direct chats": "Rozmowy bezpośrednie",
+ "Disable Notifications": "Wyłącz powiadomienia",
+ "disabled": "wyłączone",
+ "Disable inline URL previews by default": "Domyślnie wyłącz podgląd linków",
+ "Disable markdown formatting": "Wyłącz formatowanie markdown",
+ "Disinvite": "Anuluj zaproszenie",
+ "Display name": "Wyświetlana nazwa",
+ "Displays action": "Wyświetlane akcje",
+ "Do you want to load widget from URL:": "Czy chcesz załadować widżet z adresu:",
+ "Don't send typing notifications": "Nie wysyłaj powiadomienia o pisaniu",
+ "Download %(text)s": "Pobrano %(text)s",
+ "Drop File Here": "Upuść plik tutaj",
+ "Drop here to tag %(section)s": "Upuść tutaj by oznaczyć %(section)s",
+ "Ed25519 fingerprint": "Odcisk Ed25519",
+ "Edit": "Edytuj",
+ "Email": "E-mail",
+ "Email address": "Adres e-mail",
+ "Email address (optional)": "Adres e-mail (opcjonalnie)",
+ "Email, name or matrix ID": "E-mail, nazwa lub matrix ID",
+ "Emoji": "Emoji",
+ "Enable automatic language detection for syntax highlighting": "Włącz automatyczne rozpoznawanie języka dla podświetlania składni",
+ "Enable encryption": "Włącz szyfrowanie",
+ "Enable Notifications": "Włącz powiadomienia",
+ "enabled": "włączone",
+ "Encrypted by a verified device": "Zaszyfrowane przez zweryfikowane urządzenie",
+ "Encrypted by an unverified device": "Zaszyfrowane przez niezweryfikowane urządzenie",
+ "Encrypted messages will not be visible on clients that do not yet implement encryption": "Szyfrowane wiadomości nie są widoczne w programach, które nie implementują szyfrowania",
+ "Encrypted room": "Pokój szyfrowany",
+ "Encryption is enabled in this room": "Szyfrowanie jest włączone w tym pokoju",
+ "Encryption is not enabled in this room": "Szyfrowanie nie jest włączone w tym pokoju",
+ "%(senderName)s ended the call.": "%(senderName)s zakończył połączenie.",
+ "End-to-end encryption information": "Informacje o szyfrowaniu końcówka-do-końcówki",
+ "End-to-end encryption is in beta and may not be reliable": "Szyfrowanie końcówka-do-końcówki jest w fazie beta i może nie być dopracowane",
+ "Enter Code": "Wpisz kod",
+ "Enter passphrase": "Wpisz frazę",
+ "Error decrypting attachment": "Błąd odszyfrowywania załącznika",
+ "Error: Problem communicating with the given homeserver.": "Błąd: wystąpił problem podczas komunikacji z podanym serwerem.",
+ "Event information": "Informacje zdarzenia",
+ "Existing Call": "Istniejące połączenie",
+ "Export": "Eksport",
+ "Export E2E room keys": "Eksportuj klucze E2E pokojów",
+ "Failed to ban user": "Nie udało się zbanować użytkownika",
+ "Failed to change power level": "Nie udało się zmienić poziomu mocy",
+ "Failed to delete device": "Nie udało się usunąć urządzenia",
+ "Failed to fetch avatar URL": "Nie udało się pobrać awatara",
+ "Failed to join room": "Nie udało się dołączyć do pokoju",
+ "Failed to kick": "Nie udało się wykopać użytkownika",
+ "Failed to leave room": "Nie udało się opuścić pokoju",
+ "Failed to load timeline position": "Nie udało się wczytać pozycji osi czasu",
+ "Failed to lookup current room": "Nie udało się wyszukać aktualnego pokoju",
+ "Failed to mute user": "Nie udało się wyciszyć użytkownika",
+ "Failed to register as guest:": "Nie udało się zarejestrować jako gość:",
+ "Failed to reject invite": "Nie udało się odrzucić zaproszenia",
+ "Failed to reject invitation": "Nie udało się odrzucić zaproszenia",
+ "Failed to save settings": "Nie udało się zapisać ustawień",
+ "Failed to send email": "Nie udało się wysłać wiadomości e-mail",
+ "Failed to send request.": "Nie udało się wysłać żądania.",
+ "Failed to set avatar.": "Nie udało się ustawić awataru.",
+ "Failed to set display name": "Nie udało się ustawić wyświetlanej nazwy",
+ "Failed to set up conference call": "Nie udało się ustanowić połączenia konferencyjnego",
+ "Failed to toggle moderator status": "Nie udało się przełączyć na stan moderatora",
+ "Failed to unban": "Nie udało się odbanować",
+ "Failed to upload file": "Nie udało się wgrać pliku",
+ "Failed to upload profile picture!": "Nie udało się wgrać zdjęcia profilowego!",
+ "Failed to verify email address: make sure you clicked the link in the email": "Nie udało się zweryfikować adresu e-mail: upewnij się że kliknąłeś w link w e-mailu",
+ "Failure to create room": "Nie udało się stworzyć pokoju",
+ "favourite": "ulubiony",
+ "Favourites": "Ulubione",
+ "Fill screen": "Wypełnij ekran",
+ "Filter room members": "Filtruj uczestników pokoju",
+ "Forget room": "Zapomnij pokój",
+ "Forgot your password?": "Zapomniałeś hasła?",
+ "For security, this session has been signed out. Please sign in again.": "Ze względów bezpieczeństwa ta sesja została wylogowana. Zaloguj się jeszcze raz.",
+ "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.": "Ze względów bezpieczeństwa, wylogowanie skasuje z tej przeglądarki wszystkie klucze szyfrowania końcówka-do-końcówki. Jeśli chcesz móc odszyfrować swoje historie konwersacji z przyszłych sesji Riot-a, proszę wyeksportuj swoje klucze pokojów do bezpiecznego miejsca.",
+ "Found a bug?": "Znalazłeś błąd?",
+ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s",
+ "Guest access is disabled on this Home Server.": "Dostęp dla gości jest wyłączony na tym serwerze.",
+ "Guests can't set avatars. Please register.": "Goście nie mogą ustawić awatara. Proszę się zarejestrować.",
+ "Guest users can't create new rooms. Please register to create room and start a chat.": "Goście nie mogą tworzyć nowych pokoi. Proszę się zarejestrować, by móc stworzyć nowy pokój.",
+ "Deops user with given id": "Usuwa prawa administratora użytkownikowi z danym ID",
+ "Guest users can't upload files. Please register to upload.": "Goście nie mogą wysyłać plików na serwer. Proszę się zarejestrować, by móc wysyłać pliki.",
+ "Guests can't use labs features. Please register.": "Goście nie mogą używać funkcji eksperymentalnych. Proszę się zarejestrować.",
+ "Guests cannot join this room even if explicitly invited.": "Goście nie mogą dołączać do tego pokoju, nawet jeśli zostali specjalnie zaproszeni.",
+ "Hangup": "Rozłącz się",
+ "Hide avatar and display name changes": "Ukryj zmiany awatarów i nazw ekranowych",
+ "Hide Text Formatting Toolbar": "Ukryj pasek formatowania tekstu",
+ "Home": "Strona startowa",
+ "Homeserver is": "Serwer domowy to",
+ "Identity Server is": "Serwer tożsamości to",
+ "I have verified my email address": "Zweryfikowałem swój adres e-mail",
+ "Import": "Importuj",
+ "Import E2E room keys": "Importuj klucze pokoju E2E",
+ "Incoming call from %(name)s": "Połączenie przychodzące od %(name)s",
+ "Incoming video call from %(name)s": "Przychodzące połączenie wideo od %(name)s",
+ "Incoming voice call from %(name)s": "Przychodzące połączenie głosowe od %(name)s",
+ "Incorrect username and/or password.": "Nieprawidłowa nazwa użytkownika i/lub hasło.",
+ "Incorrect verification code": "Nieprawidłowy kod weryfikujący",
+ "Integrations Error": "Błąd integracji",
+ "Interface Language": "Język interfejsu",
+ "Invalid alias format": "Nieprawidłowy format aliasu",
+ "Invalid address format": "Nieprawidłowy format adresu",
+ "Invalid Email Address": "Nieprawidłowy adres e-mail",
+ "Invalid file%(extra)s": "Nieprawidłowy plik %(extra)s",
+ "%(senderName)s invited %(targetName)s.": "%(senderName)s zaprosił %(targetName)s.",
+ "Invite new room members": "Zaproś nowych członków do pokoju",
+ "Invited": "Zaproszony",
+ "Invites": "Zaproszenia",
+ "Invites user with given id to current room": "Zaprasza użytkownika z danym ID do obecnego pokoju",
+ "'%(alias)s' is not a valid format for an address": "'%(alias)s' nie jest poprawnym formatem adresu",
+ "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nie jest poprawnym formatem aliasu",
+ "%(displayName)s is typing": "%(displayName)s pisze",
+ "Sign in with": "Zaloguj się używając",
+ "Join as voice or video .": "Dołącz głosowo lub przez wideo .",
+ "Join Room": "Dołącz do pokoju",
+ "joined and left": "dołączył i wyszedł",
+ "joined": "dołączył",
+ "%(targetName)s joined the room.": "%(targetName)s dołączył do pokoju.",
+ "Joins room with given alias": "Dołącz do pokoju z podanym aliasem",
+ "Jump to first unread message.": "Przeskocz do pierwszej nieprzeczytanej wiadomości.",
+ "%(senderName)s kicked %(targetName)s.": "%(senderName)s wyrzucił %(targetName)s.",
+ "Kick": "Wyrzuć",
+ "Kicks user with given id": "Wyrzuca użytkownika o danym ID",
+ "Labs": "Laboratoria",
+ "Last seen": "Ostatnio widziany",
+ "Leave room": "Opuść pokój",
+ "left and rejoined": "wyszedł i ponownie dołączył",
+ "left": "wyszedł",
+ "%(targetName)s left the room.": "%(targetName)s opuścił pokój.",
+ "Level:": "Poziom:",
+ "Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokoi domeny %(domain)s?",
+ "Local addresses for this room:": "Lokalne adresy dla tego pokoju:",
+ "Logged in as:": "Zalogowany jako:",
+ "Login as guest": "Zaloguj jako gość",
+ "Logout": "Wyloguj",
+ "Low priority": "Niski priorytet",
+ "%(senderName)s made future room history visible to": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla",
+ "Manage Integrations": "Zarządzaj integracjami",
+ "Markdown is disabled": "Markdown jest wyłączony",
+ "Markdown is enabled": "Markdown jest włączony",
+ "matrix-react-sdk version:": "Wersja matrix-react-sdk:",
+ "Matrix Apps": "Aplikacje Matrix",
+ "Members only": "Tylko dla członków",
+ "Message not sent due to unknown devices being present": "Wiadomość nie została wysłana z powodu obecności nieznanych urządzeń",
+ "Missing room_id in request": "Brakujące room_id w żądaniu",
+ "Missing user_id in request": "Brakujące user_id w żądaniu",
+ "Mobile phone number": "Numer telefonu komórkowego",
+ "Mobile phone number (optional)": "Numer telefonu komórkowego (opcjonalne)",
+ "Moderator": "Moderator",
+ "my Matrix ID": "mój Matrix ID",
+ "Name": "Imię",
+ "Never send encrypted messages to unverified devices from this device": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia",
+ "Never send encrypted messages to unverified devices in this room": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych urządzeń w tym pokoju",
+ "Never send encrypted messages to unverified devices in this room from this device": "Nigdy nie wysyłaj niezaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia",
+ "New address (e.g. #foo:%(localDomain)s)": "Nowy adres (np. #foo:%(localDomain)s)",
+ "New Composer & Autocomplete": "Nowy edytor tekstu i autouzupełnianie",
+ "New password": "Nowe hasło",
+ "New passwords don't match": "Nowe hasła nie zgadzają się",
+ "New passwords must match each other.": "Nowe hasła muszą się zgadzać.",
+ "none": "żaden",
+ "not set": "nieustawiony",
+ "not specified": "nieokreślony",
+ "(not supported by this browser)": "(niewspierany przez tę przeglądarkę)",
+ "": "",
+ "AM": "AM",
+ "PM": "PM",
+ "NOT verified": "NIEzweryfikowany",
+ "NOTE: Apps are not end-to-end encrypted": "UWAGA: Aplikacje nie są szyfrowane metodą użytkownik-użytkownik",
+ "No devices with registered encryption keys": "Brak urządzeń z zarejestrowanymi kluczami szyfrującymi",
+ "No display name": "Brak nazwy ekranowej",
+ "No more results": "Nie ma więcej wyników",
+ "No results": "Brak wyników",
+ "No users have specific privileges in this room": "Żadni użytkownicy w tym pokoju nie mają specyficznych uprawnień",
+ "olm version:": "wersja olm:",
+ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Po włączeniu szyfrowania w pokoju nie można go ponownie wyłączyć (póki co)",
+ "Once you've followed the link it contains, click below": "Po kliknięciu łącza, które jest tam zawarte kliknij poniżej",
+ "Only people who have been invited": "Tylko ludzie, którzy zostali zaproszeni",
+ "Otherwise, click here to send a bug report.": "W przeciwnym razie, kliknij tutaj by wysłać raport o błędzie.",
+ "had": "było",
+ "Password": "Hasło",
+ "Password:": "Hasło:",
+ "Passwords can't be empty": "Hasła nie mogą być puste",
+ "People": "Ludzie",
+ "Permissions": "Uprawnienia",
+ "Phone": "Telefon",
+ "%(senderName)s placed a %(callType)s call.": "%(senderName)s rozpoczął połączenie %(callType)s.",
+ "Please check your email and click on the link it contains. Once this is done, click continue.": "Sprawdź swój e-mail i kliknij link w nim zawarty. Kiedy już to zrobisz, kliknij \"kontynuuj\".",
+ "Power level must be positive integer.": "Poziom uprawnień musi być liczbą dodatnią.",
+ "Press": "Naciśnij",
+ "Press to start a chat with someone": "Naciśnij , by rozpocząć rozmowę z kimś",
+ "Privacy warning": "Ostrzeżenie o prywatności",
+ "Private Chat": "Rozmowa prywatna",
+ "Privileged Users": "Użytkownicy uprzywilejowani",
+ "Profile": "Profil",
+ "Public Chat": "Rozmowa publiczna",
+ "Reason": "Powód",
+ "Reason: %(reasonText)s": "Powód: %(reasonText)s",
+ "Revoke Moderator": "Usuń prawa moderatorskie",
+ "Revoke widget access": "Usuń dostęp do widżetów",
+ "Refer a friend to Riot:": "Zaproś znajomego do Riota:",
+ "Register": "Zarejestruj",
+ "rejected": "odrzucone",
+ "%(targetName)s rejected the invitation.": "%(targetName)s odrzucił zaproszenie.",
+ "Reject invitation": "Odrzuć zaproszenie",
+ "Rejoin": "Dołącz ponownie",
+ "Remote addresses for this room:": "Adresy zdalne dla tego pokoju:",
+ "Remove Contact Information?": "Usunąć dane kontaktowe?",
+ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s usunął swoją nazwę ekranową (%(oldDisplayName)s).",
+ "%(senderName)s removed their profile picture.": "%(senderName)s usunął swoje zdjęcie profilowe.",
+ "Remove %(threePid)s?": "Usunąć %(threePid)s?",
+ "Hide Apps": "Ukryj aplikacje",
+ "%(senderName)s requested a VoIP conference.": "%(senderName)s zażądał konferencji VoIP.",
+ "Report it": "Zgłoś",
+ "restore": "przywróć",
+ "Results from DuckDuckGo": "Wyniki z DuckDuckGo",
+ "Return to app": "Wróć do aplikacji",
+ "Return to login screen": "Wróć do ekranu logowania",
+ "Riot does not have permission to send you notifications - please check your browser settings": "Riot nie ma uprawnień, by wysyłać ci powiadomienia - sprawdź ustawienia swojej przeglądarki",
+ "Hide join/leave messages (invites/kicks/bans unaffected)": "Ukryj wiadomości o dołączeniu/opuszczeniu (nie obejmuje zaproszeń/wyrzuceń/banów)",
+ "Hide read receipts": "Ukryj potwierdzenia odczytu",
+ "Historical": "Historyczne",
+ "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.": "Resetowanie hasła zresetuje klucze szyfrowania końcówka-do-końcówki na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.",
+ "Riot was not given permission to send notifications - please try again": "Riot nie otrzymał uprawnień do wysyłania powiadomień - proszę spróbuj ponownie",
+ "riot-web version:": "wersja riot-web:",
+ "Room %(roomId)s not visible": "Pokój %(roomId)s nie jest widoczny",
+ "Room Colour": "Kolor pokoju",
+ "Room contains unknown devices": "Pokój zawiera nieznane urządzenia",
+ "Room name (optional)": "Nazwa pokoju (opcjonalna)",
+ "%(roomName)s does not exist.": "%(roomName)s nie istnieje.",
+ "%(roomName)s is not accessible at this time.": "%(roomName)s nie jest dostępny w tym momencie.",
+ "Rooms": "Pokoje",
+ "Save": "Zapisz",
+ "Scroll to bottom of page": "Przewiń do końca strony",
+ "Scroll to unread messages": "Przewiń do nieprzeczytanych wiadomości",
+ "Search failed": "Wyszukiwanie nie powiodło się",
+ "Searches DuckDuckGo for results": "Przeszukaj DuckDuckGo dla wyników",
+ "Searching known users": "Przeszukaj znanych użytkowników",
+ "Seen by %(userName)s at %(dateTime)s": "Widziane przez %(userName)s o %(dateTime)s",
+ "Send a message (unencrypted)": "Wyślij wiadomość (nieszyfrowaną)",
+ "Send an encrypted message": "Wyślij szyfrowaną wiadomość",
+ "Send anyway": "Wyślij mimo to",
+ "Sender device information": "Informacja o urządzeniu nadawcy",
+ "Send Invites": "Wyślij zaproszenie",
+ "Send Reset Email": "Wyślij e-mail resetujący hasło",
+ "sent an image": "wysłano obraz",
+ "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s wysłał obraz.",
+ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.",
+ "sent a video": "wysłał wideo",
+ "Server error": "Błąd serwera",
+ "Server may be unavailable or overloaded": "Serwer może być niedostępny lub przeciążony",
+ "Server may be unavailable, overloaded, or search timed out :(": "Serwer może być niedostępny, przeciążony, lub upłynął czas wyszukiwania :(",
+ "Server may be unavailable, overloaded, or the file too big": "Serwer może być niedostępny, przeciążony, lub plik jest za duży",
+ "Server may be unavailable, overloaded, or you hit a bug.": "Serwer może być niedostępny, przeciążony, lub trafiłeś na błąd.",
+ "Server unavailable, overloaded, or something else went wrong.": "Serwer może być niedostępny, przeciążony, lub coś innego poszło źle.",
+ "Session ID": "Identyfikator sesji",
+ "%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.",
+ "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.",
+ "Set": "Ustaw",
+ "Sets the room topic": "Ustaw temat pokoju",
+ "Show Apps": "Pokaż aplikacje",
+ "Show panel": "Pokaż panel",
+ "Show Text Formatting Toolbar": "Pokaż pasek narzędzi formatowania tekstu",
+ "Show timestamps in 12 hour format (e.g. 2:30pm)": "Pokaż czas w formacie 12-sto godzinnym (n.p. 2:30pm)",
+ "Signed Out": "Wylogowano",
+ "Sign in": "Zaloguj",
+ "Sign out": "Wyloguj",
+ "since the point in time of selecting this option": "od momentu zaznaczenia tej opcji",
+ "since they joined": "od momentu dołączenia",
+ "since they were invited": "od momentu zaproszenia",
+ "Some of your messages have not been sent.": "Niektóre z twoich wiadomości nie zostały wysłane.",
+ "Someone": "Ktoś",
+ "Sorry, this homeserver is using a login which is not recognised ": "Przepraszamy, ten serwer używa loginu który nie jest rozpoznawany ",
+ "Start a chat": "Rozpocznij rozmowę",
+ "Start authentication": "Rozpocznij uwierzytelnienie",
+ "Start Chat": "Rozpocznij rozmowę",
+ "Submit": "Wyślij",
+ "Success": "Sukces",
+ "tag as %(tagName)s": "oznaczył jako %(tagName)s",
+ "tag direct chat": "oznaczył bezpośrednią rozmowę",
+ "Tagged as: ": "Oznaczone jako: ",
+ "The default role for new room members is": "Domyślną rolą dla nowych członków pokoju jest",
+ "The main address for this room is": "Głównym adresem dla tego pokoju jest",
+ "The maximum permitted number of widgets have already been added to this room.": "Do tego pokoju dodano już maksymalną dozwoloną liczbę widżetów.",
+ "The phone number entered looks invalid": "Wprowadzony numer telefonu wygląda na niepoprawny",
+ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podany klucz podpisu odpowiada kluczowi podpisania otrzymanemu z urządzenia %(userId)s %(deviceId)s. Urządzenie oznaczone jako zweryfikowane.",
+ "This action cannot be performed by a guest user. Please register to be able to do this.": "Ta czynność nie może być wykonana przez gościa. Proszę się zarejestrować, aby móc ją wykonać.",
+ "This email address is already in use": "Podany adres e-mail jest już w użyciu",
+ "This email address was not found": "Podany adres e-mail nie został znaleziony",
+ "%(actionVerb)s this person?": "%(actionVerb)s tą osobę?",
+ "changing room on a RoomView is not supported": "Zmiana pokoju na RoomView nie jest obsługiwana",
+ "Must be viewing a room": "Musi wyświetlać pokój",
+ "The email address linked to your account must be entered.": "Adres e-mail połączony z twoim kontem musi zostać wpisany.",
+ "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Rozmiar folderu '%(fileName)s' przekracza możliwy limit do przesłania na serwer domowy",
+ "The file '%(fileName)s' failed to upload": "Przesyłanie folderu '%(fileName)s' nie powiodło się",
+ "The remote side failed to pick up": "Strona zdalna nie odebrała",
+ "There was a problem logging in.": "Nastąpiły problemy z logowaniem.",
+ "This room has no local addresses": "Ten pokój nie ma lokalnych adresów",
+ "This room is not recognised.": "Ten pokój nie został rozpoznany.",
+ "These are experimental features that may break in unexpected ways": "Te funkcje są eksperymentalne i może wystąpić błąd",
+ "The visibility of existing history will be unchanged": "Widoczność dotychczasowej historii nie zostanie zmieniona",
+ "This doesn't appear to be a valid email address": "Ten adres e-mail zdaje się nie być poprawny",
+ "This is a preview of this room. Room interactions have been disabled": "To jest podgląd tego pokoju. Interakcje w pokoju zostały wyłączone",
+ "This phone number is already in use": "Ten numer telefonu jest już zajęty",
+ "This room": "Ten pokój",
+ "This room is not accessible by remote Matrix servers": "Ten pokój nie jest dostępny na zdalnych serwerach Matrix",
+ "This room's internal ID is": "Identyfikatorem tego pokoju jest",
+ "times": "razy",
+ "To ban users": "Żeby zablokować użytkowników",
+ "to browse the directory": "żeby przeglądnąć katalog",
+ "To configure the room": "Żeby skonfigurować pokój",
+ "to demote": "Żeby zmniejszyć priorytet",
+ "To get started, please pick a username!": "Aby rozpocząć, wybierz nazwę użytkownika!",
+ "To invite users into the room": "Żeby zaprosić użytkowników do pokoju",
+ "To kick users": "Żeby wykluczyć użytkowników",
+ "to make a room or": "żeby utworzyć pokój lub",
+ "To remove other users' messages": "Żeby usunąć wiadomości innych użytkowników",
+ "To reset your password, enter the email address linked to your account": "Aby zresetować swoje hasło, wpisz adres e-mail połączony z twoim kontem",
+ "to restore": "żeby przywrócić",
+ "To send messages": "Żeby wysyłać wiadomości",
+ "to start a chat with someone": "żeby zacząć rozmowę z kimś",
+ "to tag as %(tagName)s": "żeby otagować jako %(tagName)s",
+ "To send events of type": "Żeby wysyłać wydarzenia typu",
+ "to tag direct chat": "żeby oznaczyć rozmowę bezpośrednią",
+ "Turn Markdown off": "Wyłącz Markdown",
+ "Turn Markdown on": "Włącz Markdown",
+ "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s włączył szyfrowanie użytkownik-użytkownik (algorithm %(algorithm)s).",
+ "Unable to add email address": "Nie można dodać adresu e-mail",
+ "Unable to create widget.": "Nie można utworzyć widżetu.",
+ "Unable to remove contact information": "Nie można usunąć informacji kontaktowych",
+ "Unable to restore previous session": "Nie można przywrócić poprzedniej sesji",
+ "Unable to verify email address.": "Weryfikacja adresu e-mail nie powiodła się.",
+ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s odblokował/a %(targetName)s.",
+ "Unable to capture screen": "Nie można zrobić zrzutu ekranu",
+ "Unable to enable Notifications": "Nie można włączyć powiadomień",
+ "Unable to load device list": "Nie można załadować listy urządzeń",
+ "Undecryptable": "Nie do odszyfrowania",
+ "Unencrypted room": "Pokój nieszyfrowany",
+ "This Home Server does not support login using email address.": "Ten domowy serwer nie obsługuje logowania się poprzez adres e-mail.",
+ "This invitation was sent to an email address which is not associated with this account:": "To zaproszenie zostało wysłane na adres e-mail, który nie jest połączony z tym kontem:",
+ "to favourite": "Żeby dodać do ulubionych",
+ "To use it, just wait for autocomplete results to load and tab through them.": "Żeby z niego skorzystać, należy poczekać na załadowanie się autouzupełnienia wyników i przewinąć je.",
+ "Unencrypted message": "Niezaszyfrowana wiadomość",
+ "unknown caller": "nieznany dzwoniący",
+ "unknown device": "nieznane urządzenie",
+ "Unknown room %(roomId)s": "Nieznany pokój %(roomId)s",
+ "unknown": "nieznany",
+ "Unmute": "Wyłącz wyciszenie",
+ "Unnamed Room": "Pokój bez nazwy",
+ "Unrecognised command:": "Nierozpoznane polecenie:",
+ "Unrecognised room alias:": "Nierozpoznany alias pokoju:",
+ "Unverified": "Niezweryfikowany",
+ "Uploading %(filename)s and %(count)s others|zero": "Przesyłanie %(filename)s",
+ "Uploading %(filename)s and %(count)s others|one": "Przesyłanie %(filename)s i %(count)s inny",
+ "Uploading %(filename)s and %(count)s others|other": "Przesyłanie %(filename)s i %(count)s innych",
+ "uploaded a file": "przesłał plik",
+ "Upload avatar": "Prześlij zdjęcie profilowe",
+ "Upload Failed": "Błąd przesyłania",
+ "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",
+ "Verification": "Weryfikacja",
+ "verified": "Zweryfikowany",
+ "Verified": "Zweryfikowany",
+ "Verified key": "Zweryfikowany klucz",
+ "Video call": "Rozmowa wideo",
+ "Voice call": "Rozmowa głosowa",
+ "VoIP conference finished.": "Zakończono konferencję głosową.",
+ "VoIP conference started.": "Rozpoczęto konferencję głosową.",
+ "VoIP is unsupported": "Rozmowy głosowe nie są obsługiwane",
+ "(could not connect media)": "(brak możliwości połączenia się z mediami)",
+ "(no answer)": "(brak odpowiedzi)",
+ "(unknown failure: %(reason)s)": "(nieznany błąd: %(reason)s)",
+ "(warning: cannot be disabled again!)": "(ostrzeżenie: brak możliwości ponownego dezaktywowania!)",
+ "WARNING: Device already verified, but keys do NOT MATCH!": "OSTRZEŻENIE: Urządzenie już zweryfikowane, ale klucze NIE PASUJĄ DO SIEBIE!",
+ "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!": "OSTRZEŻENIE: BŁĄD WERYFIKACJI KLUCZA! Klucz podpisujący dla %(userId)s i urządzenia %(deviceId)s to \"%(fprint)s\", który nie pasuje do dostarczonego klucza \"%(fingerprint)s\". To może oznaczać, że twoje komunikaty są przejmowane!",
+ "Who can access this room?": "Kto może mieć dostęp do tego pokoju?",
+ "Who would you like to add to this room?": "Kogo chciał(a)byś dodać do tego pokoju?",
+ "Who would you like to communicate with?": "Z kim chciał(a)byś się komunikować?",
+ "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s wycofał(a) zaproszenie %(targetName)s.",
+ "Would you like to accept or decline this invitation?": "Czy chcesz zaakceptować czy odrzucić to zaproszenie?",
+ "You already have existing direct chats with this user:": "Masz już istniejącą bezpośrednią konwersację z tym użytkownikiem:",
+ "You are already in a call.": "Jesteś już w trakcie połączenia.",
+ "You are not in this room.": "Nie jesteś w tym pokoju.",
+ "You do not have permission to do that in this room.": "Nie masz pozwolenia na wykonanie tej akcji w tym pokoju.",
+ "You're not in any rooms yet! Press to make a room or to browse the directory": "Nie jesteś jeszcze w żadnym pokoju! Naciśnij , aby stworzyć pokój lub , żeby przeszukać katalog",
+ "You are trying to access %(roomName)s.": "Próbujesz uzyskać dostęp do %(roomName)s.",
+ "You cannot place a call with yourself.": "Nie możesz wykonać połączenia do siebie.",
+ "You cannot place VoIP calls in this browser.": "Nie możesz przeprowadzić rozmowy audio w tej przeglądarce.",
+ "You do not have permission to post to this room": "Nie jesteś uprawniony do pisania w tym pokoju",
+ "You have been banned from %(roomName)s by %(userName)s.": "Zostałeś permanentnie usunięty z pokoju %(roomName)s przez %(userName)s.",
+ "You have been invited to join this room by %(inviterName)s": "Zostałeś zaproszony do dołączenia do tego pokoju przez %(inviterName)s",
+ "You have been kicked from %(roomName)s by %(userName)s.": "Zostałeś usunięty z %(roomName)s przez %(userName)s.",
+ "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": "Wylogowałeś się ze wszystkich urządzeń i nie będziesz już otrzymywał powiadomień push. Aby ponownie aktywować powiadomienia zaloguj się ponownie na każdym urządzeniu",
+ "You have disabled URL previews by default.": "Masz domyślnie wyłączone podglądy linków.",
+ "You have entered an invalid contact. Try using their Matrix ID or email address.": "Wpisałeś niewłaściwy kontakt. Spróbuj używając identyfikacji Matrix lub adresu e-mail.",
+ "You have no visible notifications": "Nie masz widocznych powiadomień",
+ "You may wish to login with a different account, or add this email to this account.": "Możesz chcieć zalogować się z innego konta lub dodać e-mail do tego konta.",
+ "you must be a": "musisz być",
+ "You must register to use this functionality": "Musisz się zarejestrować aby używać tej funkcji",
+ "You need to be able to invite users to do that.": "Aby to zrobić musisz mieć możliwość zapraszania użytkowników.",
+ "You need to be logged in.": "Musisz być zalogowany.",
+ "You need to enter a user name.": "Musisz wpisać nazwę użytkownika.",
+ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Twój adres e-mail zdaje się nie być powiązany z identyfikacją Matrix na tym serwerze domowym.",
+ "Your password has been reset": "Twoje hasło zostało zresetowane",
+ "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Zmiana Twojego hasła powiodła się. Nie będziesz otrzymywał powiadomień push na inne urządzenia aż do momentu ponownego zalogowania się na nich",
+ "You seem to be in a call, are you sure you want to quit?": "Wygląda na to, że prowadzisz z kimś rozmowę; jesteś pewien że chcesz wyjść?",
+ "You seem to be uploading files, are you sure you want to quit?": "Wygląda na to, że jesteś w trakcie przesyłania plików; jesteś pewien, że chcesz wyjść?",
+ "You should not yet trust it to secure data": "Na chwilę obecną nie powinieneś ufać mu w kwestii zabezpieczenia danych",
+ "Set a display name:": "Ustaw nazwę ekranową:",
+ "This server does not support authentication with a phone number.": "Ten serwer nie wspiera autentykacji za pomocą numeru telefonu.",
+ "This doesn't look like a valid email address.": "To nie wygląda na poprawny adres e-mail.",
+ "This doesn't look like a valid phone number.": "To nie wygląda na poprawny numer telefonu.",
+ "User names may only contain letters, numbers, dots, hyphens and underscores.": "Nazwa użytkownika może zawierać tylko litery, cyfry, kropki, myślniki i podkreślenia.",
+ "An unknown error occurred.": "Wystąpił nieznany błąd.",
+ "I already have an account": "Posiadam już konto",
+ "Share message history with new users": "Udostępnij historię wiadomości nowym użytkownikom",
+ "Encrypt room": "Zaszyfruj pokój",
+ "There are no visible files in this room": "Nie ma widocznych plików w tym pokoju",
+ "Connectivity to the server has been lost.": "Połączenie z serwerem zostało utracone.",
+ "Auto-complete": "Auto-uzupełnianie",
+ "bold": "wytłuszczenie",
+ "italic": "kursywa",
+ "underline": "podkreślenie",
+ "code": "kod",
+ "quote": "cytat",
+ "Edit Group": "Edytuj grupę",
+ "Join an existing group": "Dołącz do istniejącej grupy",
+ "Create a new group": "Stwórz nową grupę",
+ "Create": "Utwórz",
+ "Groups": "Grupy",
+ "Online": "Dostępny",
+ "Offline": "Niedostępny",
+ "Add an Integration": "Dodaj integrację",
+ "Token incorrect": "Niepoprawny token",
+ "This action is irreversible.": "Ta akcja jest nieodwracalna.",
+ "To link to a room it must have an address .": "Aby móc stworzyć link do pokoju musi on mieć swój adres .",
+ "unencrypted": "niezaszyfrowany",
+ "Unknown (user, device) pair:": "Nieznana para (użytkownik, urządzenie):",
+ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nie będziesz mógł cofnąć tej zmiany, ponieważ nadajesz użytkownikowi uprawnienia administratorskie równe Twoim.",
+ "Your home server does not support device management.": "Twój serwer domowy nie obsługuje zarządzania urządzeniami.",
+ "Unbans user with given id": "Odblokowuje użytkownika o danym ID",
+ "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Brak możliwości stwierdzenia, że adres tego zaproszenia został wysłany na adres połączony z twoim kontem.",
+ "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
+ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
+ "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
+ "Set a Display Name": "Ustaw nazwę ekranową",
+ "Upload an avatar:": "Prześlij zdjęcie profilowe:",
+ "Missing password.": "Brakujące hasło.",
+ "Passwords don't match.": "Hasła nie zgadzają się.",
+ "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Za krótkie hasło (min. %(MIN_PASSWORD_LENGTH)s).",
+ "An error occurred: %(error_string)s": "Wystąpił błąd: %(error_string)s",
+ "Make Moderator": "Nadaj uprawnienia moderatora",
+ "Make this room private": "Nadaj temu pokojowi charakter prywatny",
+ "Sent messages will be stored until your connection has returned.": "Wysłane wiadomości będą przechowywane aż do momentu odzyskania połączenia.",
+ "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Wyślij ponownie wszystkie lub anuluj wszystkie teraz. Możesz też wybrać poszczególne wiadomości aby wysłać je ponownie lub anulować.",
+ "(~%(count)s results)|one": "(~%(count)s wynik)",
+ "(~%(count)s results)|other": "(~%(count)s wyniki)",
+ "Active call": "Aktywna rozmowa",
+ "strike": "przekreślenie",
+ "bullet": "lista",
+ "numbullet": "lista numerowana",
+ "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)sdołączyli do pokoju %(repeats)s razy",
+ "%(oneUser)sjoined %(repeats)s times": "%(oneUser)sdołączył do pokoju %(repeats)s razy",
+ "%(severalUsers)sjoined": "%(severalUsers)sdołączyli",
+ "%(oneUser)sjoined": "%(oneUser)sdołączył",
+ "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)sopuścili pokój %(repeats)s razy",
+ "%(oneUser)sleft %(repeats)s times": "%(oneUser)sopuścił pokój %(repeats)s razy",
+ "%(severalUsers)sleft": "%(severalUsers)sopuścili pokój",
+ "%(oneUser)sleft": "%(oneUser)sopuścił pokój",
+ "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)sdołączyli i opuścili pokój %(repeats)s razy",
+ "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)sdołączył i opuścił pokój %(repeats)s razy",
+ "%(severalUsers)sjoined and left": "%(severalUsers)sdołączyli i opuścili pokój",
+ "%(oneUser)sjoined and left": "%(oneUser)sdołączył i opuścił pokój",
+ "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)sopuścili i ponownie dołączyli do pokoju %(repeats)s razy",
+ "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sopuścił i ponownie dołączył do pokoju %(repeats)s razy",
+ "%(severalUsers)sleft and rejoined": "%(severalUsers)sopuścili i ponownie dołączyli do pokoju",
+ "%(oneUser)sleft and rejoined": "%(oneUser)sopuścił i dołączył ponownie do pokoju",
+ "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)sodrzucili ich zaproszenia %(repeats)s razy",
+ "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)sodrzucił swoje zaproszenie %(repeats)s razy",
+ "%(severalUsers)srejected their invitations": "%(severalUsers)sodrzucili swoje zaproszenia",
+ "%(oneUser)srejected their invitation": "%(oneUser)sodrzucił swoje zaproszenie",
+ "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)swycofali swoje zaproszenia %(repeats)s razy",
+ "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)swycofał swoje zaproszenie %(repeats)s razy",
+ "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)swycofali swoje zaproszenia",
+ "%(oneUser)shad their invitation withdrawn": "%(oneUser)swycofał swoje zaproszenie",
+ "were invited %(repeats)s times": "zostali zaproszeni %(repeats)s razy",
+ "was invited %(repeats)s times": "został zaproszony %(repeats)s razy",
+ "were invited": "zostali zaproszeni",
+ "was invited": "został zaproszony",
+ "were banned %(repeats)s times": "zostali zablokowani %(repeats)s times",
+ "was banned %(repeats)s times": "został zablokowany %(repeats)s razy",
+ "were banned": "zostali zablokowani",
+ "was banned": "został zablokowany",
+ "were unbanned %(repeats)s times": "zostali odblokowani %(repeats)s razy",
+ "was unbanned %(repeats)s times": "został odblokowany %(repeats)s razy",
+ "were unbanned": "zostali odblokowani",
+ "was unbanned": "został odblokowany",
+ "were kicked %(repeats)s times": "zostali usunięci %(repeats)s razy",
+ "was kicked %(repeats)s times": "został usunięty %(repeats)s razy",
+ "were kicked": "zostali usunięci",
+ "was kicked": "został usunięty",
+ "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)szmienili swoją nazwę %(repeats)s razy",
+ "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)szmienił swoją nazwę %(repeats)s razy",
+ "%(severalUsers)schanged their name": "%(severalUsers)szmienili swoje nazwy",
+ "%(oneUser)schanged their name": "%(oneUser)szmienił swoją nazwę",
+ "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)szmienili swoje zdjęcia profilowe %(repeats)s razy",
+ "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)szmienił swoje zdjęcie profilowe %(repeats)s razy",
+ "%(severalUsers)schanged their avatar": "%(severalUsers)szmienili swoje zdjęcia profilowe",
+ "%(oneUser)schanged their avatar": "%(oneUser)szmienił swoje zdjęcie profilowe",
+ "Please select the destination room for this message": "Wybierz pokój docelowy dla tej wiadomości",
+ "Start automatically after system login": "Uruchom automatycznie po zalogowaniu się do systemu",
+ "Desktop specific": "Specyficzne dla desktopowej aplikacji klienckiej",
+ "Analytics": "Analityka",
+ "Passphrases must match": "Hasła szyfrujące muszą być identyczne",
+ "Passphrase must not be empty": "Hasło szyfrujące nie może być puste",
+ "Export room keys": "Eksportuj klucze do pokoju",
+ "Confirm passphrase": "Potwierdź tekst szyfrujący",
+ "Import room keys": "Importuj klucze do pokoju",
+ "File to import": "Plik do importu",
+ "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.": "Ten proces pozwala na eksport kluczy do wiadomości otrzymanych w zaszyfrowanych pokojach do pliku lokalnego. Wtedy będzie można importować plik do innego klienta Matrix w przyszłości, tak aby klient także mógł rozszyfrować te wiadomości.",
+ "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.": "Ten proces pozwala na import zaszyfrowanych kluczy, które wcześniej zostały eksportowane z innego klienta Matrix. Będzie można odszyfrować każdą wiadomość, którą inny klient może odszyfrować.",
+ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Eksportowany plik będzie chroniony tekstem szyfrowanym. Aby odszyfrować plik, wpisz tekst szyfrowany tutaj.",
+ "You must join the room to see its files": "Należy dołączyć do pokoju by zobaczyć jego pliki",
+ "Reject all %(invitedRooms)s invites": "Odrzuć wszystkie zaproszenia do %(invitedRooms)s",
+ "Guest users can't invite users. Please register.": "Goście nie mogą zapraszać użytkowników. Zarejestruj się.",
+ "Failed to invite": "Wysłanie zaproszenia nie powiodło się",
+ "Failed to invite user": "Wysłanie zaproszenia użytkownikowi nie powiodło się",
+ "Failed to invite the following users to the %(roomName)s room:": "Wysłanie zaproszenia do następujących użytkowników do pokoju %(roomName)s nie powiodło się:",
+ "Confirm Removal": "Potwierdź usunięcie",
+ "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.": "Jesteś pewien że chcesz usunąć to wydarzenie? Pamiętaj, że jeśli usuniesz nazwę pokoju lub aktualizację tematu pokoju, zmiana może zostać cofnięta.",
+ "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "To sprawi, że Twoje konto będzie permamentnie nieużywalne. Nie będzie można zarejestrować się ponownie z tą samą identyfikacją użytkownika.",
+ "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:": "Aby sprawdzić czy to urządzenie jest zaufane, skontaktuj się z jego właścicielem używając innych środków (np. osobiście lub telefonicznie) i zapytaj ich czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasują do klucza poniżej:",
+ "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.": "Jeśli pasują, naciśnij na przycisk \"Sprawdź\" poniżej. Jeśli nie, to ktoś inny przejmuje to urządzenie i powinieneś nacisnąć na przycisk czarnej listy.",
+ "In future this verification process will be more sophisticated.": "W przyszłości proces weryfikacji będzie bardziej skomplikowany.",
+ "I verify that the keys match": "Upewnię się, że klucze się zgadzają",
+ "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.": "Napotkaliśmy błąd próbując przywrócić twoją poprzednią sesję. Jeśli chcesz kontynuować, będziesz musiał zalogować się ponownie, a historia zaszyfrowanego czatu nie będzie do odczytania.",
+ "Unable to restore session": "Przywrócenie sesji jest niemożliwe",
+ "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.": "Jeśli wcześniej używałeś nowszej wersji Riot, twoja sesja może być niekompatybilna z tą wersją. Zamknij to okno i powróć do nowszej wersji.",
+ "Continue anyway": "Kontynuuj mimo to",
+ "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Aktualnie wpisujesz niezweryfikowane urządzenia na czarną listę; aby wysłać wiadomość do tych urządzeń musisz je zweryfikować.",
+ "Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonimowe dane analityczne, aby umożliwić nam rozwijanie aplikacji.",
+ "Verifies a user, device, and pubkey tuple": "Weryfikuje użytkownika, urządzenie i krotkę kluczy publicznych",
+ "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" zawiera niewidziane przez Ciebie wcześniej urządzenia.",
+ "ex. @bob:example.com": "np. @jan:example.com",
+ "This Home Server would like to make sure you are not a robot": "Ten serwer domowy chciałby się upewnić, że nie jesteś robotem",
+ "Sign in with CAS": "Zaloguj się używając CAS",
+ "This allows you to use this app with an existing Matrix account on a different home server.": "To umożliwia Ci używanie tej aplikacji wraz z istniejącym kontem Matrix na innym serwerze domowym.",
+ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nastąpiła próba załadowania danego punktu w historii tego pokoju, lecz nie masz uprawnień, by zobaczyć określoną wiadomość.",
+ "Use compact timeline layout": "Użyj kompaktowego stylu linii czasu",
+ "You have enabled URL previews by default.": "Masz domyślnie włączone podglądy linków.",
+ "Opt out of analytics": "Zrezygnuj z analityk",
+ "Please check your email to continue registration.": "Sprawdź swój e-mail, aby kontynuować rejestrację.",
+ "Please enter the code it contains:": "Wpisz kod, który jest tam zawarty:",
+ "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Jeśli nie ustawisz adresu e-mail, nie będzie możliwe zresetowanie Twojego hasła. Kontynuować?",
+ "You are registering with %(SelectedTeamName)s": "Rejestrujesz się z %(SelectedTeamName)s",
+ "Custom server": "Serwer niestandardowy",
+ "Home server URL": "Adres serwera domowego",
+ "What does this mean?": "Co to znaczy?",
+ "Error decrypting audio": "Błąd deszyfrowania audio",
+ "Error decrypting image": "Błąd deszyfrowania obrazu",
+ "Image '%(Body)s' cannot be displayed.": "Obraz '%(Body)s' nie może zostać wyświetlony.",
+ "Error decrypting video": "Błąd deszyfrowania wideo",
+ "Removed or unknown message type": "Usunięto lub nieznany typ wiadomości",
+ "Disable URL previews by default for participants in this room": "Ustaw podglądy linków na domyślnie wyłączone dla uczestników w tym pokoju",
+ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Próbowano załadować konkretny punkt na osi czasu w tym pokoju, ale nie nie można go znaleźć.",
+ "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.": "",
+ " (unsupported)": " (niewspierany)",
+ "for %(amount)ss": "za %(amount)s sek",
+ "for %(amount)sm": "%(amount)s min",
+ "for %(amount)sh": "%(amount)s godz",
+ "for %(amount)sd": "%(amount)s dni",
+ "Idle": "Bezczynny",
+ "Check for update": "Sprawdź aktualizacje",
+ "$senderDisplayName changed the room avatar to ": "$senderDisplayName zmienił awatar pokoju na ",
+ "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s usunął awatar pokoju.",
+ "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmienił awatar %(roomName)s",
+ "This will be your account name on the homeserver, or you can pick a different server .": "To będzie twoja nazwa konta na serwerze domowym; możesz też wybrać inny serwer .",
+ "If you already have a Matrix account you can log in instead.": "Jeśli już posiadasz konto Matrix możesz się zalogować .",
+ "Not a valid Riot keyfile": "Niepoprawny plik klucza Riot",
+ "Authentication check failed: incorrect password?": "Próba autentykacji nieudana: nieprawidłowe hasło?",
+ "Disable Peer-to-Peer for 1:1 calls": "Wyłącz P2P dla połączeń 1:1",
+ "Do you want to set an email address?": "Czy chcesz ustawić adres e-mail?",
+ "To return to your account in future you need to set a password": "By móc powrócić do swojego konta w przyszłości musisz ustawić hasło",
+ "Share without verifying": "Udostępnij bez weryfikacji",
+ "You added a new device '%(displayName)s', which is requesting encryption keys.": "Dodałeś nowe urządzenie '%(displayName)s', które żąda kluczy szyfrujących.",
+ "Your unverified device '%(displayName)s' is requesting encryption keys.": "Twoje niezweryfikowane urządzenie '%(displayName)s' żąda kluczy szyfrujących.",
+ "Encryption key request": "Żądanie klucza szyfrującego",
+ "Autocomplete Delay (ms):": "Opóźnienie autouzupełniania (ms):",
+ "This Home server does not support groups": "Ten serwer domowy nie wspiera grup",
+ "Loading device info...": "Wczytywanie informacji o urządzeniu...",
+ "Create Group": "Utwórz grupę",
+ "Group Name": "Nazwa grupy",
+ "Example": "Przykład",
+ "Group ID": "ID grupy",
+ "+example:%(domain)s": "+przyklad:%(domain)s",
+ "Room creation failed": "Nie udało się utworzyć pokoju",
+ "You are a member of these groups:": "Jesteś członkiem następujących grup:",
+ "Drop file here to upload": "Upuść plik tutaj, aby go przesłać",
+ "Error whilst fetching joined groups": "Błąd podczas pobierania informacji o dołączonych grupach",
+ "Automatically replace plain text Emoji": "Automatycznie zastępuj tekstowe emotikony",
+ "Failed to upload image": "Przesyłanie obrazka nie powiodło się",
+ "Failed to update group": "Uaktualnienie grupy nie powiodło się",
+ "and %(count)s others...|other": "i %(count)s innych...",
+ "and %(count)s others...|one": "i jeden inny...",
+ "%(count)s new messages|one": "%(count)s nowa wiadomość",
+ "%(count)s new messages|other": "%(count)s nowe wiadomości"
}
diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json
index c9255e2d8e..6bb3816476 100644
--- a/src/i18n/strings/ru.json
+++ b/src/i18n/strings/ru.json
@@ -891,7 +891,7 @@
"You are a member of these groups:": "Вы являетесь членом этих групп:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Создайте группу для представления своего сообщества! Определите набор комнат и собственную домашнюю страницу, чтобы выделить свое пространство во вселенной Matrix.",
"Join an existing group": "Присоединиться к существующей группе",
- "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Чтобы присоединиться к группе, вам нужно знать ее идентификатор; он выглядит примерно так:+пример:matrix.org .",
+ "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "Чтобы присоединиться к группе, вам нужно знать ее идентификатор; он выглядит примерно так:+example:matrix.org .",
"Featured Rooms:": "Рекомендуемые комнаты:",
"Error whilst fetching joined groups": "Ошибка при извлечении объединенных групп",
"Featured Users:": "Избранные пользователи:",
diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json
index 6698557f07..298c0c4d86 100644
--- a/src/i18n/strings/sv.json
+++ b/src/i18n/strings/sv.json
@@ -375,7 +375,7 @@
"Send Reset Email": "Skicka återställningsmeddelande",
"sent an image": "skickade en bild",
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s skickade en bild.",
- "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDIsplayName)s med i rummet.",
+ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s med i rummet.",
"sent a video": "skickade en video",
"Server error": "Serverfel",
"Server may be unavailable or overloaded": "Servern kan vara otillgänglig eller överbelastad",
diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json
index 417a47a79e..29811e855c 100644
--- a/src/i18n/strings/zh_Hans.json
+++ b/src/i18n/strings/zh_Hans.json
@@ -549,17 +549,17 @@
"Seen by %(userName)s at %(dateTime)s": "在 %(dateTime)s 被 %(userName)s 看到",
"Show Apps": "显示应用",
"Tagged as: ": "标记为:",
- "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送到+%(msisdn),请输入接收到的验证码",
- "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName) 接受了 %(displayName)的邀请。",
- "Active call (%(roomName)s)": "%(roomName)的呼叫",
- "And %(count)s more...": "添加%(count)个...",
- "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName) 将级别调整到%(powerLevelDiffText)。",
+ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送到+%(msisdn)s,请输入接收到的验证码",
+ "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。",
+ "Active call (%(roomName)s)": "%(roomName)s 的呼叫",
+ "And %(count)s more...": "添加%(count)s 个...",
+ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整到%(powerLevelDiffText)s 。",
"Changes colour scheme of current room": "修改了样式",
"changing room on a RoomView is not supported": "暂不支持修改",
"demote": "降级",
"Deops user with given id": "Deops user",
"Join as voice or video .": "通过 语言 或者 视频 加入.",
- "%(senderName)s made future room history visible to": "%(senderName) 设定历史浏览功能为",
+ "%(senderName)s made future room history visible to": "%(senderName)s 设定历史浏览功能为",
"AM": "上午",
"PM": "下午",
"NOTE: Apps are not end-to-end encrypted": "提示:APP不支持端对端加密",
@@ -568,11 +568,9 @@
"Profile": "个人配置",
"Public Chat": "公开的",
"Refer a friend to Riot:": "介绍朋友加入Riot:",
- "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName) 删除了显示名称。",
- "%(roomName)s is not accessible at this time.": "%(roomName)此时无法访问。",
+ "%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。",
"Set": "设置",
"Start authentication": "开始认证",
- "tag as %(tagName)s": "标签",
"tag direct chat": "标签",
"The maximum permitted number of widgets have already been added to this room.": "小部件的最大允许数量已经添加到这个房间了。",
"The phone number entered looks invalid": "输入的电话号码看起来无效",
@@ -585,5 +583,52 @@
"Unable to add email address": "无法添加电子邮件地址",
"Failed to update group": "更新群组失败",
"Automatically replace plain text Emoji": "文字、表情自动转换",
- "Join an existing group": "试图加入一个不存在的群组"
+ "Join an existing group": "试图加入一个不存在的群组",
+ "To reset your password, enter the email address linked to your account": "要重置你的密码,请输入关联你的帐号的电子邮箱地址",
+ "Unable to restore previous session": "无法恢复上一个会话",
+ "Unable to verify email address.": "无法验证电子邮箱地址。",
+ "Unknown room %(roomId)s": "未知聊天室 %(roomId)s",
+ "Unknown (user, device) pair:": "未知(用户,设备)对:",
+ "Unrecognised command:": "无法识别的命令:",
+ "Unrecognised room alias:": "无法识别的聊天室别名:",
+ "Use with caution": "谨慎使用",
+ "User Interface": "用户界面",
+ "%(user)s is a": "%(user)s 是一个",
+ "User name": "用户名",
+ "(no answer)": "(没有回答)",
+ "(warning: cannot be disabled again!)": "(警告:无法再被禁用!)",
+ "WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已经验证,但密钥不匹配!",
+ "Who can access this room?": "谁可以访问这个聊天室?",
+ "Who would you like to add to this room?": "你想把谁加入这个聊天室?",
+ "Who would you like to communicate with?": "你想和谁交流?",
+ "You are already in a call.": "你已经在一个通话之中。",
+ "You do not have permission to do that in this room.": "你没有权限在这个聊天室里面做那件事。",
+ "You are trying to access %(roomName)s.": "你正在尝试访问 %(roomName)s.",
+ "You cannot place VoIP calls in this browser.": "你不能在这个浏览器中发起 VoIP 通话。",
+ "You do not have permission to post to this room": "你没有发送到这个聊天室的权限",
+ "You have been invited to join this room by %(inviterName)s": "你已经被 %(inviterName)s 邀请加入这个聊天室",
+ "You seem to be in a call, are you sure you want to quit?": "你好像在一个通话中,你确定要退出吗?",
+ "You seem to be uploading files, are you sure you want to quit?": "你好像正在上传文件,你确定要退出吗?",
+ "You should not yet trust it to secure data": "你不应该相信它来保护你的数据",
+ "Upload an avatar:": "上传一个头像:",
+ "This doesn't look like a valid email address.": "这看起来不是一个合法的电子邮件地址。",
+ "This doesn't look like a valid phone number.": "这看起来不是一个合法的电话号码。",
+ "User names may only contain letters, numbers, dots, hyphens and underscores.": "用户名只可以包含字母、数字、点、连字号和下划线。",
+ "An unknown error occurred.": "一个未知错误出现了。",
+ "An error occurred: %(error_string)s": "一个错误出现了: %(error_string)s",
+ "Encrypt room": "加密聊天室",
+ "There are no visible files in this room": "这个聊天室里面没有可见的文件",
+ "Active call": "活跃的通话",
+ "Verify...": "验证...",
+ "Error decrypting audio": "解密音频时出错",
+ "Error decrypting image": "解密图像时出错",
+ "Error decrypting video": "解密视频时出错",
+ " (unsupported)": "(不支持)",
+ "Updates": "更新",
+ "Check for update": "检查更新",
+ "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室头像。",
+ "Something went wrong!": "出了点问题!",
+ "If you already have a Matrix account you can log in instead.": "如果你已经有一个 Matrix 帐号,你可以登录 。",
+ "Do you want to set an email address?": "你要设置一个电子邮箱地址吗?",
+ "Room creation failed": "创建聊天室失败"
}
diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json
index 2d3e6254f8..dcea22236b 100644
--- a/src/i18n/strings/zh_Hant.json
+++ b/src/i18n/strings/zh_Hant.json
@@ -847,7 +847,7 @@
"You are a member of these groups:": "您是這些群組的成員:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "建立一個群組來代表您的社群!定義一組聊天室與您自己的自訂首頁來標記您在 Matrix 世界中的空間。",
"Join an existing group": "加入既有的群組",
- "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "要加入既有的群組,您將會需要知道其群組識別符;其看起來會像是 +範例:matrix.org 。",
+ "To join an existing group you'll have to know its group identifier; this will look something like +example:matrix.org .": "要加入既有的群組,您將會需要知道其群組識別符;其看起來會像是 +example:matrix.org 。",
"Featured Rooms:": "特色聊天室:",
"Error whilst fetching joined groups": "在擷取已加入的群組時發生錯誤",
"Featured Users:": "特色使用者:",
@@ -858,5 +858,6 @@
"Hide avatars in user and room mentions": "在使用者與聊天室提及中隱藏大頭貼",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所新增",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所移除",
- "Robot check is currently unavailable on desktop - please use a web browser ": "機器人檢查目前在桌面端不可用 ── 請使用網路瀏覽器 "
+ "Robot check is currently unavailable on desktop - please use a web browser ": "機器人檢查目前在桌面端不可用 ── 請使用網路瀏覽器 ",
+ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小工具已被 %(senderName)s 修改"
}
diff --git a/src/stores/RoomScrollStateStore.js b/src/stores/RoomScrollStateStore.js
new file mode 100644
index 0000000000..07848283d1
--- /dev/null
+++ b/src/stores/RoomScrollStateStore.js
@@ -0,0 +1,50 @@
+/*
+Copyright 2017 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.
+*/
+
+/**
+ * Stores where the user has scrolled to in each room
+ */
+class RoomScrollStateStore {
+ constructor() {
+ // A map from room id to scroll state.
+ //
+ // If there is no special scroll state (ie, we are following the live
+ // timeline), the scroll state is null. Otherwise, it is an object with
+ // the following properties:
+ //
+ // focussedEvent: the ID of the 'focussed' event. Typically this is
+ // the last event fully visible in the viewport, though if we
+ // have done an explicit scroll to an explicit event, it will be
+ // that event.
+ //
+ // pixelOffset: the number of pixels the window is scrolled down
+ // from the focussedEvent.
+ this._scrollStateMap = {};
+ }
+
+ getScrollState(roomId) {
+ return this._scrollStateMap[roomId];
+ }
+
+ setScrollState(roomId, scrollState) {
+ this._scrollStateMap[roomId] = scrollState;
+ }
+}
+
+if (global.mx_RoomScrollStateStore === undefined) {
+ global.mx_RoomScrollStateStore = new RoomScrollStateStore();
+}
+export default global.mx_RoomScrollStateStore;
diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js
index bd9d3ea0fa..17fcc97160 100644
--- a/src/stores/RoomViewStore.js
+++ b/src/stores/RoomViewStore.js
@@ -30,8 +30,6 @@ const INITIAL_STATE = {
// The event to scroll to when the room is first viewed
initialEventId: null,
- // The offset to display the initial event at (see scrollStateMap)
- initialEventPixelOffset: null,
// Whether to highlight the initial event
isInitialEventHighlighted: false,
@@ -41,20 +39,6 @@ const INITIAL_STATE = {
roomLoading: false,
// Any error that has occurred during loading
roomLoadError: null,
- // A map from room id to scroll state.
- //
- // If there is no special scroll state (ie, we are following the live
- // timeline), the scroll state is null. Otherwise, it is an object with
- // the following properties:
- //
- // focussedEvent: the ID of the 'focussed' event. Typically this is
- // the last event fully visible in the viewport, though if we
- // have done an explicit scroll to an explicit event, it will be
- // that event.
- //
- // pixelOffset: the number of pixels the window is scrolled down
- // from the focussedEvent.
- scrollStateMap: {},
forwardingEvent: null,
};
@@ -115,9 +99,6 @@ class RoomViewStore extends Store {
case 'on_logged_out':
this.reset();
break;
- case 'update_scroll_state':
- this._updateScrollState(payload);
- break;
case 'forward_event':
this._setState({
forwardingEvent: payload.event,
@@ -132,7 +113,6 @@ class RoomViewStore extends Store {
roomId: payload.room_id,
roomAlias: payload.room_alias,
initialEventId: payload.event_id,
- initialEventPixelOffset: undefined,
isInitialEventHighlighted: payload.highlighted,
forwardingEvent: null,
roomLoading: false,
@@ -145,16 +125,6 @@ class RoomViewStore extends Store {
newState.joining = false;
}
- // If an event ID wasn't specified, default to the one saved for this room
- // via update_scroll_state. Assume initialEventPixelOffset should be set.
- if (!newState.initialEventId) {
- const roomScrollState = this._state.scrollStateMap[payload.room_id];
- if (roomScrollState) {
- newState.initialEventId = roomScrollState.focussedEvent;
- newState.initialEventPixelOffset = roomScrollState.pixelOffset;
- }
- }
-
if (this._state.forwardingEvent) {
dis.dispatch({
action: 'send_event',
@@ -241,15 +211,6 @@ class RoomViewStore extends Store {
});
}
- _updateScrollState(payload) {
- // Clobber existing scroll state for the given room ID
- const newScrollStateMap = this._state.scrollStateMap;
- newScrollStateMap[payload.room_id] = payload.scroll_state;
- this._setState({
- scrollStateMap: newScrollStateMap,
- });
- }
-
reset() {
this._state = Object.assign({}, INITIAL_STATE);
}
@@ -264,11 +225,6 @@ class RoomViewStore extends Store {
return this._state.initialEventId;
}
- // The offset to display the initial event at (see scrollStateMap)
- getInitialEventPixelOffset() {
- return this._state.initialEventPixelOffset;
- }
-
// Whether to highlight the initial event
isInitialEventHighlighted() {
return this._state.isInitialEventHighlighted;
diff --git a/test/components/structures/TimelinePanel-test.js b/test/components/structures/TimelinePanel-test.js
index c13d149ed0..98ec65b8e8 100644
--- a/test/components/structures/TimelinePanel-test.js
+++ b/test/components/structures/TimelinePanel-test.js
@@ -234,6 +234,7 @@ describe('TimelinePanel', function() {
// 5 times, and we should have given up paginating
expect(client.paginateEventTimeline.callCount).toEqual(5);
expect(messagePanel.props.backPaginating).toBe(false);
+ expect(messagePanel.props.suppressFirstDateSeparator).toBe(false);
// now, if we update the events, there shouldn't be any
// more requests.
@@ -338,6 +339,7 @@ describe('TimelinePanel', function() {
awaitScroll().then(() => {
// we should now have loaded the first few events
expect(messagePanel.props.backPaginating).toBe(false);
+ expect(messagePanel.props.suppressFirstDateSeparator).toBe(true);
// back-paginate until we hit the start
return backPaginate();
@@ -345,6 +347,7 @@ describe('TimelinePanel', function() {
// hopefully, we got to the start of the timeline
expect(messagePanel.props.backPaginating).toBe(false);
+ expect(messagePanel.props.suppressFirstDateSeparator).toBe(false);
var events = scryEventTiles(panel);
expect(events[0].props.mxEvent).toBe(timeline.getEvents()[0]);