Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into t3chguy/alpha_room_list

 Conflicts:
	src/components/views/rooms/RoomList.js
	src/stores/RoomListStore.js
This commit is contained in:
Michael Telatynski 2020-02-26 23:02:06 +00:00
commit a1908a208e
104 changed files with 1810 additions and 680 deletions

View file

@ -1,119 +0,0 @@
steps:
- label: ":eslint: JS Lint"
command:
# We fetch the develop js-sdk to get our latest eslint rules
- "echo '--- Install js-sdk'"
- "./scripts/ci/install-deps.sh --ignore-scripts"
- "echo '+++ Lint'"
- "yarn lint:js"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: ":eslint: TS Lint"
command:
- "echo '--- Install'"
- "yarn install --ignore-scripts"
- "echo '+++ Lint'"
- "yarn lint:ts"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: ":eslint: Types Lint"
command:
- "echo '--- Install'"
- "yarn install --ignore-scripts"
- "echo '+++ Lint'"
- "yarn lint:types"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: ":stylelint: Style Lint"
command:
- "echo '--- Install'"
- "yarn install --ignore-scripts"
- "yarn lint:style"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: ":jest: Tests"
agents:
# We use a medium sized instance instead of the normal small ones because
# webpack loves to gorge itself on resources.
queue: "medium"
command:
- "echo '--- Install js-sdk'"
# We don't use the babel-ed output for anything so we can --ignore-scripts
# to save transpiling the files. We run the transpile step explicitly in
# the 'build' job.
- "./scripts/ci/install-deps.sh --ignore-scripts"
- "yarn run reskindex"
- "echo '+++ Running Tests'"
- "yarn test"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: "🛠 Build"
command:
- "echo '+++ Install & Build'"
- "yarn install"
plugins:
- docker#v3.0.1:
image: "node:12"
- label: ":chains: End-to-End Tests"
agents:
# We use a xlarge sized instance instead of the normal small ones because
# e2e tests otherwise take +-8min
queue: "xlarge"
command:
- "echo '--- Install js-sdk'"
- "./scripts/ci/install-deps.sh --ignore-scripts"
- "echo '+++ Running Tests'"
- "./scripts/ci/end-to-end-tests.sh"
plugins:
- docker#v3.0.1:
image: "matrixdotorg/riotweb-ci-e2etests-env:latest"
propagate-environment: true
workdir: "/workdir/matrix-react-sdk"
retry:
automatic:
- exit_status: 1 # retry end-to-end tests once as Puppeteer sometimes fails
limit: 1
- label: "🔧 Riot Tests"
agents:
# We use a medium sized instance instead of the normal small ones because
# webpack loves to gorge itself on resources.
queue: "medium"
command:
- "echo '+++ Running Tests'"
- "./scripts/ci/riot-unit-tests.sh"
plugins:
- docker#v3.0.1:
image: "node:10"
propagate-environment: true
workdir: "/workdir/matrix-react-sdk"
- label: "🌐 i18n"
command:
- "echo '--- Fetching Dependencies'"
- "yarn install --ignore-scripts"
- "echo '+++ Testing i18n output'"
- "yarn diff-i18n"
plugins:
- docker#v3.0.1:
image: "node:10"
- wait
- label: "🐴 Trigger riot-web"
trigger: "riot-web"
branches: "develop"
build:
branch: "develop"
message: "[react-sdk] ${BUILDKITE_MESSAGE}"
async: true

View file

@ -1 +1,4 @@
src/component-index.js
test/end-to-end-tests/node_modules/
test/end-to-end-tests/riot/
test/end-to-end-tests/synapse/

View file

@ -61,3 +61,7 @@ test/mock-clock.js
test/notifications/ContentRules-test.js
test/notifications/PushRuleVectorState-test.js
test/stores/RoomViewStore-test.js
src/component-index.js
test/end-to-end-tests/node_modules/
test/end-to-end-tests/riot/
test/end-to-end-tests/synapse/

View file

@ -85,6 +85,7 @@
"pako": "^1.0.5",
"png-chunks-extract": "^1.0.0",
"prop-types": "^15.5.8",
"qrcode": "^1.4.4",
"qrcode-react": "^0.1.16",
"qs": "^6.6.0",
"react": "^16.9.0",

View file

@ -189,3 +189,37 @@ limitations under the License.
}
}
}
.mx_DevTools_VerificationRequest {
border: 1px solid #cccccc;
border-radius: 3px;
padding: 1px 5px;
margin-bottom: 6px;
font-family: $monospace-font-family;
dl {
display: grid;
grid-template-columns: max-content auto;
margin: 0;
}
dd {
grid-column-start: 2;
}
dd:empty {
color: #666666;
&::after {
content: "(empty)";
}
}
dt {
font-weight: bold;
grid-column-start: 1;
}
dt::after {
content: ":";
}
}

View file

@ -137,12 +137,19 @@ limitations under the License.
font-size: 18px;
line-height: 25px;
flex: 1;
overflow-x: auto;
max-height: 50px;
display: flex;
justify-content: center;
align-items: center;
// limit to 2 lines, show an ellipsis if it overflows
// this looks webkit specific but is supported by Firefox 68+
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
word-break: break-all;
text-overflow: ellipsis;
.mx_E2EIcon {
margin: 5px;
}

View file

@ -14,27 +14,45 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
.mx_InviteOnlyIcon {
@define-mixin mx_InviteOnlyIcon {
width: 12px;
height: 12px;
position: relative;
display: block !important;
// Align the padlock with unencrypted room names
}
@define-mixin mx_InviteOnlyIcon_padlock {
background-color: $roomtile-name-color;
mask-image: url("$(res)/img/feather-customised/lock-solid.svg");
mask-position: center;
mask-repeat: no-repeat;
mask-size: contain;
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.mx_InviteOnlyIcon_large {
@mixin mx_InviteOnlyIcon;
margin: 0 4px;
&::before {
background-color: $roomtile-name-color;
mask-image: url('$(res)/img/feather-customised/lock-solid.svg');
mask-position: center;
mask-repeat: no-repeat;
mask-size: contain;
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
@mixin mx_InviteOnlyIcon_padlock;
width: 12px;
height: 12px;
}
}
.mx_InviteOnlyIcon_small {
@mixin mx_InviteOnlyIcon;
left: -2px;
&::before {
@mixin mx_InviteOnlyIcon_padlock;
width: 10px;
height: 10px;
}
}

View file

@ -5,9 +5,12 @@
Arial empirically gets it right, hence prioritising Arial here. */
/* We fall through to Twemoji for emoji rather than falling through
to native Emoji fonts (if any) to ensure cross-browser consistency */
$font-family: Nunito, Twemoji, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', Arial, Helvetica, Sans-Serif;
/* Noto Color Emoji contains digits, in fixed-width, therefore causing
digits in flowed text to stand out.
TODO: Consider putting all emoji fonts to the end rather than the front. */
$font-family: Nunito, Twemoji, 'Apple Color Emoji', 'Segoe UI Emoji', Arial, Helvetica, Sans-Serif, 'Noto Color Emoji';
$monospace-font-family: Inconsolata, Twemoji, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', Courier, monospace;
$monospace-font-family: Inconsolata, Twemoji, 'Apple Color Emoji', 'Segoe UI Emoji', Courier, monospace, 'Noto Color Emoji';
// unified palette
// try to use these colors when possible

View file

@ -14,8 +14,10 @@ echo "generating $out"
# autogenerated file: run scripts/generate-eslint-error-ignore-file to update.
EOF
./node_modules/.bin/eslint --no-ignore -f json src test |
./node_modules/.bin/eslint -f json src test |
jq -r '.[] | select((.errorCount + .warningCount) > 0) | .filePath' |
sed -e 's/.*matrix-react-sdk\///';
} > "$out"
# also append rules from eslintignore file
cat .eslintignore >> $out

View file

@ -102,6 +102,8 @@ export function getInitialLetter(name) {
}
export function avatarUrlForRoom(room, width, height, resizeMethod) {
if (!room) return null; // null-guard
const explicitRoomAvatar = room.getAvatarUrl(
MatrixClientPeg.get().getHomeserverUrl(),
width,

View file

@ -162,4 +162,6 @@ export default class BasePlatform {
getEventIndexingManager(): BaseEventIndexManager | null {
return null;
}
setLanguage(preferredLangs: string[]) {}
}

View file

@ -160,7 +160,7 @@ const transformTags = { // custom to matrix
delete attribs.target;
}
}
attribs.rel = 'noopener'; // https://mathiasbynens.github.io/rel-noopener/
attribs.rel = 'noreferrer noopener'; // https://mathiasbynens.github.io/rel-noopener/
return { tagName, attribs };
},
'img': function(tagName, attribs) {

View file

@ -136,7 +136,7 @@ export default class Markdown {
// thus opening in a new tab.
if (externalLinks) {
attrs.push(['target', '_blank']);
attrs.push(['rel', 'noopener']);
attrs.push(['rel', 'noreferrer noopener']);
}
this.tag('a', attrs);
} else {

View file

@ -23,7 +23,7 @@ import {MatrixClientPeg} from './MatrixClientPeg';
* of aliases. Otherwise return null;
*/
export function getDisplayAliasForRoom(room) {
return room.getCanonicalAlias() || room.getAliases()[0];
return room.getCanonicalAlias() || room.getAltAliases()[0];
}
/**

View file

@ -15,7 +15,7 @@ limitations under the License.
*/
import { asyncAction } from './actionCreators';
import RoomListStore from '../stores/RoomListStore';
import RoomListStore, {TAG_DM} from '../stores/RoomListStore';
import Modal from '../Modal';
import * as Rooms from '../Rooms';
import { _t } from '../languageHandler';
@ -73,11 +73,11 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
const roomId = room.roomId;
// Evil hack to get DMs behaving
if ((oldTag === undefined && newTag === 'im.vector.fake.direct') ||
(oldTag === 'im.vector.fake.direct' && newTag === undefined)
if ((oldTag === undefined && newTag === TAG_DM) ||
(oldTag === TAG_DM && newTag === undefined)
) {
return Rooms.guessAndSetDMRoom(
room, newTag === 'im.vector.fake.direct',
room, newTag === TAG_DM,
).catch((err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to set direct chat tag " + err);
@ -91,10 +91,10 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
const hasChangedSubLists = oldTag !== newTag;
// More evilness: We will still be dealing with moving to favourites/low prio,
// but we avoid ever doing a request with 'im.vector.fake.direct`.
// but we avoid ever doing a request with TAG_DM.
//
// if we moved lists, remove the old tag
if (oldTag && oldTag !== 'im.vector.fake.direct' &&
if (oldTag && oldTag !== TAG_DM &&
hasChangedSubLists
) {
const promiseToDelete = matrixClient.deleteRoomTag(
@ -112,7 +112,7 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
}
// if we moved lists or the ordering changed, add the new tag
if (newTag && newTag !== 'im.vector.fake.direct' &&
if (newTag && newTag !== TAG_DM &&
(hasChangedSubLists || metaData)
) {
// metaData is the body of the PUT to set the tag, so it must

View file

@ -53,7 +53,6 @@ function selectText(target) {
*/
export default class CreateKeyBackupDialog extends React.PureComponent {
static propTypes = {
secureSecretStorage: PropTypes.bool,
onFinished: PropTypes.func.isRequired,
}
@ -65,7 +64,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
this._setZxcvbnResultTimeout = null;
this.state = {
secureSecretStorage: props.secureSecretStorage,
secureSecretStorage: null,
phase: PHASE_PASSPHRASE,
passPhrase: '',
passPhraseConfirm: '',
@ -73,23 +72,20 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
downloaded: false,
zxcvbnResult: null,
};
if (this.state.secureSecretStorage === undefined) {
this.state.secureSecretStorage =
SettingsStore.isFeatureEnabled("feature_cross_signing");
}
// If we're using secret storage, skip ahead to the backing up step, as
// `accessSecretStorage` will handle passphrases as needed.
if (this.state.secureSecretStorage) {
this.state.phase = PHASE_BACKINGUP;
}
}
componentDidMount() {
async componentDidMount() {
const cli = MatrixClientPeg.get();
const secureSecretStorage = (
SettingsStore.isFeatureEnabled("feature_cross_signing") &&
await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing")
);
this.setState({ secureSecretStorage });
// If we're using secret storage, skip ahead to the backing up step, as
// `accessSecretStorage` will handle passphrases as needed.
if (this.state.secureSecretStorage) {
if (secureSecretStorage) {
this.setState({ phase: PHASE_BACKINGUP });
this._createBackup();
}
}

View file

@ -23,7 +23,6 @@ import AutocompleteProvider from './AutocompleteProvider';
import {MatrixClientPeg} from '../MatrixClientPeg';
import QueryMatcher from './QueryMatcher';
import {PillCompletion} from './Components';
import {getDisplayAliasForRoom} from '../Rooms';
import * as sdk from '../index';
import _sortBy from 'lodash/sortBy';
import {makeRoomPermalink} from "../utils/permalinks/Permalinks";
@ -40,11 +39,19 @@ function score(query, space) {
}
}
function matcherObject(room, displayedAlias, matchName = "") {
return {
room,
matchName,
displayedAlias,
};
}
export default class RoomProvider extends AutocompleteProvider {
constructor() {
super(ROOM_REGEX);
this.matcher = new QueryMatcher([], {
keys: ['displayedAlias', 'name'],
keys: ['displayedAlias', 'matchName'],
});
}
@ -56,16 +63,16 @@ export default class RoomProvider extends AutocompleteProvider {
const {command, range} = this.getCurrentCommand(query, selection, force);
if (command) {
// the only reason we need to do this is because Fuse only matches on properties
let matcherObjects = client.getVisibleRooms().filter(
(room) => !!room && !!getDisplayAliasForRoom(room),
).map((room) => {
return {
room: room,
name: room.name,
displayedAlias: getDisplayAliasForRoom(room),
};
});
let matcherObjects = client.getVisibleRooms().reduce((aliases, room) => {
if (room.getCanonicalAlias()) {
aliases = aliases.concat(matcherObject(room, room.getCanonicalAlias(), room.name));
}
if (room.getAltAliases().length) {
const altAliases = room.getAltAliases().map(alias => matcherObject(room, alias));
aliases = aliases.concat(altAliases);
}
return aliases;
}, []);
// Filter out any matches where the user will have also autocompleted new rooms
matcherObjects = matcherObjects.filter((r) => {
const tombstone = r.room.currentState.getStateEvents("m.room.tombstone", "");
@ -84,16 +91,16 @@ export default class RoomProvider extends AutocompleteProvider {
completions = _sortBy(completions, [
(c) => score(matchedString, c.displayedAlias),
(c) => c.displayedAlias.length,
]).map((room) => {
const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId;
]);
completions = completions.map((room) => {
return {
completion: displayAlias,
completionId: displayAlias,
completion: room.displayedAlias,
completionId: room.room.roomId,
type: "room",
suffix: ' ',
href: makeRoomPermalink(displayAlias),
href: makeRoomPermalink(room.displayedAlias),
component: (
<PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.name} description={displayAlias} />
<PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.room.name} description={room.displayedAlias} />
),
range,
};

View file

@ -255,7 +255,7 @@ export class ContextMenu extends React.Component {
if (chevronFace === 'top' || chevronFace === 'bottom') {
chevronOffset.left = props.chevronOffset;
} else {
} else if (position.top !== undefined) {
const target = position.top;
// By default, no adjustment is made

View file

@ -821,10 +821,10 @@ export default createReactClass({
{_t(
"Want more than a community? <a>Get your own server</a>", {},
{
a: sub => <a href={hostingSignupLink} target="_blank" rel="noopener">{sub}</a>,
a: sub => <a href={hostingSignupLink} target="_blank" rel="noreferrer noopener">{sub}</a>,
},
)}
<a href={hostingSignupLink} target="_blank" rel="noopener">
<a href={hostingSignupLink} target="_blank" rel="noreferrer noopener">
<img src={require("../../../res/img/external-link.svg")} width="11" height="10" alt='' />
</a>
</div>;

View file

@ -1175,6 +1175,7 @@ export default createReactClass({
* Called when a new logged in session has started
*/
_onLoggedIn: async function() {
ThemeController.isLogin = false;
this.setStateForNewView({ view: VIEWS.LOGGED_IN });
if (MatrixClientPeg.currentUserIsJustRegistered()) {
MatrixClientPeg.setJustRegisteredUserId(null);
@ -1374,7 +1375,8 @@ export default createReactClass({
cancelButton: _t('Dismiss'),
onFinished: (confirmed) => {
if (confirmed) {
window.open(consentUri, '_blank');
const wnd = window.open(consentUri, '_blank');
wnd.opener = null;
}
},
}, null, true);

View file

@ -873,6 +873,11 @@ class CreationGrouper {
}
getTiles() {
// If we don't have any events to group, don't even try to group them. The logic
// below assumes that we have a group of events to deal with, but we might not if
// the events we were supposed to group were redacted.
if (!this.events || !this.events.length) return [];
const DateSeparator = sdk.getComponent('messages.DateSeparator');
const EventListSummary = sdk.getComponent('views.elements.EventListSummary');
@ -959,6 +964,11 @@ class MemberGrouper {
}
getTiles() {
// If we don't have any events to group, don't even try to group them. The logic
// below assumes that we have a group of events to deal with, but we might not if
// the events we were supposed to group were redacted.
if (!this.events || !this.events.length) return [];
const DateSeparator = sdk.getComponent('messages.DateSeparator');
const MemberEventListSummary = sdk.getComponent('views.elements.MemberEventListSummary');

View file

@ -342,7 +342,7 @@ export default createReactClass({
peekLoading: false,
});
this._onRoomLoaded(room);
}, (err) => {
}).catch((err) => {
if (this.unmounted) {
return;
}
@ -355,7 +355,7 @@ export default createReactClass({
// This won't necessarily be a MatrixError, but we duck-type
// here and say if it's got an 'errcode' key with the right value,
// it means we can't peek.
if (err.errcode == "M_GUEST_ACCESS_FORBIDDEN") {
if (err.errcode === "M_GUEST_ACCESS_FORBIDDEN" || err.errcode === 'M_FORBIDDEN') {
// This is fine: the room just isn't peekable (we assume).
this.setState({
peekLoading: false,
@ -365,8 +365,6 @@ export default createReactClass({
}
});
} else if (room) {
//viewing a previously joined room, try to lazy load members
// Stop peeking because we have joined this room previously
MatrixClientPeg.get().stopPeeking();
this.setState({isPeeking: false});
@ -460,8 +458,6 @@ export default createReactClass({
// (We could use isMounted, but facebook have deprecated that.)
this.unmounted = true;
SettingsStore.unwatchSetting(this._ciderWatcherRef);
// update the scroll map before we get unmounted
if (this.state.roomId) {
RoomScrollStateStore.setScrollState(this.state.roomId, this._getScrollState());

View file

@ -481,7 +481,7 @@ export default createReactClass({
"Either use HTTPS or <a>enable unsafe scripts</a>.", {},
{
'a': (sub) => {
return <a target="_blank" rel="noopener"
return <a target="_blank" rel="noreferrer noopener"
href="https://www.google.com/search?&q=enable%20unsafe%20scripts"
>
{ sub }
@ -496,11 +496,10 @@ export default createReactClass({
"<a>homeserver's SSL certificate</a> is trusted, and that a browser extension " +
"is not blocking requests.", {},
{
'a': (sub) => {
return <a target="_blank" rel="noopener" href={this.props.serverConfig.hsUrl}>
'a': (sub) =>
<a target="_blank" rel="noreferrer noopener" href={this.props.serverConfig.hsUrl}>
{ sub }
</a>;
},
</a>,
},
) }
</span>;

View file

@ -26,7 +26,7 @@ export default createReactClass({
render: function() {
return (
<div className="mx_AuthFooter">
<a href="https://matrix.org" target="_blank" rel="noopener">{ _t("powered by Matrix") }</a>
<a href="https://matrix.org" target="_blank" rel="noreferrer noopener">{ _t("powered by Matrix") }</a>
</div>
);
},

View file

@ -331,7 +331,7 @@ export const TermsAuthEntry = createReactClass({
checkboxes.push(
<label key={"policy_checkbox_" + policy.id} className="mx_InteractiveAuthEntryComponents_termsPolicy">
<input type="checkbox" onChange={() => this._togglePolicy(policy.id)} checked={checked} />
<a href={policy.url} target="_blank" rel="noopener">{ policy.name }</a>
<a href={policy.url} target="_blank" rel="noreferrer noopener">{ policy.name }</a>
</label>,
);
}
@ -604,6 +604,7 @@ export const FallbackAuthEntry = createReactClass({
this.props.authSessionId,
);
this._popupWindow = window.open(url);
this._popupWindow.opener = null;
},
_onReceiveMessage: function(event) {

View file

@ -99,7 +99,7 @@ export default class ModularServerConfig extends ServerConfig {
"Enter the location of your Modular homeserver. It may use your own " +
"domain name or be a subdomain of <a>modular.im</a>.",
{}, {
a: sub => <a href={MODULAR_URL} target="_blank" rel="noopener">
a: sub => <a href={MODULAR_URL} target="_blank" rel="noreferrer noopener">
{sub}
</a>,
},

View file

@ -46,7 +46,7 @@ export const TYPES = {
label: () => _t('Premium'),
logo: () => <img src={require('../../../../res/img/modular-bw-logo.svg')} />,
description: () => _t('Premium hosting for organisations <a>Learn more</a>', {}, {
a: sub => <a href={MODULAR_URL} target="_blank" rel="noopener">
a: sub => <a href={MODULAR_URL} target="_blank" rel="noreferrer noopener">
{sub}
</a>,
}),

View file

@ -90,7 +90,8 @@ export default createReactClass({
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
const pinnedEvent = room.currentState.getStateEvents('m.room.pinned_events', '');
if (!pinnedEvent) return false;
return pinnedEvent.getContent().pinned.includes(this.props.mxEvent.getId());
const content = pinnedEvent.getContent();
return content.pinned && Array.isArray(content.pinned) && content.pinned.includes(this.props.mxEvent.getId());
},
onResendClick: function() {
@ -420,7 +421,7 @@ export default createReactClass({
onClick={this.onPermalinkClick}
href={permalink}
target="_blank"
rel="noopener"
rel="noreferrer noopener"
>
{ mxEvent.isRedacted() || mxEvent.getType() !== 'm.room.message'
? _t('Share Permalink') : _t('Share Message') }
@ -445,7 +446,7 @@ export default createReactClass({
element="a"
className="mx_MessageContextMenu_field"
target="_blank"
rel="noopener"
rel="noreferrer noopener"
onClick={this.closeMenu}
href={mxEvent.event.content.external_url}
>

View file

@ -68,10 +68,11 @@ export default class TopLeftMenu extends React.Component {
{_t(
"<a>Upgrade</a> to your own domain", {},
{
a: sub => <a href={hostingSignupLink} target="_blank" rel="noopener" tabIndex={-1}>{sub}</a>,
a: sub =>
<a href={hostingSignupLink} target="_blank" rel="noreferrer noopener" tabIndex={-1}>{sub}</a>,
},
)}
<a href={hostingSignupLink} target="_blank" rel="noopener" role="presentation" aria-hidden={true} tabIndex={-1}>
<a href={hostingSignupLink} target="_blank" rel="noreferrer noopener" role="presentation" aria-hidden={true} tabIndex={-1}>
<img src={require("../../../../res/img/external-link.svg")} width="11" height="10" alt='' />
</a>
</div>;

View file

@ -52,7 +52,7 @@ export default class ChangelogDialog extends React.Component {
_elementsForCommit(commit) {
return (
<li key={commit.sha} className="mx_ChangelogDialog_li">
<a href={commit.html_url} target="_blank" rel="noopener">
<a href={commit.html_url} target="_blank" rel="noreferrer noopener">
{commit.commit.message.split('\n')[0]}
</a>
</li>

View file

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import React, {useState, useEffect} from 'react';
import PropTypes from 'prop-types';
import * as sdk from '../../../index';
import SyntaxHighlight from '../elements/SyntaxHighlight';
@ -22,6 +22,16 @@ import { _t } from '../../../languageHandler';
import { Room } from "matrix-js-sdk";
import Field from "../elements/Field";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import {useEventEmitter} from "../../../hooks/useEventEmitter";
import {
PHASE_UNSENT,
PHASE_REQUESTED,
PHASE_READY,
PHASE_DONE,
PHASE_STARTED,
PHASE_CANCELLED,
} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
class GenericEditor extends React.PureComponent {
// static propTypes = {onBack: PropTypes.func.isRequired};
@ -605,12 +615,97 @@ class ServersInRoomList extends React.PureComponent {
}
}
const PHASE_MAP = {
[PHASE_UNSENT]: "unsent",
[PHASE_REQUESTED]: "requested",
[PHASE_READY]: "ready",
[PHASE_DONE]: "done",
[PHASE_STARTED]: "started",
[PHASE_CANCELLED]: "cancelled",
};
function VerificationRequest({txnId, request}) {
const [, updateState] = useState();
const [timeout, setRequestTimeout] = useState(request.timeout);
/* Re-render if something changes state */
useEventEmitter(request, "change", updateState);
/* Keep re-rendering if there's a timeout */
useEffect(() => {
if (request.timeout == 0) return;
/* Note that request.timeout is a getter, so its value changes */
const id = setInterval(() => {
setRequestTimeout(request.timeout);
}, 500);
return () => { clearInterval(id); };
}, [request]);
return (<div className="mx_DevTools_VerificationRequest">
<dl>
<dt>Transaction</dt>
<dd>{txnId}</dd>
<dt>Phase</dt>
<dd>{PHASE_MAP[request.phase] || request.phase}</dd>
<dt>Timeout</dt>
<dd>{Math.floor(timeout / 1000)}</dd>
<dt>Methods</dt>
<dd>{request.methods && request.methods.join(", ")}</dd>
<dt>requestingUserId</dt>
<dd>{request.requestingUserId}</dd>
<dt>observeOnly</dt>
<dd>{JSON.stringify(request.observeOnly)}</dd>
</dl>
</div>);
}
class VerificationExplorer extends React.Component {
static getLabel() {
return _t("Verification Requests");
}
/* Ensure this.context is the cli */
static contextType = MatrixClientContext;
onNewRequest = () => {
this.forceUpdate();
}
componentDidMount() {
const cli = this.context;
cli.on("crypto.verification.request", this.onNewRequest);
}
componentWillUnmount() {
const cli = this.context;
cli.off("crypto.verification.request", this.onNewRequest);
}
render() {
const cli = this.context;
const room = this.props.room;
const inRoomChannel = cli._crypto._inRoomVerificationRequests;
const inRoomRequests = (inRoomChannel._requestsByRoomId || new Map()).get(room.roomId) || new Map();
return (<div>
<div className="mx_Dialog_content">
{Array.from(inRoomRequests.entries()).reverse().map(([txnId, request]) =>
<VerificationRequest txnId={txnId} request={request} key={txnId} />,
)}
</div>
</div>);
}
}
const Entries = [
SendCustomEvent,
RoomStateExplorer,
SendAccountData,
AccountDataExplorer,
ServersInRoomList,
VerificationExplorer,
];
export default class DevtoolsDialog extends React.PureComponent {

View file

@ -34,6 +34,7 @@ import {humanizeTime} from "../../../utils/humanize";
import createRoom, {canEncryptToAllUsers} from "../../../createRoom";
import {inviteMultipleToRoom} from "../../../RoomInvite";
import SettingsStore from '../../../settings/SettingsStore';
import RoomListStore, {TAG_DM} from "../../../stores/RoomListStore";
export const KIND_DM = "dm";
export const KIND_INVITE = "invite";
@ -332,7 +333,23 @@ export default class InviteDialog extends React.PureComponent {
}
_buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals();
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room
// Also pull in all the rooms tagged as TAG_DM so we don't miss anything. Sometimes the
// room list doesn't tag the room for the DMRoomMap, but does for the room list.
const taggedRooms = RoomListStore.getRoomLists();
const dmTaggedRooms = taggedRooms[TAG_DM];
const myUserId = MatrixClientPeg.get().getUserId();
for (const dmRoom of dmTaggedRooms) {
const otherMembers = dmRoom.getJoinedMembers().filter(u => u.userId !== myUserId);
for (const member of otherMembers) {
if (rooms[member.userId]) continue; // already have a room
console.warn(`Adding DM room for ${member.userId} as ${dmRoom.roomId} from tag, not DM map`);
rooms[member.userId] = dmRoom;
}
}
const recents = [];
for (const userId in rooms) {
// Filter out user IDs that are already in the room / should be excluded
@ -512,9 +529,27 @@ export default class InviteDialog extends React.PureComponent {
return false;
}
_convertFilter(): Member[] {
// Check to see if there's anything to convert first
if (!this.state.filterText || !this.state.filterText.includes('@')) return this.state.targets || [];
let newMember: Member;
if (this.state.filterText.startsWith('@')) {
// Assume mxid
newMember = new DirectoryMember({user_id: this.state.filterText, display_name: null, avatar_url: null});
} else {
// Assume email
newMember = new ThreepidMember(this.state.filterText);
}
const newTargets = [...(this.state.targets || []), newMember];
this.setState({targets: newTargets, filterText: ''});
return newTargets;
}
_startDm = async () => {
this.setState({busy: true});
const targetIds = this.state.targets.map(t => t.userId);
const targets = this._convertFilter();
const targetIds = targets.map(t => t.userId);
// Check if there is already a DM with these people and reuse it if possible.
const existingRoom = DMRoomMap.shared().getDMRoomForIdentifiers(targetIds);
@ -544,9 +579,12 @@ export default class InviteDialog extends React.PureComponent {
// Check if it's a traditional DM and create the room if required.
// TODO: [Canonical DMs] Remove this check and instead just create the multi-person DM
let createRoomPromise = Promise.resolve();
if (targetIds.length === 1) {
const isSelf = targetIds.length === 1 && targetIds[0] === MatrixClientPeg.get().getUserId();
if (targetIds.length === 1 && !isSelf) {
createRoomOptions.dmUserId = targetIds[0];
createRoomPromise = createRoom(createRoomOptions);
} else if (isSelf) {
createRoomPromise = createRoom(createRoomOptions);
} else {
// Create a boring room and try to invite the targets manually.
createRoomPromise = createRoom(createRoomOptions).then(roomId => {
@ -573,7 +611,9 @@ export default class InviteDialog extends React.PureComponent {
_inviteUsers = () => {
this.setState({busy: true});
const targetIds = this.state.targets.map(t => t.userId);
this._convertFilter();
const targets = this._convertFilter();
const targetIds = targets.map(t => t.userId);
const room = MatrixClientPeg.get().getRoom(this.props.roomId);
if (!room) {
@ -630,13 +670,14 @@ export default class InviteDialog extends React.PureComponent {
// While we're here, try and autocomplete a search result for the mxid itself
// if there's no matches (and the input looks like a mxid).
if (term[0] === '@' && term.indexOf(':') > 1 && r.results.length === 0) {
if (term[0] === '@' && term.indexOf(':') > 1) {
try {
const profile = await MatrixClientPeg.get().getProfileInfo(term);
if (profile) {
// If we have a profile, we have enough information to assume that
// the mxid can be invited - add it to the list
r.results.push({
// the mxid can be invited - add it to the list. We stick it at the
// top so it is most obviously presented to the user.
r.results.splice(0, 0, {
user_id: term,
display_name: profile['displayname'],
avatar_url: profile['avatar_url'],
@ -645,6 +686,14 @@ export default class InviteDialog extends React.PureComponent {
} catch (e) {
console.warn("Non-fatal error trying to make an invite for a user ID");
console.warn(e);
// Add a result anyways, just without a profile. We stick it at the
// top so it is most obviously presented to the user.
r.results.splice(0, 0, {
user_id: term,
display_name: term,
avatar_url: null,
});
}
}
@ -769,7 +818,7 @@ export default class InviteDialog extends React.PureComponent {
];
const toAdd = [];
const failed = [];
const potentialAddresses = text.split(/[\s,]+/);
const potentialAddresses = text.split(/[\s,]+/).map(p => p.trim()).filter(p => !!p); // filter empty strings
for (const address of potentialAddresses) {
const member = possibleMembers.find(m => m.userId === address);
if (member) {
@ -1014,7 +1063,7 @@ export default class InviteDialog extends React.PureComponent {
"If you can't find someone, ask them for their username, share your " +
"username (%(userId)s) or <a>profile link</a>.",
{userId},
{a: (sub) => <a href={makeUserPermalink(userId)} rel="noopener" target="_blank">{sub}</a>},
{a: (sub) => <a href={makeUserPermalink(userId)} rel="noreferrer noopener" target="_blank">{sub}</a>},
);
buttonText = _t("Go");
goButtonFn = this._startDm;
@ -1023,12 +1072,17 @@ export default class InviteDialog extends React.PureComponent {
helpText = _t(
"If you can't find someone, ask them for their username (e.g. @user:server.com) or " +
"<a>share this room</a>.", {},
{a: (sub) => <a href={makeRoomPermalink(this.props.roomId)} rel="noopener" target="_blank">{sub}</a>},
{
a: (sub) =>
<a href={makeRoomPermalink(this.props.roomId)} rel="noreferrer noopener" target="_blank">{sub}</a>,
},
);
buttonText = _t("Invite");
goButtonFn = this._inviteUsers;
}
const hasSelection = this.state.targets.length > 0
|| (this.state.filterText && this.state.filterText.includes('@'));
return (
<BaseDialog
className='mx_InviteDialog'
@ -1045,7 +1099,7 @@ export default class InviteDialog extends React.PureComponent {
kind="primary"
onClick={goButtonFn}
className='mx_InviteDialog_goButton'
disabled={this.state.busy}
disabled={this.state.busy || !hasSelection}
>
{buttonText}
</AccessibleButton>

View file

@ -23,6 +23,7 @@ import VerificationRequestDialog from './VerificationRequestDialog';
import BaseDialog from './BaseDialog';
import DialogButtons from '../elements/DialogButtons';
import {MatrixClientPeg} from "../../../MatrixClientPeg";
import * as sdk from '../../../index';
@replaceableComponent("views.dialogs.NewSessionReviewDialog")
export default class NewSessionReviewDialog extends React.PureComponent {
@ -33,7 +34,24 @@ export default class NewSessionReviewDialog extends React.PureComponent {
}
onCancelClick = () => {
this.props.onFinished(false);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog("Verification failed", "insecure", ErrorDialog, {
headerImage: require("../../../../res/img/e2e/warning.svg"),
title: _t("Your account is not secure"),
description: <div>
{_t("One of the following may be compromised:")}
<ul>
<li>{_t("Your password")}</li>
<li>{_t("Your homeserver")}</li>
<li>{_t("This session, or the other session")}</li>
<li>{_t("The internet connection either session is using")}</li>
</ul>
<div>
{_t("We recommend you change your password and recovery key in Settings immediately")}
</div>
</div>,
onFinished: () => this.props.onFinished(false),
});
}
onContinueClick = async () => {

View file

@ -218,7 +218,7 @@ export default class ShareDialog extends React.Component {
</div>
<div className="mx_ShareDialog_social_container">
{
socials.map((social) => <a rel="noopener"
socials.map((social) => <a rel="noreferrer noopener"
target="_blank"
key={social.name}
name={social.name}

View file

@ -135,7 +135,7 @@ export default class TermsDialog extends React.PureComponent {
rows.push(<tr key={termDoc[termsLang].url}>
<td className="mx_TermsDialog_service">{serviceName}</td>
<td className="mx_TermsDialog_summary">{summary}</td>
<td>{termDoc[termsLang].name} <a rel="noopener" target="_blank" href={termDoc[termsLang].url}>
<td>{termDoc[termsLang].name} <a rel="noreferrer noopener" target="_blank" href={termDoc[termsLang].url}>
<span className="mx_TermsDialog_link" />
</a></td>
<td><TermsCheckbox

View file

@ -552,7 +552,7 @@ export default class AppTile extends React.Component {
// Using Object.assign workaround as the following opens in a new window instead of a new tab.
// window.open(this._getSafeUrl(), '_blank', 'noopener=yes');
Object.assign(document.createElement('a'),
{ target: '_blank', href: this._getSafeUrl(), rel: 'noopener'}).click();
{ target: '_blank', href: this._getSafeUrl(), rel: 'noreferrer noopener'}).click();
}
_onReloadWidgetClick() {

View file

@ -91,7 +91,7 @@ export default class ImageView extends React.Component {
getName() {
let name = this.props.name;
if (name && this.props.link) {
name = <a href={ this.props.link } target="_blank" rel="noopener">{ name }</a>;
name = <a href={ this.props.link } target="_blank" rel="noreferrer noopener">{ name }</a>;
}
return name;
}
@ -216,7 +216,7 @@ export default class ImageView extends React.Component {
{ this.getName() }
</div>
{ eventMeta }
<a className="mx_ImageView_link" href={ this.props.src } download={ this.props.name } target="_blank" rel="noopener">
<a className="mx_ImageView_link" href={ this.props.src } download={ this.props.name } rel="noreferrer noopener">
<div className="mx_ImageView_download">
{ _t('Download this file') }<br />
<span className="mx_ImageView_size">{ sizeRes }</span>

View file

@ -23,7 +23,6 @@ import classNames from 'classnames';
import { Room, RoomMember } from 'matrix-js-sdk';
import PropTypes from 'prop-types';
import {MatrixClientPeg} from '../../../MatrixClientPeg';
import { getDisplayAliasForRoom } from '../../../Rooms';
import FlairStore from "../../../stores/FlairStore";
import {getPrimaryPermalinkEntity} from "../../../utils/permalinks/Permalinks";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
@ -129,7 +128,7 @@ const Pill = createReactClass({
const localRoom = resourceId[0] === '#' ?
MatrixClientPeg.get().getRooms().find((r) => {
return r.getCanonicalAlias() === resourceId ||
r.getAliases().includes(resourceId);
r.getAltAliases().includes(resourceId);
}) : MatrixClientPeg.get().getRoom(resourceId);
room = localRoom;
if (!localRoom) {
@ -237,12 +236,12 @@ const Pill = createReactClass({
case Pill.TYPE_ROOM_MENTION: {
const room = this.state.room;
if (room) {
linkText = (room ? getDisplayAliasForRoom(room) : null) || resource;
linkText = resource;
if (this.props.shouldShowPillAvatar) {
avatar = <RoomAvatar room={room} width={16} height={16} aria-hidden="true" />;
}
pillClass = 'mx_RoomPill';
}
pillClass = 'mx_RoomPill';
}
break;
case Pill.TYPE_GROUP_MENTION: {

View file

@ -17,89 +17,87 @@ limitations under the License.
import React from "react";
import PropTypes from "prop-types";
import {replaceableComponent} from "../../../../utils/replaceableComponent";
import * as qs from "qs";
import QRCode from "qrcode-react";
import {MatrixClientPeg} from "../../../../MatrixClientPeg";
import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
import {ToDeviceChannel} from "matrix-js-sdk/src/crypto/verification/request/ToDeviceChannel";
import {decodeBase64} from "matrix-js-sdk/src/crypto/olmlib";
import Spinner from "../Spinner";
import * as QRCode from "qrcode";
const CODE_VERSION = 0x02; // the version of binary QR codes we support
const BINARY_PREFIX = "MATRIX"; // ASCII, used to prefix the binary format
const MODE_VERIFY_OTHER_USER = 0x00; // Verifying someone who isn't us
const MODE_VERIFY_SELF_TRUSTED = 0x01; // We trust the master key
const MODE_VERIFY_SELF_UNTRUSTED = 0x02; // We do not trust the master key
@replaceableComponent("views.elements.crypto.VerificationQRCode")
export default class VerificationQRCode extends React.PureComponent {
static propTypes = {
// Common for all kinds of QR codes
keys: PropTypes.array.isRequired, // array of [Key ID, Base64 Key] pairs
action: PropTypes.string.isRequired,
keyholderUserId: PropTypes.string.isRequired,
// User verification use case only
secret: PropTypes.string,
otherUserKey: PropTypes.string, // Base64 key being verified
otherUserDeviceKey: PropTypes.string, // Base64 key of the other user's device (or what we think it is; optional)
requestEventId: PropTypes.string, // for DM verification only
};
static defaultProps = {
action: "verify",
prefix: PropTypes.string.isRequired,
version: PropTypes.number.isRequired,
mode: PropTypes.number.isRequired,
transactionId: PropTypes.string.isRequired, // or requestEventId
firstKeyB64: PropTypes.string.isRequired,
secondKeyB64: PropTypes.string.isRequired,
secretB64: PropTypes.string.isRequired,
};
static async getPropsForRequest(verificationRequest: VerificationRequest) {
const cli = MatrixClientPeg.get();
const myUserId = cli.getUserId();
const otherUserId = verificationRequest.otherUserId;
const myDeviceId = cli.getDeviceId();
const otherDevice = verificationRequest.targetDevice;
const otherDeviceId = otherDevice ? otherDevice.deviceId : null;
const qrProps = {
secret: verificationRequest.encodedSharedSecret,
keyholderUserId: myUserId,
action: "verify",
keys: [], // array of pairs: keyId, base64Key
otherUserKey: "", // base64key
otherUserDeviceKey: "", // base64key
requestEventId: "", // we figure this out in a moment
};
let mode = MODE_VERIFY_OTHER_USER;
if (myUserId === otherUserId) {
// Mode changes depending on whether or not we trust the master cross signing key
const myTrust = cli.checkUserTrust(myUserId);
if (myTrust.isCrossSigningVerified()) {
mode = MODE_VERIFY_SELF_TRUSTED;
} else {
mode = MODE_VERIFY_SELF_UNTRUSTED;
}
}
const requestEvent = verificationRequest.requestEvent;
qrProps.requestEventId = requestEvent.getId()
const transactionId = requestEvent.getId()
? requestEvent.getId()
: ToDeviceChannel.getTransactionId(requestEvent);
// Populate the keys we need depending on which direction and users are involved in the verification.
if (myUserId === otherUserId) {
if (!otherDeviceId) {
// Existing scanning New session's QR code
qrProps.otherUserDeviceKey = null;
} else {
// New scanning Existing session's QR code
const myDevices = (await cli.getStoredDevicesForUser(myUserId)) || [];
const device = myDevices.find(d => d.deviceId === otherDeviceId);
if (device) qrProps.otherUserDeviceKey = device.getFingerprint();
}
const qrProps = {
prefix: BINARY_PREFIX,
version: CODE_VERSION,
mode,
transactionId,
firstKeyB64: '', // worked out shortly
secondKeyB64: '', // worked out shortly
secretB64: verificationRequest.encodedSharedSecret,
};
// Either direction shares these next few props
const myCrossSigningInfo = cli.getStoredCrossSigningForUser(myUserId);
const myDevices = (await cli.getStoredDevicesForUser(myUserId)) || [];
const xsignInfo = cli.getStoredCrossSigningForUser(myUserId);
qrProps.otherUserKey = xsignInfo.getId("master");
if (mode === MODE_VERIFY_OTHER_USER) {
// First key is our master cross signing key
qrProps.firstKeyB64 = myCrossSigningInfo.getId("master");
qrProps.keys = [
[myDeviceId, cli.getDeviceEd25519Key()],
[xsignInfo.getId("master"), xsignInfo.getId("master")],
];
} else {
// Doesn't matter which direction the verification is, we always show the same QR code
// for not-ourself verification.
const myXsignInfo = cli.getStoredCrossSigningForUser(myUserId);
const otherXsignInfo = cli.getStoredCrossSigningForUser(otherUserId);
const otherDevices = (await cli.getStoredDevicesForUser(otherUserId)) || [];
const otherDevice = otherDevices.find(d => d.deviceId === otherDeviceId);
// Second key is the other user's master cross signing key
const otherUserCrossSigningInfo = cli.getStoredCrossSigningForUser(otherUserId);
qrProps.secondKeyB64 = otherUserCrossSigningInfo.getId("master");
} else if (mode === MODE_VERIFY_SELF_TRUSTED) {
// First key is our master cross signing key
qrProps.firstKeyB64 = myCrossSigningInfo.getId("master");
qrProps.keys = [
[myDeviceId, cli.getDeviceEd25519Key()],
[myXsignInfo.getId("master"), myXsignInfo.getId("master")],
];
qrProps.otherUserKey = otherXsignInfo.getId("master");
if (otherDevice) qrProps.otherUserDeviceKey = otherDevice.getFingerprint();
// Second key is the other device's device key
const otherDevice = verificationRequest.targetDevice;
const otherDeviceId = otherDevice ? otherDevice.deviceId : null;
const device = myDevices.find(d => d.deviceId === otherDeviceId);
qrProps.secondKeyB64 = device.getFingerprint();
} else if (mode === MODE_VERIFY_SELF_UNTRUSTED) {
// First key is our device's key
qrProps.firstKeyB64 = cli.getDeviceEd25519Key();
// Second key is what we think our master cross signing key is
qrProps.secondKeyB64 = myCrossSigningInfo.getId("master");
}
return qrProps;
@ -107,21 +105,63 @@ export default class VerificationQRCode extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
dataUri: null,
};
this.generateQrCode();
}
componentDidUpdate(prevProps): void {
if (JSON.stringify(this.props) === JSON.stringify(prevProps)) return; // No prop change
this.generateQRCode();
}
async generateQrCode() {
let buf = Buffer.alloc(0); // we'll concat our way through life
const appendByte = (b: number) => {
const tmpBuf = Buffer.from([b]);
buf = Buffer.concat([buf, tmpBuf]);
};
const appendInt = (i: number) => {
const tmpBuf = Buffer.alloc(2);
tmpBuf.writeInt16BE(i, 0);
buf = Buffer.concat([buf, tmpBuf]);
};
const appendStr = (s: string, enc: string, withLengthPrefix = true) => {
const tmpBuf = Buffer.from(s, enc);
if (withLengthPrefix) appendInt(tmpBuf.byteLength);
buf = Buffer.concat([buf, tmpBuf]);
};
const appendEncBase64 = (b64: string) => {
const b = decodeBase64(b64);
const tmpBuf = Buffer.from(b);
buf = Buffer.concat([buf, tmpBuf]);
};
// Actually build the buffer for the QR code
appendStr(this.props.prefix, "ascii", false);
appendByte(this.props.version);
appendByte(this.props.mode);
appendStr(this.props.transactionId, "utf-8");
appendEncBase64(this.props.firstKeyB64);
appendEncBase64(this.props.secondKeyB64);
appendEncBase64(this.props.secretB64);
// Now actually assemble the QR code's data URI
const uri = await QRCode.toDataURL([{data: buf, mode: 'byte'}], {
errorCorrectionLevel: 'L', // we want it as trivial-looking as possible
});
this.setState({dataUri: uri});
}
render() {
const query = {
request: this.props.requestEventId,
action: this.props.action,
other_user_key: this.props.otherUserKey,
secret: this.props.secret,
};
for (const key of this.props.keys) {
query[`key_${key[0]}`] = key[1];
if (!this.state.dataUri) {
return <div className='mx_VerificationQRCode'><Spinner /></div>;
}
const uri = `https://matrix.to/#/${this.props.keyholderUserId}?${qs.stringify(query)}`;
return <QRCode value={uri} size={512} logoWidth={64} logo={require("../../../../../res/img/matrix-m.svg")} />;
return <img src={this.state.dataUri} className='mx_VerificationQRCode' />;
}
}

View file

@ -20,7 +20,7 @@ import * as HtmlUtils from '../../../HtmlUtils';
import { editBodyDiffToHtml } from '../../../utils/MessageDiffUtils';
import {formatTime} from '../../../DateUtils';
import {MatrixEvent} from 'matrix-js-sdk';
import {pillifyLinks} from '../../../utils/pillify';
import {pillifyLinks, unmountPills} from '../../../utils/pillify';
import { _t } from '../../../languageHandler';
import * as sdk from '../../../index';
import {MatrixClientPeg} from '../../../MatrixClientPeg';
@ -53,6 +53,7 @@ export default class EditHistoryMessage extends React.PureComponent {
this.state = {canRedact, sendStatus: event.getAssociatedStatus()};
this._content = createRef();
this._pills = [];
}
_onAssociatedStatusChanged = () => {
@ -81,7 +82,7 @@ export default class EditHistoryMessage extends React.PureComponent {
pillifyLinks() {
// not present for redacted events
if (this._content.current) {
pillifyLinks(this._content.current.children, this.props.mxEvent);
pillifyLinks(this._content.current.children, this.props.mxEvent, this._pills);
}
}
@ -90,6 +91,7 @@ export default class EditHistoryMessage extends React.PureComponent {
}
componentWillUnmount() {
unmountPills(this._pills);
const event = this.props.mxEvent;
if (event.localRedactionEvent()) {
event.localRedactionEvent().off("status", this._onAssociatedStatusChanged);

View file

@ -297,7 +297,7 @@ export default createReactClass({
} else if (contentUrl) {
const downloadProps = {
target: "_blank",
rel: "noopener",
rel: "noreferrer noopener",
// We set the href regardless of whether or not we intercept the download
// because we don't really want to convert the file to a blob eagerly, and

View file

@ -62,8 +62,8 @@ export default class MKeyVerificationRequest extends React.Component {
const request = this.props.mxEvent.verificationRequest;
if (request) {
try {
await request.accept();
this._openRequest();
await request.accept();
} catch (err) {
console.error(err.message);
}
@ -136,9 +136,9 @@ export default class MKeyVerificationRequest extends React.Component {
} else if (request.cancelled) {
stateLabel = this._cancelledLabel(request.cancellingUserId);
} else if (request.accepting) {
stateLabel = _t("accepting …");
stateLabel = _t("Accepting …");
} else if (request.declining) {
stateLabel = _t("declining …");
stateLabel = _t("Declining …");
}
stateNode = (<div className="mx_cryptoEvent_state">{stateLabel}</div>);
}

View file

@ -30,7 +30,7 @@ import { _t } from '../../../languageHandler';
import * as ContextMenu from '../../structures/ContextMenu';
import SettingsStore from "../../../settings/SettingsStore";
import ReplyThread from "../elements/ReplyThread";
import {pillifyLinks} from '../../../utils/pillify';
import {pillifyLinks, unmountPills} from '../../../utils/pillify';
import {IntegrationManagers} from "../../../integrations/IntegrationManagers";
import {isPermalinkHost} from "../../../utils/permalinks/Permalinks";
import {toRightOf} from "../../structures/ContextMenu";
@ -92,6 +92,7 @@ export default createReactClass({
componentDidMount: function() {
this._unmounted = false;
this._pills = [];
if (!this.props.editState) {
this._applyFormatting();
}
@ -103,7 +104,7 @@ export default createReactClass({
// pillifyLinks BEFORE linkifyElement because plain room/user URLs in the composer
// are still sent as plaintext URLs. If these are ever pillified in the composer,
// we should be pillify them here by doing the linkifying BEFORE the pillifying.
pillifyLinks([this._content.current], this.props.mxEvent);
pillifyLinks([this._content.current], this.props.mxEvent, this._pills);
HtmlUtils.linkifyElement(this._content.current);
this.calculateUrlPreview();
@ -146,6 +147,7 @@ export default createReactClass({
componentWillUnmount: function() {
this._unmounted = true;
unmountPills(this._pills);
},
shouldComponentUpdate: function(nextProps, nextState) {
@ -372,7 +374,9 @@ export default createReactClass({
const height = window.screen.height > 800 ? 800 : window.screen.height;
const left = (window.screen.width - width) / 2;
const top = (window.screen.height - height) / 2;
window.open(completeUrl, '_blank', `height=${height}, width=${width}, top=${top}, left=${left},`);
const features = `height=${height}, width=${width}, top=${top}, left=${left},`;
const wnd = window.open(completeUrl, '_blank', features);
wnd.opener = null;
},
});
});

View file

@ -28,12 +28,17 @@ export const PendingActionSpinner = ({text}) => {
</div>;
};
const EncryptionInfo = ({pending, member, onStartVerification}) => {
const EncryptionInfo = ({waitingForOtherParty, waitingForNetwork, member, onStartVerification}) => {
let content;
if (pending) {
const text = _t("Waiting for %(displayName)s to accept…", {
displayName: member.displayName || member.name || member.userId,
});
if (waitingForOtherParty || waitingForNetwork) {
let text;
if (waitingForOtherParty) {
text = _t("Waiting for %(displayName)s to accept…", {
displayName: member.displayName || member.name || member.userId,
});
} else {
text = _t("Accepting…");
}
content = <PendingActionSpinner text={text} />;
} else {
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');

View file

@ -32,11 +32,14 @@ const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"];
const EncryptionPanel = ({verificationRequest, member, onClose, layout}) => {
const [request, setRequest] = useState(verificationRequest);
useEffect(() => {
setRequest(verificationRequest);
}, [verificationRequest]);
const [phase, setPhase] = useState(request && request.phase);
useEffect(() => {
setRequest(verificationRequest);
if (verificationRequest) {
setPhase(verificationRequest.phase);
}
}, [verificationRequest]);
const changeHandler = useCallback(() => {
// handle transitions -> cancelled for mismatches which fire a modal instead of showing a card
if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) {
@ -73,8 +76,13 @@ const EncryptionPanel = ({verificationRequest, member, onClose, layout}) => {
}, [member.userId]);
const requested = request && (phase === PHASE_REQUESTED || phase === PHASE_UNSENT || phase === undefined);
const initiatedByMe = request && request.initiatedByMe;
if (!request || requested) {
return <EncryptionInfo onStartVerification={onStartVerification} member={member} pending={requested} />;
return <EncryptionInfo
onStartVerification={onStartVerification}
member={member}
waitingForOtherParty={requested && initiatedByMe}
waitingForNetwork={requested && !initiatedByMe} />;
} else {
return (
<VerificationPanel

View file

@ -42,6 +42,7 @@ import {textualPowerLevel} from '../../../Roles';
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases";
import EncryptionPanel from "./EncryptionPanel";
import { useAsyncMemo } from '../../../hooks/useAsyncMemo';
const _disambiguateDevices = (devices) => {
const names = Object.create(null);
@ -916,6 +917,12 @@ const useIsSynapseAdmin = (cli) => {
return isAdmin;
};
const useHomeserverSupportsCrossSigning = (cli) => {
return useAsyncMemo(async () => {
return cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing");
}, [cli], false);
};
function useRoomPermissions(cli, room, user) {
const [roomPermissions, setRoomPermissions] = useState({
// modifyLevelMax is the max PL we can set this user to, typically min(their PL, our PL) && canSetPL
@ -1315,19 +1322,23 @@ const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => {
text = _t("Messages in this room are end-to-end encrypted.");
}
const userTrust = cli.checkUserTrust(member.userId);
const userVerified = SettingsStore.isFeatureEnabled("feature_cross_signing") ?
userTrust.isCrossSigningVerified() :
userTrust.isVerified();
const isMe = member.userId === cli.getUserId();
let verifyButton;
if (isRoomEncrypted && !userVerified && !isMe) {
verifyButton = (
<AccessibleButton className="mx_UserInfo_field" onClick={() => verifyUser(member)}>
{_t("Verify")}
</AccessibleButton>
);
const homeserverSupportsCrossSigning = useHomeserverSupportsCrossSigning(cli);
if (
SettingsStore.isFeatureEnabled("feature_cross_signing") &&
homeserverSupportsCrossSigning
) {
const userTrust = cli.checkUserTrust(member.userId);
const userVerified = userTrust.isCrossSigningVerified();
const isMe = member.userId === cli.getUserId();
if (isRoomEncrypted && !userVerified && !isMe) {
verifyButton = (
<AccessibleButton className="mx_UserInfo_field" onClick={() => verifyUser(member)}>
{_t("Verify")}
</AccessibleButton>
);
}
}
let devicesSection;

View file

@ -270,6 +270,8 @@ export default class VerificationPanel extends React.PureComponent {
};
_onVerifierShowSas = (sasEvent) => {
const {request} = this.props;
request.verifier.off('show_sas', this._onVerifierShowSas);
this.setState({sasEvent});
};
@ -278,7 +280,7 @@ export default class VerificationPanel extends React.PureComponent {
const hadVerifier = this._hasVerifier;
this._hasVerifier = !!request.verifier;
if (!hadVerifier && this._hasVerifier) {
request.verifier.once('show_sas', this._onVerifierShowSas);
request.verifier.on('show_sas', this._onVerifierShowSas);
try {
// on the requester side, this is also awaited in _startSAS,
// but that's ok as verify should return the same promise.
@ -299,6 +301,10 @@ export default class VerificationPanel extends React.PureComponent {
}
componentWillUnmount() {
this.props.request.off("change", this._onRequestChange);
const {request} = this.props;
if (request.verifier) {
request.verifier.off('show_sas', this._onVerifierShowSas);
}
request.off("change", this._onRequestChange);
}
}

View file

@ -219,7 +219,7 @@ export default createReactClass({
if (link) {
span = (
<a href={link} target="_blank" rel="noopener">
<a href={link} target="_blank" rel="noreferrer noopener">
{ span }
</a>
);

View file

@ -392,6 +392,20 @@ export default class BasicMessageEditor extends React.Component {
} else if (event.key === Key.ENTER && (event.shiftKey || (IS_MAC && event.altKey))) {
this._insertText("\n");
handled = true;
// move selection to start of composer
} else if (modKey && event.key === Key.HOME) {
setSelection(this._editorRef, model, {
index: 0,
offset: 0,
});
handled = true;
// move selection to end of composer
} else if (modKey && event.key === Key.END) {
setSelection(this._editorRef, model, {
index: model.parts.length - 1,
offset: model.parts[model.parts.length - 1].text.length,
});
handled = true;
// autocomplete or enter to send below shouldn't have any modifier keys pressed.
} else {
const metaOrAltPressed = event.metaKey || event.altKey;
@ -457,10 +471,14 @@ export default class BasicMessageEditor extends React.Component {
const addedLen = range.replace([partCreator.pillCandidate(range.text)]);
return model.positionForOffset(caret.offset + addedLen, true);
});
await model.autoComplete.onTab();
if (!model.autoComplete.hasSelection()) {
this.setState({showVisualBell: true});
model.autoComplete.close();
// Don't try to do things with the autocomplete if there is none shown
if (model.autoComplete) {
await model.autoComplete.onTab();
if (!model.autoComplete.hasSelection()) {
this.setState({showVisualBell: true});
model.autoComplete.close();
}
}
} catch (err) {
console.error(err);
@ -490,6 +508,7 @@ export default class BasicMessageEditor extends React.Component {
}
componentWillUnmount() {
document.removeEventListener("selectionchange", this._onSelectionChange);
this._editorRef.removeEventListener("input", this._onInput, true);
this._editorRef.removeEventListener("compositionstart", this._onCompositionStart, true);
this._editorRef.removeEventListener("compositionend", this._onCompositionEnd, true);

View file

@ -100,6 +100,17 @@ export function getHandlerTile(ev) {
}
}
// sometimes MKeyVerificationConclusion declines to render. Jankily decline to render and
// fall back to showing hidden events, if we're viewing hidden events
// XXX: This is extremely a hack. Possibly these components should have an interface for
// declining to render?
if (type === "m.key.verification.cancel" && SettingsStore.getValue("showHiddenEventsInTimeline")) {
const MKeyVerificationConclusion = sdk.getComponent("messages.MKeyVerificationConclusion");
if (!MKeyVerificationConclusion.prototype._shouldRender.call(null, ev, ev.request)) {
return;
}
}
return ev.isState() ? stateEventTileTypes[type] : eventTileTypes[type];
}

View file

@ -37,6 +37,8 @@ export default class InviteOnlyIcon extends React.Component {
};
render() {
const classes = this.props.collapsedPanel ? "mx_InviteOnlyIcon_small": "mx_InviteOnlyIcon_large";
if (!SettingsStore.isFeatureEnabled("feature_invite_only_padlocks")) {
return null;
}
@ -46,7 +48,7 @@ export default class InviteOnlyIcon extends React.Component {
if (this.state.hover) {
tooltip = <Tooltip className="mx_InviteOnlyIcon_tooltip" label={_t("Invite only")} dir="auto" />;
}
return (<div className="mx_InviteOnlyIcon"
return (<div className={classes}
onMouseEnter={this.onHoverStart}
onMouseLeave={this.onHoverEnd}
>

View file

@ -136,7 +136,7 @@ export default createReactClass({
<div className="mx_LinkPreviewWidget" >
{ img }
<div className="mx_LinkPreviewWidget_caption">
<div className="mx_LinkPreviewWidget_title"><a href={this.props.link} target="_blank" rel="noopener">{ p["og:title"] }</a></div>
<div className="mx_LinkPreviewWidget_title"><a href={this.props.link} target="_blank" rel="noreferrer noopener">{ p["og:title"] }</a></div>
<div className="mx_LinkPreviewWidget_siteName">{ p["og:site_name"] ? (" - " + p["og:site_name"]) : null }</div>
<div className="mx_LinkPreviewWidget_description" ref={this._description}>
{ description }

View file

@ -341,7 +341,7 @@ export default class MessageComposer extends React.Component {
</a>
) : '';
controls.push(<div className="mx_MessageComposer_replaced_wrapper">
controls.push(<div className="mx_MessageComposer_replaced_wrapper" key="room_replaced">
<div className="mx_MessageComposer_replaced_valign">
<img className="mx_MessageComposer_roomReplaced_icon" src={require("../../../../res/img/room_replaced.svg")} />
<span className="mx_MessageComposer_roomReplaced_header">

View file

@ -28,7 +28,7 @@ import rate_limited_func from "../../../ratelimitedfunc";
import * as Rooms from '../../../Rooms';
import DMRoomMap from '../../../utils/DMRoomMap';
import TagOrderStore from '../../../stores/TagOrderStore';
import RoomListStore from '../../../stores/RoomListStore';
import RoomListStore, {TAG_DM} from '../../../stores/RoomListStore';
import CustomRoomTagStore from '../../../stores/CustomRoomTagStore';
import GroupStore from '../../../stores/GroupStore';
import RoomSubList from '../../structures/RoomSubList';
@ -715,10 +715,10 @@ export default createReactClass({
incomingCall: incomingCallIfTaggedAs('m.favourite'),
},
{
list: this.state.lists['im.vector.fake.direct'],
list: this.state.lists[TAG_DM],
label: _t('Direct Messages'),
tagName: "im.vector.fake.direct",
incomingCall: incomingCallIfTaggedAs('im.vector.fake.direct'),
tagName: TAG_DM,
incomingCall: incomingCallIfTaggedAs(TAG_DM),
onAddRoom: () => {dis.dispatch({action: 'view_create_chat'});},
addRoomLabel: _t("Start chat"),
},

View file

@ -509,7 +509,7 @@ export default createReactClass({
"<issueLink>submit a bug report</issueLink>.",
{ errcode: this.props.error.errcode },
{ issueLink: label => <a href="https://github.com/vector-im/riot-web/issues/new/choose"
target="_blank" rel="noopener">{ label }</a> },
target="_blank" rel="noreferrer noopener">{ label }</a> },
),
];
break;

View file

@ -528,7 +528,7 @@ export default createReactClass({
let privateIcon = null;
if (SettingsStore.isFeatureEnabled("feature_cross_signing")) {
if (this.state.joinRule == "invite" && !dmUserId) {
privateIcon = <InviteOnlyIcon />;
privateIcon = <InviteOnlyIcon collapsedPanel={this.props.collapsed} />;
}
}

View file

@ -119,7 +119,7 @@ export default createReactClass({
'In future this will be improved.',
) }
{' '}
<a href="https://github.com/vector-im/riot-web/issues/2671" target="_blank" rel="noopener">
<a href="https://github.com/vector-im/riot-web/issues/2671" target="_blank" rel="noreferrer noopener">
https://github.com/vector-im/riot-web/issues/2671
</a>
</div>,

View file

@ -72,11 +72,14 @@ export default class CrossSigningPanel extends React.PureComponent {
const crossSigningPublicKeysOnDevice = crossSigning.getId();
const crossSigningPrivateKeysInStorage = await crossSigning.isStoredInSecretStorage(secretStorage);
const secretStorageKeyInAccount = await secretStorage.hasKey();
const homeserverSupportsCrossSigning =
await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing");
this.setState({
crossSigningPublicKeysOnDevice,
crossSigningPrivateKeysInStorage,
secretStorageKeyInAccount,
homeserverSupportsCrossSigning,
});
}
@ -120,6 +123,7 @@ export default class CrossSigningPanel extends React.PureComponent {
crossSigningPublicKeysOnDevice,
crossSigningPrivateKeysInStorage,
secretStorageKeyInAccount,
homeserverSupportsCrossSigning,
} = this.state;
let errorSection;
@ -127,14 +131,19 @@ export default class CrossSigningPanel extends React.PureComponent {
errorSection = <div className="error">{error.toString()}</div>;
}
const enabled = (
crossSigningPublicKeysOnDevice &&
// Whether the various keys exist on your account (but not necessarily
// on this device).
const enabledForAccount = (
crossSigningPrivateKeysInStorage &&
secretStorageKeyInAccount
);
let summarisedStatus;
if (enabled) {
if (!homeserverSupportsCrossSigning) {
summarisedStatus = <p>{_t(
"Your homeserver does not support cross-signing.",
)}</p>;
} else if (enabledForAccount && crossSigningPublicKeysOnDevice) {
summarisedStatus = <p> {_t(
"Cross-signing and secret storage are enabled.",
)}</p>;
@ -149,19 +158,28 @@ export default class CrossSigningPanel extends React.PureComponent {
)}</p>;
}
let resetButton;
if (enabledForAccount) {
resetButton = (
<div className="mx_CrossSigningPanel_buttonRow">
<AccessibleButton kind="danger" onClick={this._destroySecureSecretStorage}>
{_t("Reset cross-signing and secret storage")}
</AccessibleButton>
</div>
);
}
let bootstrapButton;
if (!enabled) {
bootstrapButton = <div className="mx_CrossSigningPanel_buttonRow">
<AccessibleButton kind="primary" onClick={this._bootstrapSecureSecretStorage}>
{_t("Bootstrap cross-signing and secret storage")}
</AccessibleButton>
</div>;
} else {
bootstrapButton = <div className="mx_CrossSigningPanel_buttonRow">
<AccessibleButton kind="danger" onClick={this._destroySecureSecretStorage}>
{_t("Reset cross-signing and secret storage")}
</AccessibleButton>
</div>;
if (
(!enabledForAccount || !crossSigningPublicKeysOnDevice) &&
homeserverSupportsCrossSigning
) {
bootstrapButton = (
<div className="mx_CrossSigningPanel_buttonRow">
<AccessibleButton kind="primary" onClick={this._bootstrapSecureSecretStorage}>
{_t("Bootstrap cross-signing and secret storage")}
</AccessibleButton>
</div>
);
}
return (
@ -182,10 +200,15 @@ export default class CrossSigningPanel extends React.PureComponent {
<td>{_t("Secret storage public key:")}</td>
<td>{secretStorageKeyInAccount ? _t("in account data") : _t("not found")}</td>
</tr>
</tbody></table>
<tr>
<td>{_t("Homeserver feature support:")}</td>
<td>{homeserverSupportsCrossSigning ? _t("exists") : _t("not found")}</td>
</tr>
</tbody></table>
</details>
{errorSection}
{bootstrapButton}
{resetButton}
</div>
);
}

View file

@ -172,7 +172,7 @@ export default class EventIndexPanel extends React.Component {
{},
{
'nativeLink': (sub) => <a href={nativeLink} target="_blank"
rel="noopener">{sub}</a>,
rel="noreferrer noopener">{sub}</a>,
},
)
}
@ -188,7 +188,7 @@ export default class EventIndexPanel extends React.Component {
{},
{
'riotLink': (sub) => <a href="https://riot.im/download/desktop"
target="_blank" rel="noopener">{sub}</a>,
target="_blank" rel="noreferrer noopener">{sub}</a>,
},
)
}

View file

@ -127,7 +127,6 @@ export default class KeyBackupPanel extends React.PureComponent {
Modal.createTrackedDialogAsync('Key Backup', 'Key Backup',
import('../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'),
{
secureSecretStorage: SettingsStore.isFeatureEnabled("feature_cross_signing"),
onFinished: () => {
this._loadBackupStatus();
},

View file

@ -132,10 +132,10 @@ export default class ProfileSettings extends React.Component {
{_t(
"<a>Upgrade</a> to your own domain", {},
{
a: sub => <a href={hostingSignupLink} target="_blank" rel="noopener">{sub}</a>,
a: sub => <a href={hostingSignupLink} target="_blank" rel="noreferrer noopener">{sub}</a>,
},
)}
<a href={hostingSignupLink} target="_blank" rel="noopener">
<a href={hostingSignupLink} target="_blank" rel="noreferrer noopener">
<img src={require("../../../../res/img/external-link.svg")} width="11" height="10" alt='' />
</a>
</span>;

View file

@ -68,7 +68,7 @@ export default class BridgeSettingsTab extends React.Component {
{
// TODO: We don't have this link yet: this will prevent the translators
// having to re-translate the string when we do.
a: sub => <a href={BRIDGES_LINK} target="_blank" rel="noopener">{sub}</a>,
a: sub => <a href={BRIDGES_LINK} target="_blank" rel="noreferrer noopener">{sub}</a>,
},
)}</p>
<ul className="mx_RoomSettingsDialog_BridgeList">
@ -82,7 +82,7 @@ export default class BridgeSettingsTab extends React.Component {
{
// TODO: We don't have this link yet: this will prevent the translators
// having to re-translate the string when we do.
a: sub => <a href={BRIDGES_LINK} target="_blank" rel="noopener">{sub}</a>,
a: sub => <a href={BRIDGES_LINK} target="_blank" rel="noreferrer noopener">{sub}</a>,
},
)}</p>;
}

View file

@ -97,7 +97,7 @@ export default class SecurityRoomSettingsTab extends React.Component {
{},
{
'a': (sub) => {
return <a rel='noopener' target='_blank'
return <a rel='noreferrer noopener' target='_blank'
href='https://about.riot.im/help#end-to-end-encryption'>{sub}</a>;
},
},

View file

@ -37,7 +37,7 @@ const ghVersionLabel = function(repo, token='') {
} else {
url = `https://github.com/${repo}/commit/${token.split('-')[0]}`;
}
return <a target="_blank" rel="noopener" href={url}>{ token }</a>;
return <a target="_blank" rel="noreferrer noopener" href={url}>{ token }</a>;
};
export default class HelpUserSettingsTab extends React.Component {
@ -110,7 +110,7 @@ export default class HelpUserSettingsTab extends React.Component {
const legalLinks = [];
for (const tocEntry of SdkConfig.get().terms_and_conditions_links) {
legalLinks.push(<div key={tocEntry.url}>
<a href={tocEntry.url} rel="noopener" target="_blank">{tocEntry.text}</a>
<a href={tocEntry.url} rel="noreferrer noopener" target="_blank">{tocEntry.text}</a>
</div>);
}
@ -132,27 +132,27 @@ export default class HelpUserSettingsTab extends React.Component {
<span className='mx_SettingsTab_subheading'>{_t("Credits")}</span>
<ul>
<li>
The <a href="themes/riot/img/backgrounds/valley.jpg" rel="noopener" target="_blank">
The <a href="themes/riot/img/backgrounds/valley.jpg" rel="noreferrer noopener" target="_blank">
default cover photo</a> is ©&nbsp;
<a href="https://www.flickr.com/golan" rel="noopener" target="_blank">Jesús Roncero</a>{' '}
<a href="https://www.flickr.com/golan" rel="noreferrer noopener" target="_blank">Jesús Roncero</a>{' '}
used under the terms of&nbsp;
<a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noopener" target="_blank">
<a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noreferrer noopener" target="_blank">
CC-BY-SA 4.0</a>.
</li>
<li>
The <a href="https://github.com/matrix-org/twemoji-colr" rel="noopener" target="_blank">
twemoji-colr</a> font is ©&nbsp;
<a href="https://mozilla.org" rel="noopener" target="_blank">Mozilla Foundation</a>{' '}
The <a href="https://github.com/matrix-org/twemoji-colr" rel="noreferrer noopener"
target="_blank"> twemoji-colr</a> font is ©&nbsp;
<a href="https://mozilla.org" rel="noreferrer noopener" target="_blank">Mozilla Foundation</a>{' '}
used under the terms of&nbsp;
<a href="http://www.apache.org/licenses/LICENSE-2.0" rel="noopener" target="_blank">
<a href="http://www.apache.org/licenses/LICENSE-2.0" rel="noreferrer noopener" target="_blank">
Apache 2.0</a>.
</li>
<li>
The <a href="https://twemoji.twitter.com/" rel="noopener" target="_blank">
The <a href="https://twemoji.twitter.com/" rel="noreferrer noopener" target="_blank">
Twemoji</a> emoji art is ©&nbsp;
<a href="https://twemoji.twitter.com/" rel="noopener" target="_blank">Twitter, Inc and other
<a href="https://twemoji.twitter.com/" rel="noreferrer noopener" target="_blank">Twitter, Inc and other
contributors</a> used under the terms of&nbsp;
<a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener" target="_blank">
<a href="https://creativecommons.org/licenses/by/4.0/" rel="noreferrer noopener" target="_blank">
CC-BY 4.0</a>.
</li>
</ul>
@ -162,7 +162,8 @@ export default class HelpUserSettingsTab extends React.Component {
render() {
let faqText = _t('For help with using Riot, click <a>here</a>.', {}, {
'a': (sub) => <a href="https://about.riot.im/need-help/" rel='noopener' target='_blank'>{sub}</a>,
'a': (sub) =>
<a href="https://about.riot.im/need-help/" rel='noreferrer noopener' target='_blank'>{sub}</a>,
});
if (SdkConfig.get().welcomeUserId && getCurrentLanguage().startsWith('en')) {
faqText = (
@ -170,7 +171,7 @@ export default class HelpUserSettingsTab extends React.Component {
{
_t('For help with using Riot, click <a>here</a> or start a chat with our ' +
'bot using the button below.', {}, {
'a': (sub) => <a href="https://about.riot.im/need-help/" rel='noopener'
'a': (sub) => <a href="https://about.riot.im/need-help/" rel='noreferrer noopener'
target='_blank'>{sub}</a>,
})
}

View file

@ -55,7 +55,7 @@ export default class LabsUserSettingsTab extends React.Component {
'<a>Learn more</a>.', {}, {
'a': (sub) => {
return <a href="https://github.com/vector-im/riot-web/blob/develop/docs/labs.md"
rel='noopener' target='_blank'>{sub}</a>;
rel='noreferrer noopener' target='_blank'>{sub}</a>;
},
})
}

View file

@ -77,7 +77,7 @@ export default class InlineTermsAgreement extends React.Component {
"Accept <policyLink /> to continue:", {}, {
policyLink: () => {
return (
<a href={policy.url} rel='noopener' target='_blank'>
<a href={policy.url} rel='noreferrer noopener' target='_blank'>
{policy.name}
<span className='mx_InlineTermsAgreement_link' />
</a>

View file

@ -42,6 +42,12 @@ export default class UnverifiedSessionToast extends React.PureComponent {
Modal.createTrackedDialog('New Session Review', 'Starting dialog', NewSessionReviewDialog, {
userId: MatrixClientPeg.get().getUserId(),
device,
onFinished: (r) => {
if (!r) {
/* This'll come back false if the user clicks "this wasn't me" and saw a warning dialog */
this._onLaterClick();
}
},
}, null, /* priority = */ false, /* static = */ true);
};

View file

@ -78,7 +78,6 @@ export default class VerificationRequestToast extends React.PureComponent {
// no room id for to_device requests
const cli = MatrixClientPeg.get();
try {
await request.accept();
if (request.channel.roomId) {
dis.dispatch({
action: 'view_room',
@ -99,6 +98,7 @@ export default class VerificationRequestToast extends React.PureComponent {
verificationRequest: request,
}, null, /* priority = */ false, /* static = */ true);
}
await request.accept();
} catch (err) {
console.error(err.message);
}

View file

@ -48,6 +48,11 @@ export default class VerificationShowSas extends React.Component {
this.props.onDone();
};
onDontMatchClick = () => {
this.setState({ cancelling: true });
this.props.onCancel();
};
render() {
let sasDisplay;
let sasCaption;
@ -98,9 +103,14 @@ export default class VerificationShowSas extends React.Component {
}
let confirm;
if (this.state.pending) {
const {displayName} = this.props;
const text = _t("Waiting for %(displayName)s to verify…", {displayName});
if (this.state.pending || this.state.cancelling) {
let text;
if (this.state.pending) {
const {displayName} = this.props;
text = _t("Waiting for %(displayName)s to verify…", {displayName});
} else {
text = _t("Cancelling…");
}
confirm = <PendingActionSpinner text={text} />;
} else {
// FIXME: stop using DialogButtons here once this component is only used in the right panel verification
@ -109,7 +119,7 @@ export default class VerificationShowSas extends React.Component {
onPrimaryButtonClick={this.onMatchClick}
primaryButtonClass="mx_UserInfo_wideButton"
cancelButton={_t("They don't match")}
onCancel={this.props.onCancel}
onCancel={this.onDontMatchClick}
cancelButtonClass="mx_UserInfo_wideButton"
/>;
}

View file

@ -102,7 +102,7 @@ export default class AutocompleteWrapperModel {
const text = completion.completion;
switch (completion.type) {
case "room":
return [this._partCreator.roomPill(completionId), this._partCreator.plain(completion.suffix)];
return [this._partCreator.roomPill(text, completionId), this._partCreator.plain(completion.suffix)];
case "at-room":
return [this._partCreator.atRoomPill(completionId), this._partCreator.plain(completion.suffix)];
case "user":

View file

@ -254,8 +254,8 @@ class RoomPillPart extends PillPart {
let initialLetter = "";
let avatarUrl = Avatar.avatarUrlForRoom(this._room, 16 * window.devicePixelRatio, 16 * window.devicePixelRatio);
if (!avatarUrl) {
initialLetter = Avatar.getInitialLetter(this._room.name);
avatarUrl = `../../${Avatar.defaultAvatarUrlForString(this._room.roomId)}`;
initialLetter = Avatar.getInitialLetter(this._room ? this._room.name : this.resourceId);
avatarUrl = `../../${Avatar.defaultAvatarUrlForString(this._room ? this._room.roomId : this.resourceId)}`;
}
this._setAvatarVars(node, avatarUrl, initialLetter);
}
@ -422,14 +422,15 @@ export class PartCreator {
return new PillCandidatePart(text, this._autoCompleteCreator);
}
roomPill(alias) {
roomPill(alias, roomId) {
let room;
if (alias[0] === '#') {
room = this._client.getRooms().find((r) => {
return r.getCanonicalAlias() === alias || r.getAliases().includes(alias);
});
if (roomId || alias[0] !== "#") {
room = this._client.getRoom(roomId || alias);
} else {
room = this._client.getRoom(alias);
room = this._client.getRooms().find((r) => {
return r.getCanonicalAlias() === alias ||
r.getAltAliases().includes(alias);
});
}
return new RoomPillPart(alias, room);
}

View file

@ -41,14 +41,6 @@ export function htmlSerializeIfNeeded(model, {forceHTML = false} = {}) {
if (!parser.isPlainText() || forceHTML) {
return parser.toHTML();
}
// Format "plain" text to ensure removal of backslash escapes
// https://github.com/vector-im/riot-web/issues/11230
// https://github.com/vector-im/riot-web/issues/2870
const postParsePlaintext = parser.toPlaintext();
if (postParsePlaintext !== md) {
// only return "formatted" text if it differs from the source text
return postParsePlaintext;
}
}
export function textSerialize(model) {

25
src/hooks/useAsyncMemo.js Normal file
View file

@ -0,0 +1,25 @@
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import { useState, useEffect } from 'react';
export const useAsyncMemo = (fn, deps, initialValue) => {
const [value, setValue] = useState(initialValue);
useEffect(() => {
fn().then(setValue);
}, deps); // eslint-disable-line react-hooks/exhaustive-deps
return value;
};

View file

@ -1865,7 +1865,7 @@
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V místnosti jsou neověřené relace: pokud budete pokračovat bez ověření, bude možné váš hovor odposlouchávat.",
"Verify this session": "Ověřit tuto relaci",
"Encryption upgrade available": "Je dostupná aktualizace šifrování",
"Set up encryption": "Nastavit šifrování",
"Set up encryption": "Připravit šifrování",
"Unverified session": "Neověřená relace",
"Verifies a user, session, and pubkey tuple": "Ověří uživatele, relaci a veřejné klíče",
"Unknown (user, session) pair:": "Neznámý pár (uživatel, relace):",
@ -2102,5 +2102,49 @@
"Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Smazání klíčů pro cross-signing je definitivní. Každý kdo vás ověřil teď uvidí bezpečnostní varování. Pokud jste zrovna neztratili všechna zařízení ze kterých se můžete ověřit, tak to asi nechcete udělat.",
"Clear cross-signing keys": "Smazat klíče pro cross-signing",
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Zabezpečte si šifrovací klíče silným heslem. Pro lepší bezpečnost by mělo být jiné než vaše heslo k přihlášení:",
"Enter a passphrase": "Zadejte heslo"
"Enter a passphrase": "Zadejte heslo",
"The version of Riot": "Verze Riotu",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Jestli používáte Riot na dotykovém zařízení",
"Whether you're using Riot as an installed Progressive Web App": "Jestli používáte Riot jako nainstalovanou Progresivní Webovou Aplikaci",
"Your user agent": "Identifikace vašeho prohlížeče",
"The information being sent to us to help make Riot better includes:": "Abychom mohli Riot zlepšovat si posíláme následující informace:",
"Verify this session by completing one of the following:": "Ověřte tuto relaci dokončením jednoho z následujících:",
"Scan this unique code": "Naskenujte tento jedinečný kód",
"or": "nebo",
"Compare unique emoji": "Porovnejte jedinečnou kombinaci emoji",
"Compare a unique set of emoji if you don't have a camera on either device": "Porovnejte jedinečnou kombinaci emoji pokud na žádném zařízení nemáte kameru",
"Not Trusted": "Nedůvěryhodné",
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) se přihlásil do nové relace a neověřil ji:",
"Ask this user to verify their session, or manually verify it below.": "Poproste tohoto uživatele aby svojí relaci ověřil a nebo jí níže můžete ověřit manuálně.",
"Manually Verify": "Ověřit manuálně",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Relace, kterou se snažíte ověřit neumožňuje ověření QR kódem ani pomocí emoji, což je to co Riot podporuje. Zkuste použít jiného klienta.",
"Verify by scanning": "Ověřte naskenováním",
"You declined": "Odmítli jste",
"%(name)s declined": "%(name)s odmítl/a",
"accepting …": "přijímání …",
"declining …": "odmítání …",
"Back up my encryption keys, securing them with the same passphrase": "Zazálohovat šifrovací klíče zabezpečené tím stejným heslem",
"Enter your passphrase a second time to confirm it.": "Pro ověření zadejte své heslo podruhé.",
"Keep a copy of it somewhere secure, like a password manager or even a safe.": "Uschovejte si kopii na bezpečném místě, například ve správci hesel nebo v trezoru.",
"Your recovery key": "Váš obnovovací klíč",
"Copy": "Zkopírovat",
"You can now verify your other devices, and other users to keep your chats safe.": "Teď můžete ověřit své ostatní zařízení a další uživatelé, aby vaše komunikace byla bezpečná.",
"Upgrade your encryption": "Aktualizovat šifrování",
"Make a copy of your recovery key": "Vytvořit kopii svého obnovovacího klíče",
"You're done!": "Hotovo!",
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Bez nastavení Bezpečného Obnovení Zpráv nebudete moci obnovit historii šifrovaných zpráv pokud se odhlásíte nebo použijete jinou relaci.",
"Create key backup": "Vytvořit zálohu klíčů",
"This session is encrypting history using the new recovery method.": "Tato relace šifruje historii zpráv s podporou nového způsobu obnovení.",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Tato relace zjistila, že klíč a heslo k obnovení zpráv byly odstraněny.",
"If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Pokud se vám to stalo neůmyslně, můžete znovu nastavit zálohu zpráv pro tuto relaci. To znovu zašifruje historii zpráv novým způsobem.",
"If disabled, messages from encrypted rooms won't appear in search results.": "Když je to zakázané, zprávy v šifrovaných místnostech se nebudou objevovat ve výsledcích vyhledávání.",
"Disable": "Zakázat",
"Not currently downloading messages for any room.": "Aktuálně se nestahují žádné zprávy.",
"Downloading mesages for %(currentRoom)s.": "Stahují se zprávy pro %(currentRoom)s.",
"Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot si bezpečně uchovává šifrované zprávy lokálně, aby v nich mohl vyhledávat:",
"Space used:": "Použitý prostor:",
"Indexed messages:": "Indexované zprávy:",
"Indexed rooms:": "Indexované místnosti:",
"%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s z %(totalRooms)s",
"Message downloading sleep time(ms)": "Čas na stažení zprávy (ms)"
}

View file

@ -516,5 +516,8 @@
"Multiple integration managers": "Flere integrationsmanagere",
"Enable Emoji suggestions while typing": "Aktiver emoji forslag under indtastning",
"Use compact timeline layout": "Brug kompakt tidslinje",
"Show a placeholder for removed messages": "Vis en pladsholder for fjernede beskeder"
"Show a placeholder for removed messages": "Vis en pladsholder for fjernede beskeder",
"The version of Riot": "Riot versionen",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Hvorvidt du benytter Riot på en enhed, hvor touch er den primære input-grænseflade",
"Your user agent": "Din user agent"
}

View file

@ -869,7 +869,7 @@
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Bitte hilf uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen (bitte beachte auch unsere <PolicyLink>Cookie-Richtlinie</PolicyLink>).",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Bitte hilf uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen.",
"Yes, I want to help!": "Ja, ich möchte helfen!",
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Dies wird deinen Account permanent unbenutzbar machen. Du wirst nicht in der Lage sein, dich anzumelden und keiner wird dieselbe Benutzer-ID erneut registrieren können. Alle Räume, in denen der Account ist, werden verlassen und deine Account-Daten werden vom Identitätsserver gelöscht. <b>Diese Aktion ist irreversibel!</b>",
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Dies wird deinen Account permanent unbenutzbar machen. Du wirst nicht in der Lage sein, dich anzumelden und keiner wird dieselbe Benutzer-ID erneut registrieren können. Alle Räume, in denen der Account ist, werden verlassen und deine Account-Daten werden vom Identitätsserver gelöscht. <b>Diese Aktion ist unumkehrbar.</b>",
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Standardmäßig werden <b>die von dir gesendeten Nachrichten beim Deaktiveren nicht gelöscht</b>. Wenn du dies von uns möchtest, aktivere das Auswalfeld unten.",
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Sie Sichtbarkeit der Nachrichten in Matrix ist vergleichbar mit E-Mails: Wenn wir deine Nachrichten vergessen heißt das, dass diese nicht mit neuen oder nicht registrierten Nutzern teilen werden, aber registrierte Nutzer, die bereits zugriff haben, werden Zugriff auf ihre Kopie behalten.",
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Bitte vergesst alle Nachrichten, die ich gesendet habe, wenn mein Account deaktiviert wird. (<b>Warnung:</b> Zukünftige Nutzer werden eine unvollständige Konversation sehen)",
@ -892,7 +892,7 @@
"No Audio Outputs detected": "Keine Ton-Ausgabe erkannt",
"Audio Output": "Ton-Ausgabe",
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In verschlüsselten Räumen, wie diesem, ist die Link-Vorschau standardmäßig deaktiviert damit dein Heimserver (auf dem die Vorschau erzeugt wird) keine Informationen über Links in diesem Raum bekommt.",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Wenn jemand eine Nachricht mit einem Link schickt, kann die Link-Vorschau mehr Informationen, wie Titel, Beschreibung und Bild der Webseite, über den Link anzeigen.",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Wenn jemand eine URL in seine Nachricht einfügt, kann eine URL-Vorschau angezeigt werden, um mehr Informationen über diesen Link zu erhalten, wie z.B. den Titel, die Beschreibung und ein Bild von der Website.",
"The email field must not be blank.": "Das E-Mail-Feld darf nicht leer sein.",
"The phone number field must not be blank.": "Das Telefonnummern-Feld darf nicht leer sein.",
"The password field must not be blank.": "Das Passwort-Feld darf nicht leer sein.",
@ -945,9 +945,9 @@
"%(senderName)s removed the main address for this room.": "%(senderName)s entfernte die Hauptadresse von diesem Raum.",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s fügte %(addedAddresses)s hinzu und entfernte %(removedAddresses)s als Adressen von diesem Raum.",
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Bevor du Log-Dateien übermittelst, musst du ein <a>GitHub-Issue erstellen</a> um dein Problem zu beschreiben.",
"Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot benutzt nun 3-5x weniger Arbeitsspeicher, indem Informationen über andere Nutzer erst bei Bedarf geladen werden. Bitte warte, während die Daten erneut mit dem Server abgeglichen werden!",
"Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot benutzt nun 3-5-mal weniger Arbeitsspeicher, indem Informationen über andere Nutzer erst bei Bedarf geladen werden. Bitte warte, während die Daten erneut mit dem Server abgeglichen werden!",
"Updating Riot": "Aktualisiere Riot",
"You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "Du hast zuvor Riot auf %(host)s ohne verzögertem Laden von Mitgliedern genutzt. In dieser Version war das verzögerte Laden deaktiviert. Da die lokal zwischengespeicherten Daten zwischen diesen Einstellungen nicht kompatibel ist, muss Riot dein Konto neu synchronisieren.",
"You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "Du hast zuvor Riot auf %(host)s ohne das verzögerte Laden von Mitgliedern genutzt. In dieser Version war das verzögerte Laden deaktiviert. Da die lokal zwischengespeicherten Daten zwischen diesen Einstellungen nicht kompatibel sind, muss Riot dein Konto neu synchronisieren.",
"If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Wenn Riot mit der alten Version in einem anderen Tab geöffnet ist, schließe dies bitte, da das parallele Nutzen von Riot auf demselben Host mit aktivierten und deaktivierten verzögertem Laden, Probleme verursachen wird.",
"Incompatible local cache": "Inkompatibler lokaler Zwischenspeicher",
"Clear cache and resync": "Zwischenspeicher löschen und erneut synchronisieren",
@ -960,7 +960,7 @@
"Delete Backup": "Sicherung löschen",
"Backup version: ": "Sicherungsversion: ",
"Algorithm: ": "Algorithmus: ",
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Um deinen Chatverlauf nicht zu verlieren, musst du deine Raum-Schlüssel exportieren, bevor du dich abmeldest. Du musst zurück zu einer neueren Riot-Version gehen, um dies zu tun",
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Um zu vermeiden, dass Ihr Chat-Verlauf verloren geht, müssen Sie Ihre Raum-Schlüssel exportieren, bevor Sie sich abmelden. Dazu müssen Sie auf die neuere Version von Riot zurückgehen",
"Incompatible Database": "Inkompatible Datenbanken",
"Continue With Encryption Disabled": "Mit deaktivierter Verschlüsselung fortfahren",
"Enter a passphrase...": "Passphrase eingeben...",
@ -984,7 +984,7 @@
"Backup Restored": "Sicherung wiederhergestellt",
"Enter Recovery Passphrase": "Gebe Wiederherstellungs-Passphrase ein",
"Enter Recovery Key": "Gebe Wiederherstellungsschlüssel ein",
"This looks like a valid recovery key!": "Dies sieht nach einem validen Wiederherstellungsschlüssel aus",
"This looks like a valid recovery key!": "Dies sieht wie ein gültiger Wiederherstellungsschlüssel aus!",
"Not a valid recovery key": "Kein valider Wiederherstellungsschlüssel",
"There was an error joining the room": "Es gab einen Fehler beim Raum-Beitreten",
"Use a few words, avoid common phrases": "Benutze einige Worte, vermeide gängige Phrasen",
@ -1026,7 +1026,7 @@
"Unable to load key backup status": "Konnte Status des Schlüsselbackups nicht laden",
"Don't ask again": "Nicht erneut fragen",
"Set up": "Einrichten",
"Please review and accept all of the homeserver's policies": "Bitte sieh dir die Heimserver-Regularien an und akzeptiere sie",
"Please review and accept all of the homeserver's policies": "Bitte prüfen und akzeptieren Sie alle Richtlinien des Heimservers",
"Failed to load group members": "Konnte Gruppenmitglieder nicht laden",
"That doesn't look like a valid email address": "Sieht nicht nach einer validen E-Mail-Adresse aus",
"Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)s",
@ -1034,10 +1034,10 @@
"Unable to load backup status": "Konnte Backupstatus nicht laden",
"Failed to decrypt %(failedCount)s sessions!": "Konnte %(failedCount)s Sitzungen nicht entschlüsseln!",
"Restored %(sessionCount)s session keys": "%(sessionCount)s Sitzungsschlüssel wiederhergestellt",
"Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Greife auf deinen sicheren Chatverlauf zu und richte sicheres Schreiben ein indem du deine Wiederherstellungspassphrase eingibst.",
"Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Greifen Sie auf Ihre sichere Nachrichtenhistorie zu und richten Sie einen sicheren Nachrichtenversand ein, indem Sie Ihre Wiederherstellungspassphrase eingeben.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "Wenn du deinen Wiederherstellungspassphrase vergessen hast, kannst du <button1>deinen Wiederherstellungsschlüssel benutzen</button1> oder <button2>neue Wiederherstellungsoptionen einrichten</button2>",
"You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Du hast kürzlich eine neuere Version von Riot auf %(host)s verwendet. Um diese Version erneut mit Ende-zu-Ende-Verschlüsselung zu nutzen, musst du dich ab- und wieder anmelden. ",
"Access your secure message history and set up secure messaging by entering your recovery key.": "Auf sichere Nachrichtenhistorie zugreifen und sicheren Nachrichtenversand einrichten indem du deinen Wiederherstellungsschlüssel eingibst.",
"Access your secure message history and set up secure messaging by entering your recovery key.": "Greifen Sie auf Ihren sicheren Nachrichtenverlauf zu und richten Sie durch Eingabe Ihres Wiederherstellungsschlüssels einen sicheren Nachrichtenversand ein.",
"Set a new status...": "Setze einen neuen Status...",
"Clear status": "Status löschen",
"Invalid homeserver discovery response": "Ungültige Antwort beim Aufspüren des Heimservers",
@ -1051,10 +1051,10 @@
"Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Ohne Sichere Nachrichten-Wiederherstellung einzurichten, wirst du deine sichere Nachrichtenhistorie verlieren, wenn du dich abmeldest.",
"If you don't want to set this up now, you can later in Settings.": "Wenn du dies jetzt nicht einrichten willst, kannst du dies später in den Einstellungen tun.",
"New Recovery Method": "Neue Wiederherstellungsmethode",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Wenn du die neue Wiederherstellungsmethode nicht eingerichtet hast, kann ein Angreifer versuchen Zugang zu deinem Konto zu erlangen. Ändere sofort dein Passwort und setze eine neue Wiederherstellungsmethode.",
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Wenn Sie die neue Wiederherstellungsmethode nicht festgelegt haben, versucht ein Angreifer möglicherweise, auf Ihr Konto zuzugreifen. Ändern Sie Ihr Kontopasswort und legen Sie sofort eine neue Wiederherstellungsmethode in den Einstellungen fest.",
"Set up Secure Messages": "Richte sichere Nachrichten ein",
"Go to Settings": "Gehe zu Einstellungen",
"Sign in with single sign-on": "Mit Single Sign-On anmelden",
"Sign in with single sign-on": "Melden Sie sich mit Single Sign-On an",
"Waiting for %(userId)s to confirm...": "Warte auf Bestätigung für %(userId)s ...",
"Unrecognised address": "Nicht erkannte Adresse",
"User %(user_id)s may or may not exist": "Existenz der Benutzer %(user_id)s unsicher",
@ -1246,11 +1246,11 @@
"Manually export keys": "Manueller Schlüssel Export",
"Composer": "Nachrichteneingabefeld",
"Nothing appearing? Not all clients support interactive verification yet. <button>Use legacy verification</button>.": "Es ist nichts aufgetaucht? Noch nicht alle Clients unterstützen die interaktive Verifikation. <button>Nutze alte Verifikation</button>.",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifiziere diesen Benutzer und markiere ihn als \"vertraut\". Dies gibt dir bei Ende-zu-Ende-verschlüsselten Nachrichten extra Seelenfrieden.",
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Überprüfen Sie diesen Benutzer, um ihn als vertrauenswürdig zu kennzeichnen. Benutzern zu vertrauen gibt Ihnen zusätzliche Sicherheit bei der Verwendung von Ende-zu-Ende-verschlüsselten Nachrichten.",
"I don't want my encrypted messages": "Ich möchte meine verschlüsselten Nachrichten nicht",
"You'll lose access to your encrypted messages": "Du wirst den Zugang zu deinen verschlüsselten Nachrichten verlieren",
"If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Wenn du Fehler bemerkst oder eine Rückmeldung geben möchtest, teile dies uns auf GitHub mit.",
"To help avoid duplicate issues, please <existingIssuesLink>view existing issues</existingIssuesLink> first (and add a +1) or <newIssueLink>create a new issue</newIssueLink> if you can't find it.": "Um doppelte Issues zu vermeiden, <existingIssuesLink>schau dir zuerst die existierenden Issues an</existingIssuesLink> (und füge hinzu oder <newIssueLink>erstelle ein neues Issue</newIssueLink>, wenn du keins finden kannst.",
"To help avoid duplicate issues, please <existingIssuesLink>view existing issues</existingIssuesLink> first (and add a +1) or <newIssueLink>create a new issue</newIssueLink> if you can't find it.": "Um doppelte Issues zu vermeiden, <existingIssuesLink>schauen Sie bitte zuerst die existierenden Issues an</existingIssuesLink> (und fügen Sie ein \"+1\" hinzu), oder <newIssueLink>erstellen Sie ein neues Issue</newIssueLink>, wenn Sie keines finden können.",
"Report bugs & give feedback": "Melde Fehler & gebe Rückmeldungen",
"Recovery Key Mismatch": "Wiederherstellungsschlüssel passt nicht",
"Update status": "Aktualisiere Status",
@ -1302,7 +1302,7 @@
"Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of <a>modular.im</a>.": "Gib die Adresse deines Modular-Heimservers an. Es kann deine eigene Domain oder eine Subdomain von <a>modular.im</a> sein.",
"Unable to query for supported registration methods.": "Konnte unterstützte Registrierungsmethoden nicht abrufen.",
"Bulk options": "Sammeloptionen",
"Join millions for free on the largest public server": "Tritt wie Millionen andere kostenlos dem größten öffentlichen Server bei",
"Join millions for free on the largest public server": "Schließen Sie sich auf dem größten öffentlichen Server kostenlos Millionen von Menschen an",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Fügt ¯\\_(ツ)_/¯ vor einer Klartextnachricht ein",
"Changes your display nickname in the current room only": "Ändert den Anzeigenamen ausschließlich für den aktuellen Raum",
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktivierte Abzeichen der Gruppen %(groups)s für diesen Raum.",
@ -1542,5 +1542,104 @@
"Unsubscribe": "Deabonnieren",
"View rules": "Regeln betrachten",
"You are currently subscribed to:": "Du abonnierst momentan:",
"⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht."
"⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.",
"The version of Riot": "Die Version von Riot",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Ob Sie Riot auf einem Gerät verwenden, bei dem Berührung der primäre Eingabemechanismus ist",
"Whether you're using Riot as an installed Progressive Web App": "Ob Sie Riot als installierte progressive Web-App verwenden",
"Your user agent": "Ihr User-Agent",
"The information being sent to us to help make Riot better includes:": "Zu den Informationen, die uns zugesandt werden, um zu helfen, Riot besser zu machen, gehören:",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Es sind unbekannte Sitzungen in diesem Raum: Wenn Sie ohne Verifizierung fortfahren, wird es für jemanden möglich sein, Ihren Anruf zu belauschen.",
"If you cancel now, you won't complete verifying the other user.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung des anderen Nutzers nicht beenden können.",
"If you cancel now, you won't complete verifying your other session.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung der anderen Sitzung nicht beenden können.",
"If you cancel now, you won't complete your secret storage operation.": "Wenn Sie jetzt abbrechen, werden Sie die Geheimlagerungsoperation nicht beenden können.",
"Cancel entering passphrase?": "Eingabe der Passphrase abbrechen?",
"Setting up keys": "Einrichten der Schlüssel",
"Encryption upgrade available": "Verschlüsselungs-Update verfügbar",
"Unverified session": "Ungeprüfte Sitzung",
"Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und Pubkey-Tupel",
"Unknown (user, session) pair:": "Unbekanntes (Nutzer-, Sitzungs-) Paar:",
"Session already verified!": "Sitzung bereits verifiziert!",
"WARNING: Session already verified, but keys do NOT MATCH!": "ACHTUNG: Sitzung bereits verifiziert, aber die Schlüssel passen NICHT ZUSAMMEN!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ACHTUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signierschlüssel für %(userId)s und Sitzung %(deviceId)s ist \"%(fprint)s\", was nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Das könnte bedeuten, dass Ihre Kommunikation abgehört wird!",
"Never send encrypted messages to unverified sessions from this session": "Sende niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen",
"Never send encrypted messages to unverified sessions in this room from this session": "Sende niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen in diesem Raum",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle End-zu-End-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chat-Verlauf nicht mehr lesbar ist, es sei denn, Sie exportieren zuerst Ihre Raumschlüssel und importieren sie anschließend wieder. In Zukunft wird dies verbessert werden.",
"Delete %(count)s sessions|other": "Lösche %(count)s Sitzungen",
"Backup is not signed by any of your sessions": "Die Sicherung ist von keiner Ihrer Sitzungen unterzeichnet.",
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Ihr Passwort wurde erfolgreich geändert. Sie erhalten keine Push-Benachrichtigungen zu anderen Sitzungen, bis Sie sich wieder bei diesen anmelden",
"Sessions": "Sitzungen",
"Notification sound": "Benachrichtigungston",
"Set a new custom sound": "Setze einen neuen benutzerdefinierten Sound",
"Browse": "Durchsuche",
"Direct Messages": "Direkte Nachrichten",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Sie können <code>/help</code> benutzen, um verfügbare Befehle aufzulisten. Wollten Sie dies als Nachricht senden?",
"Direct message": "Direkte Nachricht",
"Set a room alias to easily share your room with other people.": "Setze ein Raum-Alias, um deinen Raum einfach mit anderen Personen zu teilen.",
"Suggestions": "Vorschläge",
"Recently Direct Messaged": "Kürzlich direkt verschickt",
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Wenn Sie niemanden finden können, fragen Sie nach deren Benutzernamen, teilen Sie ihren Benutzernamen (%(userId)s) oder <a>Profil-Link</a>.",
"Go": "Los",
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Wenn Sie niemanden finden können, fragen Sie nach deren Benutzernamen (z.B. @benutzer:server.de) oder <a>teilen Sie diesen Raum</a>.",
"Command Help": "Befehl Hilfe",
"To help us prevent this in future, please <a>send us logs</a>.": "Um uns zu helfen, dies in Zukunft zu vermeiden, <a>senden Sie uns bitte Logs</a>.",
"We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Wir empfehlen Ihnen, den Verifizierungsprozess für jede Sitzung zu durchlaufen, um zu bestätigen, dass sie ihrem rechtmäßigen Eigentümer gehören, aber Sie können die Nachricht auch ohne Verifizierung erneut senden, wenn Sie dies bevorzugen.",
"Notification settings": "Benachrichtigungseinstellungen",
"Help": "Hilfe",
"Filter": "Filter",
"Filter rooms…": "Räume filtern…",
"You have %(count)s unread notifications in a prior version of this room.|one": "Sie haben %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Raumes.",
"Go Back": "Gehe zurück",
"Notification Autocomplete": "Benachrichtigung Autovervollständigen",
"If disabled, messages from encrypted rooms won't appear in search results.": "Wenn deaktiviert, werden Nachrichten von verschlüsselten Räumen nicht in den Ergebnissen auftauchen.",
"This user has not verified all of their sessions.": "Dieser Benutzer hat nicht alle seine Sitzungen verifiziert.",
"You have verified this user. This user has verified all of their sessions.": "Sie haben diesen Benutzer verifiziert. Dieser Benutzer hat alle seine Sitzungen verifiziert.",
"Some sessions for this user are not trusted": "Einige Sitzungen für diesen Benutzer sind nicht vertrauenswürdig",
"All sessions for this user are trusted": "Alle Sitzungen für diesen Benutzer sind vertrauenswürdig",
"Some sessions in this encrypted room are not trusted": "Einige Sitzungen in diesem verschlüsselten Raum sind nicht vertrauenswürdig",
"All sessions in this encrypted room are trusted": "Alle Sitzungen in diesem verschlüsselten Raum sind vertrauenswürdig",
"Your key share request has been sent - please check your other sessions for key share requests.": "Ihre Anfrage zur Schlüssel-Teilung wurde gesendet - bitte überprüfen Sie Ihre anderen Sitzungen auf Anfragen zur Schlüssel-Teilung.",
"Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Anfragen zum Teilen von Schlüsseln werden automatisch an Ihre anderen Sitzungen gesendet. Wenn Sie die Anfragen zum Teilen von Schlüsseln in Ihren anderen Sitzungen abgelehnt oder abgewiesen haben, klicken Sie hier, um die Schlüssel für diese Sitzung erneut anzufordern.",
"If your other sessions do not have the key for this message you will not be able to decrypt them.": "Wenn Ihre anderen Sitzungen nicht über den Schlüssel für diese Nachricht verfügen, können Sie sie nicht entschlüsseln.",
"<requestLink>Re-request encryption keys</requestLink> from your other sessions.": "<requestLink>Fordern Sie Verschlüsselungsschlüssel aus Ihren anderen Sitzungen erneut an</requestLink>.",
"No sessions with registered encryption keys": "Keine Sitzungen mit registrierten Verschlüsselungsschlüsseln",
"Room %(name)s": "Raum %(name)s",
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Ein Upgrade dieses Raums schaltet die aktuelle Instanz des Raums ab und erstellt einen aktualisierten Raum mit demselben Namen.",
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) hat sich zu einer neuen Sitzung angemeldet, ohne sie zu überprüfen:",
"%(count)s verified sessions|other": "%(count)s verifizierte Sitzungen",
"Hide verified sessions": "Verifizierte Sitzungen ausblenden",
"%(count)s sessions|other": "%(count)s Sitzungen",
"Hide sessions": "Sitzungen ausblenden",
"Encryption enabled": "Verschlüsselung aktiviert",
"Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Nachrichten in diesem Raum sind Ende-zu-Ende verschlüsselt. Erfahren Sie mehr & überprüfen Sie diesen Benutzer in seinem Benutzerprofil.",
"Encryption not enabled": "Verschlüsselung nicht aktiviert",
"You verified %(name)s": "Du hast %(name)s verifiziert",
"You cancelled verifying %(name)s": "Sie haben die Verifizierung von %(name)s abgebrochen",
"%(name)s cancelled verifying": "%(name)s hat die Verifizierung abgebrochen",
"%(name)s accepted": "%(name)s hat akzeptiert",
"%(name)s declined": "%(name)s hat abgelehnt",
"%(name)s cancelled": "%(name)s hat abgebrochen",
"%(name)s wants to verify": "%(name)s will eine Verifizierung",
"Your display name": "Ihr Anzeigename",
"Please enter a name for the room": "Bitte geben Sie einen Namen für den Raum ein",
"This room is private, and can only be joined by invitation.": "Dieser Raum ist privat und kann nur auf Einladung betreten werden.",
"Create a private room": "Erstelle einen privaten Raum",
"Topic (optional)": "Thema (optional)",
"Make this room public": "Machen Sie diesen Raum öffentlich",
"Hide advanced": "Fortgeschrittenes ausblenden",
"Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Hindere Benutzer auf anderen Matrix-Homeservern daran, diesem Raum beizutreten (Diese Einstellung kann später nicht geändert werden!)",
"Session name": "Name der Sitzung",
"This will allow you to return to your account after signing out, and sign in on other sessions.": "So können Sie nach der Abmeldung zu Ihrem Konto zurückkehren und sich bei anderen Sitzungen anmelden.",
"Use bots, bridges, widgets and sticker packs": "Benutze Bots, Bridges, Widgets und Sticker-Packs",
"You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Sie blockieren derzeit nicht verifizierte Sitzungen; um Nachrichten an diese Sitzungen zu senden, müssen Sie sie verifizieren.",
"Room contains unknown sessions": "Raum enthält unbekannte Sitzungen",
"\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" enthält Sitzungen, die Sie noch nie zuvor gesehen haben.",
"Unknown sessions": "Unbekannte Sitzungen",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Greifen Sie durch Eingabe Ihrer Passphrase auf Ihren sicheren Nachrichtenverlauf und Ihre Quersignatur-Identität zu, um andere Sitzungen zu überprüfen.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Greifen Sie durch Eingabe Ihres Wiederherstellungsschlüssels auf Ihren sicheren Nachrichtenverlauf und Ihre Quersignatur-Identität zur Überprüfung anderer Sitzungen zu.",
"Message not sent due to unknown sessions being present": "Nachricht wird nicht gesendet, da unbekannte Sitzungen vorhanden sind",
"<showSessionsText>Show sessions</showSessionsText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showSessionsText>Sitzungen anzeigen</showSessionsText>, <sendAnywayText>trotzdem senden</sendAnywayText> oder <cancelText>abbrechen</cancelText>.",
"Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Wenn Sie Ihr Passwort ändern, werden alle End-to-End-Verschlüsselungsschlüssel für alle Ihre Sitzungen zurückgesetzt, sodass der verschlüsselte Chat-Verlauf nicht mehr lesbar ist. Richten Sie ein Schlüssel-Backup ein oder exportieren Sie Ihre Raumschlüssel aus einer anderen Sitzung, bevor Sie Ihr Passwort zurücksetzen.",
"You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Sie wurden von allen Sitzungen abgemeldet und erhalten keine Push-Benachrichtigungen mehr. Um die Benachrichtigungen wieder zu aktivieren, melden Sie sich auf jedem Gerät erneut an.",
"Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Aktualisieren Sie diese Sitzung, damit sie andere Sitzungen verifizieren kann, indem sie ihnen Zugang zu verschlüsselten Nachrichten gewährt und sie für andere Benutzer als vertrauenswürdig markiert.",
"Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Richten Sie für diese Sitzung eine Verschlüsselung ein, damit sie andere Sitzungen verifizieren kann, indem sie ihnen Zugang zu verschlüsselten Nachrichten gewährt und sie für andere Benutzer als vertrauenswürdig markiert."
}

View file

@ -466,6 +466,7 @@
"Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.",
"Unable to find a supported verification method.": "Unable to find a supported verification method.",
"Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…",
"Cancelling…": "Cancelling…",
"They match": "They match",
"They don't match": "They don't match",
"To be secure, do this in person or use a trusted way to communicate.": "To be secure, do this in person or use a trusted way to communicate.",
@ -563,11 +564,12 @@
"New Password": "New Password",
"Confirm password": "Confirm password",
"Change Password": "Change Password",
"Your homeserver does not support cross-signing.": "Your homeserver does not support cross-signing.",
"Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.",
"Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.",
"Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage",
"Reset cross-signing and secret storage": "Reset cross-signing and secret storage",
"Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage",
"Cross-signing public keys:": "Cross-signing public keys:",
"in memory": "in memory",
"not found": "not found",
@ -575,6 +577,8 @@
"in secret storage": "in secret storage",
"Secret storage public key:": "Secret storage public key:",
"in account data": "in account data",
"Homeserver feature support:": "Homeserver feature support:",
"exists": "exists",
"Your homeserver does not support session management.": "Your homeserver does not support session management.",
"Unable to load session list": "Unable to load session list",
"Authentication": "Authentication",
@ -1163,6 +1167,7 @@
"In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.",
"Waiting for %(displayName)s to accept…": "Waiting for %(displayName)s to accept…",
"Accepting…": "Accepting…",
"Start Verification": "Start Verification",
"Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.",
"Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Your messages are secured and only you and the recipient have the unique keys to unlock them.",
@ -1246,8 +1251,8 @@
"You cancelled": "You cancelled",
"%(name)s declined": "%(name)s declined",
"%(name)s cancelled": "%(name)s cancelled",
"accepting …": "accepting …",
"declining …": "declining …",
"Accepting …": "Accepting …",
"Declining …": "Declining …",
"%(name)s wants to verify": "%(name)s wants to verify",
"You sent a verification request": "You sent a verification request",
"Error decrypting video": "Error decrypting video",
@ -1525,6 +1530,7 @@
"Explore Room State": "Explore Room State",
"Explore Account Data": "Explore Account Data",
"View Servers in Room": "View Servers in Room",
"Verification Requests": "Verification Requests",
"Toolbox": "Toolbox",
"Developer Tools": "Developer Tools",
"An error has occurred.": "An error has occurred.",
@ -1569,6 +1575,11 @@
"Are you sure you want to sign out?": "Are you sure you want to sign out?",
"Your homeserver doesn't seem to support this feature.": "Your homeserver doesn't seem to support this feature.",
"Message edits": "Message edits",
"Your account is not secure": "Your account is not secure",
"Your password": "Your password",
"This session, or the other session": "This session, or the other session",
"The internet connection either session is using": "The internet connection either session is using",
"We recommend you change your password and recovery key in Settings immediately": "We recommend you change your password and recovery key in Settings immediately",
"New session": "New session",
"Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:",
"If you didnt sign in to this session, your account may be compromised.": "If you didnt sign in to this session, your account may be compromised.",

View file

@ -1182,13 +1182,13 @@
"Your Riot is misconfigured": "Riot tiene un error de configuración",
"Whether or not you're logged in (we don't record your username)": "Hayas o no iniciado sesión (no guardamos tu nombre de usuario)",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Uses o no los 'breadcrumbs' (iconos sobre la lista de salas)",
"A conference call could not be started because the integrations server is not available": "No se puede iniciar la llamada porque no hay servidor de integraciones disponible",
"A conference call could not be started because the integrations server is not available": "No se pudo iniciar la conferencia porque el servidor de integraciones no está disponible",
"Replying With Files": "Respondiendo con archivos",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "En este momento no es posible responder con un archivo. ¿Te gustaría subir el archivo sin responder?",
"The file '%(fileName)s' failed to upload.": "Falló en subir el archivo '%(fileName)s'.",
"The server does not support the room version specified.": "El servidor no soporta la versión de sala especificada.",
"Name or Matrix ID": "Nombre o identificador (ID) Matrix",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Pone ¯\\_(ツ)_/¯ al principio de un mensaje de texto",
"Name or Matrix ID": "Nombre o Matrix ID",
"Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Añade ¯\\_(ツ)_/¯ al principio de un mensaje de texto plano",
"<b>Warning</b>: Upgrading a room will <i>not automatically migrate room members to the new version of the room.</i> We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "<b>Aviso</b>: Actualizar una sala <i>no migrará automáticamente a sus miembros a la nueva versión de la sala.</i> Incluiremos un enlace a la nueva sala en la versión antigüa de la misma - los miembros tendrán que seguir ese enlace para unirse a la nueva sala.",
"Changes your display nickname in the current room only": "Cambia tu apodo sólo en la sala actual",
"Changes your avatar in this current room only": "Cambia tu avatar sólo en la sala actual",
@ -1203,7 +1203,7 @@
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s ha revocado la invitación para que %(targetDisplayName)s se una a la sala.",
"Cannot reach homeserver": "No se puede conectar con el servidor",
"Ensure you have a stable internet connection, or get in touch with the server admin": "Asegúrate de tener conexión a internet, o contacta con el administrador del servidor",
"Ask your Riot admin to check <a>your config</a> for incorrect or duplicate entries.": "Solicita al administrador de Riot que compruebe <a>tu configuración</a> por si hubiera errores o entradas duplicadas.",
"Ask your Riot admin to check <a>your config</a> for incorrect or duplicate entries.": "Solicita al administrador de Riot que compruebe si hay entradas duplicadas o erróneas en <a>tu configuración</a>.",
"Cannot reach identity server": "No se puede conectar con el servidor de identidad",
"You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Te puedes registrar, pero algunas funcionalidades no estarán disponibles hasta que se pueda conectar con el servidor de identidad. Si continúas viendo este aviso, comprueba tu configuración o contacta con el administrador del servidor.",
"You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Puedes cambiar tu contraseña, pero algunas funcionalidades no estarán disponibles hasta que el servidor de identidad esté disponible. Si continúas viendo este aviso, comprueba tu configuración o contacta con el administrador del servidor.",
@ -1214,10 +1214,10 @@
"User %(userId)s is already in the room": "El usuario %(userId)s ya está en la sala",
"The user must be unbanned before they can be invited.": "El usuario debe ser desbloqueado antes de poder ser invitado.",
"The user's homeserver does not support the version of the room.": "El servidor del usuario no soporta la versión de la sala.",
"Show read receipts sent by other users": "Mostrar las confirmaciones de lectura de otros usuarios",
"Show read receipts sent by other users": "Mostrar las confirmaciones de lectura enviadas por otros usuarios",
"Order rooms in the room list by most important first instead of most recent": "Ordenar la lista de salas por importancia en vez de por reciente",
"Show recently visited rooms above the room list": "Mostrar salas visitadas recientemente sobre la lista de salas",
"Show hidden events in timeline": "Mostrar eventos ocultos en la línea del tiempo",
"Show hidden events in timeline": "Mostrar eventos ocultos en la línea de tiempo",
"Low bandwidth mode": "Modo de ancho de banda bajo",
"Got It": "Entendido",
"Scissors": "Tijeras",
@ -1276,7 +1276,7 @@
"Jump to first unread room.": "Saltar a la primera sala sin leer.",
"You have %(count)s unread notifications in a prior version of this room.|other": "Tiene %(count)s notificaciones sin leer en una versión anterior de esta sala.",
"You have %(count)s unread notifications in a prior version of this room.|one": "Tiene %(count)s notificaciones sin leer en una versión anterior de esta sala.",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hay sesiones desconocidas en esta sala: si continuas sin verificarlas, será posible que alguien escuche secretamente tu llamada.",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hay sesiones desconocidas en esta sala: si continúas sin verificarlas, será posible que alguien escuche secretamente tu llamada.",
"Setting up keys": "Configurando claves",
"Verify this session": "Verificar esta sesión",
"Encryption upgrade available": "Mejora de encriptación disponible",
@ -1287,21 +1287,21 @@
"Session already verified!": "¡La sesión ya ha sido verificada!",
"WARNING: Session already verified, but keys do NOT MATCH!": "ATENCIÓN: ¡La sesión ya ha sido verificada, pero las claves NO CONCUERDAN!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "¡ATENCIÓN: LA VERIFICACIÓN DE LA CLAVE HA FALLADO! La clave de firma para %(userId)s y sesión %(deviceId)s es \"%(fprint)s\", la cual no coincide con la clave proporcionada \"%(fingerprint)s\". ¡Esto podría significar que tus comunicaciones están siendo interceptadas!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "La clave de firma que proporcionaste coincide con la clave de firma que reciviste de la sesión %(deviceId)s de %(userId)s. Sesión marcada como verificada.",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "La clave de firma que proporcionaste coincide con la clave de firma que recibiste de la sesión %(deviceId)s de %(userId)s. Sesión marcada como verificada.",
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s añadió %(addedAddresses)s y %(count)s otras direcciones a esta sala",
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s eliminó %(removedAddresses)s y %(count)s otras direcciones de esta sala",
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s eliminó %(countRemoved)s y añadió %(countAdded)s direcciones a esta sala",
"%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s eliminó la regla que banea usuarios que corresponden con %(glob)s",
"%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s eliminó la regla que banea salas que corresponden con %(glob)s",
"%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s eliminó la regla que banea servidores que corresponden con %(glob)s",
"%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s eliminó la regla que bloquea a usuarios que coinciden con %(glob)s",
"%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s eliminó la regla que bloquea a salas que coinciden con %(glob)s",
"%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s eliminó la regla que bloquea a servidores que coinciden con %(glob)s",
"%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s eliminó una regla correspondiente a %(glob)s",
"%(senderName)s updated an invalid ban rule": "%(senderName)s actualizó una regla de baneo inválida",
"%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s actualizó una regla que banea usuarios que corresponden a %(glob)s por %(reason)s",
"They match": "Corresponden",
"They don't match": "No corresponden",
"%(senderName)s updated an invalid ban rule": "%(senderName)s actualizó una regla de bloqueo inválida",
"%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s actualizó una regla que bloquea a usuarios que coinciden con %(glob)s por %(reason)s",
"They match": "Coinciden",
"They don't match": "No coinciden",
"To be secure, do this in person or use a trusted way to communicate.": "Para ser seguro, haz esto en persona o usando una forma de comunicación de confianza.",
"Lock": "Bloquear",
"Verify yourself & others to keep your chats safe": "Verifícate y verifica a otros para mantener tus chats seguros",
"Verify yourself & others to keep your chats safe": "Verifícate y verifica a otros para mantener tus conversaciones seguras",
"Other users may not trust it": "Puede que otros usuarios no confíen en ello",
"Upgrade": "Actualizar",
"Verify": "Verificar",
@ -1311,13 +1311,13 @@
"Channel: %(channelName)s": "Canal: %(channelName)s",
"Show less": "Mostrar menos",
"Show more": "Mostrar más",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reseteará cualquier clave de encriptación end-to-end en todas las sesiones, haciendo el historial de chat encriptado ilegible, a no ser que primero exportes tus claves de sala y las reimportes después. En un futuro esto será mejorado.",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de encriptación end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.",
"in memory": "en memoria",
"not found": "no encontrado",
"Identity Server (%(server)s)": "Servidor de identidad %(server)s",
"Identity Server (%(server)s)": "Servidor de Identidad %(server)s",
"You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Estás usando actualmente <server></server>para descubrir y ser descubierto por contactos existentes que conoces. Puedes cambiar tu servidor de identidad más abajo.",
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Si no quieres usar <server /> para descubrir y ser descubierto por contactos existentes que conoces, introduce otro servidor de identidad más abajo.",
"Identity Server": "Servidor de identidad",
"Identity Server": "Servidor de Identidad",
"You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "No estás usando actualmente un servidor de identidad. Para descubrir y ser descubierto por contactos existentes que conoces, introduce uno más abajo.",
"Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectarte de tu servidor de identidad significa que no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.",
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar un servidor de identidad es opcional. Si eliges no usar un servidor de identidad, no podrás ser descubierto por otros usuarios y no podrás invitar a otros por email o teléfono.",
@ -1325,15 +1325,15 @@
"Enter a new identity server": "Introducir un servidor de identidad nuevo",
"Change": "Cambiar",
"Manage integrations": "Administrar integraciones",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establece niveles de poder en tu nombre.",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Los administradores de integración reciben datos de configuración, y pueden modificar widgets, enviar invitaciones de sala, y establecer niveles de poder en tu nombre.",
"Something went wrong trying to invite the users.": "Algo salió mal al intentar invitar a los usuarios.",
"We couldn't invite those users. Please check the users you want to invite and try again.": "No se pudo invitar a esos usuarios. Por favor, revisa los usuarios que quieres invitar e inténtalo de nuevo.",
"Failed to find the following users": "No se encontró a los siguientes usuarios",
"The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Puede que los siguientes usuarios no existan o sean inválidos, y no pueden ser invitados: %(csvNames)s",
"Recent Conversations": "Conversaciones Recientes",
"Recent Conversations": "Conversaciones recientes",
"Suggestions": "Sugerencias",
"Recently Direct Messaged": "Enviado Mensaje Directo recientemente",
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Si no encuentras a alguien, pídele su usuario, comparte tu usuario (%(userId)s) o un <a>enlace de perfil</a>.",
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Si no encuentras a alguien, pídele su usuario, comparte tu usuario (%(userId)s) o <a>enlace de perfil</a>.",
"Go": "Ir",
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Si no encuentras a alguien, pídele su usuario (p.ej. @user:server.com) o <a>comparte esta sala</a>.",
"You added a new session '%(displayName)s', which is requesting encryption keys.": "Has añadido una nueva sesión '%(displayName)s', la cual está pidiendo claves de encriptación.",
@ -1373,7 +1373,7 @@
"Missing session data": "Faltan datos de sesión",
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Algunos datos de sesión, incluyendo claves de mensaje encriptadas, no se encuentran. Desconéctate y vuelve a conectarte para solucionarlo, reestableciendo las claves desde el backup.",
"Your browser likely removed this data when running low on disk space.": "Tu navegador probablemente borró estos datos cuando tenía poco espacio de disco.",
"Find others by phone or email": "Encontar a otros por teléfono o email",
"Find others by phone or email": "Encontrar a otros por teléfono o email",
"Be found by phone or email": "Ser encontrado por teléfono o email",
"Use bots, bridges, widgets and sticker packs": "Usar robots, puentes, widgets, o packs de pegatinas",
"Terms of Service": "Términos de servicio",
@ -1398,17 +1398,17 @@
"A widget would like to verify your identity": "Un widget quisiera verificar tu identidad",
"Remember my selection for this widget": "Recordar mi selección para este widget",
"Deny": "Rechazar",
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Tu contraseña ha sido cambiada satisfactoriamente. No recibirás notificaciones de push en otras sesiones hasta que te conectes de nuevo a ellas",
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Tu contraseña ha sido cambiada satisfactoriamente. No recibirás notificaciones push en otras sesiones hasta que te conectes de nuevo a ellas",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Aceptar los Términos de Servicio del servidor de identidad %(serverName)s para poder ser descubierto por dirección de email o número de teléfono.",
"Discovery": "Descubrimiento",
"Deactivate account": "Desactivar cuenta",
"Clear cache and reload": "Limpiar caché y recargar",
"Ignored/Blocked": "Ignorado/Bloqueado",
"Error adding ignored user/server": "Error añadiendo usuario/servidor ignorado",
"Error adding ignored user/server": "Error al añadir usuario/servidor ignorado",
"Error subscribing to list": "Error al suscribirse a la lista",
"Please verify the room ID or alias and try again.": "Por favor, verifica el ID de la sala o el alias e inténtalo de nuevo.",
"Error removing ignored user/server": "Error al remover usuario/servidor ignorado",
"Error unsubscribing from list": "Error al desuscribirse de la lista",
"Error removing ignored user/server": "Error al eliminar usuario/servidor ignorado",
"Error unsubscribing from list": "Error al cancelar la suscripción a la lista",
"None": "Ninguno",
"Server rules": "Reglas del servidor",
"User rules": "Reglas de usuario",
@ -1419,7 +1419,122 @@
"View rules": "Ver reglas",
"You are currently subscribed to:": "Estás actualmente suscrito a:",
"⚠ These settings are meant for advanced users.": "⚠ Estas opciones son indicadas para usuarios avanzados.",
"Personal ban list": "Lista de bans personal",
"Personal ban list": "Lista de bloqueo personal",
"Server or user ID to ignore": "Servidor o ID de usuario a ignorar",
"eg: @bot:* or example.org": "p. ej.: @bot:* o ejemplo.org"
"eg: @bot:* or example.org": "p. ej.: @bot:* o ejemplo.org",
"The version of Riot": "La version de Riot",
"Your user agent": "Tu agente de usuario",
"The information being sent to us to help make Riot better includes:": "La información que se nos envía para ayudarnos a mejorar Riot incluye:",
"If you cancel now, you won't complete verifying the other user.": "Si cancelas ahora, no completarás la verificación del otro usuario.",
"If you cancel now, you won't complete verifying your other session.": "Si cancelas ahora, no completarás la verificación de tu otra sesión.",
"If you cancel now, you won't complete your secret storage operation.": "Si cancelas ahora, no completarás tu operación de almacén secreto.",
"Cancel entering passphrase?": "¿Cancelar la introducción de frase de contraseña?",
"%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s actualizó la regla bloqueando salas que coinciden con %(glob)s por %(reason)s",
"%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s actualizó la regla bloqueando servidores que coinciden con %(glob)s por %(reason)s",
"%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s actualizó una regla de bloqueo correspondiente a %(glob)s por %(reason)s",
"%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s creó una regla bloqueando a usuarios que coinciden con %(glob)s por %(reason)s",
"%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s creó una regla bloqueando a salas que coinciden con %(glob)s por %(reason)s",
"%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s creó una regla bloqueando a servidores que coinciden con %(glob)s por %(reason)s",
"%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s creó una regla de bloqueo correspondiente a %(glob)s por %(reason)s",
"%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s cambió una regla que estaba bloqueando a usuarios que coinciden con %(oldGlob)s a %(newGlob)s por %(reason)s",
"%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s cambió una regla que estaba bloqueando a salas que coinciden con %(oldGlob)s a %(newGlob)s por %(reason)s",
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s cambió una regla que estaba bloqueando a servidores que coinciden con %(oldGlob)s a %(newGlob)s por %(reason)s",
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s actualizó una regla de bloqueo que correspondía a %(oldGlob)s a %(newGlob)s por %(reason)s",
"The message you are trying to send is too large.": "El mensaje que estás intentando enviar es demasiado largo.",
"a few seconds ago": "hace unos segundos",
"about a minute ago": "hace un minuto",
"%(num)s minutes ago": "hace %(num)s minutos",
"about an hour ago": "hace una hora",
"%(num)s hours ago": "hace %(num)s horas",
"about a day ago": "hace un día",
"%(num)s days ago": "hace %(num)s días",
"a few seconds from now": "dentro de unos segundos",
"about a minute from now": "dentro de un minuto",
"%(num)s minutes from now": "dentro de %(num)s minutos",
"about an hour from now": "dentro de una hora",
"%(num)s hours from now": "dentro de %(num)s horas",
"about a day from now": "dentro de un día",
"%(num)s days from now": "dentro de %(num)s días",
"Show typing notifications": "Mostrar notificaciones de escritura",
"Never send encrypted messages to unverified sessions from this session": "No enviar nunca mensajes cifrados a sesiones sin verificar desde esta sesión",
"Never send encrypted messages to unverified sessions in this room from this session": "No enviar nunca mensajes cifrados a sesiones sin verificar en esta sala desde esta sesión",
"Enable message search in encrypted rooms": "Habilitar la búsqueda de mensajes en salas cifradas",
"Keep secret storage passphrase in memory for this session": "Mantener la frase de contraseña en memoria para esta sesión",
"How fast should messages be downloaded.": "Con qué rapidez deben ser descargados los mensajes.",
"Verify this session by completing one of the following:": "Verifica esta sesión completando uno de los siguientes:",
"Scan this unique code": "Escanea este código único",
"or": "o",
"Compare unique emoji": "Comparar emoji único",
"Compare a unique set of emoji if you don't have a camera on either device": "Comparar un conjunto de emojis si no tienes cámara en ninguno de los dispositivos",
"Start": "Comenzar",
"Confirm the emoji below are displayed on both devices, in the same order:": "Confirma que los emojis a continuación son mostrados en ambos dispositivos, en el mismo orden:",
"Verify this device by confirming the following number appears on its screen.": "Verifica este dispositivo confirmando que el siguiente número aparece en su pantalla.",
"Waiting for %(displayName)s to verify…": "Esperando la verificación de %(displayName)s …",
"Review": "Revisar",
"in secret storage": "en almacén secreto",
"Secret storage public key:": "Clave pública del almacén secreto:",
"in account data": "en datos de cuenta",
"Unable to load session list": "No se pudo cargar la lista de sesiones",
"Delete %(count)s sessions|other": "Borrar %(count)s sesiones",
"Delete %(count)s sessions|one": "Borrar %(count)s sesión",
"rooms.": "salas.",
"Manage": "Administrar",
"Enable": "Activar",
"This session is backing up your keys. ": "Esta sesión está haciendo una copia de seguridad de tus claves. ",
"not stored": "no almacenado",
"Message search": "Busqueda de mensajes",
"Sessions": "Sesiones",
"Upgrade this room to the recommended room version": "Actualizar esta sala a la versión de sala recomendada",
"this room": "esta sala",
"View older messages in %(roomName)s.": "Ver mensajes más antiguos en %(roomName)s.",
"Sounds": "Sonidos",
"Notification sound": "Sonido de notificación",
"Set a new custom sound": "Usar un nuevo sonido personalizado",
"Browse": "Navegar",
"Change room avatar": "Cambiar avatar de sala",
"Change room name": "Cambiar nombre de sala",
"Change main address for the room": "Cambiar dirección principal para la sala",
"Change history visibility": "Cambiar visibilidad del historial",
"Change permissions": "Cambiar permisos",
"Change topic": "Cambiar tema",
"Upgrade the room": "Actualizar la sala",
"Enable room encryption": "Activar el cifrado de sala",
"Modify widgets": "Modificar widgets",
"Error changing power level requirement": "Error al cambiar el requerimiento de nivel de poder",
"An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Ocurrió un error cambiando los requerimientos de nivel de poder de la sala. Asegúrate de tener los permisos suficientes e inténtalo de nuevo.",
"Error changing power level": "Error al cambiar nivel de poder",
"An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Ocurrió un error cambiando los requerimientos de nivel de poder del usuario. Asegúrate de tener los permisos suficientes e inténtalo de nuevo.",
"Default role": "Rol por defecto",
"Send messages": "Enviar mensajes",
"Invite users": "Invitar usuarios",
"Change settings": "Cambiar la configuración",
"Kick users": "Echar a usuarios",
"Ban users": "Bloquear a usuarios",
"Remove messages": "Eliminar mensajes",
"Notify everyone": "Notificar a todos",
"Send %(eventType)s events": "Enviar eventos %(eventType)s",
"Select the roles required to change various parts of the room": "Selecciona los roles requeridos para cambiar varias partes de la sala",
"Enable encryption?": "¿Habilitar cifrado?",
"Your email address hasn't been verified yet": "Tu dirección de email no ha sido verificada",
"Verify the link in your inbox": "Verifica el enlace en tu bandeja de entrada",
"Complete": "Completar",
"Share": "Compartir",
"Remove %(email)s?": "¿Eliminar %(email)s?",
"Backup is not signed by any of your sessions": "La copia de seguridad no está firmada por ninguna de tus sesiones",
"This backup is trusted because it has been restored on this session": "Esta copia de seguridad es de confianza porque ha sido restaurada en esta sesión",
"Backup key stored: ": "Clave de seguridad almacenada: ",
"Your keys are <b>not being backed up from this session</b>.": "<b>No se está haciendo una copia de seguridad de tus claves en esta sesión</b>.",
"Clear notifications": "Limpiar notificaciones",
"Enable desktop notifications for this session": "Habilitar notificaciones de escritorio para esta sesión",
"Enable audible notifications for this session": "Habilitar notificaciones sonoras para esta sesión",
"Checking server": "Comprobando servidor",
"Change identity server": "Cambiar servidor de identidad",
"Disconnect from the identity server <current /> and connect to <new /> instead?": "¿Desconectarse del servidor de identidad <current /> y conectarse a <new/>?",
"Terms of service not accepted or the identity server is invalid.": "Términos de servicio no aceptados o el servidor de identidad es inválido.",
"The identity server you have chosen does not have any terms of service.": "El servidor de identidad que has elegido no tiene ningún término de servicio.",
"Disconnect identity server": "Desconectar servidor de identidad",
"Disconnect from the identity server <idserver />?": "¿Desconectarse del servidor de identidad <idserver />?",
"Disconnect": "Desconectarse",
"You should:": "Deberías:",
"%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s de %(totalRooms)s"
}

View file

@ -2097,5 +2097,16 @@
"Your unverified session '%(displayName)s' is requesting encryption keys.": "Zure egiaztatu gabeko '%(displayName)s' saioa zifratze gakoak eskatzen ari da.",
"We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Egiaztaketa prozesua saio bakoitzeko egitea aholkatzen dizugu, benetan jabearenak direla baieztatzeko, baina egiaztaketa egin gabe mezua bidali dezakezu ere.",
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Atzitu zure mezu seguruen historiala eta zeharkako sinatzerako identitatea beste saioak egiaztatzeko zure pasa-esaldia sartuz.",
"<showSessionsText>Show sessions</showSessionsText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showSessionsText>Erakutsi saioak</showSessionsText>, <sendAnywayText>bidali edonola ere</sendAnywayText> edo <cancelText>ezeztatu</cancelText>."
"<showSessionsText>Show sessions</showSessionsText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showSessionsText>Erakutsi saioak</showSessionsText>, <sendAnywayText>bidali edonola ere</sendAnywayText> edo <cancelText>ezeztatu</cancelText>.",
"The information being sent to us to help make Riot better includes:": "Riot hobetzeko bidaltzen zaigun informazioa honakoa da, besteren artean:",
"Verify this session by completing one of the following:": "Egiaztatu saio hau hauetako bat osatuz:",
"or": "ala",
"The version of Riot": "Riot bertsioa",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Sarrera mekanismo nagusia ukimena den gailu bat erabiltzen duzun",
"Whether you're using Riot as an installed Progressive Web App": "Riot instalatutako aplikazio progresibo gisa erabiltzen duzun",
"Your user agent": "Zure erabiltzaile-agentea",
"Show typing notifications": "Erakutsi idazketa jakinarazpenak",
"Scan this unique code": "Eskaneatu kode bakan hau",
"Compare unique emoji": "Konparatu emoji bakana",
"Compare a unique set of emoji if you don't have a camera on either device": "Konparatu emoji sorta bakana gailuek kamerarik ez badute"
}

View file

@ -97,7 +97,7 @@
"Emoji": "Emoji",
"Enable Notifications": "Ota ilmoitukset käyttöön",
"End-to-end encryption information": "Osapuolten välisen salauksen tiedot",
"Enter passphrase": "Syötä salasana",
"Enter passphrase": "Syötä salalause",
"Error decrypting attachment": "Virhe purettaessa liitteen salausta",
"Event information": "Tapahtumatiedot",
"Export": "Vie",
@ -1880,5 +1880,64 @@
"Recent Conversations": "Viimeaikaiset keskustelut",
"Direct Messages": "Yksityisviestit",
"Go": "Mene",
"Lock": "Lukko"
"Lock": "Lukko",
"The version of Riot": "Riotin versio",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Käytätkö Riotia laitteella, jossa kosketus on ensisijainen syöttömekanismi",
"Whether you're using Riot as an installed Progressive Web App": "Käytätkö Riotia asennettuna PWA:na (Progressive Web App)",
"The information being sent to us to help make Riot better includes:": "Tietoihin, joita lähetetään Riotin kehittäjille sovelluksen kehittämiseksi sisältyy:",
"Cancel entering passphrase?": "Peruuta salalauseen syöttäminen?",
"Encryption upgrade available": "Salauksen päivitys saatavilla",
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s lisäsi osoitteet %(addedAddresses)s ja %(count)s muuta osoitetta tähän huoneeseen",
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s poisti osoitteet %(removedAddresses)s ja %(count)s muuta osoitetta tästä huoneesta",
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s poisti %(countRemoved)s ja lisäsi %(countAdded)s osoitetta tähän huoneeseen",
"a few seconds ago": "muutama sekunti sitten",
"about a minute ago": "noin minuutti sitten",
"%(num)s minutes ago": "%(num)s minuuttia sitten",
"about an hour ago": "noin tunti sitten",
"%(num)s hours ago": "%(num)s tuntia sitten",
"about a day ago": "noin päivä sitten",
"%(num)s days ago": "%(num)s päivää sitten",
"Show info about bridges in room settings": "Näytä tietoa silloista huoneen asetuksissa",
"Show typing notifications": "Näytä kirjoitusilmoitukset",
"or": "tai",
"Start": "Aloita",
"Confirm the emoji below are displayed on both devices, in the same order:": "Varmista, että alla olevat emojit näkyvät molemmilla laitteilla, samassa järjestyksessä:",
"To be secure, do this in person or use a trusted way to communicate.": "Turvallisuuden varmistamiseksi tee tämä kasvokkain tai käytä luotettua viestintätapaa.",
"Later": "Myöhemmin",
"Show less": "Näytä vähemmän",
"in memory": "muistissa",
"This room isnt bridging messages to any platforms. <a>Learn more.</a>": "Tämä huone ei siltaa viestejä millekään alustalle. <a>Lue lisää.</a>",
"Bridges": "Sillat",
"Send a reply…": "Lähetä vastaus…",
"Send a message…": "Lähetä viesti…",
"Unknown Command": "Tuntematon komento",
"Unrecognised command: %(commandText)s": "Tunnistamaton komento: %(commandText)s",
"Send as message": "Lähetä viestinä",
"Waiting for %(displayName)s to accept…": "Odotetaan, että %(displayName)s hyväksyy…",
"Done": "Valmis",
"Got it": "Asia selvä",
"Failed to find the following users": "Seuraavia käyttäjiä ei löytynyt",
"Backup restored": "Varmuuskopio palautettu",
"Go Back": "Takaisin",
"Copy": "Kopioi",
"Upgrade your encryption": "Päivitä salauksesi",
"Unknown (user, session) pair:": "Tuntematon (käyttäjä, istunto) -pari:",
"Your homeserver does not support session management.": "Kotipalvelimesi ei tue istunnonhallintaa.",
"Unable to load session list": "Istuntoluettelon lataaminen ei onnistu",
"Delete %(count)s sessions|one": "Poista %(count)s istunto",
"Backup has a <validity>valid</validity> signature from this session": "Varmuuskopiossa on <validity>kelvollinen</validity> allekirjoitus tästä istunnosta",
"Backup has an <validity>invalid</validity> signature from this session": "Varmuuskopiossa on <validity>epäkelpo</validity> allekirjoitus tästä istunnosta",
"Enable desktop notifications for this session": "Ota käyttöön työpöytäilmoitukset tälle istunnolle",
"Enable audible notifications for this session": "Ota käyttöön ääni-ilmoitukset tälle istunnolle",
"A session's public name is visible to people you communicate with": "Istunnon julkinen nimi näkyy ihmisille, joiden kanssa viestit",
"Someone is using an unknown session": "Joku käyttää tuntematonta istuntoa",
"%(count)s sessions|other": "%(count)s istuntoa",
"%(count)s sessions|one": "%(count)s istunto",
"Hide sessions": "Piilota istunnot",
"Clear all data in this session?": "Poista kaikki tämän istunnon tiedot?",
"Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Kaikkien tämän istunnon tietojen poistaminen on pysyvää. Salatut viestit menetetään, ellei niiden avaimia ole varmuuskopioitu.",
"Session name": "Istunnon nimi",
"You added a new session '%(displayName)s', which is requesting encryption keys.": "Lisäsit uuden istunnon '%(displayName)s', joka pyytää salausavaimia.",
"Loading session info...": "Ladataan istunnon tietoja...",
"New session": "Uusi istunto"
}

View file

@ -2148,5 +2148,19 @@
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) sest connecté à une nouvelle session sans la vérifier :",
"Ask this user to verify their session, or manually verify it below.": "Demandez à cet utilisateur de vérifier sa session, ou vérifiez-la manuellement ci-dessous.",
"Manually Verify": "Vérifier manuellement",
"Verify by scanning": "Vérifier en scannant"
"Verify by scanning": "Vérifier en scannant",
"The version of Riot": "La version de Riot",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Si vous utilisez Riot sur un appareil où le toucher est le mécanisme primaire de saisie",
"Whether you're using Riot as an installed Progressive Web App": "Si vous utilisez Riot en tant quapplication web progressive (PWA)",
"Your user agent": "Votre agent utilisateur",
"The information being sent to us to help make Riot better includes:": "Les informations qui nous sont envoyées et qui nous aident à améliorer Riot comportent :",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "La session que vous essayez de vérifier ne prend pas en charge les codes QR ou la vérification démojis, qui sont les méthodes prises en charge par Riot. Essayez avec un autre client.",
"You declined": "Vous avez refusé",
"%(name)s declined": "%(name)s a refusé",
"accepting …": "nous acceptons…",
"declining …": "nous refusons…",
"Your homeserver does not support cross-signing.": "Votre serveur daccueil ne prend pas en charge la signature croisée.",
"Homeserver feature support:": "Prise en charge de la fonctionnalité par le serveur daccueil :",
"exists": "existant",
"Verification Requests": "Demandes de vérification"
}

View file

@ -3,7 +3,7 @@
"Search": "Keresés",
"OK": "Rendben",
"Custom Server Options": "Egyedi szerverbeállítások",
"Dismiss": "Eltüntet",
"Dismiss": "Eltüntetés",
"Error": "Hiba",
"Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s",
"Favourite": "Kedvenc",
@ -31,7 +31,7 @@
"Default Device": "Alapértelmezett eszköz",
"Microphone": "Mikrofon",
"Camera": "Kamera",
"Advanced": "Haladó",
"Advanced": "Speciális",
"Algorithm": "Algoritmus",
"Always show message timestamps": "Üzenet időbélyeg folyamatos megjelenítése",
"Authentication": "Azonosítás",
@ -59,7 +59,7 @@
"%(senderName)s banned %(targetName)s.": "%(senderName)s kitiltotta őt: %(targetName)s.",
"Ban": "Kitilt",
"Banned users": "Kitiltott felhasználók",
"Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel",
"Bans user with given id": "Kitiltja a megadott azonosítójú felhasználót",
"Blacklisted": "Fekete listára téve",
"Call Timeout": "Hívás időtúllépés",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a Matrix szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>Matrix szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
@ -221,8 +221,8 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.",
"Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból",
"Return to login screen": "Vissza a bejelentkezési képernyőre",
"Riot does not have permission to send you notifications - please check your browser settings": "Riotnak nincs jogosultsága értesítést küldeni neked - ellenőrizd a böngésző beállításait",
"Riot was not given permission to send notifications - please try again": "Riotnak nincs jogosultsága értesítést küldeni neked - próbáld újra",
"Riot does not have permission to send you notifications - please check your browser settings": "A Riotnak nincs jogosultsága értesítést küldeni neked ellenőrizd a böngésző beállításait",
"Riot was not given permission to send notifications - please try again": "A Riotnak nincs jogosultsága értesítést küldeni neked próbáld újra",
"riot-web version:": "riot-web verzió:",
"Room %(roomId)s not visible": "%(roomId)s szoba nem látható",
"Room Colour": "Szoba színe",
@ -232,7 +232,7 @@
"Save": "Mentés",
"Scroll to bottom of page": "Az oldal aljára görget",
"Search failed": "Keresés sikertelen",
"Searches DuckDuckGo for results": "Keresés DuckDuckGo-val",
"Searches DuckDuckGo for results": "Keresés DuckDuckGóval",
"Seen by %(userName)s at %(dateTime)s": "%(userName)s %(dateTime)s időpontban látta",
"Send anyway": "Küld mindenképpen",
"Send Reset Email": "Visszaállítási e-mail küldése",
@ -326,25 +326,25 @@
"You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?",
"You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.",
"Sun": "Vas",
"Mon": "Hé",
"Tue": "K",
"Wed": "Sze",
"Thu": "Csüt",
"Fri": "Pé",
"Sat": "Szo",
"Jan": "Jan",
"Feb": "Feb",
"Mar": "Már",
"Apr": "Ápr",
"May": "Máj",
"Jun": "Jún",
"Jul": "Júl",
"Aug": "Aug",
"Sep": "Szept",
"Oct": "Okt",
"Nov": "Nov",
"Dec": "Dec",
"Sun": "vas",
"Mon": "hé",
"Tue": "k",
"Wed": "sze",
"Thu": "csü",
"Fri": "pé",
"Sat": "szo",
"Jan": "jan",
"Feb": "feb",
"Mar": "már",
"Apr": "ápr",
"May": "máj",
"Jun": "jún",
"Jul": "júl",
"Aug": "aug",
"Sep": "szept",
"Oct": "okt",
"Nov": "nov",
"Dec": "dec",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
@ -663,10 +663,10 @@
"expand": "kinyit",
"Call Failed": "Sikertelen hívás",
"Review Devices": "Eszközök áttekintése",
"Call Anyway": "Mindenképpen hívj",
"Answer Anyway": "Mindenképpen felvesz",
"Call Anyway": "Hívás mindenképpen",
"Answer Anyway": "Felvétel mindenképpen",
"Call": "Hívás",
"Answer": "Felvesz",
"Answer": "Felvétel",
"Send": "Elküld",
"Old cryptography data detected": "Régi titkosítási adatot találhatók",
"Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Régebbi Riot verzióból származó adatok találhatók. Ezek hibás működéshez vezethettek a végponttól-végpontig titkosításban régebbi verzióknál. A nemrég küldött/fogadott titkosított üzenetek ha a régi adatokat használták lehetséges hogy nem lesznek visszafejthetők ebben a verzióban. Ha problémákba ütközöl jelentkezz ki és vissza. A régi üzenetek elérésének biztosításához mentsd ki a kulcsokat és töltsd be újra.",
@ -1183,7 +1183,7 @@
"Create account": "Fiók létrehozása",
"Keep going...": "Így tovább...",
"Starting backup...": "Mentés indul...",
"A new recovery passphrase and key for Secure Messages have been detected.": "A Biztonságos Üzenetekhez új visszaállítási jelmondatot és kulcsot észleltünk.",
"A new recovery passphrase and key for Secure Messages have been detected.": "A Biztonságos üzenetekhez új visszaállítási jelmondatot és kulcsot észleltünk.",
"Recovery Method Removed": "Visszaállítási eljárás törölve",
"If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ha nem te törölted a visszaállítási eljárást, akkor egy támadó hozzá akar férni a fiókodhoz. Azonnal változtasd meg a jelszavadat és állíts be egy visszaállítási eljárást a Beállításokban.",
"Chat with Riot Bot": "Csevegés a Riot Robottal",
@ -1374,7 +1374,7 @@
"The homeserver may be unavailable or overloaded.": "A Matrix szerver elérhetetlen vagy túlterhelt.",
"You have %(count)s unread notifications in a prior version of this room.|other": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.",
"You have %(count)s unread notifications in a prior version of this room.|one": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használsz vagy nem „morzsákat” (profilképek a szobalista felett)",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használsz-e „morzsákat” (profilképek a szobalista felett)",
"Replying With Files": "Válasz fájlokkal",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyenlőre nem lehet fájlal válaszolni. Szeretnéd feltölteni a fájlt úgy, hogy az nem egy válasz lesz?",
"The file '%(fileName)s' failed to upload.": "A %(fileName)s fájlt nem sikerült feltölteni.",
@ -2122,7 +2122,7 @@
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül kijelentkezés után vagy másik munkamenetet használva nem tudod visszaállítani a titkosított üzeneteidet.",
"Create key backup": "Kulcs mentés készítése",
"This session is encrypting history using the new recovery method.": "Ez a munkamenet az új visszaállítási metódussal titkosítja a régi üzeneteket.",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "A munkamenet észrevette, hogy a visszaállítási jelmondat és a kulcs a Biztonságos Üzenetekhez törölve lett.",
"This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "A munkamenet észrevette, hogy a visszaállítási jelmondat és a kulcs a Biztonságos üzenetekhez törölve lett.",
"If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Ha véletlenül tetted, beállíthatod a Biztonságos Üzeneteket ezen a munkameneten ami újra titkosítja a régi üzeneteket az visszaállítási eljárással.",
"Indexed rooms:": "Indexált szobák:",
"%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s / %(totalRooms)s",
@ -2144,5 +2144,28 @@
"Destroy cross-signing keys?": "Eszközök közti hitelesítési kulcsok megsemmisítése?",
"Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Eszközök közti hitelesítési kulcsok törlése végleges. Mindenki akit ezzel hitelesítettél biztonsági figyelmeztetéseket fog látni. Hacsak nem vesztetted el az összes eszközödet amivel eszközök közti hitelesítést tudsz végezni, nem valószínű, hogy ezt szeretnéd tenni.",
"Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése",
"Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló visszaállítása"
"Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló visszaállítása",
"The version of Riot": "Riot verziója",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Olyan eszközön használod-e a Riotot, ahol az érintés az elsődleges beviteli mód",
"Whether you're using Riot as an installed Progressive Web App": "A Riotot progresszív webalkalmazásként használod-e",
"Your user agent": "Felhasználói ügynök",
"The information being sent to us to help make Riot better includes:": "Az alábbi információk kerülnek elküldésre amivel a Riotot jobbá tudjuk tenni:",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Az ellenőrizni kívánt munkamenet nem támogatja se a QR kód beolvasást se az emodzsi ellenőrzést, amit a Riot támogat. Próbáld meg egy másik klienssel.",
"You declined": "Elutasítottad",
"%(name)s declined": "%(name)s elutasította",
"accepting …": "elfogadás …",
"declining …": "elutasítás …",
"Cancelling…": "Megszakítás…",
"Your homeserver does not support cross-signing.": "A matrix szervered nem támogatja az eszközök közti hitelesítést.",
"Homeserver feature support:": "Matrix szerver támogatott szolgáltatások:",
"exists": "létezik",
"Accepting…": "Elfogadás…",
"Accepting …": "Elfogadás …",
"Declining …": "Elutasítás …",
"Verification Requests": "Hitelesítés Kérések",
"Your account is not secure": "A fiókod nem biztonságos",
"Your password": "A jelszavad",
"This session, or the other session": "Ez vagy másik munkamenet",
"The internet connection either session is using": "Az egyik munkamenet internet kapcsolata",
"We recommend you change your password and recovery key in Settings immediately": "Javasoljuk, hogy a jelszavadat és a visszaállítási kulcsodat mihamarabb változtasd meg a Beállításokban"
}

View file

@ -2130,5 +2130,34 @@
"Cancel entering passphrase?": "Annullare l'inserimento della password?",
"Mod": "Moderatore",
"Indexed rooms:": "Stanze indicizzate:",
"%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s di %(totalRooms)s"
"%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s di %(totalRooms)s",
"The version of Riot": "La versione di Riot",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Se stai usando Riot su un dispositivo dove il tocco è il metodo di input principale",
"Whether you're using Riot as an installed Progressive Web App": "Se stai usando Riot installato come Web App Progressiva",
"Your user agent": "Il tuo user agent",
"The information being sent to us to help make Riot better includes:": "Le informazioni che ci vengono inviate per aiutarci a migliorare Riot includono:",
"Show typing notifications": "Mostra notifiche di scrittura",
"Verify this session by completing one of the following:": "Verifica questa sessione completando una delle seguenti cose:",
"Scan this unique code": "Scansiona questo codice univoco",
"or": "o",
"Compare unique emoji": "Confronta emoji univoci",
"Compare a unique set of emoji if you don't have a camera on either device": "Confrontate un set di emoji univoci se non avete una fotocamera sui dispositivi",
"Reset cross-signing and secret storage": "Reimposta la firma incrociata e l'archivio segreto",
"Not Trusted": "Non fidato",
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) ha fatto l'accesso con una nuova sessione senza verificarla:",
"Ask this user to verify their session, or manually verify it below.": "Chiedi a questo utente di verificare la sua sessione o verificala manualmente sotto.",
"Manually Verify": "Verifica manualmente",
"Verify by scanning": "Verifica con la scansione",
"Destroy cross-signing keys?": "Distruggere le chiavi di firma incrociata?",
"Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "L'eliminazione delle chiavi di firma incrociata è permanente. Chiunque si sia verificato con te vedrà avvisi di sicurezza. Quasi sicuramente non vuoi fare questa cosa, a meno che tu non abbia perso tutti i dispositivi da cui puoi fare l'accesso.",
"Clear cross-signing keys": "Elimina chiavi di firma incrociata",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "La sessione che stai cercando di verificare non supporta la scansione del codice QR o la verifica emoji, che sono supportate da Riot. Prova con un client diverso.",
"You declined": "Hai rifiutato",
"%(name)s declined": "%(name)s ha rifiutato",
"accepting …": "accettazione …",
"declining …": "rifiuto …",
"Your homeserver does not support cross-signing.": "Il tuo homeserver non supporta la firma incrociata.",
"Homeserver feature support:": "Funzioni supportate dall'homeserver:",
"exists": "esiste",
"Verification Requests": "Richieste di verifica"
}

View file

@ -420,7 +420,7 @@
"I have verified my email address": "Aš patvirtinau savo el. pašto adresą",
"Return to login screen": "Grįžti į prisijungimo ekraną",
"Send Reset Email": "Siųsti atstatymo el. laišką",
"Incorrect username and/or password.": "Neteisingas naudotojo vardas ir/ar slaptažodis.",
"Incorrect username and/or password.": "Neteisingas vartotojo vardas ir/arba slaptažodis.",
"Please note you are logging into the %(hs)s server, not matrix.org.": "Turėkite omenyje, kad jūs prisijungiate prie %(hs)s serverio, o ne matrix.org.",
"Failed to fetch avatar URL": "Nepavyko gauti avataro URL",
"Commands": "Komandos",
@ -526,7 +526,7 @@
"Enable inline URL previews by default": "Įjungti tiesiogines URL nuorodų peržiūras pagal numatymą",
"Enable URL previews for this room (only affects you)": "Įjungti URL nuorodų peržiūras šiame kambaryje (įtakoja tik jus)",
"Enable URL previews by default for participants in this room": "Įjungti URL nuorodų peržiūras pagal numatymą dalyviams šiame kambaryje",
"Confirm password": "Pakartokite slaptažodį",
"Confirm password": "Patvirtinkite slaptažodį",
"Demote yourself?": "Pažeminti save?",
"Demote": "Pažeminti",
"Share Link to User": "Dalintis nuoroda į naudotoją",
@ -625,8 +625,8 @@
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Šis namų serveris pasiekė savo mėnesinį aktyvių naudotojų limitą, taigi, <b>kai kurie naudotojai negalės prisijungti</b>.",
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Šis namų serveris viršijo vieno iš savo išteklių limitą, taigi, <b>kai kurie naudotojai negalės prisijungti</b>.",
"An error ocurred whilst trying to remove the widget from the room": "Įvyko klaida, bandant pašalinti valdiklį iš kambario",
"Blacklist": "Įtraukti į juodąjį sąrašą",
"Unblacklist": "Pašalinti iš juodojo sąrašo",
"Blacklist": "Blokuoti",
"Unblacklist": "Atblokuoti",
"Verify...": "Patvirtinti...",
"Communities": "Bendruomenės",
"Home": "Pradžia",
@ -714,12 +714,12 @@
"Unable to verify email address.": "Nepavyko patvirtinti el. pašto adreso.",
"This will allow you to reset your password and receive notifications.": "Tai jums leis atstatyti savo slaptažodį ir gauti pranešimus.",
"Skip": "Praleisti",
"Username not available": "Naudotojo vardas neprieinamas",
"Username invalid: %(errMessage)s": "Neteisingas naudotojo vardas: %(errMessage)s",
"Username not available": "Vartotojo vardas negalimas",
"Username invalid: %(errMessage)s": "Neteisingas vartotojo vardas: %(errMessage)s",
"An error occurred: %(error_string)s": "Įvyko klaida: %(error_string)s",
"Checking...": "Tikrinama...",
"Username available": "Naudotojo vardas yra prieinamas",
"To get started, please pick a username!": "Norėdami pradėti, pasirinkite naudotojo vardą!",
"Username available": "Vartotojo vardas galimas",
"To get started, please pick a username!": "Norėdami pradėti, pasirinkite vartotojo vardą!",
"If you already have a Matrix account you can <a>log in</a> instead.": "Jeigu jau turite Matrix paskyrą, tuomet vietoj to, galite <a>prisijungti</a>.",
"Unable to restore backup": "Nepavyko atkurti atsarginės kopijos",
"No backup found!": "Nerasta jokios atsarginės kopijos!",
@ -755,7 +755,7 @@
"Sign In": "Prisijungti",
"Explore rooms": "Žvalgyti kambarius",
"Your Riot is misconfigured": "Jūsų Riot yra neteisingai sukonfigūruotas",
"Sign in to your Matrix account on %(serverName)s": "Prisijunkite prie savo paskyros %(serverName)s serveryje",
"Sign in to your Matrix account on %(serverName)s": "Prisijunkite prie savo Matrix paskyros %(serverName)s serveryje",
"Sign in to your Matrix account on <underlinedServerName />": "Prisijunkite prie savo paskyros <underlinedServerName /> serveryje",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Nepriklausomai nuo to ar jūs naudojate 'duonos trupinių' funkciją (avatarai virš kambarių sąrašo)",
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kur šis puslapis įtraukia identifikuojamą informaciją, kaip kambarys, vartotojas ar grupės ID, tie duomenys yra pašalinami prieš siunčiant į serverį.",
@ -900,5 +900,27 @@
"Are you sure you want to leave the room '%(roomName)s'?": "Ar tikrai norite palikti kambarį %(roomName)s?",
"%(creator)s created and configured the room.": "%(creator)s sukūrė ir sukonfigūravo kambarį.",
"Riot failed to get the public room list.": "Riot nepavyko gauti viešų kambarių sąrašą.",
"General failure": "Bendras triktis"
"General failure": "Bendras triktis",
"Messages containing my username": "Žinutės, kuriose yra mano vartotojo vardas",
"Set a new account password...": "Nustatyti naują paskyros slaptažodį...",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Jei jūs pateikėte klaidą per GitHub, derinimo žurnalai (debug logs) gali padėti mums surasti problemą. Derinimo žurnaluose yra programos naudojimo duomenys, įskaitant jūsų vartotojo vardą, ID ar kitus kambarių arba grupių, kuriuose jūs lankėtės, pavadinimus ir kitų vartotojų vardus. Juose nėra žinučių.",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (galia %(powerLevelNumber)s)",
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Derinimo žurnaluose yra programos naudojimo duomenys, įskaitant jūsų vartotojo vardą, ID ar kitus kambarių arba grupių, kuriuose jūs lankėtės, pavadinimus ir kitų vartotojų vardus. Juose nėra žinučių.",
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Jei jūs negalite kažkieno surasti, paklauskite jų vartotojo vardo, pasidalinkite savo vartotojo vardu (%(userId)s) arba <a>profilio nuoroda</a>.",
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Jei jūs negalite kažkieno surasti, paklauskite jų vartotojo vardo (pvz.: @vartotojas:serveris.lt) arba <a>pasidalinkite šiuo kambariu</a>.",
"A username can only contain lower case letters, numbers and '=_-./'": "Vartotojo vardą gali sudaryti tik mažosios raidės, skaičiai ir '=_-./'",
"The username field must not be blank.": "Vartotojo vardo laukelis negali būti tuščias.",
"Username": "Vartotojo vardas",
"Not sure of your password? <a>Set a new one</a>": "Pamiršote slaptažodį? <a>Nustatykite naują</a>",
"Enter username": "Įveskite vartotojo vardą",
"Confirm": "Patvirtinti",
"Create your Matrix account on %(serverName)s": "Sukurkite savo Matrix paskyrą %(serverName)s serveryje",
"Create your Matrix account on <underlinedServerName />": "Sukurkite savo Matrix paskyrą <underlinedServerName /> serveryje",
"Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Nustatykite el. paštą paskyros susigrąžinimui. Naudokite el. paštą ar tel. nr. norėdami pasirinktinai būti aptinkami esamų kontaktų.",
"Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Nustatykite el. paštą paskyros susigrąžinimui. Naudokite el. paštą norėdami pasirinktinai būti aptinkami esamų kontaktų.",
"Sign in instead": "Prisijungti",
"A verification email will be sent to your inbox to confirm setting your new password.": "Patvirtinimo laiškas bus išsiųstas į jūsų pašto dėžutę tam, kad patvirtintumėte naujo slaptažodžio nustatymą.",
"Set a new password": "Nustatykite naują slaptažodį",
"Create account": "Sukurti paskyrą",
"Create your account": "Sukurkite savo paskyrą"
}

View file

@ -142,7 +142,7 @@
"/ddg is not a command": "/ddg is geen opdracht",
"Deactivate Account": "Account deactiveren",
"Decline": "Weigeren",
"Decrypt %(text)s": "%(text)s ontcijferen",
"Decrypt %(text)s": "%(text)s ontsleutelen",
"Decryption error": "Ontsleutelingsfout",
"Device ID": "Apparaats-ID",
"device id: ": "apparaats-ID: ",
@ -165,7 +165,7 @@
"%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.",
"End-to-end encryption information": "Info over eind-tot-eind-versleuteling",
"Enter passphrase": "Voer wachtwoord in",
"Error decrypting attachment": "Fout bij het ontcijferen van de bijlage",
"Error decrypting attachment": "Fout bij het ontsleutelen van de bijlage",
"Error: Problem communicating with the given homeserver.": "Fout: probleem bij communicatie met de gegeven thuisserver.",
"Event information": "Gebeurtenisinformatie",
"Existing Call": "Bestaande oproep",
@ -247,8 +247,8 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-vergadering aangevraagd.",
"Results from DuckDuckGo": "Resultaten van DuckDuckGo",
"Return to login screen": "Terug naar het aanmeldscherm",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen toestemming u meldingen te versturen - controleer uw browserinstellingen",
"Riot was not given permission to send notifications - please try again": "Riot kreeg geen toestemming u meldingen te sturen - probeer het opnieuw",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen toestemming om u meldingen te versturen - controleer uw browserinstellingen",
"Riot was not given permission to send notifications - please try again": "Riot kreeg geen toestemming om u meldingen te sturen - probeer het opnieuw",
"riot-web version:": "riot-web-versie:",
"Room %(roomId)s not visible": "Gesprek %(roomId)s is niet zichtbaar",
"Room Colour": "Gesprekskleur",
@ -321,7 +321,7 @@
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (macht %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Ongeldige gebruikersnaam: %(errMessage)s",
"Users": "Gebruikers",
"Verification Pending": "Contrôle in afwachting",
"Verification Pending": "Verificatie in afwachting",
"Verification": "Verificatie",
"verified": "geverifieerd",
"Verified key": "Geverifieerde sleutel",
@ -374,10 +374,10 @@
"Import room keys": "Gesprekssleutels inlezen",
"File to import": "In te lezen bestand",
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Hiermee kunt u de sleutels van uw ontvangen berichten in versleutelde gesprekken naar een lokaal bestand wegschrijven. Als u dat bestand dan in een andere Matrix-cliënt inleest kan die ook die berichten ontcijferen.",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Wie het weggeschreven bestand kan lezen, kan daarmee ook alle versleutelde berichten die u kunt zien ontcijferen - ga er dus zorgvuldig mee om! Daartoe kunt u hieronder een wachtwoord invoeren, dat dan gebruikt zal worden om het bestand te versleutelen. Het is dan enkel mogelijk de gegevens in te lezen met hetzelfde wachtwoord.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven ontcijferingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het weggeschreven bestand is beveiligd met een wachtwoord. Voer dat wachtwoord hier in om het bestand te ontcijferen.",
"You must join the room to see its files": "Slechts na toetreding tot het gesprek toetreden zult u de bestanden kunnen zien",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Wie het weggeschreven bestand kan lezen, kan daarmee ook alle versleutelde berichten die u kunt zien ontcijferen - ga er dus zorgvuldig mee om! Daartoe kunt u hieronder een wachtwoord invoeren, dat dan gebruikt zal worden om het bestand te versleutelen. Het is dan enkel mogelijk de gegevens in te lezen met hetzelfde wachtwoord.",
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.",
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het weggeschreven bestand is beveiligd met een wachtwoord. Voer dat wachtwoord hier in om het bestand te ontsleutelen.",
"You must join the room to see its files": "Slechts na toetreding tot het gesprek zult u de bestanden kunnen zien",
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s-uitnodigingen weigeren",
"Failed to invite": "Uitnodigen is mislukt",
"Failed to invite the following users to the %(roomName)s room:": "Kon de volgende gebruikers niet uitnodigen voor gesprek %(roomName)s:",
@ -400,9 +400,9 @@
"Token incorrect": "Bewijs onjuist",
"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 u geen e-mailadres opgeeft, zult u uw wachtwoord niet opnieuw kunnen instellen. Weet u het zeker?",
"Error decrypting audio": "Fout bij het ontcijferen van de audio",
"Error decrypting image": "Fout bij het ontcijferen van de afbeelding",
"Error decrypting video": "Fout bij het ontcijferen van de video",
"Error decrypting audio": "Fout bij het ontsleutelen van de audio",
"Error decrypting image": "Fout bij het ontsleutelen van de afbeelding",
"Error decrypting video": "Fout bij 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?": "U wordt zo dadelijk naar een derdepartijwebsite gebracht zodat u de account kunt legitimeren voor gebruik met %(integrationsUrl)s. Wilt u doorgaan?",
"Removed or unknown message type": "Verwijderd of onbekend berichttype",
@ -586,8 +586,8 @@
"%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s is weggegaan en weer toegetreden",
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s hebben hun uitnodigingen %(count)s keer afgewezen",
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s hebben hun uitnodigingen afgewezen",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s heeft de uitnodiging %(count)smaal afgewezen",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s heeft de uitnodiging afgeslagen",
"%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s heeft de uitnodiging %(count)s maal geweigerd",
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s heeft de uitnodiging geweigerd",
"%(severalUsers)shad their invitations withdrawn %(count)s times|other": "De uitnodigingen van %(severalUsers)s zijn %(count)s keer ingetrokken",
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "De uitnodigingen van %(severalUsers)s zijn ingetrokken",
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "De uitnodiging van %(oneUser)s is %(count)s keer ingetrokken",
@ -609,11 +609,11 @@
"was kicked %(count)s times|one": "is uit het gesprek gezet",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s hebben hun naam %(count)s keer gewijzigd",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s hebben hun naam gewijzigd",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s is %(count)smaal van naam veranderd",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s is %(count)s maal van naam veranderd",
"%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s is van naam veranderd",
"%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s hebben hun avatar %(count)s keer gewijzigd",
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s hebben hun avatar gewijzigd",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s is %(count)smaal van profielfoto veranderd",
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s is %(count)s maal van profielfoto veranderd",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s is van profielfoto veranderd",
"%(items)s and %(count)s others|other": "%(items)s en %(count)s andere",
"%(items)s and %(count)s others|one": "%(items)s en één ander",
@ -664,7 +664,7 @@
"Community %(groupId)s not found": "Gemeenschap %(groupId)s is niet gevonden",
"Failed to load %(groupId)s": "Laden van %(groupId)s is mislukt",
"Old cryptography data detected": "Oude cryptografiegegevens gedetecteerd",
"Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Er zijn gegevens van een oudere versie van Riot gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontcijferbaar in deze versie. Ook kunnen berichten die met deze versie gewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw de sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.",
"Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Er zijn gegevens van een oudere versie van Riot gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontsleutelbaar in deze versie. Ook kunnen berichten die met deze versie uitgewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.",
"Your Communities": "Uw gemeenschappen",
"Error whilst fetching joined communities": "Er is een fout opgetreden bij het ophalen van de gemeenschappen waarvan u lid bent",
"Create a new community": "Maak een nieuwe gemeenschap aan",
@ -718,14 +718,14 @@
"Who can join this community?": "Wie kan er tot deze gemeenschap toetreden?",
"Everyone": "Iedereen",
"Leave this community": "Deze gemeenschap verlaten",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Voor het oplossen van in GitHub gemelde problemen helpen foutopsporingslogboeken ons enorm. Deze bevatten wel gebruiksgegevens (waaronder uw gebruikersnaam, de IDs of bijnamen van de gesprekken en groepen die u heeft bezocht, en de namen van andere gebruikers), maar geen berichten.",
"If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Voor het oplossen van in GitHub gemelde problemen helpen foutopsporingslogboeken ons enorm. Deze bevatten wel gebruiksgegevens (waaronder uw gebruikersnaam, de IDs of bijnamen van de gesprekken en groepen die u heeft bezocht, en de namen van andere gebruikers), maar geen berichten.",
"Submit debug logs": "Foutopsporingslogboeken indienen",
"Opens the Developer Tools dialog": "Opent het dialoogvenster met ontwikkelaarsgereedschap",
"Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt",
"A new version of Riot is available.": "Er is een nieuwe versie van Riot beschikbaar.",
"I understand the risks and wish to continue": "Ik begrijp de risicos en wil graag verdergaan",
"Send Account Data": "Accountgegevens versturen",
"All notifications are currently disabled for all targets.": "Alle meldingen voor alle bestemmingen staan momenteel uit.",
"All notifications are currently disabled for all targets.": "Alle meldingen voor alle bestemmingen zijn momenteel uitgeschakeld.",
"Uploading report": "Rapport wordt geüpload",
"Sunday": "Zondag",
"Notification targets": "Meldingsbestemmingen",
@ -914,7 +914,7 @@
"You need to register to do this. Would you like to register now?": "Hiervoor dient u zich te registreren. Wilt u dat nu doen?",
"This homeserver has hit its Monthly Active User limit.": "Deze thuisserver heeft zijn limiet voor maandelijks actieve gebruikers bereikt.",
"This homeserver has exceeded one of its resource limits.": "Deze thuisserver heeft één van zijn systeembronlimieten overschreden.",
"Whether or not you're logged in (we don't record your username)": "Of u al dan niet ingelogd bent (we slaan uw gebruiksnaam niet op)",
"Whether or not you're logged in (we don't record your username)": "Of u al dan niet aangemeld bent (we slaan uw gebruikersnaam niet op)",
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Het bestand %(fileName)s is groter dan de uploadlimiet van de thuisserver",
"Unable to load! Check your network connectivity and try again.": "Laden mislukt! Controleer uw netwerktoegang en probeer het nogmaals.",
"Failed to invite users to the room:": "Kon de volgende gebruikers hier niet uitnodigen:",
@ -963,7 +963,7 @@
"Avoid years that are associated with you": "Vermijd jaren die op uzelf betrekking hebben",
"Avoid dates and years that are associated with you": "Vermijd data en jaren die op uzelf betrekking hebben",
"Capitalization doesn't help very much": "Hoofdlettergebruik helpt niet echt",
"All-uppercase is almost as easy to guess as all-lowercase": "Enkel hoofdletters is nauwelijks moeilijker te raden als enkel kleine letters",
"All-uppercase is almost as easy to guess as all-lowercase": "Enkel hoofdletters is nauwelijks moeilijker te raden dan enkel kleine letters",
"Reversed words aren't much harder to guess": "Omgedraaide woorden zijn bijna even gemakkelijk te raden",
"Predictable substitutions like '@' instead of 'a' don't help very much": "Voorspelbare vervangingen (zoals '@' i.p.v. 'a') zijn niet erg zinvol",
"Add another word or two. Uncommon words are better.": "Voeg nog een paar (liefst weinig gebruikte) woorden toe.",
@ -1154,7 +1154,7 @@
"Roles & Permissions": "Rollen & toestemmingen",
"Select the roles required to change various parts of the room": "Selecteer de rollen vereist om verschillende delen van het gesprek te wijzigen",
"Enable encryption?": "Versleuteling inschakelen?",
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "Gespreksversleuteling is onomkeerbaar. Berichten in versleutelde gesprekken zijn niet leesbaar voor de server; enkel voor de gespreksdeelnemers. Veel robots en overbruggingen werken niet correct in versleutelde gesprekken. <a>Lees meer over versleuteling.</a>",
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. <a>Learn more about encryption.</a>": "Gespreksversleuteling is onomkeerbaar. Berichten in versleutelde gesprekken zijn niet leesbaar voor de server; enkel voor de gespreksdeelnemers. Veel robots en overbruggingen werken niet correct in versleutelde gesprekken. <a>Lees meer over versleuteling.</a>",
"To link to this room, please add an alias.": "Voeg een bijnaam toe om naar dit gesprek te verwijzen.",
"Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Wijzigingen aan wie de geschiedenis kan lezen gelden enkel voor toekomstige berichten in dit gesprek. De zichtbaarheid van de bestaande geschiedenis blijft ongewijzigd.",
"Encryption": "Versleuteling",
@ -1196,7 +1196,7 @@
"Invite anyway": "Alsnog uitnodigen",
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Vooraleer u logboeken indient, dient u uw probleem te <a>melden op GitHub</a>.",
"Unable to load commit detail: %(msg)s": "Kan commitdetail niet laden: %(msg)s",
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Om uw gespreksgeschiedenis niet te verliezen, moet u vóór het afmelden uw gesprekssleutels wegschrijven. Dat moet vanuit de nieuwere versie van Riot",
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Om uw gespreksgeschiedenis niet te verliezen, moet u vóór het afmelden uw gesprekssleutels wegschrijven. Dat moet vanuit de nieuwere versie van Riot",
"You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "U heeft eerder een nieuwere versie van Riot op %(host)s gebruikt. Om deze versie opnieuw met eind-tot-eind-versleuteling te gebruiken, zult u zich moeten afmelden en opnieuw aanmelden. ",
"Incompatible Database": "Incompatibele database",
"Continue With Encryption Disabled": "Verdergaan met versleuteling uitgeschakeld",
@ -1221,7 +1221,7 @@
"You'll lose access to your encrypted messages": "U zult de toegang tot uw versleutelde berichten verliezen",
"Are you sure you want to sign out?": "Weet u zeker dat u zich wilt afmelden?",
"If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Als u fouten zou tegenkomen of voorstellen zou hebben, laat het ons dan weten op GitHub.",
"To help avoid duplicate issues, please <existingIssuesLink>view existing issues</existingIssuesLink> first (and add a +1) or <newIssueLink>create a new issue</newIssueLink> if you can't find it.": "Voorkom dubbele meldingen: doorzoek eerst de <existingIssuesLink>bestaande meldingen</existingIssuesLink> (en voeg desgewenst een +1 toe). Maak enkel <newIssueLink>een nieuwe melding</newIssueLink> aan indien u niets kunt vinden.",
"To help avoid duplicate issues, please <existingIssuesLink>view existing issues</existingIssuesLink> first (and add a +1) or <newIssueLink>create a new issue</newIssueLink> if you can't find it.": "Voorkom dubbele meldingen: doorzoek eerst de <existingIssuesLink>bestaande meldingen</existingIssuesLink> (en voeg desgewenst een +1 toe). Maak enkel <newIssueLink>een nieuwe melding</newIssueLink> aan indien u niets kunt vinden.",
"Report bugs & give feedback": "Fouten melden & feedback geven",
"Go back": "Terug",
"Room Settings - %(roomName)s": "Gespreksinstellingen - %(roomName)s",
@ -1232,18 +1232,18 @@
"Create a new room with the same name, description and avatar": "Een nieuw gesprek aanmaken met dezelfde naam, beschrijving en avatar",
"Update any local room aliases to point to the new room": "Alle lokale gespreksbijnamen naar het nieuwe gesprek laten verwijzen",
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Gebruikers verhinderen aan de oude versie van het gesprek bij te dragen, en daar een bericht plaatsen dat de gebruikers verwijst naar het nieuwe gesprek",
"Put a link back to the old room at the start of the new room so people can see old messages": "Bovenaan het nieuwe gesprek naar het oude te verwijzen, om oude berichten te lezen",
"Put a link back to the old room at the start of the new room so people can see old messages": "Bovenaan het nieuwe gesprek naar het oude verwijzen, om oude berichten te lezen",
"A username can only contain lower case letters, numbers and '=_-./'": "Een gebruikersnaam mag enkel kleine letters, cijfers en =_-./ bevatten",
"Checking...": "Bezig met controleren…",
"Unable to load backup status": "Kan back-upstatus niet laden",
"Recovery Key Mismatch": "Herstelsleutel komt niet overeen",
"Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "De back-up kon met deze sleutel niet ontcijferd worden: controleer of u de juiste herstelsleutel heeft ingevoerd.",
"Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "De back-up kon met deze sleutel niet ontsleuteld worden: controleer of u de juiste herstelsleutel heeft ingevoerd.",
"Incorrect Recovery Passphrase": "Onjuist herstelwachtwoord",
"Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "De back-up kon met dit wachtwoord niet ontcijferd worden: controleer of u het juiste herstelwachtwoord heeft ingevoerd.",
"Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "De back-up kon met dit wachtwoord niet ontsleuteld worden: controleer of u het juiste herstelwachtwoord heeft ingevoerd.",
"Unable to restore backup": "Kan back-up niet terugzetten",
"No backup found!": "Geen back-up gevonden!",
"Backup Restored": "Back-up hersteld",
"Failed to decrypt %(failedCount)s sessions!": "Ontcijferen van %(failedCount)s sessies is mislukt!",
"Failed to decrypt %(failedCount)s sessions!": "Ontsleutelen van %(failedCount)s sessies is mislukt!",
"Restored %(sessionCount)s session keys": "%(sessionCount)s sessiesleutels hersteld",
"Enter Recovery Passphrase": "Voer het herstelwachtwoord in",
"<b>Warning</b>: you should only set up key backup from a trusted computer.": "<b>Let op</b>: stel sleutelback-up enkel in op een vertrouwde computer.",
@ -1386,7 +1386,7 @@
"Sign out and remove encryption keys?": "Afmelden en versleutelingssleutels verwijderen?",
"To help us prevent this in future, please <a>send us logs</a>.": "Gelieve <a>ons logboeken te sturen</a> om dit in de toekomst te helpen voorkomen.",
"Missing session data": "Sessiegegevens ontbreken",
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Sommige sessiegegevens, waaronder sleutels voor versleutelde berichten, ontbreken. Herstel de sleutels uit uw back-up door u af en weer aan te melden.",
"Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Sommige sessiegegevens, waaronder sleutels voor versleutelde berichten, ontbreken. Herstel de sleutels uit uw back-up door u af- en weer aan te melden.",
"Your browser likely removed this data when running low on disk space.": "Uw browser heeft deze gegevens wellicht verwijderd toen de beschikbare opslagruimte vol was.",
"Upload files (%(current)s of %(total)s)": "Bestanden versturen (%(current)s van %(total)s)",
"Upload files": "Bestanden versturen",
@ -1395,9 +1395,9 @@
"These files are <b>too large</b> to upload. The file size limit is %(limit)s.": "Deze bestanden zijn <b>te groot</b> om te versturen. De bestandsgroottelimiet is %(limit)s.",
"Some files are <b>too large</b> to be uploaded. The file size limit is %(limit)s.": "Sommige bestanden zijn <b>te groot</b> om te versturen. De bestandsgroottelimiet is %(limit)s.",
"Upload %(count)s other files|other": "%(count)s overige bestanden versturen",
"Upload %(count)s other files|one": "%(count)s overig bestanden versturen",
"Upload %(count)s other files|one": "%(count)s overig bestand versturen",
"Cancel All": "Alles annuleren",
"Upload Error": "Fout bij versturen bestand",
"Upload Error": "Fout bij versturen van bestand",
"A conference call could not be started because the integrations server is not available": "Daar de integratieserver onbereikbaar is kon het groepsaudiogesprek niet gestart worden",
"The server does not support the room version specified.": "De server ondersteunt deze versie van gesprekken niet.",
"Name or Matrix ID": "Naam of Matrix-ID",
@ -1582,7 +1582,7 @@
"You are still <b>sharing your personal data</b> on the identity server <idserver />.": "U deelt nog steeds <b>uw persoonlijke gegevens</b> op de identiteitsserver <idserver />.",
"We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "We raden u aan uw e-mailadressen en telefoonnummers van de identiteitsserver te verwijderen vooraleer u de verbinding verbreekt.",
"Disconnect anyway": "Verbinding toch verbreken",
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Mocht u om bekenden te zoeken en vindbaar te zijn niet <server /> willen gebruiken, voer dan hieronder een andere identiteitsserver in.",
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Mocht u om bekenden te zoeken en zelf vindbaar te zijn <server /> niet willen gebruiken, voer dan hieronder een andere identiteitsserver in.",
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Een identiteitsserver is niet verplicht, maar zonder identiteitsserver zult u geen bekenden op e-mailadres of telefoonnummer kunnen zoeken, noch door hen vindbaar zijn.",
"Do not use an identity server": "Geen identiteitsserver gebruiken",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Aanvaard de gebruiksvoorwaarden van de identiteitsserver (%(serverName)s) om vindbaar te zijn op e-mailadres of telefoonnummer.",
@ -1638,7 +1638,7 @@
"Explore rooms": "Gesprekken ontdekken",
"Show previews/thumbnails for images": "Toon voorbeelden voor afbeeldingen",
"Clear cache and reload": "Cache wissen en herladen",
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "U staat op het punt 1 bericht door %(user)s te verwijderen. Dit kan niet ongedaan worden gemaakt. Wilt u doorgaan?",
"You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "U staat op het punt 1 bericht door %(user)s te verwijderen. Dit kan niet ongedaan gemaakt worden. Wilt u doorgaan?",
"Remove %(count)s messages|one": "1 bericht verwijderen",
"%(count)s unread messages including mentions.|other": "%(count)s ongelezen berichten, inclusief vermeldingen.",
"%(count)s unread messages.|other": "%(count)s ongelezen berichten.",
@ -1669,31 +1669,31 @@
"Notification Autocomplete": "Meldingen automatisch voltooien",
"Room Autocomplete": "Gesprekken automatisch aanvullen",
"User Autocomplete": "Gebruikers automatisch aanvullen",
"Add Email Address": "Emailadres toevoegen",
"Add Email Address": "E-mailadres toevoegen",
"Add Phone Number": "Telefoonnummer toevoegen",
"Your email address hasn't been verified yet": "Uw emailadres is nog niet gecontroleerd",
"Click the link in the email you received to verify and then click continue again.": "Open de link in de ontvangen contrôle-email, en klik dan op \"Doorgaan\".",
"Your email address hasn't been verified yet": "Uw e-mailadres is nog niet geverifieerd",
"Click the link in the email you received to verify and then click continue again.": "Open de koppeling in de ontvangen verificatie-e-mail, en klik dan op Doorgaan.",
"%(creator)s created and configured the room.": "Gesprek gestart en ingesteld door %(creator)s.",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Dit gesprek bevat onbekende sessies. Tenzij u die verifieert zou iemand u kunnen afluisteren.",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Dit gesprek bevat onbekende sessies. Tenzij u die verifieert zou iemand u kunnen afluisteren.",
"Setting up keys": "Sleutelconfiguratie",
"Verify this session": "Deze sessie verifiëren",
"Encryption upgrade available": "Er is een bijgewerkte versleuteling beschikbaar",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Type <code>/help</code> om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?",
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Typ <code>/help</code> om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?",
"Help": "Hulp",
"Set up encryption": "Versleuteling instellen",
"Unverified session": "Ongeverifieerde sessie",
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt toegang tot de verstek-identiteitsserver <server /> om emailadres of telefoonummer te valideren, maar die server heeft kent geen gebruiksvoorwaarden.",
"Trust": "Vertrouw",
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt toegang tot de standaardidentiteitsserver <server /> om een e-mailadres of telefoonnummer te valideren, maar die server heeft geen gebruiksvoorwaarden.",
"Trust": "Vertrouwen",
"Custom (%(level)s)": "Aangepast (%(level)s)",
"Error upgrading room": "Bijwerken gesprek mislukt",
"Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer dan opnieuw.",
"Error upgrading room": "Bijwerken van gesprek mislukt",
"Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer het dan opnieuw.",
"Verifies a user, session, and pubkey tuple": "Verifieert een combinatie van gebruiker+sessie+publieke sleutel",
"Unknown (user, session) pair:": "Onbekende combinatie gebruiker+sessie:",
"Session already verified!": "Sessie al geverifieerd!",
"WARNING: Session already verified, but keys do NOT MATCH!": "PAS OP: De sessie is al geverifieerd, maar de sleutels komen NIET OVEREEN!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "PAS OP: Sleutelverificatie MISLUKT! De combinatie %userId)s + sessie %(deviceId)s is ondertekend met \"%(fprint)s\" - maar de opgegeven sleutel is \"%(fingerprint)s\". Wellicht worden uw berichten onderschept!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "De door u verschafte en de van %(userId)ss sessie %(deviceId)s verkregen sleutels komen overeen. De sessie is daarmee geverifieerd.",
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName) heeft %(addedAddresses)s en %(count)d andere adressen aan dit gesprek toegevoegd",
"WARNING: Session already verified, but keys do NOT MATCH!": "PAS OP: de sessie is al geverifieerd, maar de sleutels komen NIET OVEREEN!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "PAS OP: sleutelverificatie MISLUKT! De combinatie %(userId)s + sessie %(deviceId)s is ondertekend met %(fprint)s - maar de opgegeven sleutel is %(fingerprint)s. Wellicht worden uw berichten onderschept!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "De door u verschafte en de van %(userId)ss sessie %(deviceId)s verkregen sleutels komen overeen. De sessie is daarmee geverifieerd.",
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s heeft %(addedAddresses)s en %(count)s andere adressen aan dit gesprek toegevoegd",
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s heeft dit gesprek ontdaan van %(removedAddresses)s en %(count)s andere adressen",
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s heeft dit gesprek ontdaan van %(countRemoved)s adressen, en er %(countAdded)s toegevoegd",
"%(senderName)s placed a voice call.": "%(senderName)s probeert u te bellen.",
@ -1717,12 +1717,12 @@
"%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gesprekken wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s",
"%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor servers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s",
"%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s",
"The message you are trying to send is too large.": "Uw bericht is te lang om te verzenden.",
"The message you are trying to send is too large.": "Uw bericht is te lang om te versturen.",
"a few seconds ago": "enige tellen geleden",
"about a minute ago": "een minuut of zo geleden",
"%(num)s minutes ago": "%(num)s minuten geleden",
"about an hour ago": "een uur of zo geleden",
"%(num)s hours ago": "%(num)s uren geleden",
"%(num)s hours ago": "%(num)s uur geleden",
"about a day ago": "een dag of zo geleden",
"%(num)s days ago": "%(num)s dagen geleden",
"a few seconds from now": "over een paar tellen",
@ -1736,10 +1736,10 @@
"Try out new ways to ignore people (experimental)": "Nieuwe manieren om mensen te negeren uitproberen (nog in ontwikkeling)",
"Show a presence dot next to DMs in the room list": "Toon aanwezigheid bij tweegesprekken in de gesprekkenlijst",
"Enable cross-signing to verify per-user instead of per-session (in development)": "Gebruik gebruikersverificatie in plaats van sessieverificatie (nog in ontwikkeling)",
"Enable local event indexing and E2EE search (requires restart)": "Indexeer lokaal gebeurtenissen en maak zo E2EE-zoeken mogelijk (vergt een herstart)",
"Enable local event indexing and E2EE search (requires restart)": "Indexeer gebeurtenissen lokaal en maak zo E2EE-zoeken mogelijk (vergt een herstart)",
"Show info about bridges in room settings": "Toon bruginformatie in gespreksinstellingen",
"Show padlocks on invite only rooms": "Toon hangsloten op besloten gesprekken",
"Match system theme": "Pas aan aan systeemthema",
"Match system theme": "Aanpassen aan systeemthema",
"Never send encrypted messages to unverified sessions from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies",
"Never send encrypted messages to unverified sessions in this room from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies in dit gesprek",
"Enable message search in encrypted rooms": "Sta zoeken in versleutelde gesprekken toe",
@ -1747,19 +1747,19 @@
"How fast should messages be downloaded.": "Ophaalfrequentie van berichten.",
"My Ban List": "Mijn banlijst",
"This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!",
"Confirm the emoji below are displayed on both devices, in the same order:": "Bevestig dat beide apparaten dezelfde emojis in dezelfde volgorde tonen:",
"Confirm the emoji below are displayed on both devices, in the same order:": "Bevestig dat beide apparaten dezelfde emojis in dezelfde volgorde tonen:",
"Verify this device by confirming the following number appears on its screen.": "Verifieer dit apparaat door te bevestigen dat het scherm het volgende getal toont.",
"Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…",
"They match": "Ze komen overeen",
"They don't match": "Ze komen niet overeen",
"To be secure, do this in person or use a trusted way to communicate.": "Doe dit voor de zekerheid in persona, of via een betrouwbaar communicatiemedium.",
"To be secure, do this in person or use a trusted way to communicate.": "Doe dit voor de zekerheid onder vier ogen, of via een betrouwbaar communicatiemedium.",
"Lock": "Hangslot",
"Verify yourself & others to keep your chats safe": "Verifieer jezelf en anderen om je gesprekken veilig te houden",
"Verify yourself & others to keep your chats safe": "Verifieer uzelf en anderen om uw gesprekken veilig te houden",
"Other users may not trust it": "Mogelijk wantrouwen anderen het",
"Upgrade": "Bijwerken",
"Verify": "Verifiëren",
"Later": "Later",
"Review": "Contrôle",
"Review": "Controle",
"Decline (%(counter)s)": "Afwijzen (%(counter)s)",
"This bridge was provisioned by <user />.": "Dank aan <user /> voor de brug.",
"This bridge is managed by <user />.": "Brug onderhouden door <user />.",
@ -1767,12 +1767,134 @@
"Channel: %(channelName)s": "Kanaal: %(channelName)s",
"Show less": "Minder tonen",
"Show more": "Meer tonen",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.",
"Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, <code>@bot:*</code> would ignore all users that have the name 'bot' on any server.": "Geef hier te negeren gebruikers en servers in. Asterisken staan voor willekeurige tekenreeksen; zo leidt <code>@bot:*</code> tot het negeren van gebruikers die 'bot' heten op alle servers.",
"Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.",
"Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, <code>@bot:*</code> would ignore all users that have the name 'bot' on any server.": "Geef hier te negeren gebruikers en servers in. Asterisken staan voor willekeurige tekenreeksen; zo leidt <code>@bot:*</code> tot het negeren van alle gebruikers die bot heten op alle servers.",
"in memory": "in het geheugen",
"not found": "niet gevonden",
"Your homeserver does not support session management.": "Uw thuisserver ondersteunt geen sessiebeheer.",
"Unable to load session list": "Kan sessielijst niet laden",
"Delete %(count)s sessions|other": "Verwijder %(count)s sessies",
"Delete %(count)s sessions|one": "Verwijder %(count)s sessie"
"Delete %(count)s sessions|other": "%(count)s sessies verwijderen",
"Delete %(count)s sessions|one": "%(count)s sessie verwijderen",
"The version of Riot": "De versie van Riot",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Of u Riot op een apparaat gebruikt waarop een aanraakscherm de voornaamste invoermethode is",
"Whether you're using Riot as an installed Progressive Web App": "Of u Riot gebruikt als een geïnstalleerde Progressive-Web-App",
"Your user agent": "Uw gebruikersagent",
"The information being sent to us to help make Riot better includes:": "De informatie die naar ons wordt verstuurd om Riot te verbeteren bevat:",
"If you cancel now, you won't complete verifying the other user.": "Als u nu annuleert zult u de andere gebruiker niet verifiëren.",
"If you cancel now, you won't complete verifying your other session.": "Als u nu annuleert zult u uw andere sessie niet verifiëren.",
"If you cancel now, you won't complete your secret storage operation.": "Als u nu annuleert zal de sleutelopslag worden afgebroken.",
"Cancel entering passphrase?": "Wachtwoordinvoer annuleren?",
"Show typing notifications": "Typmeldingen weergeven",
"Verify this session by completing one of the following:": "Verifieer deze sessie door een van het volgende te doen:",
"Scan this unique code": "Scan deze unieke code",
"or": "of",
"Compare unique emoji": "Vergelijk unieke emoji",
"Compare a unique set of emoji if you don't have a camera on either device": "Vergelijk een unieke lijst met emoji als geen van beide apparaten een camera heeft",
"Start": "Start",
"Securely cache encrypted messages locally for them to appear in search results.": "Sla versleutelde berichten beveiligd op om ze weer te geven in zoekresultaten.",
"Enable": "Inschakelen",
"Connecting to integration manager...": "Verbinding maken met de integratiebeheerder…",
"Cannot connect to integration manager": "Kan geen verbinding maken met de integratiebeheerder",
"The integration manager is offline or it cannot reach your homeserver.": "De integratiebeheerder is offline of kan uw thuisserver niet bereiken.",
"This session is backing up your keys. ": "Deze sessie maakt back-ups van uw sleutels. ",
"not stored": "niet opgeslagen",
"Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Uw wachtwoord is gewijzigd. U zult geen pushmeldingen op uw andere sessies meer ontvangen, totdat u zichzelf daarop opnieuw aanmeldt",
"Ignored/Blocked": "Genegeerd/geblokkeerd",
"Error adding ignored user/server": "Fout bij het toevoegen van een genegeerde gebruiker/server",
"Something went wrong. Please try again or view your console for hints.": "Er is iets fout gegaan. Probeer het opnieuw of bekijk de console om voor meer informatie.",
"Error subscribing to list": "Fout bij het abonneren op de lijst",
"Please verify the room ID or alias and try again.": "Controleer de gespreks-ID of -(bij)naam en probeer het opnieuw.",
"Error removing ignored user/server": "Fout bij het verwijderen van genegeerde gebruiker/server",
"Error unsubscribing from list": "Fout bij het opzeggen van een abonnement op de lijst",
"Please try again or view your console for hints.": "Probeer het opnieuw of bekijk de console voor meer informatie.",
"None": "Geen",
"You have not ignored anyone.": "U heeft niemand genegeerd.",
"You are currently ignoring:": "U negeert op dit moment:",
"You are not subscribed to any lists": "U heeft geen abonnement op een lijst",
"Unsubscribe": "Abonnement opzeggen",
"View rules": "Bekijk regels",
"You are currently subscribed to:": "U heeft een abonnement op:",
"⚠ These settings are meant for advanced users.": "⚠ Deze instellingen zijn bedoeld voor gevorderde gebruikers.",
"Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Het negeren van gebruikers gaat via banlijsten. Deze bevatten regels over wie verbannen moet worden. Het abonneren op een banlijst betekent dat u de gebruikers/servers die op de lijst staan niet meer zult zien.",
"Personal ban list": "Persoonlijke banlijst",
"Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Uw persoonlijke banlijst bevat alle gebruikers/server waar u geen berichten meer van wilt zien. Nadat u een gebruiker/server heeft genegeerd, zal er een nieuw gesprek worden aangemaakt met de naam Mijn banlijst. Om de lijst actief te houden dient u het gesprek niet te verlaten.",
"Server or user ID to ignore": "Server of gebruikers-ID om te negeren",
"eg: @bot:* or example.org": "bijvoorbeeld: @bot:* of voorbeeld.org",
"Subscribed lists": "Abonnementen op lijsten",
"Subscribing to a ban list will cause you to join it!": "Wanneer u zich abonneert op een banlijst zal u eraan worden toegevoegd!",
"If this isn't what you want, please use a different tool to ignore users.": "Als u dit niet wilt kunt u een andere methode gebruiken om gebruikers te negeren.",
"Room ID or alias of ban list": "Gespreks-ID of (bij)naam van banlijst",
"Subscribe": "Abonneren",
"Enable desktop notifications for this session": "Bureaubladmeldingen inschakelen voor deze sessie",
"Enable audible notifications for this session": "Meldingen met geluid inschakelen voor deze sessie",
"You should:": "U zou best:",
"check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "uw browserextensies bekijken voor extensies die mogelijk de identiteitsserver blokkeren (zoals Privacy Badger)",
"contact the administrators of identity server <idserver />": "contact opnemen met de beheerders van de identiteitsserver <idserver />",
"wait and try again later": "wachten en het later weer proberen",
"Use an Integration Manager <b>(%(serverName)s)</b> to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder <b>(%(serverName)s)</b> om robots, widgets en stickerpakketten te beheren.",
"Use an Integration Manager to manage bots, widgets, and sticker packs.": "Gebruik een integratiebeheerder om robots, widgets en stickerpakketten te beheren.",
"Manage integrations": "Beheer integraties",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveaus namens u aanpassen.",
"Ban list rules - %(roomName)s": "Banlijstregels - %(roomName)s",
"Server rules": "Serverregels",
"User rules": "Gebruikersregels",
"Show tray icon and minimize window to it on close": "Geef een pictogram weer in de systeembalk en minimaliseer het venster wanneer het wordt gesloten",
"Session ID:": "Sessie-ID:",
"Session key:": "Sessiesleutel:",
"Message search": "Berichten zoeken",
"Sessions": "Sessies",
"A session's public name is visible to people you communicate with": "De publieke naam van een sessie is zichtbaar voor de mensen waarmee u communiceert",
"This room is bridging messages to the following platforms. <a>Learn more.</a>": "Dit gesprek wordt overbrugd naar de volgende platformen. <a>Lees meer</a>",
"This room isnt bridging messages to any platforms. <a>Learn more.</a>": "Dit gesprek wordt niet overbrugd naar andere platformen. <a>Lees meer.</a>",
"Bridges": "Bruggen",
"This user has not verified all of their sessions.": "Deze gebruiker heeft niet al zijn sessies geverifieerd.",
"You have not verified this user.": "U heeft deze gebruiker niet geverifieerd.",
"You have verified this user. This user has verified all of their sessions.": "U heeft deze gebruiker geverifieerd. Deze gebruiker heeft al zijn sessies geverifieerd.",
"Someone is using an unknown session": "Iemand gebruikt een onbekende sessie",
"This room is end-to-end encrypted": "Dit gesprek is eind-tot-eind-versleuteld",
"Everyone in this room is verified": "Iedereen in dit gesprek is geverifieerd",
"Some sessions for this user are not trusted": "Sommige sessies van deze gebruiker zijn niet vertrouwd",
"All sessions for this user are trusted": "Alle sessies van deze gebruiker zijn vertrouwd",
"Some sessions in this encrypted room are not trusted": "Sommige sessies in dit versleutelde gesprek zijn niet vertrouwd",
"All sessions in this encrypted room are trusted": "Alle sessies in dit versleutelde gesprek zijn vertrouwd",
"Mod": "Mod",
"rooms.": "gesprekken.",
"Recent rooms": "Actuele gesprekken",
"Direct Messages": "Tweegesprekken",
"If disabled, messages from encrypted rooms won't appear in search results.": "Dit moet aan staan om te kunnen zoeken in versleutelde gesprekken.",
"Indexed rooms:": "Geïndexeerde gesprekken:",
"Cross-signing and secret storage are enabled.": "Kruiselings ondertekenen en sleutelopslag zijn ingeschakeld.",
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Uw account heeft een identiteit voor kruiselings ondertekenen in de sleutelopslag, maar deze is nog niet vertrouwd door de huidige sessie.",
"Cross-signing and secret storage are not yet set up.": "Kruiselings ondertekenen en sleutelopslag zijn nog niet ingesteld.",
"Bootstrap cross-signing and secret storage": "Kruiselings ondertekenen en sleutelopslag instellen",
"Reset cross-signing and secret storage": "Kruiselings ondertekenen en sleutelopslag opnieuw instellen",
"Cross-signing public keys:": "Publieke sleutels voor kruiselings ondertekenen:",
"Cross-signing private keys:": "Privésleutels voor kruiselings ondertekenen:",
"in secret storage": "in de sleutelopslag",
"Secret storage public key:": "Sleutelopslag publieke sleutel:",
"in account data": "in accountinformatie",
"Securely cache encrypted messages locally for them to appear in search results, using ": "Sla versleutelde berichten beveiligd op om ze weer te geven in de zoekresultaten, door gebruik te maken van ",
" to store messages from ": " om berichten op te slaan van ",
"Manage": "Beheren",
"Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbind deze sessie met de sleutelback-up voordat u zich afmeldt. Dit voorkomt dat u sleutels verliest die alleen op deze sessie voorkomen.",
"Connect this session to Key Backup": "Verbind deze sessie met de sleutelback-up",
"Backup has a <validity>valid</validity> signature from this user": "De back-up heeft een <validity>geldige</validity> ondertekening van deze gebruiker",
"Backup has a <validity>invalid</validity> signature from this user": "De back-up heeft een <validity>ongeldige</validity> ondertekening van deze gebruiker",
"Backup has a signature from <verify>unknown</verify> user with ID %(deviceId)s": "De back-up heeft een ondertekening van een <verify>onbekende</verify> gebruiker met ID %(deviceId)s",
"Backup has a signature from <verify>unknown</verify> session with ID %(deviceId)s": "De back-up heeft een ondertekening van een <verify>onbekende</verify> sessie met ID %(deviceId)s",
"Backup has a <validity>valid</validity> signature from this session": "De back-up heeft een <validity>geldige</validity> ondertekening van deze sessie",
"Backup has an <validity>invalid</validity> signature from this session": "De back-up heeft een <validity>ongeldige</validity> ondertekening van deze sessie",
"Backup has a <validity>valid</validity> signature from <verify>verified</verify> session <device></device>": "De back-up heeft een <validity>geldige</validity> ondertekening van een <verify>geverifieerde</verify> sessie <device></device>",
"Backup has a <validity>valid</validity> signature from <verify>unverified</verify> session <device></device>": "De back-up heeft een <validity>geldige</validity> ondertekening van een <verify>ongeverifieerde</verify> sessie <device></device>",
"Backup has an <validity>invalid</validity> signature from <verify>verified</verify> session <device></device>": "De back-up heeft een <validity>ongeldige</validity> ondertekening van een <verify>geverifieerde</verify> sessie <device></device>",
"Backup has an <validity>invalid</validity> signature from <verify>unverified</verify> session <device></device>": "De back-up heeft een <validity>ongeldige</validity> ondertekening van een <verify>ongeverifieerde</verify> sessie <device></device>",
"Backup is not signed by any of your sessions": "De back-up is door geen van uw sessies ondertekend",
"This backup is trusted because it has been restored on this session": "Deze back-up is vertrouwd omdat hij hersteld is naar deze sessie",
"Backup key stored: ": "Back-upsleutel opgeslagen: ",
"Your keys are <b>not being backed up from this session</b>.": "Uw sleutels worden <b>niet geback-upt van deze sessie</b>.",
"Clear notifications": "Meldingen wissen",
"You should <b>remove your personal data</b> from identity server <idserver /> before disconnecting. Unfortunately, identity server <idserver /> is currently offline or cannot be reached.": "U moet uw <b>persoonlijke informatie</b> van de identiteitsserver <idserver /> <b>verwijderen</b> voordat u zich ontkoppelt. Helaas kan de identiteitsserver <idserver /> op dit moment niet worden bereikt. Mogelijk is hij offline.",
"Your homeserver does not support cross-signing.": "Uw thuisserver biedt geen ondersteuning voor kruiselings ondertekenen.",
"Homeserver feature support:": "Functies ondersteund door thuisserver:",
"exists": "bestaat"
}

View file

@ -47,25 +47,25 @@
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
"Who would you like to add to this community?": "Kven vil du leggja til i dette samfunnet?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Åtvaring: alle du legg til i eit samfunn vert offentleg synleg til alle som kan samfunns-IDen",
"Invite new community members": "Byd nye samfunnsmedlemer inn",
"Invite to Community": "Byd inn til Samfunn",
"Which rooms would you like to add to this community?": "Kva rom vil du leggja til i dette samfunnet?",
"Show these rooms to non-members on the community page and room list?": "Vis desse romma til ikkje-medlemer på samfunnssida og romlista?",
"Add rooms to the community": "Legg til rom i samfunnet",
"Who would you like to add to this community?": "Kven vil du leggja til i dette fellesskapet?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Åtvaring: alle du legg til i eit fellesskap blir offentleg synleg til alle som kan fellesskaps-IDen",
"Invite new community members": "Inviter nye fellesskapsmedlem",
"Invite to Community": "Inviter til Felleskapet",
"Which rooms would you like to add to this community?": "Kva rom vil du leggja til i dette fellesskapet?",
"Show these rooms to non-members on the community page and room list?": "Vise desse romma til ikkje-medlem på fellesskapssida og romkatalogen?",
"Add rooms to the community": "Legg til rom i fellesskapet",
"Room name or alias": "Romnamn eller alias",
"Add to community": "Legg til i samfunn",
"Failed to invite the following users to %(groupId)s:": "Fylgjande brukarar lét seg ikkje byda inn i %(groupId)s:",
"Failed to invite users to community": "Fekk ikkje til å byda brukarar inn til samfunnet",
"Add to community": "Legg til i fellesskapet",
"Failed to invite the following users to %(groupId)s:": "Fekk ikkje til å invitera følgjande brukarar i %(groupId)s:",
"Failed to invite users to community": "Fekk ikkje til å invitera brukarar til fellesskapet.",
"Failed to invite users to %(groupId)s": "Fekk ikkje til å byda brukarar inn til %(groupId)s",
"Failed to add the following rooms to %(groupId)s:": "Fylgjande rom lét seg ikkje leggja til i %(groupId)s:",
"Failed to add the following rooms to %(groupId)s:": "Fekk ikkje til å invitera følgjande rom til %(groupId)s:",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikkje tillating til å senda deg varsel - ver venleg og sjekk nettlesarinnstillingane dine",
"Riot was not given permission to send notifications - please try again": "Riot fekk ikkje tillating til å senda varsel - ver venleg og prøv igjen",
"Unable to enable Notifications": "Klarte ikkje å skru på Varsel",
"This email address was not found": "Denne epostadressa var ikkje funnen",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Epostadressa di ser ikkje ut til å vera tilknytta ein Matrix-ID på denne heimtenaren.",
"Default": "Utgangspunktinnstilling",
"Default": "Opphavleg innstilling",
"Restricted": "Avgrensa",
"Moderator": "Moderator",
"Admin": "Administrator",
@ -86,10 +86,10 @@
"Room %(roomId)s not visible": "Rommet %(roomId)s er ikkje synleg",
"Missing user_id in request": "Manglande user_id i førespurnad",
"Usage": "Bruk",
"Searches DuckDuckGo for results": "Røkjer DuckDuckGo etter resultat",
"Searches DuckDuckGo for results": "Søker på DuckDuckGo for resultat",
"Your language of choice": "Ditt valde mål",
"e.g. %(exampleValue)s": "t.d. %(exampleValue)s",
"/ddg is not a command": "/ddg er ikkje eit påbod",
"/ddg is not a command": "/ddg er ikkje ein kommando",
"Changes your display nickname": "Forandrar kallenamnet ditt",
"Invites user with given id to current room": "Byd brukarar med den gjevne IDen inn til det noverande rommet",
"Joins room with given alias": "Gjeng inn i eit rom med det gjevne aliaset",
@ -114,20 +114,20 @@
"Analytics": "Statistikk",
"Unable to capture screen": "Klarte ikkje ta opp skjermen",
"Existing Call": "Samtale er i gang",
"To use it, just wait for autocomplete results to load and tab through them.": "For å bruka han, vent på at resultata fyller seg ut og tab gjennom dei.",
"To use it, just wait for autocomplete results to load and tab through them.": "For å bruka den, vent på at resultata fyller seg ut og tab gjennom dei.",
"Deops user with given id": "AvOPar brukarar med den gjevne IDen",
"Opens the Developer Tools dialog": "Opnar Utviklarverktøy-tekstboksen",
"Unverify": "Fjern godkjenning",
"Verify...": "Godkjenn...",
"Which officially provided instance you are using, if any": "Kva offisielt gjevne instanse du brukar, viss nokon",
"The remote side failed to pick up": "Den andre sida tok ikkje røret",
"Verified key": "Godkjend nykel",
"Verified key": "Godkjend nøkkel",
"Displays action": "Visar handlingar",
"Reason": "Grunnlag",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s sa ja til innbydinga frå %(displayName)s.",
"%(targetName)s accepted an invitation.": "%(targetName)s sa ja til ei innbyding.",
"%(senderName)s requested a VoIP conference.": "%(senderName)s bad om ei VoIP-gruppesamtale.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s baud %(targetName)s inn.",
"%(senderName)s invited %(targetName)s.": "%(senderName)s inviterte %(targetName)s.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s stengde %(targetName)s ute.",
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s endra visingsnamnet sitt til %(displayName)s.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s sette visingsnamnet sitt som %(displayName)s.",
@ -149,13 +149,13 @@
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sende eit bilete.",
"Someone": "Nokon",
"(not supported by this browser)": "(ikkje støtta av denne nettlesaren)",
"%(senderName)s answered the call.": "%(senderName)s tok røret.",
"%(senderName)s answered the call.": "%(senderName)s svarde på samtalen.",
"(could not connect media)": "(klarte ikkje å kopla media saman)",
"(no answer)": "(ingen svar)",
"(unknown failure: %(reason)s)": "(ukjend mislukking: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s enda samtala.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s baud %(targetDisplayName)s inn til rommet.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemer frå då dei vart innbodne.",
"(unknown failure: %(reason)s)": "(ukjend feil: %(reason)s)",
"%(senderName)s ended the call.": "%(senderName)s avslutta samtalen.",
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterte %(targetDisplayName)s til å bli med i rommet.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemar frå då dei vart invitert.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemer frå då dei kom inn.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde den framtidige romhistoria tilgjengeleg for alle rommedlemer.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde den framtidige romhistoria tilgjengelg for kven som helst.",
@ -167,10 +167,10 @@
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget lagt til av %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget fjerna av %(senderName)s",
"Failure to create room": "Klarte ikkje å laga rommet",
"Server may be unavailable, overloaded, or you hit a bug.": "tenaren er kanskje utilgjengeleg, overlasta elles so traff du ein bøgg.",
"Server may be unavailable, overloaded, or you hit a bug.": "Serveren er kanskje utilgjengeleg, overlasta elles så traff du ein bug.",
"Send anyway": "Send likevel",
"Send": "Send",
"Unnamed Room": "Rom utan Namn",
"Unnamed Room": "Rom utan namn",
"Your browser does not support the required cryptography extensions": "Nettlesaren din støttar ikkje dei naudsynte kryptografiske utvidingane",
"Not a valid Riot keyfile": "Ikkje ei gyldig Riot-nykelfil",
"Authentication check failed: incorrect password?": "Godkjenningssjekk mislukkast: urett passord?",
@ -290,7 +290,7 @@
"Ignore": "Oversjå",
"Mention": "Nemn",
"Invite": "Byd inn",
"Enable inline URL previews by default": "Skru URL-førehandsvisingar i tekstfeltet på",
"Enable inline URL previews by default": "Skru URL-førehandsvising i tekstfeltet på",
"Share Link to User": "Del Brukarlenkje",
"User Options": "Brukarinnstillingar",
"Direct chats": "Direktesamtaler",
@ -349,7 +349,7 @@
"Forget room": "Gløym rom",
"Search": "Søk",
"Share room": "Del rom",
"Community Invites": "Samfunnsinnbydingar",
"Community Invites": "Fellesskapsinvitasjonar",
"Invites": "Innbydingar",
"Favourites": "Yndlingar",
"Rooms": "Rom",
@ -397,12 +397,12 @@
"Local addresses for this room:": "Lokaladresser for dette rommet:",
"This room has no local addresses": "Dette rommer har ingen lokaladresser",
"New address (e.g. #foo:%(localDomain)s)": "Ny adresse (t.d. #foo:%(localDomain)s)",
"Invalid community ID": "Ugangbar samfunnsID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' er ikkje ein gangbar samfunnsID",
"Invalid community ID": "Ugyldig fellesskaps-ID",
"'%(groupId)s' is not a valid community ID": "'%(groupId)s' er ikkje ein gyldig fellesskaps-ID",
"Flair": "Særpreg",
"Showing flair for these communities:": "Viser særpreg for desse samfunna:",
"This room is not showing flair for any communities": "Dette rommet viser ikkje særpreg for nokre samfunn",
"New community ID (e.g. +foo:%(localDomain)s)": "Ny samfunnsID (t.d. +foo:%(localDomain)s)",
"New community ID (e.g. +foo:%(localDomain)s)": "Ny fellesskaps-ID (t.d. +foo:%(localDomain)s)",
"You have <a>enabled</a> URL previews by default.": "Du har <a>skrudd URL-førehandsvisingar på</a> i utgangspunktet.",
"You have <a>disabled</a> URL previews by default.": "Du har <a>skrudd URL-førehandsvisingar av</a> i utgangspunktet.",
"URL previews are enabled by default for participants in this room.": "URL-førehandsvisingar er skrudd på i utgangspunktet for dette rommet.",
@ -450,23 +450,23 @@
"Sign in": "Logg inn",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Viss du ikkje seier kva epostadresse du vil bruka vil du ikkje kunna attendestille passordet ditt. Er du sikker?",
"Register": "Meld deg inn",
"Remove from community": "Fjern frå samfunnet",
"Disinvite this user from community?": "Fjern denne brukaren si innbyding til samfunnet?",
"Remove this user from community?": "Fjern denne brukaren frå samfunnet?",
"Remove from community": "Fjern frå fellesskapet",
"Disinvite this user from community?": "Fjerne denne brukaren sin invitasjon til fellesskapet?",
"Remove this user from community?": "Fjerne denne brukaren frå fellesskapet?",
"Failed to withdraw invitation": "Fekk ikkje til å taka innbydinga att",
"Failed to remove user from community": "Fekk ikkje til å fjerna brukaren frå samfunnet",
"Failed to remove user from community": "Fekk ikkje til å fjerna brukaren frå fellesskapet",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Er du sikker på at du vil fjerna '%(roomName)s' frå %(groupId)s?",
"Removing a room from the community will also remove it from the community page.": "Å fjerna eit rom frå samfunnet fjernar det frå samfunnssida òg.",
"Removing a room from the community will also remove it from the community page.": "Fjerning av rom frå fellesskapet vil i tillegg fjerna det frå fellesskapssida.",
"Remove": "Fjern",
"Failed to remove room from community": "Fekk ikkje til å fjerna rommet frå samfunnet",
"Failed to remove room from community": "Fekk ikkje til å fjerna rommet frå fellesskapet",
"Failed to remove '%(roomName)s' from %(groupId)s": "Fekk ikkje til å fjerna '%(roomName)s' frå %(groupId)s",
"Something went wrong!": "Noko gjekk gale!",
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kunne ikkje oppdatera synligheita til '%(roomName)s' i %(groupId)s.",
"Visibility in Room List": "Synligheit i Romlista",
"Visible to everyone": "Synleg for alle",
"Only visible to community members": "Berre synleg for samfunnsmedlemer",
"Only visible to community members": "Berre synleg for medlemar av fellesskapet",
"Something went wrong when trying to get your communities.": "Noko gjekk gale med framhentinga av samfunna dine.",
"Display your community flair in rooms configured to show it.": "Vis samfunnssærpreget ditt i rom som er stilt inn til å visa det.",
"Display your community flair in rooms configured to show it.": "Vis fellesskapsetiketten din i rom som er stilt inn til å visa det.",
"You're not currently a member of any communities.": "Du er for augeblunket ikkje medlem i nokre samfunn.",
"Yes, I want to help!": "Ja, eg vil vera til nytte!",
"You are not receiving desktop notifications": "Du fær ikkje skrivebordsvarsel",
@ -571,11 +571,11 @@
"Send logs": "Send loggar inn",
"Unavailable": "Utilgjengeleg",
"Changelog": "Endringslogg",
"Something went wrong whilst creating your community": "Noko gjekk gale med laginga av samfunnet ditt",
"Create Community": "Lag Samfunn",
"Community Name": "Samfunnsnamn",
"Something went wrong whilst creating your community": "Noko gjekk gale med laginga av felleskapet ditt",
"Create Community": "Lag Fellesskap",
"Community Name": "Fellesskapsnamn",
"Example": "Døme",
"Community ID": "Samfunns-ID",
"Community ID": "Fellesskap-ID",
"example": "døme",
"Create": "Lag",
"Create Room": "Lag eit Rom",
@ -584,8 +584,8 @@
"Minimize apps": "Legg æppar ned",
"Confirm Removal": "Godkjenn Fjerning",
"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.": "Er du sikker på at du vil fjerna (sletta) denne hendingen? Merk deg at vis du slettar eit romnamn eller ei emneendring kan det gjera om på endringa.",
"Community IDs cannot be empty.": "Samfunns-IDfeltet kan ikkje vera tomt.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Samfunns-IDar kan berre innehalda teikna a-z, 0-9, eller '=_-./'",
"Community IDs cannot be empty.": "Feltet Fellesskap-ID kan ikkje vera tomt.",
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Fellesskap-IDar kan berre innehalda teikna a-z, 0-9, eller '=_-./'",
"Unknown error": "Noko ukjend gjekk galt",
"Incorrect password": "Urett passord",
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Dette gjer at brukaren din vert ubrukeleg til evig tid. Du kjem ikkje til å kunna logga inn, og ingen andre kjem til å kunna melde seg inn med den gamle brukar-IDen din. Brukaren din forlét òg alle rom han er i, og brukardetaljane dine vil verta fjerna frå identitetstenaren. <b>Denne handlinga kan ikkje gjerast om.</b>",
@ -642,7 +642,7 @@
"Share Room": "Del Rom",
"Link to most recent message": "Lenk til den nyaste meldinga",
"Share User": "Del Brukar",
"Share Community": "Del Samfunn",
"Share Community": "Del Fellesskap",
"Share Room Message": "Del Rommelding",
"Link to selected message": "Lenk til den valde meldinga",
"COPY": "KOPIER",
@ -673,7 +673,7 @@
"Forget": "Gløym",
"Low Priority": "Lågrett",
"Direct Chat": "Direktesamtale",
"View Community": "Sjå Samfunn",
"View Community": "Sjå Fellesskap",
"Sorry, your browser is <b>not</b> able to run Riot.": "Orsak, nettlesaren din klarer <b>ikkje</b> å køyra Riot.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot brukar mange omfattande nettlesarfunksjonar, og nokre av dei er ikkje tilgjengelege eller i utprøving i nettlesaren din.",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Med denne nettlesaren, er det mogleg at synet og kjensla av applikasjonen er fullstendig gale, og nokre eller alle funksjonar verkar kanskje ikkje. Viss du vil prøva likevel kan du gå fram, men då du må sjølv handtera alle vanskar du møter på!",
@ -682,44 +682,44 @@
"You must <a>register</a> to use this functionality": "Du må <a>melda deg inn</a> for å bruka denne funksjonen",
"You must join the room to see its files": "Du må fare inn i rommet for å sjå filene dets",
"There are no visible files in this room": "Det er ingen synlege filer i dette rommet",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML for samfunnssida di</h1>\n<p>\n Bruk den Lange Skildringa for å ynskja nye medlemer velkomen, eller gje ut viktige <a href=\"foo\">lenkjer</a>\n</p>\n<p>\n Du kan til og med bruka 'img'-merkelappar!\n</p>\n",
"Add rooms to the community summary": "Legg rom til i samfunnsoppsamanfattinga",
"<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML for samfunnssida di</h1>\n<p>\n Bruk den Lange Skildringa for å ynskja nye medlemer velkomen, eller gje ut viktige <a href=\"foo\">lenkjer</a>\n</p>\n<p>\n Du kan til og med bruka 'img' HTML-taggar!\n</p>\n",
"Add rooms to the community summary": "Legg rom til i samandraget for fellesskapet",
"Which rooms would you like to add to this summary?": "Kva rom ynskjer du å leggja til i samanfattinga?",
"Add to summary": "Legg til i samanfattinga",
"Failed to add the following rooms to the summary of %(groupId)s:": "Fekk ikkje til å leggja dei fylgjande romma til i samanfattinga av %(groupId)s:",
"Add a Room": "Legg eit Rom til",
"Failed to remove the room from the summary of %(groupId)s": "Fekk ikkje til å fjerna rommet frå samanfattinga av %(groupId)s",
"The room '%(roomName)s' could not be removed from the summary.": "Rommet '%(roomName)s' lét seg ikkje fjerna frå samanfattinga.",
"Add users to the community summary": "Legg brukarar til i samfunnsamanfattinga",
"Add users to the community summary": "Legg brukarar til i samandraget for fellesskapet",
"Who would you like to add to this summary?": "Kven vil du leggja til i samanfattinga?",
"Failed to add the following users to the summary of %(groupId)s:": "Fekk ikkje til å leggja fylgjande brukarar til i samanfattinga av %(groupId)s:",
"Add a User": "Legg ein Brukar til",
"Failed to remove a user from the summary of %(groupId)s": "Fekk ikkje til å fjerna brukaren frå samanfattinga av %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "Brukaren '%(displayName)s' lét seg ikkje fjerna frå samanfattinga.",
"Failed to upload image": "Fekk ikkje til å lasta biletet opp",
"Failed to update community": "Fekk ikkje til å oppdatera samfunnet",
"Failed to update community": "Fekk ikkje til å oppdatera fellesskapet",
"Unable to accept invite": "Fekk ikkje til å seia ja til innbydinga",
"Unable to join community": "Fekk ikkje til å fara inn i samfunnet",
"Leave Community": "Far frå Samfunnet",
"Unable to join community": "Fekk ikkje til å bli med i fellesskapet",
"Leave Community": "Forlat fellesskapet",
"Leave %(groupName)s?": "Far frå %(groupName)s?",
"Unable to leave community": "Fekk ikkje til å fara frå samfunnet",
"Community Settings": "Samfunninnstillingar",
"Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Endringar gjort på <bold1>samfunnsnamnet</bold1> og <bold2>samfunnsavataren</bold2> vert kanskje ikkje synleg forandre før opp til 30 minutt har gått.",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Desse romma vert viste for samfunnsmedlemer på samfunnsida. Samfunnsmedlemer kan fara inn i romma ved å klikka på dei.",
"Add rooms to this community": "Legg rom til i samfunnet",
"Unable to leave community": "Fekk ikkje til å forlate fellesskapet",
"Community Settings": "Fellesskapsinnstillingar",
"Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Endringar gjort på <bold1>felleskapsnamn</bold1> og <bold2>felleskapsavatar</bold2> blir kanskje ikkje synleg for andre før etter 30 minutt.",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Desse romma vert viste for medlem i felleskapet på felleskapssida. Felleskapsmedlemar kan bli med i romma ved å klikke på dei.",
"Add rooms to this community": "Legg rom til i fellesskapet",
"Featured Rooms:": "Utvalde Rom:",
"Featured Users:": "Utvalde Brukarar:",
"%(inviter)s has invited you to join this community": "%(inviter)s baud deg inn til dette samfunnet",
"Join this community": "Far inn i samfunnet",
"Leave this community": "Far frå samfunnet",
"You are an administrator of this community": "Du er administrator i dette samfunnet",
"You are a member of this community": "Du er eit medlem av dette samfunnet",
"Who can join this community?": "Kven kan verta med i samfunnet?",
"%(inviter)s has invited you to join this community": "%(inviter)s inviterte deg med i dette fellesskapet",
"Join this community": "Bli med i dette felleskapet",
"Leave this community": "Forlat dette felleskapet",
"You are an administrator of this community": "Du er administrator av dette fellesskapet",
"You are a member of this community": "Du er medlem av dette fellesskapet",
"Who can join this community?": "Kven kan bli med i dette fellesskapet?",
"Everyone": "Alle",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Samfunnet ditt har ikkje ei Lang Skilrding (ei HTML-side for å visa til samfunnsmedlem.) <br/>Klikk her for å opna innstillingar og gje det ei!",
"Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Fellesskapet ditt har ikkje ein lang beskrivelse (HTML-side for å visa til fellesskapsmedlem.) <br/>Klikk her for å opna innstillingar og legge dette til!",
"Long Description (HTML)": "Lang Skildring (HTML)",
"Description": "Skildring",
"Community %(groupId)s not found": "Fann ikkje samfunnet %(groupId)s",
"Community %(groupId)s not found": "Fann ikkje fellesskapet %(groupId)s",
"Failed to load %(groupId)s": "Fekk ikkje til å lasta %(groupId)s",
"Failed to reject invitation": "Fekk ikkje til å seia nei til innbyding",
"This room is not public. You will not be able to rejoin without an invite.": "Dette rommet er ikkje offentleg. Du kjem ikkje til å kunna koma inn att utan ei innbyding.",
@ -737,13 +737,13 @@
"Logout": "Loggar ut",
"Your Communities": "Dine Samfunn",
"Error whilst fetching joined communities": "Noko gjekk gale med innhentinga av samfunna du er i",
"Create a new community": "Lag eit nytt samfunn",
"Create a new community": "Lag eit nytt fellesskap",
"You have no visible notifications": "Du har ingen synlege varsel",
"Members": "Medlemer",
"Invite to this room": "Byd inn til rommet",
"Files": "Filer",
"Notifications": "Varsel",
"Invite to this community": "Byd inn til samfunnet",
"Invite to this community": "Inviter til dette fellesskapet",
"The server may be unavailable or overloaded": "Tenaren er kanskje utilgjengeleg eller overlasta",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slett rommaliaset %(alias)s og fjern %(name)s frå utvalet?",
"Remove %(name)s from the directory?": "Fjern %(name)s frå utvalet?",
@ -866,9 +866,9 @@
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Når nokon legg ein URL med i meldinga si, kan ei URL-førehandsvising visast for å gje meir info om lenkja slik som tittelen, skildringa, og eit bilete frå nettsida.",
"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?": "Du held på å verta teken til ei tredje-partisside so du kan godkjenna brukaren din til bruk med %(integrationsUrl)s. Vil du gå fram?",
"Token incorrect": "Teiknet er gale",
"Filter community members": "Filtrer samfunnsmedlemer",
"Filter community members": "Filtrer fellesskapssmedlemar",
"Custom Server Options": "Tilpassa tenar-innstillingar",
"Filter community rooms": "Filtrer samfunnsrom",
"Filter community rooms": "Filtrer rom i fellesskapet",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda <UsageDataLink>anonym brukardata</UsageDataLink>. Dette brukar ei datakake (ver venleg og sjå på <PolicyLink>Datakakeretningslinene våre</PolicyLink>).",
"Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda <UsageDataLink>anonym brukardata</UsageDataLink>. Dette brukar ei datakake.",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du brukar Riktekst-innstillinga på Riktekstfeltet",
@ -887,8 +887,8 @@
"Custom": "Sjølvsett",
"Failed to set Direct Message status of room": "Fekk ikkje til å setja Direktemelding-tilstanden til rommet",
"Did you know: you can use communities to filter your Riot.im experience!": "Visste du at: du kan bruka samfunn for å filtrera Riot.im-opplevinga di!",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "For å setja opp eit filter, drag ein samfunnsavatar bort til filterpanelet til venstre på skjermen. Du kan klikka på ein avatar i filterpanelet når som helst for å sjå berre romma og folka tilknytta det samfunnet.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Lag eit samfunn for å føra saman brukarar og rom! Bygg di eiga heimeside for å kreva din del av Matrix-verda.",
"To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "For å setja opp eit filter, dra ein fellesskapsavatar bort til filterpanelet til venstre på skjermen. Du kan klikka på ein avatar i filterpanelet når som helst for å sjå berre romma og folka tilknytta det fellesskapet.",
"Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Lag eit fellesskap for å føra saman brukarar og rom! Bygg di eiga heimeside for å kreva din del av Matrix-verda.",
"Unable to look up room ID from server": "Klarte ikkje å henta rom-ID frå tenaren",
"Server may be unavailable, overloaded, or search timed out :(": "Tenaren er kanskje utilgjengeleg, overlasta, elles så vart søket tidsavbrote :(",
"Clear filter": "Tøm filter",
@ -1014,7 +1014,7 @@
"Replying With Files": "Send svar med filer",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Nett no er det ikkje mogleg å senda svar med ei fil. Vil du lasta opp denne fila utan å senda svaret?",
"The file '%(fileName)s' failed to upload.": "Fila '%(fileName)s' vart ikkje lasta opp.",
"The server does not support the room version specified.": "Tenaren støttar ikkje den spesifikke versjonen av rommet.",
"The server does not support the room version specified.": "Serveren støttar ikkje den spesifikke versjonen av rommet.",
"Name or Matrix ID": "Namn eller Matrix ID",
"Registration Required": "Registrering er obligatorisk",
"You need to register to do this. Would you like to register now?": "Du må registrera for å gjera dette. Ynskjer du å registrera no?",
@ -1045,5 +1045,60 @@
"Sends the given message coloured as a rainbow": "Sender den bestemte meldinga farga som ein regnboge",
"Displays list of commands with usages and descriptions": "Viser ei liste over kommandoar med bruksområde og skildringar",
"%(senderName)s made no change.": "%(senderName)s utførde ingen endring.",
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s oppgraderte dette rommet."
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s oppgraderte dette rommet.",
"The version of Riot": "Gjeldande versjon av Riot",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Om du brukar Riot på ein innretning som er satt opp for touch-skjerm",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Om du nyttar funksjonen 'breadcrumbs' (avatarane over romkatalogen)",
"Whether you're using Riot as an installed Progressive Web App": "Om din Riot er installert som ein webapplikasjon (Progressive Web App)",
"Your user agent": "Din nettlesar (User-Agent)",
"The information being sent to us to help make Riot better includes:": "Informasjon sendt til oss for å forbetre Riot inkluderar:",
"There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det er ukjende sesjonar i dette rommet: om går vidare utan å verifisere dei, kan andre avlytte samtalen.",
"If you cancel now, you won't complete verifying the other user.": "Om du avbryter no, vil dette stoppe verifikasjonsprosessen for den andre brukaren.",
"If you cancel now, you won't complete verifying your other session.": "Om du avbryter no, vil dette stoppe verifikasjonsprosessen for den andre sesjonen.",
"If you cancel now, you won't complete your secret storage operation.": "Om du avbryter no, vil dette stoppe lagringa av den hemmelege passfrasen.",
"Cancel entering passphrase?": "Avbryte inntasting av passfrase ?",
"Setting up keys": "Setter opp nøklar",
"Verify this session": "Stadfest denne sesjonen",
"Encryption upgrade available": "Kryptering kan oppgraderast",
"Set up encryption": "Sett opp kryptering",
"Unverified session": "Uverifisert sesjon",
"Identity server has no terms of service": "Identitetsserveren manglar bruksvilkår",
"This action requires accessing the default identity server <server /> to validate an email address or phone number, but the server does not have any terms of service.": "Denne handlinga krev kommunikasjon mot <server />(standard identitetsserver) for å verifisere e-post eller telefonnummer, men serveren manglar bruksvilkår.",
"Only continue if you trust the owner of the server.": "Gå vidare så lenge du har tillit til eigar av serveren.",
"Trust": "Tillat",
"Custom (%(level)s)": "Tilpassa (%(level)s)",
"Error upgrading room": "Feil ved oppgradering av rom",
"Double check that your server supports the room version chosen and try again.": "Sjekk at server støttar romversjon, og prøv på nytt.",
"Verifies a user, session, and pubkey tuple": "Verifiser brukar, sesjon eller public key objekt (pubkey tuple)",
"Unknown (user, session) pair:": "Ukjent (brukar,sesjon) par:",
"Session already verified!": "Sesjon er tidligare verifisert!",
"WARNING: Session already verified, but keys do NOT MATCH!": "ÅTVARING: Sesjon er tidligare verifisert, men nøklane STEMMER IKKJE!",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ÅTVARING: NØKKELVERIFIKASJON FEILA! Signeringsnøkkel for %(userId)s og sesjon %(deviceId)s er \"%(fprint)s\" stemmer ikkje med innsendt nøkkel \"%(fingerprint)s\". Dette kan vere teikn på at kommunikasjonen er avlytta!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Innsendt signeringsnøkkel er lik nøkkelen du mottok frå %(userId)s med sesjon %(deviceId)s. Sesjonen no er verifisert.",
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s satte rommet til offentleg for alle som har linken.",
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s avgrensa romtilgang til inviterte deltakarar.",
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s satte tilgangsregelen til %(rule)s",
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s har opna for gjestetilgang i rommet.",
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s har hindra gjestetilgang i rommet.",
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s endra gjestetilgang til %(rule)s",
"%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s satte etikett for %(groups)s i dette rommet.",
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s deaktiverte etikettar for %(groups)s i dette rommet.",
"%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s har aktivert etikettar for %(newGroups)s, og deaktivert etikettar for %(oldGroups)s i dette rommet.",
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s la til %(addedAddresses)s og %(count)s andre adresser i dette rommet",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s la til %(addedAddresses)s som adresser for dette rommet.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s la til %(addedAddresses)s som adresse for dette rommet.",
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s fjerna %(removedAddresses)s og %(count)s andre som adresse for dette rommet",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s fjerna %(removedAddresses)s som adresser for dette rommet.",
"%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s fjerna %(removedAddresses)s som adresse for dette rommet.",
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s fjerna %(countRemoved)s og la til %(countAdded)s adresser for dette rommet",
"%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s la til %(addedAddresses)s og tok vekk %(removedAddresses)s som adresser for dette rommet.",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s satte standardadressa for dette rommet til %(address)s.",
"%(senderName)s removed the main address for this room.": "%(senderName)s fjerna standardadressa for dette rommet.",
"%(senderName)s placed a voice call.": "%(senderName)s starta eit taleanrop.",
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s starta eit taleanrop. (ikkje støtta av denne nettlesaren)",
"%(senderName)s placed a video call.": "%(senderName)s starta ein videosamtale.",
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s starta ein videosamtale. (ikkje støtta av denne nettlesaren)",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s trekte tilbake invitasjonen for at %(targetDisplayName)s kan bli medlem i rommet.",
"You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du er administrator for dette fellesskapet. Du kan ikkje melde deg inn igjen utan at du har invitasjon frå ein annan administrator.",
"Want more than a community? <a>Get your own server</a>": "Treng du meir enn eit fellesskap? <a>Skaff din eigen server</a>"
}

View file

@ -21,7 +21,7 @@
"Curve25519 identity key": "Ключ идентификации Curve25519",
"Deactivate Account": "Закрыть аккаунт",
"Decryption error": "Ошибка расшифровки",
"Default": "Участник",
"Default": "По умолчанию",
"Deops user with given id": "Снимает полномочия оператора с пользователя с заданным ID",
"Device ID": "ID устройства",
"Displays action": "Отображение действий",
@ -924,7 +924,7 @@
"Failed to invite users to the room:": "Не удалось пригласить пользователей в комнату:",
"Upgrades a room to a new version": "Модернизирует комнату до новой версии",
"Sets the room name": "Устанавливает название комнаты",
"Forces the current outbound group session in an encrypted room to be discarded": "Принудительно отбрасывает текущий сеанс исходящей группы в зашифрованной комнате",
"Forces the current outbound group session in an encrypted room to be discarded": "Принудительно отбрасывает текущая сессия исходящей группы в зашифрованной комнате",
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s модернизировал эту комнату.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s добавил %(addedAddresses)s к списку адресов комнаты.",
"%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s добавил %(addedAddresses)s к списку адресов комнаты.",
@ -1576,13 +1576,13 @@
"You are still <b>sharing your personal data</b> on the identity server <idserver />.": "Вы все еще <b> делитесь своими личными данными </b> на сервере идентификации <idserver />.",
"We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Мы рекомендуем вам удалить свои адреса электронной почты и номера телефонов с сервера идентификации перед отключением.",
"Disconnect anyway": "Отключить в любом случае",
"You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.": "В настоящее время вы используете <server></server> для обнаружения и быть найденным существующими контактами, которые вы знаете. Вы можете изменить ваш сервер идентификации ниже.",
"You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.": "В настоящее время вы используете <server></server> для поиска вами ваших контактов а также вас вашими оппонентами. Вы можете изменить ваш сервер идентификации ниже.",
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Если вы не хотите использовать <server /> для обнаружения вас и быть обнаруженным вашими существующими контактами, введите другой идентификационный сервер ниже.",
"You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Вы в настоящее время не используете идентификационный сервер. Чтобы обнаружить и быть обнаруженным существующими контактами, которых вы знаете, добавьте один ниже.",
"You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Вы в настоящее время не используете идентификационный сервер. Чтобы найти и быть найденным существующими контактами, которые вы знаете, добавьте один ниже.",
"Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Отключение от сервера идентификации будет означать, что другие пользователи не смогут вас обнаружить, и вы не сможете приглашать других по электронной почте или по телефону.",
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Использование сервера идентификации не обязательно. Если вы решите не использовать сервер идентификации, другие пользователи не смогут обнаружить вас, и вы не сможете пригласить других по электронной почте или телефону.",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Подтвердите условия предоставления услуг сервера идентификации (%(serverName)s), чтобы вас можно было обнаружить по адресу электронной почты или номеру телефона.",
"Discovery": "Обнаружение",
"Discovery": "Поиск",
"Deactivate account": "Деактивировать аккаунт",
"Clear cache and reload": "Очистить кэш и перезагрузить",
"Always show the window menu bar": "Всегда показывать строку меню",
@ -1607,11 +1607,11 @@
"Complete": "Выполнено",
"Revoke": "Отмена",
"Share": "Делиться",
"Discovery options will appear once you have added an email above.": "Параметры обнаружения появятся после добавления электронной почты выше.",
"Discovery options will appear once you have added an email above.": "Параметры поиска по электронной почты появятся после добавления её выше.",
"Unable to revoke sharing for phone number": "Не удалось отменить общий доступ к номеру телефона",
"Unable to share phone number": "Не удается предоставить общий доступ к номеру телефона",
"Please enter verification code sent via text.": "Пожалуйста, введите проверочный код, высланный с помощью текста.",
"Discovery options will appear once you have added a phone number above.": "Параметры обнаружения появятся после добавления вышеуказанного номера телефона.",
"Discovery options will appear once you have added a phone number above.": "Параметры поиска по номеру телефона появятся после его добавления.",
"Remove %(email)s?": "Удалить %(email)s?",
"Remove %(phone)s?": "Удалить %(phone)s?",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Текстовое сообщение было отправлено +%(msisdn)s. Пожалуйста, введите проверочный код, который он содержит.",
@ -1715,5 +1715,36 @@
"Error adding ignored user/server": "Ошибка добавления игнорируемого пользователя/сервера",
"Error subscribing to list": "Ошибка при подписке на список",
"Send cross-signing keys to homeserver": "Отправка ключей перекрестной подписи на домашний сервер",
"Error upgrading room": "Ошибка обновления комнаты"
"Error upgrading room": "Ошибка обновления комнаты",
"Match system theme": "Тема системы",
"Show tray icon and minimize window to it on close": "Показать иконку в панели задач и свернуть окно при закрытии",
"The version of Riot": "Версия Riot",
"Show typing notifications": "Показывать уведомления о наборе",
"Delete %(count)s sessions|other": "Удалить %(count)s сессию",
"Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии",
"Enable audible notifications for this session": "Включить звуковые уведомления для этой сессии",
"Use an Integration Manager <b>(%(serverName)s)</b> to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями <b>%(serverName)s</b> для управления ботами, виджетами и стикерами.",
"Use an Integration Manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.",
"Manage integrations": "Управление интеграциями",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.",
"Sessions": "Сессии",
"Direct Messages": "Прямые сообщения",
"%(count)s sessions|other": "%(count)s сессий",
"Hide sessions": "Скрытые сессии",
"Enable 'Manage Integrations' in Settings to do this.": "Включите «Управление интеграциями» в настройках, чтобы сделать это.",
"Unknown sessions": "Неизвестные сессии",
"Help": "Помощь",
"If you cancel now, you won't complete verifying your other session.": "Если вы отмените сейчас, вы не завершите проверку вашей другой сессии.",
"Verify this session": "Проверьте эту сессию",
"Unverified session": "Непроверенная сессия",
"Verifies a user, session, and pubkey tuple": "Проверяет пользователя, сессию и публичные ключи",
"Unknown (user, session) pair:": "Неизвестная (пользователь:сессия) пара:",
"Session already verified!": "Сессия уже подтверждена!",
"Never send encrypted messages to unverified sessions from this session": "Никогда не отправляйте зашифрованные сообщения в непроверенные сессий из этой сессии",
"Never send encrypted messages to unverified sessions in this room from this session": "Никогда не отправляйте зашифрованные сообщения в непроверенные сессии в эту комнату из этой сессии",
"Your keys are <b>not being backed up from this session</b>.": "Ваши ключи <b>не резервируются с этой сессии</b>.",
"Server or user ID to ignore": "ID сервера или пользователя для игнорирования",
"Subscribed lists": "Подписанные списки",
"Subscribe": "Подписать",
"A session's public name is visible to people you communicate with": "Публичное имя сессии видны людям, с которыми вы общаетесь"
}

View file

@ -2136,5 +2136,15 @@
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) bëri hyrjen në një sesion të ri pa e verifikuar:",
"Ask this user to verify their session, or manually verify it below.": "Kërkojini këtij përdoruesi të verifikojë sesionin e vet, ose ta verifikojë më poshtë dorazi.",
"Manually Verify": "Verifikoje Dorazi",
"Verify by scanning": "Verifikoje me skanim"
"Verify by scanning": "Verifikoje me skanim",
"The version of Riot": "Versioni i Riot-it",
"Whether you're using Riot on a device where touch is the primary input mechanism": "Nëse po e përdorni Riot-in në një pajisje ku touch-i është mekanizmi parësor për input-e",
"Whether you're using Riot as an installed Progressive Web App": "Nëse po e përdorni Riot-in të instaluar si një Aplikacion Web Progresiv",
"Your user agent": "Agjenti juaj i përdoruesit",
"The information being sent to us to help make Riot better includes:": "Te të dhënat e dërguara te ne për të na ndihmuar ta bëjmë Riot-in më të mirë përfshihen:",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Sesioni që po provoni të verifikoni, nuk mbulon skanim kodesh QR apo verifikim emoji-sh, çka janë ato që Riot-i mbulon. Provoni me një tjetër klient.",
"You declined": "Hodhët poshtë",
"%(name)s declined": "%(name)s hodhi poshtë",
"accepting …": "po pranohet …",
"declining …": "po hidhet poshtë …"
}

View file

@ -1497,5 +1497,72 @@
"Space used:": "Kullanılan alan:",
"Indexed messages:": "İndekslenmiş mesajlar:",
"Number of rooms:": "Oda sayısı:",
"Enable inline URL previews by default": "Varsayılan olarak satır içi URL önizlemeleri aç"
"Enable inline URL previews by default": "Varsayılan olarak satır içi URL önizlemeleri aç",
"Waiting for %(displayName)s to verify…": "%(displayName)s ın doğrulaması için bekleniyor…",
"They match": "Eşleşiyorlar",
"They don't match": "Eşleşmiyorlar",
"Verify yourself & others to keep your chats safe": "Sohbetlerinizi güvenli tutmak için kendinizi & diğerlerini doğrulayın",
"Other users may not trust it": "Diğer kullanıcılar güvenmeyebilirler",
"Later": "Sonra",
"Review": "Gözden Geçirme",
"Workspace: %(networkName)s": "Çalışma alanı: %(networkName)s",
"Channel: %(channelName)s": "Kanal: %(channelName)s",
"Show less": "Daha az göster",
"Show more": "Daha fazla göster",
"in memory": "hafızada",
"in secret storage": "sır deposunda",
"Secret storage public key:": "Sır deposu açık anahtarı:",
"Your homeserver does not support session management.": "Anasunucunuz oturum yönetimini desteklemiyor.",
"Unable to load session list": "Oturum listesi yüklenemedi",
"Delete %(count)s sessions|other": "%(count)s oturumu sil",
"Delete %(count)s sessions|one": "%(count)s oturum sil",
"Public Name": "Açık İsim",
"rooms.": "odalar.",
"Manage": "Yönet",
"Enable": "Aç",
"The integration manager is offline or it cannot reach your homeserver.": "Entegrasyon yöneticisi çevrim dışı veya anasunucunuza erişemiyor.",
"Connect this session to Key Backup": "Anahtar Yedekleme için bu oturuma bağlanın",
"Backup is not signed by any of your sessions": "Yedek hiç bir oturumunuz tarafından imzalanmadı",
"This backup is trusted because it has been restored on this session": "Bu yedek güvenilir çünkü bu oturumda geri döndürüldü",
"Backup key stored: ": "Yedek anahtarı depolandı: ",
"Enable desktop notifications for this session": "Bu oturum için masaüstü bildirimlerini aç",
"<a>Upgrade</a> to your own domain": "Kendi etkinlik alanınızı <a>yükseltin</a>",
"Use an Integration Manager to manage bots, widgets, and sticker packs.": "Botları, görsel bileşenleri ve çıkartma paketlerini yönetmek için bir entegrasyon yöneticisi kullanın.",
"Session ID:": "Oturum ID:",
"Session key:": "Oturum anahtarı:",
"Sessions": "Oturumlar",
"This user has not verified all of their sessions.": "Bu kullanıcı bütün oturumlarında doğrulanmamış.",
"You have not verified this user.": "Bu kullanıcıyı doğrulamadınız.",
"Someone is using an unknown session": "Birisi bilinmeyen bir oturum kullanıyor",
"Everyone in this room is verified": "Bu odadaki herkes doğrulanmış",
"Some sessions for this user are not trusted": "Bu kullanıcı için bazı oturumlar güvenilir değil",
"All sessions for this user are trusted": "Bu kullanıcı için tüm oturumlar güvenilir",
"The version of Riot": "Riot sürümü",
"Your user agent": "Kullanıcı ajanınız",
"If you cancel now, you won't complete verifying the other user.": "Şimdi iptal ederseniz, diğer kullanıcıyı doğrulamayı tamamlamış olmayacaksınız.",
"If you cancel now, you won't complete verifying your other session.": "Şimdi iptal ederseniz, diğer oturumu doğrulamış olmayacaksınız.",
"Setting up keys": "Anahtarları ayarla",
"Custom (%(level)s)": "Özel (%(level)s)",
"Room contains unknown sessions": "Oda bilinmeyen oturumlar içeriyor",
"Unknown sessions": "Bilinmeyen oturumlar",
"Upload %(count)s other files|other": "%(count)s diğer dosyaları yükle",
"Upload %(count)s other files|one": "%(count)s dosyayı sağla",
"A widget would like to verify your identity": "Bir görsel tasarım kimliğinizi teyit etmek istiyor",
"Remember my selection for this widget": "Bu görsel bileşen işin seçimimi hatırla",
"Deny": "Reddet",
"Recovery key mismatch": "Kurtarma anahtarı uyumsuz",
"Backup restored": "Yedek geri dönüldü",
"Enter recovery key": "Kurtarma anahtarı gir",
"Help": "Yardım",
"Take picture": "Resim çek",
"Premium": "Premium",
"Sign in to your Matrix account on %(serverName)s": "%(serverName)s adresindeki Matrix hesabınıza oturum açın",
"Sign in to your Matrix account on <underlinedServerName />": "<underlinedServerName /> adresindeki Matrix hesabına oturum açın",
"Add to summary": "Özete ekle",
"Add users to the community summary": "Topluluk özetine kullanıcıları ekle",
"Who would you like to add to this summary?": "Bu özete kimi eklemek istersiniz?",
"Failed to update community": "Toluluğu güncelleme başarısız",
"Downloading mesages for %(currentRoom)s.": "%(currentRoom)s için mesajlar indiriliyor.",
"Indexed rooms:": "İndekslenmiş odalar:",
"%(crawlingRooms)s out of %(totalRooms)s": "%(totalRooms)s odadan %(crawlingRooms)s tanesi"
}

View file

@ -2,7 +2,7 @@
"This email address is already in use": "Dat e-mailadresse hier es al in gebruuk",
"This phone number is already in use": "Dezen telefongnumero es al in gebruuk",
"Failed to verify email address: make sure you clicked the link in the email": "Kostege t e-mailadresse nie verifieern: zorgt dervoor da je de koppelienge in den e-mail èt angeklikt",
"The platform you're on": "t Platform wuk da je gebruukt",
"The platform you're on": "t Platform da je gebruukt",
"The version of Riot.im": "De versie van Riot.im",
"Whether or not you're logged in (we don't record your username)": "Of da je al dan nie angemeld zyt (we sloan je gebruukersnoame nie ip)",
"Your language of choice": "De deur joun gekoozn toale",

View file

@ -2147,5 +2147,28 @@
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) 登入到未驗證的新工作階段:",
"Ask this user to verify their session, or manually verify it below.": "要求此使用者驗證他們的工作階段,或在下方手動驗證。",
"Manually Verify": "手動驗證",
"Verify by scanning": "透過掃描來驗證"
"Verify by scanning": "透過掃描來驗證",
"The version of Riot": "Riot 版本",
"Whether you're using Riot on a device where touch is the primary input mechanism": "您是否在以觸控為主要機制的裝置上使用 Riot",
"Whether you're using Riot as an installed Progressive Web App": "您是否使用 PWA 形式的 Riot",
"Your user agent": "您的使用者代理字串",
"The information being sent to us to help make Riot better includes:": "傳送給我們以協助改進 Riot 的資訊包含了:",
"The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "您嘗試驗證的工作階段不支援 Riot 支援的掃描 QR code 或顏文字驗證。請用其他客戶端試試看。",
"You declined": "您拒絕了",
"%(name)s declined": "%(name)s 拒絕了",
"accepting …": "正在接受……",
"declining …": "正在拒絕……",
"Your homeserver does not support cross-signing.": "您的家伺服器不支援交叉簽章。",
"Homeserver feature support:": "家伺服器功能支援:",
"exists": "存在",
"Verification Requests": "驗證請求",
"Cancelling…": "正在取消……",
"Accepting…": "正在接受……",
"Accepting …": "正在接受……",
"Declining …": "正在拒絕……",
"Your account is not secure": "您的帳號不安全",
"Your password": "您的密碼",
"This session, or the other session": "此工作階段或其他工作階段",
"The internet connection either session is using": "任何一個工作階段正在使用的網際網路連線",
"We recommend you change your password and recovery key in Settings immediately": "我們建議您立刻在設定中變更您的密碼與復原金鑰"
}

View file

@ -21,6 +21,7 @@ import request from 'browser-request';
import counterpart from 'counterpart';
import React from 'react';
import SettingsStore, {SettingLevel} from "./settings/SettingsStore";
import PlatformPeg from "./PlatformPeg";
// $webapp is a webpack resolve alias pointing to the output directory, see webpack config
import webpackLangJsonUrl from "$webapp/i18n/languages.json";
@ -285,6 +286,11 @@ export function setLanguage(preferredLangs) {
preferredLangs = [preferredLangs];
}
const plaf = PlatformPeg.get();
if (plaf) {
plaf.setLanguage(preferredLangs);
}
let langToUse;
let availLangs;
return getLangsJson().then((result) => {

View file

@ -227,7 +227,7 @@ matrixLinkify.options = {
},
linkAttributes: {
rel: 'noopener',
rel: 'noreferrer noopener',
},
target: function(href, type) {

View file

@ -96,6 +96,13 @@ export default async function sendBugReport(bugReportEndpoint, opts) {
body.append('device_id', client.deviceId);
}
const keys = [`ed25519:${client.getDeviceEd25519Key()}`];
if (client.getDeviceCurve25519Key) {
keys.push(`curve25519:${client.getDeviceCurve25519Key()}`);
}
body.append('device_keys', keys.join(', '));
body.append('cross_signing_key', client.getCrossSigningId());
if (opts.label) {
body.append('label', opts.label);
}

View file

@ -36,6 +36,8 @@ const CATEGORY_GREY = "grey"; // Unread notified messages (not mentions)
const CATEGORY_BOLD = "bold"; // Unread messages (not notified, 'Mentions Only' rooms)
const CATEGORY_IDLE = "idle"; // Nothing of interest
export const TAG_DM = "im.vector.fake.direct";
/**
* Identifier for manual sorting behaviour: sort by the user defined order.
* @type {string}
@ -64,9 +66,9 @@ const getListAlgorithm = (listKey, settingAlgorithm) => {
return ALGO_MANUAL;
case "im.vector.fake.invite":
case "im.vector.fake.recent":
case "im.vector.fake.direct":
case "im.vector.fake.archived":
case "m.lowpriority":
case TAG_DM:
default:
return settingAlgorithm;
}
@ -76,9 +78,9 @@ const knownLists = new Set([
"m.favourite",
"im.vector.fake.invite",
"im.vector.fake.recent",
"im.vector.fake.direct",
"im.vector.fake.archived",
"m.lowpriority",
TAG_DM,
]);
/**
@ -102,6 +104,7 @@ class RoomListStore extends Store {
updateSortingAlgorithm(algorithm, orderImportantFirst) {
// Dev note: We only have two algorithms at the moment, but it isn't impossible that we want
// multiple in the future. Also constants make things slightly clearer.
console.log("Updating room sorting algorithm: ", {algorithm, orderImportantFirst});
this._setState({algorithm, orderImportantFirst});
// Trigger a resort of the entire list to reflect the change in algorithm
@ -115,7 +118,7 @@ class RoomListStore extends Store {
"im.vector.fake.invite": [],
"m.favourite": [],
"im.vector.fake.recent": [],
"im.vector.fake.direct": [],
[TAG_DM]: [],
"m.lowpriority": [],
"im.vector.fake.archived": [],
};
@ -353,7 +356,7 @@ class RoomListStore extends Store {
} else if (dmRoomMap.getUserIdForRoomId(room.roomId) && tags.length === 0) {
// We intentionally don't duplicate rooms in other tags into the people list
// as a feature.
tags.push("im.vector.fake.direct");
tags.push(TAG_DM);
} else if (tags.length === 0) {
tags.push("im.vector.fake.recent");
}
@ -589,7 +592,7 @@ class RoomListStore extends Store {
"im.vector.fake.invite": [],
"m.favourite": [],
"im.vector.fake.recent": [],
"im.vector.fake.direct": [],
[TAG_DM]: [],
"m.lowpriority": [],
"im.vector.fake.archived": [],
};
@ -628,7 +631,7 @@ class RoomListStore extends Store {
}
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
lists["im.vector.fake.direct"].push({room, category: this._calculateCategory(room)});
lists[TAG_DM].push({room, category: this._calculateCategory(room)});
} else {
lists["im.vector.fake.recent"].push({room, category: this._calculateCategory(room)});
}

View file

@ -70,7 +70,7 @@ export class ThemeWatcher {
}
};
// XXX: forceTheme param aded here as local echo appears to be unreliable
// XXX: forceTheme param added here as local echo appears to be unreliable
// https://github.com/vector-im/riot-web/issues/11443
recheck(forceTheme) {
const oldTheme = this._currentTheme;

View file

@ -15,8 +15,7 @@ function remoteRender(event) {
const a = document.createElement("a");
a.id = "a";
a.rel = "noopener";
a.target = "_blank";
a.rel = "noreferrer noopener";
a.download = data.download;
a.style = data.style;
a.style.fontFamily = "Arial, Helvetica, Sans-Serif";

View file

@ -78,7 +78,7 @@ export default class AutoDiscoveryUtils {
return <a
href="https://github.com/vector-im/riot-web/blob/master/docs/config.md"
target="_blank"
rel="noopener"
rel="noreferrer noopener"
>{sub}</a>;
},
},

View file

@ -36,7 +36,7 @@ export function messageForResourceLimitError(limitType, adminContact, strings, e
const linkSub = sub => {
if (adminContact) {
return <a href={adminContact} target="_blank" rel="noopener">{sub}</a>;
return <a href={adminContact} target="_blank" rel="noreferrer noopener">{sub}</a>;
} else {
return sub;
}

View file

@ -1,5 +1,5 @@
/*
Copyright 2019 The Matrix.org Foundation C.I.C.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -21,7 +21,20 @@ import SettingsStore from "../settings/SettingsStore";
import {PushProcessor} from 'matrix-js-sdk/src/pushprocessor';
import * as sdk from '../index';
export function pillifyLinks(nodes, mxEvent) {
/**
* Recurses depth-first through a DOM tree, converting matrix.to links
* into pills based on the context of a given room. Returns a list of
* the resulting React nodes so they can be unmounted rather than leaking.
*
* @param {Node[]} nodes - a list of sibling DOM nodes to traverse to try
* to turn into pills.
* @param {MatrixEvent} mxEvent - the matrix event which the DOM nodes are
* part of representing.
* @param {Node[]} pills: an accumulator of the DOM nodes which contain
* React components which have been mounted as part of this.
* The initial caller should pass in an empty array to seed the accumulator.
*/
export function pillifyLinks(nodes, mxEvent, pills) {
const room = MatrixClientPeg.get().getRoom(mxEvent.getRoomId());
const shouldShowPillAvatar = SettingsStore.getValue("Pill.shouldShowPillAvatar");
let node = nodes[0];
@ -45,6 +58,7 @@ export function pillifyLinks(nodes, mxEvent) {
ReactDOM.render(pill, pillContainer);
node.parentNode.replaceChild(pillContainer, node);
pills.push(pillContainer);
// Pills within pills aren't going to go well, so move on
pillified = true;
@ -102,6 +116,7 @@ export function pillifyLinks(nodes, mxEvent) {
ReactDOM.render(pill, pillContainer);
roomNotifTextNode.parentNode.replaceChild(pillContainer, roomNotifTextNode);
pills.push(pillContainer);
}
// Nothing else to do for a text node (and we don't need to advance
// the loop pointer because we did it above)
@ -111,9 +126,26 @@ export function pillifyLinks(nodes, mxEvent) {
}
if (node.childNodes && node.childNodes.length && !pillified) {
pillifyLinks(node.childNodes, mxEvent);
pillifyLinks(node.childNodes, mxEvent, pills);
}
node = node.nextSibling;
}
}
/**
* Unmount all the pill containers from React created by pillifyLinks.
*
* It's critical to call this after pillifyLinks, otherwise
* Pills will leak, leaking entire DOM trees via the event
* emitter on BaseAvatar as per
* https://github.com/vector-im/riot-web/issues/12417
*
* @param {Node[]} pills - array of pill containers whose React
* components should be unmounted.
*/
export function unmountPills(pills) {
for (const pillContainer of pills) {
ReactDOM.unmountComponentAtNode(pillContainer);
}
}

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