Merge remote-tracking branch 'matrix-org/develop' into travis/pinned-notice

This commit is contained in:
Travis Ralston 2017-11-03 19:57:39 -06:00
commit a2b7f6d30e
111 changed files with 10299 additions and 3407 deletions

View file

@ -1,3 +1,160 @@
Changes in [0.10.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.7) (2017-10-16)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.7-rc.3...v0.10.7)
* Update to latest js-sdk
Changes in [0.10.7-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.7-rc.3) (2017-10-13)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.7-rc.2...v0.10.7-rc.3)
* Fix the enableLabs flag, again
[\#1474](https://github.com/matrix-org/matrix-react-sdk/pull/1474)
Changes in [0.10.7-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.7-rc.2) (2017-10-13)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.7-rc.1...v0.10.7-rc.2)
* Honour the (now legacy) enableLabs flag
[\#1473](https://github.com/matrix-org/matrix-react-sdk/pull/1473)
* Don't show labs features by default
[\#1472](https://github.com/matrix-org/matrix-react-sdk/pull/1472)
* Make features disabled by default
[\#1470](https://github.com/matrix-org/matrix-react-sdk/pull/1470)
Changes in [0.10.7-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.7-rc.1) (2017-10-13)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.6...v0.10.7-rc.1)
* Add warm fuzzy dialog for inviting users to a group
[\#1459](https://github.com/matrix-org/matrix-react-sdk/pull/1459)
* enable/disable features in config.json
[\#1468](https://github.com/matrix-org/matrix-react-sdk/pull/1468)
* Update from Weblate.
[\#1469](https://github.com/matrix-org/matrix-react-sdk/pull/1469)
* Don't send RR or RM when peeking at a room
[\#1463](https://github.com/matrix-org/matrix-react-sdk/pull/1463)
* Fix bug that inserted emoji when typing
[\#1467](https://github.com/matrix-org/matrix-react-sdk/pull/1467)
* Ignore VS16 char in RTE
[\#1458](https://github.com/matrix-org/matrix-react-sdk/pull/1458)
* Show failures when sending messages
[\#1460](https://github.com/matrix-org/matrix-react-sdk/pull/1460)
* Run eslint --fix
[\#1461](https://github.com/matrix-org/matrix-react-sdk/pull/1461)
* Show who banned the user on hover
[\#1441](https://github.com/matrix-org/matrix-react-sdk/pull/1441)
* Enhancements to room power level settings
[\#1440](https://github.com/matrix-org/matrix-react-sdk/pull/1440)
* Added TextInputWithCheckbox dialog
[\#868](https://github.com/matrix-org/matrix-react-sdk/pull/868)
* Make it clearer which HS you're logging into
[\#1456](https://github.com/matrix-org/matrix-react-sdk/pull/1456)
* Remove redundant stale onKeyDown
[\#1451](https://github.com/matrix-org/matrix-react-sdk/pull/1451)
* Only allow event state event handlers on state events
[\#1453](https://github.com/matrix-org/matrix-react-sdk/pull/1453)
* Modify the group store to include group rooms
[\#1452](https://github.com/matrix-org/matrix-react-sdk/pull/1452)
* Factor-out GroupStore and create GroupStoreCache
[\#1449](https://github.com/matrix-org/matrix-react-sdk/pull/1449)
* Put related groups UI behind groups labs flag
[\#1448](https://github.com/matrix-org/matrix-react-sdk/pull/1448)
* Restrict Flair in the timeline to related groups of the room
[\#1447](https://github.com/matrix-org/matrix-react-sdk/pull/1447)
* Implement UI for editing related groups of a room
[\#1446](https://github.com/matrix-org/matrix-react-sdk/pull/1446)
* Fix a couple of bugs with EditableItemList
[\#1445](https://github.com/matrix-org/matrix-react-sdk/pull/1445)
* Factor out EditableItemList from AliasSettings
[\#1444](https://github.com/matrix-org/matrix-react-sdk/pull/1444)
* Add dummy translation function to mark translatable strings
[\#1421](https://github.com/matrix-org/matrix-react-sdk/pull/1421)
* Implement button to remove a room from a group
[\#1438](https://github.com/matrix-org/matrix-react-sdk/pull/1438)
* Fix showing 3pid invites in member list
[\#1443](https://github.com/matrix-org/matrix-react-sdk/pull/1443)
* Add button to get to MyGroups (view_my_groups or path #/groups)
[\#1435](https://github.com/matrix-org/matrix-react-sdk/pull/1435)
* Add eslint rule to disallow spaces inside of curly braces
[\#1436](https://github.com/matrix-org/matrix-react-sdk/pull/1436)
* Fix ability to invite existing mx users
[\#1437](https://github.com/matrix-org/matrix-react-sdk/pull/1437)
* Construct address picker message using provided `validAddressTypes`
[\#1434](https://github.com/matrix-org/matrix-react-sdk/pull/1434)
* Fix GroupView summary rooms displaying without avatars
[\#1433](https://github.com/matrix-org/matrix-react-sdk/pull/1433)
* Implement adding rooms to a group (or group summary) by room ID
[\#1432](https://github.com/matrix-org/matrix-react-sdk/pull/1432)
* Give flair avatars a tooltip = the group ID
[\#1431](https://github.com/matrix-org/matrix-react-sdk/pull/1431)
* Fix ability to feature self in a group summary
[\#1430](https://github.com/matrix-org/matrix-react-sdk/pull/1430)
* Implement "Add room to group" feature
[\#1429](https://github.com/matrix-org/matrix-react-sdk/pull/1429)
* Fix group membership publicity
[\#1428](https://github.com/matrix-org/matrix-react-sdk/pull/1428)
* Add support for Jitsi screensharing in electron app
[\#1355](https://github.com/matrix-org/matrix-react-sdk/pull/1355)
* Delint and DRY TextForEvent
[\#1424](https://github.com/matrix-org/matrix-react-sdk/pull/1424)
* Bust the flair caches after 30mins
[\#1427](https://github.com/matrix-org/matrix-react-sdk/pull/1427)
* Show displayname / avatar in group member info
[\#1426](https://github.com/matrix-org/matrix-react-sdk/pull/1426)
* Create GroupSummaryStore for storing group summary stuff
[\#1418](https://github.com/matrix-org/matrix-react-sdk/pull/1418)
* Add status & toggle for publicity
[\#1419](https://github.com/matrix-org/matrix-react-sdk/pull/1419)
* MemberList: show 100 more on overflow tile click
[\#1417](https://github.com/matrix-org/matrix-react-sdk/pull/1417)
* Fix NPE in MemberList
[\#1425](https://github.com/matrix-org/matrix-react-sdk/pull/1425)
* Fix incorrect variable in string
[\#1422](https://github.com/matrix-org/matrix-react-sdk/pull/1422)
* apply i18n _t to string which has already been translated
[\#1420](https://github.com/matrix-org/matrix-react-sdk/pull/1420)
* Make the invite section a truncatedlist too
[\#1416](https://github.com/matrix-org/matrix-react-sdk/pull/1416)
* Implement removal function of features users/rooms
[\#1415](https://github.com/matrix-org/matrix-react-sdk/pull/1415)
* Allow TruncatedList to get children via a callback
[\#1412](https://github.com/matrix-org/matrix-react-sdk/pull/1412)
* Experimental: Lazy load user autocomplete entries
[\#1413](https://github.com/matrix-org/matrix-react-sdk/pull/1413)
* Show displayname & avatar url in group member list
[\#1414](https://github.com/matrix-org/matrix-react-sdk/pull/1414)
* De-lint TruncatedList
[\#1411](https://github.com/matrix-org/matrix-react-sdk/pull/1411)
* Remove unneeded strings
[\#1409](https://github.com/matrix-org/matrix-react-sdk/pull/1409)
* Clean on prerelease
[\#1410](https://github.com/matrix-org/matrix-react-sdk/pull/1410)
* Redesign membership section in GroupView
[\#1408](https://github.com/matrix-org/matrix-react-sdk/pull/1408)
* Implement adding rooms to the group summary
[\#1406](https://github.com/matrix-org/matrix-react-sdk/pull/1406)
* Honour the is_privileged flag in GroupView
[\#1407](https://github.com/matrix-org/matrix-react-sdk/pull/1407)
* Update when a group arrives
[\#1405](https://github.com/matrix-org/matrix-react-sdk/pull/1405)
* Implement `view_group` dispatch when clicking flair
[\#1404](https://github.com/matrix-org/matrix-react-sdk/pull/1404)
* GroupView: Add a User
[\#1402](https://github.com/matrix-org/matrix-react-sdk/pull/1402)
* Track action button click event
[\#1403](https://github.com/matrix-org/matrix-react-sdk/pull/1403)
* Separate sender profile into elements with classes
[\#1401](https://github.com/matrix-org/matrix-react-sdk/pull/1401)
* Fix ugly integration button, use hover to show error
[\#1399](https://github.com/matrix-org/matrix-react-sdk/pull/1399)
* Fix promise error in flair
[\#1400](https://github.com/matrix-org/matrix-react-sdk/pull/1400)
* Flair!
[\#1351](https://github.com/matrix-org/matrix-react-sdk/pull/1351)
* Group Membership UI
[\#1328](https://github.com/matrix-org/matrix-react-sdk/pull/1328)
Changes in [0.10.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.6) (2017-09-21)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.5...v0.10.6)

6551
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
"version": "0.10.6",
"version": "0.10.7",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@ -28,11 +28,15 @@
"test"
],
"bin": {
"reskindex": "scripts/reskindex.js"
"reskindex": "scripts/reskindex.js",
"matrix-gen-i18n": "scripts/gen-i18n.js",
"matrix-prune-i18n": "scripts/prune-i18n.js"
},
"scripts": {
"reskindex": "node scripts/reskindex.js -h header",
"reskindex:watch": "node scripts/reskindex.js -h header -w",
"i18n": "matrix-gen-i18n",
"prunei18n": "matrix-prune-i18n",
"build": "npm run reskindex && babel src -d lib --source-maps --copy-files",
"build:watch": "babel src -w -d lib --source-maps --copy-files",
"emoji-data-strip": "node scripts/emoji-data-strip.js",
@ -67,7 +71,7 @@
"isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3",
"lodash": "^4.13.1",
"matrix-js-sdk": "0.8.4",
"matrix-js-sdk": "0.8.5",
"optimist": "^0.6.1",
"prop-types": "^15.5.8",
"react": "^15.4.0",
@ -101,7 +105,9 @@
"eslint-plugin-babel": "^4.0.1",
"eslint-plugin-flowtype": "^2.30.0",
"eslint-plugin-react": "^7.4.0",
"estree-walker": "^0.5.0",
"expect": "^1.16.0",
"flow-parser": "^0.57.3",
"json-loader": "^0.5.3",
"karma": "^1.7.0",
"karma-chrome-launcher": "^0.2.3",
@ -115,12 +121,13 @@
"karma-webpack": "^1.7.0",
"matrix-react-test-utils": "^0.1.1",
"mocha": "^2.4.5",
"parallelshell": "^1.2.0",
"parallelshell": "^3.0.2",
"react-addons-test-utils": "^15.4.0",
"require-json": "0.0.1",
"rimraf": "^2.4.3",
"sinon": "^1.17.3",
"source-map-loader": "^0.1.5",
"walk": "^2.3.9",
"webpack": "^1.12.14"
}
}

252
scripts/gen-i18n.js Executable file
View file

@ -0,0 +1,252 @@
#!/usr/bin/env node
/*
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* Regenerates the translations en_EN file by walking the source tree and
* parsing each file with flow-parser. Emits a JSON file with the
* translatable strings mapped to themselves in the order they appeared
* in the files and grouped by the file they appeared in.
*
* Usage: node scripts/gen-i18n.js
*/
const fs = require('fs');
const path = require('path');
const walk = require('walk');
const flowParser = require('flow-parser');
const estreeWalker = require('estree-walker');
const TRANSLATIONS_FUNCS = ['_t', '_td', '_tJsx'];
const INPUT_TRANSLATIONS_FILE = 'src/i18n/strings/en_EN.json';
const OUTPUT_FILE = 'src/i18n/strings/en_EN.json';
// NB. The sync version of walk is broken for single files so we walk
// all of res rather than just res/home.html.
// https://git.daplie.com/Daplie/node-walk/merge_requests/1 fixes it,
// or if we get bored waiting for it to be merged, we could switch
// to a project that's actively maintained.
const SEARCH_PATHS = ['src', 'res'];
const FLOW_PARSER_OPTS = {
esproposal_class_instance_fields: true,
esproposal_class_static_fields: true,
esproposal_decorators: true,
esproposal_export_star_as: true,
types: true,
};
function getObjectValue(obj, key) {
for (const prop of obj.properties) {
if (prop.key.type == 'Identifier' && prop.key.name == key) {
return prop.value;
}
}
return null;
}
function getTKey(arg) {
if (arg.type == 'Literal') {
return arg.value;
} else if (arg.type == 'BinaryExpression' && arg.operator == '+') {
return getTKey(arg.left) + getTKey(arg.right);
} else if (arg.type == 'TemplateLiteral') {
return arg.quasis.map((q) => {
return q.value.raw;
}).join('');
}
return null;
}
function getFormatStrings(str) {
// Match anything that starts with %
// We could make a regex that matched the full placeholder, but this
// would just not match invalid placeholders and so wouldn't help us
// detect the invalid ones.
// Also note that for simplicity, this just matches a % character and then
// anything up to the next % character (or a single %, or end of string).
const formatStringRe = /%([^%]+|%|$)/g;
const formatStrings = new Set();
let match;
while ( (match = formatStringRe.exec(str)) !== null ) {
const placeholder = match[1]; // Minus the leading '%'
if (placeholder === '%') continue; // Literal % is %%
const placeholderMatch = placeholder.match(/^\((.*?)\)(.)/);
if (placeholderMatch === null) {
throw new Error("Invalid format specifier: '"+match[0]+"'");
}
if (placeholderMatch.length < 3) {
throw new Error("Malformed format specifier");
}
const placeholderName = placeholderMatch[1];
const placeholderFormat = placeholderMatch[2];
if (placeholderFormat !== 's') {
throw new Error(`'${placeholderFormat}' used as format character: you probably meant 's'`);
}
formatStrings.add(placeholderName);
}
return formatStrings;
}
function getTranslationsJs(file) {
const tree = flowParser.parse(fs.readFileSync(file, { encoding: 'utf8' }), FLOW_PARSER_OPTS);
const trs = new Set();
estreeWalker.walk(tree, {
enter: function(node, parent) {
if (
node.type == 'CallExpression' &&
TRANSLATIONS_FUNCS.includes(node.callee.name)
) {
const tKey = getTKey(node.arguments[0]);
// This happens whenever we call _t with non-literals (ie. whenever we've
// had to use a _td to compensate) so is expected.
if (tKey === null) return;
// check the format string against the args
// We only check _t: _tJsx is much more complex and _td has no args
if (node.callee.name === '_t') {
try {
const placeholders = getFormatStrings(tKey);
for (const placeholder of placeholders) {
if (node.arguments.length < 2) {
throw new Error(`Placeholder found ('${placeholder}') but no substitutions given`);
}
const value = getObjectValue(node.arguments[1], placeholder);
if (value === null) {
throw new Error(`No value found for placeholder '${placeholder}'`);
}
}
} catch (e) {
console.log();
console.error(`ERROR: ${file}:${node.loc.start.line} ${tKey}`);
process.exit(1);
}
}
let isPlural = false;
if (node.arguments.length > 1 && node.arguments[1].type == 'ObjectExpression') {
const countVal = getObjectValue(node.arguments[1], 'count');
if (countVal) {
isPlural = true;
}
}
if (isPlural) {
trs.add(tKey + "|other");
const plurals = enPlurals[tKey];
if (plurals) {
for (const pluralType of Object.keys(plurals)) {
trs.add(tKey + "|" + pluralType);
}
}
} else {
trs.add(tKey);
}
}
}
});
return trs;
}
function getTranslationsOther(file) {
const contents = fs.readFileSync(file, { encoding: 'utf8' });
const trs = new Set();
// Taken from riot-web src/components/structures/HomePage.js
const translationsRegex = /_t\(['"]([\s\S]*?)['"]\)/mg;
let matches;
while (matches = translationsRegex.exec(contents)) {
trs.add(matches[1]);
}
return trs;
}
// gather en_EN plural strings from the input translations file:
// the en_EN strings are all in the source with the exception of
// pluralised strings, which we need to pull in from elsewhere.
const inputTranslationsRaw = JSON.parse(fs.readFileSync(INPUT_TRANSLATIONS_FILE, { encoding: 'utf8' }));
const enPlurals = {};
for (const key of Object.keys(inputTranslationsRaw)) {
const parts = key.split("|");
if (parts.length > 1) {
const plurals = enPlurals[parts[0]] || {};
plurals[parts[1]] = inputTranslationsRaw[key];
enPlurals[parts[0]] = plurals;
}
}
const translatables = new Set();
const walkOpts = {
listeners: {
file: function(root, fileStats, next) {
const fullPath = path.join(root, fileStats.name);
let ltrs;
if (fileStats.name.endsWith('.js')) {
trs = getTranslationsJs(fullPath);
} else if (fileStats.name.endsWith('.html')) {
trs = getTranslationsOther(fullPath);
} else {
return;
}
console.log(`${fullPath} (${trs.size} strings)`);
for (const tr of trs.values()) {
translatables.add(tr);
}
},
}
};
for (const path of SEARCH_PATHS) {
if (fs.existsSync(path)) {
walk.walkSync(path, walkOpts);
}
}
const trObj = {};
for (const tr of translatables) {
if (tr.includes("|")) {
if (inputTranslationsRaw[tr]) {
trObj[tr] = inputTranslationsRaw[tr];
} else {
trObj[tr] = tr.split("|")[0];
}
} else {
trObj[tr] = tr;
}
}
fs.writeFileSync(
OUTPUT_FILE,
JSON.stringify(trObj, translatables.values(), 4) + "\n"
);
console.log();
console.log(`Wrote ${translatables.size} strings to ${OUTPUT_FILE}`);

68
scripts/prune-i18n.js Executable file
View file

@ -0,0 +1,68 @@
#!/usr/bin/env node
/*
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* Looks through all the translation files and removes any strings
* which don't appear in en_EN.json.
* Use this if you remove a translation, but merge any outstanding changes
* from weblate first or you'll need to resolve the conflict in weblate.
*/
const fs = require('fs');
const path = require('path');
const I18NDIR = 'src/i18n/strings';
const enStringsRaw = JSON.parse(fs.readFileSync(path.join(I18NDIR, 'en_EN.json')));
const enStrings = new Set();
for (const str of Object.keys(enStringsRaw)) {
const parts = str.split('|');
if (parts.length > 1) {
enStrings.add(parts[0]);
} else {
enStrings.add(str);
}
}
for (const filename of fs.readdirSync(I18NDIR)) {
if (filename === 'en_EN.json') continue;
if (filename === 'basefile.json') continue;
if (!filename.endsWith('.json')) continue;
const trs = JSON.parse(fs.readFileSync(path.join(I18NDIR, filename)));
const oldLen = Object.keys(trs).length;
for (const tr of Object.keys(trs)) {
const parts = tr.split('|');
const trKey = parts.length > 1 ? parts[0] : tr;
if (!enStrings.has(trKey)) {
delete trs[tr];
}
}
const removed = oldLen - Object.keys(trs).length;
if (removed > 0) {
console.log(`${filename}: removed ${removed} translations`);
// XXX: This is totally relying on the impl serialising the JSON object in the
// same order as they were parsed from the file. JSON.stringify() has a specific argument
// that can be used to control the order, but JSON.parse() lacks any kind of equivalent.
// Empirically this does maintain the order on my system, so I'm going to leave it like
// this for now.
fs.writeFileSync(path.join(I18NDIR, filename), JSON.stringify(trs, undefined, 4) + "\n");
}
}

View file

@ -19,7 +19,7 @@ import PlatformPeg from './PlatformPeg';
import SdkConfig from './SdkConfig';
function getRedactedUrl() {
const redactedHash = window.location.hash.replace(/#\/(room|user)\/(.+)/, "#/$1/<redacted>");
const redactedHash = window.location.hash.replace(/#\/(group|room|user)\/(.+)/, "#/$1/<redacted>");
// hardcoded url to make piwik happy
return 'https://riot.im/app/' + redactedHash;
}

View file

@ -99,23 +99,17 @@ function loadImageElement(imageFile) {
// Load the file into an html element
const img = document.createElement("img");
const objectUrl = URL.createObjectURL(imageFile);
img.src = objectUrl;
const reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
// Once ready, create a thumbnail
img.onload = function() {
deferred.resolve(img);
};
img.onerror = function(e) {
deferred.reject(e);
};
// Once ready, create a thumbnail
img.onload = function() {
URL.revokeObjectURL(objectUrl);
deferred.resolve(img);
};
reader.onerror = function(e) {
img.onerror = function(e) {
deferred.reject(e);
};
reader.readAsDataURL(imageFile);
return deferred.promise;
}

View file

@ -22,12 +22,22 @@ import MatrixClientPeg from './MatrixClientPeg';
import GroupStoreCache from './stores/GroupStoreCache';
export function showGroupInviteDialog(groupId) {
const description = <div>
<div>{ _t("Who would you like to add to this community?") }</div>
<div className="warning">
{ _t(
"Warning: any person you add to a community will be publicly "+
"visible to anyone who knows the community ID",
) }
</div>
</div>;
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Group Invite', '', AddressPickerDialog, {
title: _t("Invite new group members"),
description: _t("Who would you like to add to this group?"),
title: _t("Invite new community members"),
description: description,
placeholder: _t("Name or matrix ID"),
button: _t("Invite to Group"),
button: _t("Invite to Community"),
validAddressTypes: ['mx-user-id'],
onFinished: (success, addrs) => {
if (!success) return;
@ -39,12 +49,22 @@ export function showGroupInviteDialog(groupId) {
export function showGroupAddRoomDialog(groupId) {
return new Promise((resolve, reject) => {
const description = <div>
<div>{ _t("Which rooms would you like to add to this community?") }</div>
<div className="warning">
{ _t(
"Warning: any room you add to a community will be publicly "+
"visible to anyone who knows the community ID",
) }
</div>
</div>;
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Add Rooms to Group', '', AddressPickerDialog, {
title: _t("Add rooms to the group"),
description: _t("Which rooms would you like to add to this group?"),
title: _t("Add rooms to the community"),
description: description,
placeholder: _t("Room name or alias"),
button: _t("Add to group"),
button: _t("Add to community"),
pickerType: 'room',
validAddressTypes: ['mx-room-id'],
onFinished: (success, addrs) => {
@ -76,31 +96,41 @@ function _onGroupInviteFinished(groupId, addrs) {
title: _t("Failed to invite the following users to %(groupId)s:", {groupId: groupId}),
description: errorList.join(", "),
});
} else {
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createTrackedDialog('Group invitations sent', '', QuestionDialog, {
title: _t("Invites sent"),
description: _t("Your group invitations have been sent."),
hasCancelButton: false,
});
}
}).catch((err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to invite users to group', '', ErrorDialog, {
title: _t("Failed to invite users group"),
title: _t("Failed to invite users to community"),
description: _t("Failed to invite users to %(groupId)s", {groupId: groupId}),
});
});
}
function _onGroupAddRoomFinished(groupId, addrs) {
const groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId);
const matrixClient = MatrixClientPeg.get();
const groupStore = GroupStoreCache.getGroupStore(matrixClient, groupId);
const errorList = [];
return Promise.all(addrs.map((addr) => {
return groupStore
.addRoomToGroup(addr.address)
.catch(() => { errorList.push(addr.address); })
.reflect();
.then(() => {
const roomId = addr.address;
const room = matrixClient.getRoom(roomId);
// Can the user change related groups?
if (!room || !room.currentState.mayClientSendStateEvent("m.room.related_groups", matrixClient)) {
return;
}
// Get the related groups
const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', '');
const groups = relatedGroupsEvent ? relatedGroupsEvent.getContent().groups || [] : [];
// Add this group as related
if (!groups.includes(groupId)) {
groups.push(groupId);
return MatrixClientPeg.get().sendStateEvent(roomId, 'm.room.related_groups', {groups}, '');
}
}).reflect();
})).then(() => {
if (errorList.length === 0) {
return;

View file

@ -143,6 +143,50 @@ export default class Login {
Object.assign(loginParams, legacyParams);
const client = this._createTemporaryClient();
const tryFallbackHs = (originalError) => {
const fbClient = Matrix.createClient({
baseUrl: self._fallbackHsUrl,
idBaseUrl: this._isUrl,
});
return fbClient.login('m.login.password', loginParams).then(function(data) {
return Promise.resolve({
homeserverUrl: self._fallbackHsUrl,
identityServerUrl: self._isUrl,
userId: data.user_id,
deviceId: data.device_id,
accessToken: data.access_token,
});
}).catch((fallback_error) => {
console.log("fallback HS login failed", fallback_error);
// throw the original error
throw originalError;
});
};
const tryLowercaseUsername = (originalError) => {
const loginParamsLowercase = Object.assign({}, loginParams, {
user: username.toLowerCase(),
identifier: {
user: username.toLowerCase(),
},
});
return client.login('m.login.password', loginParamsLowercase).then(function(data) {
return Promise.resolve({
homeserverUrl: self._hsUrl,
identityServerUrl: self._isUrl,
userId: data.user_id,
deviceId: data.device_id,
accessToken: data.access_token,
});
}).catch((fallback_error) => {
console.log("Lowercase username login failed", fallback_error);
// throw the original error
throw originalError;
});
};
let originalLoginError = null;
return client.login('m.login.password', loginParams).then(function(data) {
return Promise.resolve({
homeserverUrl: self._hsUrl,
@ -151,28 +195,25 @@ export default class Login {
deviceId: data.device_id,
accessToken: data.access_token,
});
}, function(error) {
}).catch((error) => {
originalLoginError = error;
if (error.httpStatus === 403) {
if (self._fallbackHsUrl) {
const fbClient = Matrix.createClient({
baseUrl: self._fallbackHsUrl,
idBaseUrl: this._isUrl,
});
return fbClient.login('m.login.password', loginParams).then(function(data) {
return Promise.resolve({
homeserverUrl: self._fallbackHsUrl,
identityServerUrl: self._isUrl,
userId: data.user_id,
deviceId: data.device_id,
accessToken: data.access_token,
});
}, function(fallback_error) {
// throw the original error
throw error;
});
return tryFallbackHs(originalLoginError);
}
}
throw originalLoginError;
}).catch((error) => {
if (
error.httpStatus === 403 &&
loginParams.identifier.type === 'm.id.user' &&
username.search(/[A-Z]/) > -1
) {
return tryLowercaseUsername(originalLoginError);
}
throw originalLoginError;
}).catch((error) => {
console.log("Login failed", error);
throw error;
});
}

View file

@ -21,6 +21,8 @@ import Modal from './Modal';
import { getAddressType } from './UserAddress';
import createRoom from './createRoom';
import sdk from './';
import dis from './dispatcher';
import DMRoomMap from './utils/DMRoomMap';
import { _t } from './languageHandler';
export function inviteToRoom(roomId, addr) {
@ -79,15 +81,40 @@ function _onStartChatFinished(shouldInvite, addrs) {
const addrTexts = addrs.map((addr) => addr.address);
if (_isDmChat(addrTexts)) {
// Start a new DM chat
createRoom({dmUserId: addrTexts[0]}).catch((err) => {
console.error(err.stack);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to invite user', '', ErrorDialog, {
title: _t("Failed to invite user"),
description: ((err && err.message) ? err.message : _t("Operation failed")),
const rooms = _getDirectMessageRooms(addrTexts[0]);
if (rooms.length > 0) {
// A Direct Message room already exists for this user, so select a
// room from a list that is similar to the one in MemberInfo panel
const ChatCreateOrReuseDialog = sdk.getComponent(
"views.dialogs.ChatCreateOrReuseDialog",
);
const close = Modal.createTrackedDialog('Create or Reuse', '', ChatCreateOrReuseDialog, {
userId: addrTexts[0],
onNewDMClick: () => {
dis.dispatch({
action: 'start_chat',
user_id: addrTexts[0],
});
close(true);
},
onExistingRoomSelected: (roomId) => {
dis.dispatch({
action: 'view_room',
room_id: roomId,
});
close(true);
},
}).close;
} else {
// Start a new DM chat
createRoom({dmUserId: addrTexts[0]}).catch((err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to invite user', '', ErrorDialog, {
title: _t("Failed to invite user"),
description: ((err && err.message) ? err.message : _t("Operation failed")),
});
});
});
}
} else {
// Start multi user chat
let room;
@ -127,7 +154,7 @@ function _onRoomInviteFinished(roomId, shouldInvite, addrs) {
}
function _isDmChat(addrTexts) {
if (addrTexts.length === 1 && getAddressType(addrTexts[0]) === 'mx') {
if (addrTexts.length === 1 && getAddressType(addrTexts[0]) === 'mx-user-id') {
return true;
} else {
return false;
@ -153,3 +180,19 @@ function _showAnyInviteErrors(addrs, room) {
return addrs;
}
function _getDirectMessageRooms(addr) {
const dmRoomMap = new DMRoomMap(MatrixClientPeg.get());
const dmRooms = dmRoomMap.getDMRoomsForUserId(addr);
const rooms = [];
dmRooms.forEach((dmRoom) => {
const room = MatrixClientPeg.get().getRoom(dmRoom);
if (room) {
const me = room.getMember(MatrixClientPeg.get().credentials.userId);
if (me.membership == 'join') {
rooms.push(room);
}
}
});
return rooms;
}

View file

@ -28,7 +28,7 @@ import SdkConfig from './SdkConfig';
const FEATURES = [
{
id: 'feature_groups',
name: _td("Groups"),
name: _td("Communities"),
},
{
id: 'feature_pinning',
@ -40,7 +40,7 @@ export default {
getLabsFeatures() {
const featuresConfig = SdkConfig.get()['features'] || {};
// The old flag: honourned for backwards compat
// The old flag: honoured for backwards compatibility
const enableLabs = SdkConfig.get()['enableLabs'];
let labsFeatures;
@ -217,7 +217,7 @@ export default {
isFeatureEnabled: function(featureId: string): boolean {
const featuresConfig = SdkConfig.get()['features'];
// The old flag: honourned for backwards compat
// The old flag: honoured for backwards compatibility
const enableLabs = SdkConfig.get()['enableLabs'];
let sdkConfigValue = enableLabs ? 'labs' : 'disable';

View file

@ -68,10 +68,8 @@ module.exports = {
const names = whoIsTyping.map(function(m) {
return m.name;
});
if (othersCount==1) {
return _t('%(names)s and one other are typing', {names: names.slice(0, limit - 1).join(', ')});
} else if (othersCount>1) {
return _t('%(names)s and %(count)s others are typing', {names: names.slice(0, limit - 1).join(', '), count: othersCount});
if (othersCount>=1) {
return _t('%(names)s and %(count)s others are typing', {names: names.slice(0, limit - 1).join(', '), count: othersCount});
} else {
const lastPerson = names.pop();
return _t('%(names)s and %(lastPerson)s are typing', {names: names.join(', '), lastPerson: lastPerson});

View file

@ -1,6 +1,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -28,6 +29,10 @@ export default class AutocompleteProvider {
}
}
destroy() {
// stub
}
/**
* Of the matched commands in the query, returns the first that contains or is contained by the selection, or null.
*/

View file

@ -1,5 +1,6 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -45,41 +46,56 @@ const PROVIDERS = [
EmojiProvider,
CommandProvider,
DuckDuckGoProvider,
].map((completer) => completer.getInstance());
];
// Providers will get rejected if they take longer than this.
const PROVIDER_COMPLETION_TIMEOUT = 3000;
export async function getCompletions(query: string, selection: SelectionRange, force: boolean = false): Array<Completion> {
/* Note: That this waits for all providers to return is *intentional*
otherwise, we run into a condition where new completions are displayed
while the user is interacting with the list, which makes it difficult
to predict whether an action will actually do what is intended
*/
const completionsList = await Promise.all(
// Array of inspections of promises that might timeout. Instead of allowing a
// single timeout to reject the Promise.all, reflect each one and once they've all
// settled, filter for the fulfilled ones
PROVIDERS.map((provider) => {
return provider
.getCompletions(query, selection, force)
.timeout(PROVIDER_COMPLETION_TIMEOUT)
.reflect();
}),
);
export default class Autocompleter {
constructor(room) {
this.room = room;
this.providers = PROVIDERS.map((p) => {
return new p(room);
});
}
return completionsList.filter(
(inspection) => inspection.isFulfilled(),
).map((completionsState, i) => {
return {
completions: completionsState.value(),
provider: PROVIDERS[i],
destroy() {
this.providers.forEach((p) => {
p.destroy();
});
}
/* the currently matched "command" the completer tried to complete
* we pass this through so that Autocomplete can figure out when to
* re-show itself once hidden.
*/
command: PROVIDERS[i].getCurrentCommand(query, selection, force),
};
});
async getCompletions(query: string, selection: SelectionRange, force: boolean = false): Array<Completion> {
/* Note: This intentionally waits for all providers to return,
otherwise, we run into a condition where new completions are displayed
while the user is interacting with the list, which makes it difficult
to predict whether an action will actually do what is intended
*/
const completionsList = await Promise.all(
// Array of inspections of promises that might timeout. Instead of allowing a
// single timeout to reject the Promise.all, reflect each one and once they've all
// settled, filter for the fulfilled ones
this.providers.map((provider) => {
return provider
.getCompletions(query, selection, force)
.timeout(PROVIDER_COMPLETION_TIMEOUT)
.reflect();
}),
);
return completionsList.filter(
(inspection) => inspection.isFulfilled(),
).map((completionsState, i) => {
return {
completions: completionsState.value(),
provider: this.providers[i],
/* the currently matched "command" the completer tried to complete
* we pass this through so that Autocomplete can figure out when to
* re-show itself once hidden.
*/
command: this.providers[i].getCurrentCommand(query, selection, force),
};
});
}
}

View file

@ -1,6 +1,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -109,8 +110,6 @@ const COMMANDS = [
const COMMAND_RE = /(^\/\w*)/g;
let instance = null;
export default class CommandProvider extends AutocompleteProvider {
constructor() {
super(COMMAND_RE);
@ -142,12 +141,6 @@ export default class CommandProvider extends AutocompleteProvider {
return '*️⃣ ' + _t('Commands');
}
static getInstance(): CommandProvider {
if (instance === null) instance = new CommandProvider();
return instance;
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_block">
{ completions }

View file

@ -1,6 +1,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -25,8 +26,6 @@ import {TextualCompletion} from './Components';
const DDG_REGEX = /\/ddg\s+(.+)$/g;
const REFERRER = 'vector';
let instance = null;
export default class DuckDuckGoProvider extends AutocompleteProvider {
constructor() {
super(DDG_REGEX);
@ -96,13 +95,6 @@ export default class DuckDuckGoProvider extends AutocompleteProvider {
return '🔍 ' + _t('Results from DuckDuckGo');
}
static getInstance(): DuckDuckGoProvider {
if (instance == null) {
instance = new DuckDuckGoProvider();
}
return instance;
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_block">
{ completions }

View file

@ -1,6 +1,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -70,8 +71,6 @@ const EMOJI_SHORTNAMES = Object.keys(EmojiData).map((key) => EmojiData[key]).sor
};
});
let instance = null;
function score(query, space) {
const index = space.indexOf(query);
if (index === -1) {
@ -151,11 +150,6 @@ export default class EmojiProvider extends AutocompleteProvider {
return '😃 ' + _t('Emoji');
}
static getInstance() {
if (instance == null) {instance = new EmojiProvider();}
return instance;
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_pill">
{ completions }

View file

@ -1,6 +1,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -27,8 +28,6 @@ import _sortBy from 'lodash/sortBy';
const ROOM_REGEX = /(?=#)(\S*)/g;
let instance = null;
function score(query, space) {
const index = space.indexOf(query);
if (index === -1) {
@ -96,14 +95,6 @@ export default class RoomProvider extends AutocompleteProvider {
return '💬 ' + _t('Rooms');
}
static getInstance() {
if (instance == null) {
instance = new RoomProvider();
}
return instance;
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate">
{ completions }

View file

@ -2,6 +2,7 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -30,20 +31,55 @@ import type {Room, RoomMember} from 'matrix-js-sdk';
const USER_REGEX = /@\S*/g;
let instance = null;
export default class UserProvider extends AutocompleteProvider {
users: Array<RoomMember> = null;
room: Room = null;
constructor() {
constructor(room) {
super(USER_REGEX, {
keys: ['name'],
});
this.room = room;
this.matcher = new FuzzyMatcher([], {
keys: ['name', 'userId'],
shouldMatchPrefix: true,
});
this._onRoomTimelineBound = this._onRoomTimeline.bind(this);
this._onRoomStateMemberBound = this._onRoomStateMember.bind(this);
MatrixClientPeg.get().on("Room.timeline", this._onRoomTimelineBound);
MatrixClientPeg.get().on("RoomState.members", this._onRoomStateMemberBound);
}
destroy() {
MatrixClientPeg.get().removeListener("Room.timeline", this._onRoomTimelineBound);
MatrixClientPeg.get().removeListener("RoomState.members", this._onRoomStateMemberBound);
}
_onRoomTimeline(ev, room, toStartOfTimeline, removed, data) {
if (!room) return;
if (removed) return;
if (room.roomId !== this.room.roomId) return;
// ignore events from filtered timelines
if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;
// ignore anything but real-time updates at the end of the room:
// updates from pagination will happen when the paginate completes.
if (toStartOfTimeline || !data || !data.liveEvent) return;
this.onUserSpoke(ev.sender);
}
_onRoomStateMember(ev, state, member) {
// ignore members in other rooms
if (member.roomId !== this.room.roomId) {
return;
}
// blow away the users cache
this.users = null;
}
async getCompletions(query: string, selection: {start: number, end: number}, force = false) {
@ -86,11 +122,6 @@ export default class UserProvider extends AutocompleteProvider {
return '👥 ' + _t('Users');
}
setUserListFromRoom(room: Room) {
this.room = room;
this.users = null;
}
_makeUsers() {
const events = this.room.getLiveTimeline().getEvents();
const lastSpoken = {};
@ -123,13 +154,6 @@ export default class UserProvider extends AutocompleteProvider {
this.matcher.setObjects(this.users);
}
static getInstance(): UserProvider {
if (instance == null) {
instance = new UserProvider();
}
return instance;
}
renderCompletions(completions: [React.Component]): ?React.Component {
return <div className="mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate">
{ completions }

View file

@ -116,7 +116,6 @@ const FilePanel = React.createClass({
timelineSet={this.state.timelineSet}
showUrlPreview = {false}
tileShape="file_grid"
opacity={this.props.opacity}
empty={_t('There are no visible files in this room')}
/>
);

View file

@ -29,6 +29,8 @@ import classnames from 'classnames';
import GroupStoreCache from '../../stores/GroupStoreCache';
import GroupStore from '../../stores/GroupStore';
import { showGroupAddRoomDialog } from '../../GroupAddressPicker';
import GeminiScrollbar from 'react-gemini-scrollbar';
const RoomSummaryType = PropTypes.shape({
room_id: PropTypes.string.isRequired,
@ -64,11 +66,11 @@ const CategoryRoomList = React.createClass({
editing: PropTypes.bool.isRequired,
},
onAddRoomsClicked: function(ev) {
onAddRoomsToSummaryClicked: function(ev) {
ev.preventDefault();
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Add Rooms to Group Summary', '', AddressPickerDialog, {
title: _t('Add rooms to the group summary'),
title: _t('Add rooms to the community summary'),
description: _t("Which rooms would you like to add to this summary?"),
placeholder: _t("Room name or alias"),
button: _t("Add to summary"),
@ -106,7 +108,9 @@ const CategoryRoomList = React.createClass({
render: function() {
const TintableSvg = sdk.getComponent("elements.TintableSvg");
const addButton = this.props.editing ?
(<AccessibleButton className="mx_GroupView_featuredThings_addButton" onClick={this.onAddRoomsClicked}>
(<AccessibleButton className="mx_GroupView_featuredThings_addButton"
onClick={this.onAddRoomsToSummaryClicked}
>
<TintableSvg src="img/icons-create-room.svg" width="64" height="64" />
<div className="mx_GroupView_featuredThings_addButton_label">
{ _t('Add a Room') }
@ -242,7 +246,7 @@ const RoleUserList = React.createClass({
ev.preventDefault();
const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog");
Modal.createTrackedDialog('Add Users to Group Summary', '', AddressPickerDialog, {
title: _t('Add users to the group summary'),
title: _t('Add users to the community summary'),
description: _t("Who would you like to add to this summary?"),
placeholder: _t("Name or matrix ID"),
button: _t("Add to summary"),
@ -263,7 +267,7 @@ const RoleUserList = React.createClass({
}
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog(
'Failed to add the following users to the group summary',
'Failed to add the following users to the community summary',
'', ErrorDialog,
{
title: _t(
@ -335,7 +339,7 @@ const FeaturedUser = React.createClass({
const displayName = this.props.summaryInfo.displayname || this.props.summaryInfo.user_id;
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog(
'Failed to remove user from group summary',
'Failed to remove user from community summary',
'', ErrorDialog,
{
title: _t(
@ -403,6 +407,10 @@ export default React.createClass({
getInitialState: function() {
return {
summary: null,
isGroupPublicised: null,
isUserPrivileged: null,
groupRooms: null,
groupRoomsLoading: null,
error: null,
editing: false,
saving: false,
@ -443,9 +451,25 @@ export default React.createClass({
_initGroupStore: function(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(MatrixClientPeg.get(), groupId);
this._groupStore.on('update', () => {
this._groupStore.registerListener(() => {
const summary = this._groupStore.getSummary();
if (summary.profile) {
// Default profile fields should be "" for later sending to the server (which
// requires that the fields are strings, not null)
["avatar_url", "long_description", "name", "short_description"].forEach((k) => {
summary.profile[k] = summary.profile[k] || "";
});
}
this.setState({
summary: this._groupStore.getSummary(),
summary,
summaryLoading: !this._groupStore.isStateReady(GroupStore.STATE_KEY.Summary),
isGroupPublicised: this._groupStore.getGroupPublicity(),
isUserPrivileged: this._groupStore.isUserPrivileged(),
groupRooms: this._groupStore.getGroupRooms(),
groupRoomsLoading: !this._groupStore.isStateReady(GroupStore.STATE_KEY.GroupRooms),
isUserMember: this._groupStore.getGroupMembers().some(
(m) => m.userId === MatrixClientPeg.get().credentials.userId,
),
error: null,
});
});
@ -466,6 +490,10 @@ export default React.createClass({
editing: true,
profileForm: Object.assign({}, this.state.summary.profile),
});
dis.dispatch({
action: 'panel_disable',
sideDisabled: true,
});
},
_onCancelClick: function() {
@ -473,17 +501,18 @@ export default React.createClass({
editing: false,
profileForm: null,
});
dis.dispatch({action: 'panel_disable'});
},
_onNameChange: function(e) {
const newProfileForm = Object.assign(this.state.profileForm, { name: e.target.value });
_onNameChange: function(value) {
const newProfileForm = Object.assign(this.state.profileForm, { name: value });
this.setState({
profileForm: newProfileForm,
});
},
_onShortDescChange: function(e) {
const newProfileForm = Object.assign(this.state.profileForm, { short_description: e.target.value });
_onShortDescChange: function(value) {
const newProfileForm = Object.assign(this.state.profileForm, { short_description: value });
this.setState({
profileForm: newProfileForm,
});
@ -520,22 +549,26 @@ export default React.createClass({
_onSaveClick: function() {
this.setState({saving: true});
MatrixClientPeg.get().setGroupProfile(this.props.groupId, this.state.profileForm).then((result) => {
const savePromise = this.state.isUserPrivileged ?
MatrixClientPeg.get().setGroupProfile(this.props.groupId, this.state.profileForm) :
Promise.resolve();
savePromise.then((result) => {
this.setState({
saving: false,
editing: false,
summary: null,
});
dis.dispatch({action: 'panel_disable'});
this._initGroupStore(this.props.groupId);
}).catch((e) => {
this.setState({
saving: false,
});
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to save group profile", e);
console.error("Failed to save community profile", e);
Modal.createTrackedDialog('Failed to update group', '', ErrorDialog, {
title: _t('Error'),
description: _t('Failed to update group'),
description: _t('Failed to update community'),
});
}).done();
},
@ -571,7 +604,7 @@ export default React.createClass({
_onLeaveClick: function() {
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createTrackedDialog('Leave Group', '', QuestionDialog, {
title: _t("Leave Group"),
title: _t("Leave Community"),
description: _t("Leave %(groupName)s?", {groupName: this.props.groupId}),
button: _t("Leave"),
danger: true,
@ -593,18 +626,15 @@ export default React.createClass({
});
},
_onPubliciseOffClick: function() {
this._setPublicity(false);
_onAddRoomsClick: function() {
showGroupAddRoomDialog(this.props.groupId);
},
_onPubliciseOnClick: function() {
this._setPublicity(true);
},
_setPublicity: function(publicity) {
_onPublicityToggle: function() {
this.setState({
publicityBusy: true,
});
const publicity = !this.state.isGroupPublicised;
this._groupStore.setGroupPublicity(publicity).then(() => {
this.setState({
publicityBusy: false,
@ -612,6 +642,49 @@ export default React.createClass({
});
},
_getGroupSection: function() {
const groupSettingsSectionClasses = classnames({
"mx_GroupView_group": this.state.editing,
"mx_GroupView_group_disabled": this.state.editing && !this.state.isUserPrivileged,
});
const header = this.state.editing ? <h2> { _t('Community Settings') } </h2> : <div />;
return <div className={groupSettingsSectionClasses}>
{ header }
{ this._getLongDescriptionNode() }
{ this._getRoomsNode() }
</div>;
},
_getRoomsNode: function() {
const RoomDetailList = sdk.getComponent('rooms.RoomDetailList');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
const TintableSvg = sdk.getComponent('elements.TintableSvg');
const Spinner = sdk.getComponent('elements.Spinner');
const addRoomRow = this.state.editing ?
(<AccessibleButton className="mx_GroupView_rooms_header_addRow"
onClick={this._onAddRoomsClick}
>
<div className="mx_GroupView_rooms_header_addRow_button">
<TintableSvg src="img/icons-room-add.svg" width="24" height="24" />
</div>
<div className="mx_GroupView_rooms_header_addRow_label">
{ _t('Add rooms to this community') }
</div>
</AccessibleButton>) : <div />;
return <div className="mx_GroupView_rooms">
<div className="mx_GroupView_rooms_header">
<h3>{ _t('Rooms') }</h3>
{ addRoomRow }
</div>
{ this.state.groupRoomsLoading ?
<Spinner /> :
<RoomDetailList rooms={this.state.groupRooms} />
}
</div>;
},
_getFeaturedRoomsNode: function() {
const summary = this.state.summary;
@ -706,111 +779,126 @@ export default React.createClass({
<Spinner />
</div>;
}
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_invited">
<div className="mx_GroupView_membershipSection_description">
{ _t("%(inviter)s has invited you to join this group", {inviter: group.inviter.userId}) }
</div>
<div className="mx_GroupView_membership_buttonContainer">
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onAcceptInviteClick}
>
{ _t("Accept") }
</AccessibleButton>
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onRejectInviteClick}
>
{ _t("Decline") }
</AccessibleButton>
</div>
</div>;
} else if (group.myMembership === 'join') {
let youAreAMemberText = _t("You are a member of this group");
if (this.state.summary.user && this.state.summary.user.is_privileged) {
youAreAMemberText = _t("You are an administrator of this group");
}
let publicisedButton;
if (this.state.publicityBusy) {
publicisedButton = <Spinner />;
}
let publicisedSection;
if (this.state.summary.user && this.state.summary.user.is_publicised) {
if (!this.state.publicityBusy) {
publicisedButton = <AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onPubliciseOffClick}
>
{ _t("Unpublish") }
</AccessibleButton>;
}
publicisedSection = <div className="mx_GroupView_membershipSubSection">
{ _t("This group is published on your profile") }
<div className="mx_GroupView_membership_buttonContainer">
{ publicisedButton }
</div>
</div>;
} else {
if (!this.state.publicityBusy) {
publicisedButton = <AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onPubliciseOnClick}
>
{ _t("Publish") }
</AccessibleButton>;
}
publicisedSection = <div className="mx_GroupView_membershipSubSection">
{ _t("This group is not published on your profile") }
<div className="mx_GroupView_membership_buttonContainer">
{ publicisedButton }
</div>
</div>;
}
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_joined">
<div className="mx_GroupView_membershipSubSection">
<div className="mx_GroupView_membershipSection_description">
{ youAreAMemberText }
{ _t("%(inviter)s has invited you to join this community", {inviter: group.inviter.userId}) }
</div>
<div className="mx_GroupView_membership_buttonContainer">
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onAcceptInviteClick}
>
{ _t("Accept") }
</AccessibleButton>
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onRejectInviteClick}
>
{ _t("Decline") }
</AccessibleButton>
</div>
</div>
</div>;
} else if (group.myMembership === 'join' && this.state.editing) {
const leaveButtonTooltip = this.state.isUserPrivileged ?
_t("You are an administrator of this community") :
_t("You are a member of this community");
const leaveButtonClasses = classnames({
"mx_RoomHeader_textButton": true,
"mx_GroupView_textButton": true,
"mx_GroupView_leaveButton": true,
"mx_RoomHeader_textButton_danger": this.state.isUserPrivileged,
});
return <div className="mx_GroupView_membershipSection mx_GroupView_membershipSection_joined">
<div className="mx_GroupView_membershipSubSection">
{ /* Empty div for flex alignment */ }
<div />
<div className="mx_GroupView_membership_buttonContainer">
<AccessibleButton
className={leaveButtonClasses}
onClick={this._onLeaveClick}
title={leaveButtonTooltip}
>
{ _t("Leave") }
</AccessibleButton>
</div>
</div>
{ publicisedSection }
</div>;
}
return null;
},
_getMemberSettingsSection: function() {
return <div className="mx_GroupView_memberSettings">
<h2> { _t("Community Member Settings") } </h2>
<div className="mx_GroupView_memberSettings_toggle">
<input type="checkbox"
onClick={this._onPublicityToggle}
checked={this.state.isGroupPublicised}
tabIndex="3"
id="isGroupPublicised"
/>
<label htmlFor="isGroupPublicised"
onClick={this._onPublicityToggle}
>
{ _t("Publish this community on your profile") }
</label>
</div>
</div>;
},
_getLongDescriptionNode: function() {
const summary = this.state.summary;
let description = null;
if (summary.profile && summary.profile.long_description) {
description = sanitizedHtmlNode(summary.profile.long_description);
}
const groupDescEditingClasses = classnames({
"mx_GroupView_groupDesc": true,
"mx_GroupView_groupDesc_disabled": !this.state.isUserPrivileged,
});
return this.state.editing ?
<div className={groupDescEditingClasses}>
<h3> { _t("Long Description (HTML)") } </h3>
<textarea
value={this.state.profileForm.long_description}
onChange={this._onLongDescChange}
tabIndex="4"
key="editLongDesc"
/>
</div> :
<div className="mx_GroupView_groupDesc">
{ description }
</div>;
},
render: function() {
const GroupAvatar = sdk.getComponent("avatars.GroupAvatar");
const Loader = sdk.getComponent("elements.Spinner");
const Spinner = sdk.getComponent("elements.Spinner");
const TintableSvg = sdk.getComponent("elements.TintableSvg");
if (this.state.summary === null && this.state.error === null || this.state.saving) {
return <Loader />;
if (this.state.summaryLoading && this.state.error === null || this.state.saving) {
return <Spinner />;
} else if (this.state.summary) {
const summary = this.state.summary;
let avatarNode;
let nameNode;
let shortDescNode;
let roomBody;
const bodyNodes = [
this._getMembershipSection(),
this.state.editing ? this._getMemberSettingsSection() : null,
this._getGroupSection(),
];
const rightButtons = [];
const headerClasses = {
mx_GroupView_header: true,
};
if (this.state.editing) {
if (this.state.editing && this.state.isUserPrivileged) {
let avatarImage;
if (this.state.uploadingAvatar) {
avatarImage = <Loader />;
avatarImage = <Spinner />;
} else {
const GroupAvatar = sdk.getComponent('avatars.GroupAvatar');
avatarImage = <GroupAvatar groupId={this.props.groupId}
groupName={this.state.profileForm.name}
groupAvatarUrl={this.state.profileForm.avatar_url}
width={48} height={48} resizeMethod='crop'
/>;
@ -831,18 +919,54 @@ export default React.createClass({
</div>
</div>
);
nameNode = <input type="text"
value={this.state.profileForm.name}
onChange={this._onNameChange}
placeholder={_t('Group Name')}
tabIndex="1"
/>;
shortDescNode = <input type="text"
value={this.state.profileForm.short_description}
onChange={this._onShortDescChange}
placeholder={_t('Description')}
tabIndex="2"
const EditableText = sdk.getComponent("elements.EditableText");
nameNode = <EditableText ref="nameEditor"
className="mx_GroupView_editable"
placeholderClassName="mx_GroupView_placeholder"
placeholder={_t('Community Name')}
blurToCancel={false}
initialValue={this.state.profileForm.name}
onValueChanged={this._onNameChange}
tabIndex="1"
dir="auto" />;
shortDescNode = <EditableText ref="descriptionEditor"
className="mx_GroupView_editable"
placeholderClassName="mx_GroupView_placeholder"
placeholder={_t("Description")}
blurToCancel={false}
initialValue={this.state.profileForm.short_description}
onValueChanged={this._onShortDescChange}
tabIndex="2"
dir="auto" />;
} else {
const onGroupHeaderItemClick = this.state.isUserMember ? this._onEditClick : null;
const groupAvatarUrl = summary.profile ? summary.profile.avatar_url : null;
const groupName = summary.profile ? summary.profile.name : null;
avatarNode = <GroupAvatar
groupId={this.props.groupId}
groupAvatarUrl={groupAvatarUrl}
groupName={groupName}
onClick={onGroupHeaderItemClick}
width={48} height={48}
/>;
if (summary.profile && summary.profile.name) {
nameNode = <div onClick={onGroupHeaderItemClick}>
<span>{ summary.profile.name }</span>
<span className="mx_GroupView_header_groupid">
({ this.props.groupId })
</span>
</div>;
} else {
nameNode = <span onClick={onGroupHeaderItemClick}>{ this.props.groupId }</span>;
}
if (summary.profile && summary.profile.short_description) {
shortDescNode = <span onClick={onGroupHeaderItemClick}>{ summary.profile.short_description }</span>;
}
}
if (this.state.editing) {
rightButtons.push(
<AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton"
onClick={this._onSaveClick} key="_saveButton"
@ -856,47 +980,11 @@ export default React.createClass({
width="18" height="18" alt={_t("Cancel")} />
</AccessibleButton>,
);
roomBody = <div>
<textarea className="mx_GroupView_editLongDesc" value={this.state.profileForm.long_description}
onChange={this._onLongDescChange}
tabIndex="3"
/>
{ this._getFeaturedRoomsNode() }
{ this._getFeaturedUsersNode() }
</div>;
} else {
const groupAvatarUrl = summary.profile ? summary.profile.avatar_url : null;
avatarNode = <GroupAvatar
groupId={this.props.groupId}
groupAvatarUrl={groupAvatarUrl}
width={48} height={48}
/>;
if (summary.profile && summary.profile.name) {
nameNode = <div>
<span>{ summary.profile.name }</span>
<span className="mx_GroupView_header_groupid">
({ this.props.groupId })
</span>
</div>;
} else {
nameNode = <span>{ this.props.groupId }</span>;
}
shortDescNode = <span>{ summary.profile.short_description }</span>;
let description = null;
if (summary.profile && summary.profile.long_description) {
description = sanitizedHtmlNode(summary.profile.long_description);
}
roomBody = <div>
{ this._getMembershipSection() }
<div className="mx_GroupView_groupDesc">{ description }</div>
{ this._getFeaturedRoomsNode() }
{ this._getFeaturedUsersNode() }
</div>;
if (summary.user && summary.user.is_privileged) {
if (summary.user && summary.user.membership === 'join') {
rightButtons.push(
<AccessibleButton className="mx_GroupHeader_button"
onClick={this._onEditClick} title={_t("Edit Group")} key="_editButton"
onClick={this._onEditClick} title={_t("Community Settings")} key="_editButton"
>
<TintableSvg src="img/icons-settings-room.svg" width="16" height="16" />
</AccessibleButton>,
@ -911,10 +999,14 @@ export default React.createClass({
</AccessibleButton>,
);
}
headerClasses.mx_GroupView_header_view = true;
}
const headerClasses = {
mx_GroupView_header: true,
mx_GroupView_header_view: !this.state.editing,
mx_GroupView_header_isUserMember: this.state.isUserMember,
};
return (
<div className="mx_GroupView">
<div className={classnames(headerClasses)}>
@ -935,24 +1027,26 @@ export default React.createClass({
{ rightButtons }
</div>
</div>
{ roomBody }
<GeminiScrollbar className="mx_GroupView_body">
{ bodyNodes }
</GeminiScrollbar>
</div>
);
} else if (this.state.error) {
if (this.state.error.httpStatus === 404) {
return (
<div className="mx_GroupView_error">
Group { this.props.groupId } not found
{ _t('Community %(groupId)s not found', {groupId: this.props.groupId}) }
</div>
);
} else {
let extraText;
if (this.state.error.errcode === 'M_UNRECOGNIZED') {
extraText = <div>{ _t('This Home server does not support groups') }</div>;
extraText = <div>{ _t('This Home server does not support communities') }</div>;
}
return (
<div className="mx_GroupView_error">
Failed to load { this.props.groupId }
{ _t('Failed to load %(groupId)s', {groupId: this.props.groupId }) }
{ extraText }
</div>
);

View file

@ -240,11 +240,13 @@ export default React.createClass({
oobData={this.props.roomOobData}
eventPixelOffset={this.props.initialEventPixelOffset}
key={this.props.currentRoomId || 'roomview'}
opacity={this.props.middleOpacity}
disabled={this.props.middleDisabled}
collapsedRhs={this.props.collapseRhs}
ConferenceHandler={this.props.ConferenceHandler}
/>;
if (!this.props.collapseRhs) right_panel = <RightPanel roomId={this.props.currentRoomId} opacity={this.props.rightOpacity} />;
if (!this.props.collapseRhs) {
right_panel = <RightPanel roomId={this.props.currentRoomId} disabled={this.props.rightDisabled} />;
}
break;
case PageTypes.UserSettings:
@ -254,7 +256,7 @@ export default React.createClass({
referralBaseUrl={this.props.config.referralBaseUrl}
teamToken={this.props.teamToken}
/>;
if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity} />;
if (!this.props.collapseRhs) right_panel = <RightPanel disabled={this.props.rightDisabled} />;
break;
case PageTypes.MyGroups:
@ -266,7 +268,7 @@ export default React.createClass({
onRoomCreated={this.props.onRoomCreated}
collapsedRhs={this.props.collapseRhs}
/>;
if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity} />;
if (!this.props.collapseRhs) right_panel = <RightPanel disabled={this.props.rightDisabled} />;
break;
case PageTypes.RoomDirectory:
@ -294,14 +296,14 @@ export default React.createClass({
case PageTypes.UserView:
page_element = null; // deliberately null for now
right_panel = <RightPanel opacity={this.props.rightOpacity} />;
right_panel = <RightPanel disabled={this.props.rightDisabled} />;
break;
case PageTypes.GroupView:
page_element = <GroupView
groupId={this.props.currentGroupId}
collapsedRhs={this.props.collapseRhs}
/>;
if (!this.props.collapseRhs) right_panel = <RightPanel groupId={this.props.currentGroupId} opacity={this.props.rightOpacity} />;
if (!this.props.collapseRhs) right_panel = <RightPanel groupId={this.props.currentGroupId} disabled={this.props.rightDisabled} />;
break;
}
@ -334,7 +336,7 @@ export default React.createClass({
<LeftPanel
selectedRoom={this.props.currentRoomId}
collapsed={this.props.collapseLhs || false}
opacity={this.props.leftOpacity}
disabled={this.props.leftDisabled}
/>
<main className='mx_MatrixChat_middlePanel'>
{ page_element }

View file

@ -145,9 +145,9 @@ module.exports = React.createClass({
collapseLhs: false,
collapseRhs: false,
leftOpacity: 1.0,
middleOpacity: 1.0,
rightOpacity: 1.0,
leftDisabled: false,
middleDisabled: false,
rightDisabled: false,
version: null,
newVersion: null,
@ -534,12 +534,11 @@ module.exports = React.createClass({
collapseRhs: false,
});
break;
case 'ui_opacity': {
const sideDefault = payload.sideOpacity >= 0.0 ? payload.sideOpacity : 1.0;
case 'panel_disable': {
this.setState({
leftOpacity: payload.leftOpacity >= 0.0 ? payload.leftOpacity : sideDefault,
middleOpacity: payload.middleOpacity || 1.0,
rightOpacity: payload.rightOpacity >= 0.0 ? payload.rightOpacity : sideDefault,
leftDisabled: payload.leftDisabled || payload.sideDisabled || false,
middleDisabled: payload.middleDisabled || false,
rightDisabled: payload.rightDisabled || payload.sideDisabled || false,
});
break; }
case 'set_theme':

View file

@ -16,6 +16,7 @@ limitations under the License.
import React from 'react';
import ReactDOM from 'react-dom';
import classNames from 'classnames';
import UserSettingsStore from '../../UserSettingsStore';
import shouldHideEvent from '../../shouldHideEvent';
import dis from "../../dispatcher";
@ -78,9 +79,6 @@ module.exports = React.createClass({
// callback which is called when more content is needed.
onFillRequest: React.PropTypes.func,
// opacity for dynamic UI fading effects
opacity: React.PropTypes.number,
// className for the panel
className: React.PropTypes.string.isRequired,
@ -353,7 +351,7 @@ module.exports = React.createClass({
}
if (!isMembershipChange(collapsedMxEv) ||
this._wantsDateSeparator(this.props.events[i], collapsedMxEv.getDate())) {
this._wantsDateSeparator(mxEv, collapsedMxEv.getDate())) {
break;
}
@ -376,9 +374,7 @@ module.exports = React.createClass({
// of MemberEventListSummary, render each member event as if the previous
// one was itself. This way, the timestamp of the previous event === the
// timestamp of the current event, and no DateSeperator is inserted.
const ret = this._getTilesForEvent(e, e, e === lastShownEvent);
prevEvent = e;
return ret;
return this._getTilesForEvent(e, e, e === lastShownEvent);
}).reduce((a, b) => a.concat(b));
if (eventTiles.length === 0) {
@ -397,6 +393,7 @@ module.exports = React.createClass({
ret.push(this._getReadMarkerTile(visible));
}
prevEvent = mxEv;
continue;
}
@ -649,12 +646,13 @@ module.exports = React.createClass({
}
const style = this.props.hidden ? { display: 'none' } : {};
style.opacity = this.props.opacity;
let className = this.props.className + " mx_fadable";
if (this.props.alwaysShowTimestamps) {
className += " mx_MessagePanel_alwaysShowTimestamps";
}
const className = classNames(
this.props.className,
{
"mx_MessagePanel_alwaysShowTimestamps": this.props.alwaysShowTimestamps,
},
);
return (
<ScrollPanel ref="scrollPanel" className={className}

View file

@ -15,14 +15,18 @@ limitations under the License.
*/
import React from 'react';
import PropTypes from 'prop-types';
import GeminiScrollbar from 'react-gemini-scrollbar';
import {MatrixClient} from 'matrix-js-sdk';
import sdk from '../../index';
import { _t, _tJsx } from '../../languageHandler';
import withMatrixClient from '../../wrappers/withMatrixClient';
import AccessibleButton from '../views/elements/AccessibleButton';
import dis from '../../dispatcher';
import PropTypes from 'prop-types';
import Modal from '../../Modal';
import FlairStore from '../../stores/FlairStore';
const GroupTile = React.createClass({
displayName: 'GroupTile',
@ -30,6 +34,22 @@ const GroupTile = React.createClass({
groupId: PropTypes.string.isRequired,
},
contextTypes: {
matrixClient: React.PropTypes.instanceOf(MatrixClient).isRequired,
},
getInitialState() {
return {
profile: null,
};
},
componentWillMount: function() {
FlairStore.getGroupProfileCached(this.context.matrixClient, this.props.groupId).then((profile) => {
this.setState({profile});
});
},
onClick: function(e) {
e.preventDefault();
dis.dispatch({
@ -39,7 +59,23 @@ const GroupTile = React.createClass({
},
render: function() {
return <a onClick={this.onClick} href="#">{ this.props.groupId }</a>;
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
const profile = this.state.profile || {};
const name = profile.name || this.props.groupId;
const desc = profile.shortDescription;
const httpUrl = profile.avatarUrl ? this.context.matrixClient.mxcUrlToHttp(
profile.avatarUrl, 50, 50, "crop",
) : null;
return <AccessibleButton className="mx_GroupTile" onClick={this.onClick}>
<div className="mx_GroupTile_avatar">
<BaseAvatar name={name} url={httpUrl} width={50} height={50} />
</div>
<div className="mx_GroupTile_profile">
<h3 className="mx_GroupTile_name">{ name }</h3>
<div className="mx_GroupTile_desc">{ desc }</div>
<div className="mx_GroupTile_groupId">{ this.props.groupId }</div>
</div>
</AccessibleButton>;
},
});
@ -63,7 +99,7 @@ export default withMatrixClient(React.createClass({
_onCreateGroupClick: function() {
const CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog");
Modal.createTrackedDialog('Create Group', '', CreateGroupDialog);
Modal.createTrackedDialog('Create Community', '', CreateGroupDialog);
},
_fetch: function() {
@ -80,60 +116,67 @@ export default withMatrixClient(React.createClass({
const TintableSvg = sdk.getComponent("elements.TintableSvg");
let content;
let contentHeader;
if (this.state.groups) {
const groupNodes = [];
this.state.groups.forEach((g) => {
groupNodes.push(
<div key={g}>
<GroupTile groupId={g} />
</div>,
);
groupNodes.push(<GroupTile groupId={g} />);
});
content = <div>
<div>{ _t('You are a member of these groups:') }</div>
{ groupNodes }
</div>;
contentHeader = groupNodes.length > 0 ? <h3>{ _t('Your Communities') }</h3> : <div />;
content = groupNodes.length > 0 ?
<GeminiScrollbar className="mx_MyGroups_joinedGroups">
{ groupNodes }
</GeminiScrollbar> :
<div className="mx_MyGroups_placeholder">
{ _t(
"You're not currently a member of any communities.",
) }
</div>;
} else if (this.state.error) {
content = <div className="mx_MyGroups_error">
{ _t('Error whilst fetching joined groups') }
{ _t('Error whilst fetching joined communities') }
</div>;
} else {
content = <Loader />;
}
return <div className="mx_MyGroups">
<SimpleRoomHeader title={_t("Groups")} icon="img/icons-groups.svg" />
<div className='mx_MyGroups_joinCreateBox'>
<div className="mx_MyGroups_createBox">
<div className="mx_MyGroups_joinCreateHeader">
{ _t('Create a new group') }
</div>
<AccessibleButton className='mx_MyGroups_joinCreateButton' onClick={this._onCreateGroupClick}>
<SimpleRoomHeader title={_t("Communities")} icon="img/icons-groups.svg" />
<div className='mx_MyGroups_header'>
<div className="mx_MyGroups_headerCard">
<AccessibleButton className='mx_MyGroups_headerCard_button' onClick={this._onCreateGroupClick}>
<TintableSvg src="img/icons-create-room.svg" width="50" height="50" />
</AccessibleButton>
{ _t(
'Create a group to represent your community! '+
'Define a set of rooms and your own custom homepage '+
'to mark out your space in the Matrix universe.',
) }
<div className="mx_MyGroups_headerCard_content">
<div className="mx_MyGroups_headerCard_header">
{ _t('Create a new community') }
</div>
{ _t(
'Create a community to group together users and rooms! ' +
'Build a custom homepage to mark out your space in the Matrix universe.',
) }
</div>
</div>
<div className="mx_MyGroups_joinBox">
<div className="mx_MyGroups_joinCreateHeader">
{ _t('Join an existing group') }
</div>
<AccessibleButton className='mx_MyGroups_joinCreateButton' onClick={this._onJoinGroupClick}>
<div className="mx_MyGroups_joinBox mx_MyGroups_headerCard">
<AccessibleButton className='mx_MyGroups_headerCard_button' onClick={this._onJoinGroupClick}>
<TintableSvg src="img/icons-create-room.svg" width="50" height="50" />
</AccessibleButton>
{ _tJsx(
'To join an existing group you\'ll have to '+
'know its group identifier; this will look '+
'something like <i>+example:matrix.org</i>.',
/<i>(.*)<\/i>/,
(sub) => <i>{ sub }</i>,
) }
<div className="mx_MyGroups_headerCard_content">
<div className="mx_MyGroups_headerCard_header">
{ _t('Join an existing community') }
</div>
{ _tJsx(
'To join an existing community you\'ll have to '+
'know its community identifier; this will look '+
'something like <i>+example:matrix.org</i>.',
/<i>(.*)<\/i>/,
(sub) => <i>{ sub }</i>,
) }
</div>
</div>
</div>
<div className="mx_MyGroups_content">
{ contentHeader }
{ content }
</div>
</div>;

View file

@ -45,7 +45,6 @@ const NotificationPanel = React.createClass({
manageReadMarkers={false}
timelineSet={timelineSet}
showUrlPreview = {false}
opacity={this.props.opacity}
tileShape="notif"
empty={_t('You have no visible notifications')}
/>

View file

@ -44,8 +44,6 @@ const Rooms = require('../../Rooms');
import KeyCode from '../../KeyCode';
import UserProvider from '../../autocomplete/UserProvider';
import RoomViewStore from '../../stores/RoomViewStore';
import RoomScrollStateStore from '../../stores/RoomScrollStateStore';
@ -541,12 +539,6 @@ module.exports = React.createClass({
});
}
}
// update the tab complete list as it depends on who most recently spoke,
// and that has probably just changed
if (ev.sender) {
UserProvider.getInstance().onUserSpoke(ev.sender);
}
},
onRoomName: function(room) {
@ -568,7 +560,6 @@ module.exports = React.createClass({
this._warnAboutEncryption(room);
this._calculatePeekRules(room);
this._updatePreviewUrlVisibility(room);
UserProvider.getInstance().setUserListFromRoom(room);
},
_warnAboutEncryption: function(room) {
@ -722,9 +713,6 @@ module.exports = React.createClass({
// refresh the conf call notification state
this._updateConfCallNotification();
// refresh the tab complete list
UserProvider.getInstance().setUserListFromRoom(this.state.room);
// if we are now a member of the room, where we were not before, that
// means we have finished joining a room we were previously peeking
// into.
@ -1697,7 +1685,7 @@ module.exports = React.createClass({
onResize={this.onChildResize}
uploadFile={this.uploadFile}
callState={this.state.callState}
opacity={this.props.opacity}
disabled={this.props.disabled}
showApps={this.state.showApps}
/>;
}
@ -1758,7 +1746,6 @@ module.exports = React.createClass({
className="mx_RoomView_messagePanel mx_RoomView_searchResultsPanel"
onFillRequest={this.onSearchResultsFillRequest}
onResize={this.onSearchResultsResize}
style={{ opacity: this.props.opacity }}
>
<li className={scrollheader_classes}></li>
{ this.getSearchResultTiles() }
@ -1789,7 +1776,6 @@ module.exports = React.createClass({
onScroll={this.onMessageListScroll}
onReadMarkerUpdated={this._updateTopUnreadMessagesBar}
showUrlPreview = {this.state.showUrlPreview}
opacity={this.props.opacity}
className="mx_RoomView_messagePanel"
/>);
@ -1797,7 +1783,7 @@ module.exports = React.createClass({
if (this.state.showTopUnreadMessagesBar) {
const TopUnreadMessagesBar = sdk.getComponent('rooms.TopUnreadMessagesBar');
topUnreadMessagesBar = (
<div className="mx_RoomView_topUnreadMessagesBar mx_fadable" style={{ opacity: this.props.opacity }}>
<div className="mx_RoomView_topUnreadMessagesBar">
<TopUnreadMessagesBar
onScrollUpClick={this.jumpToReadMarker}
onCloseClick={this.forgetReadMarker}
@ -1805,10 +1791,19 @@ module.exports = React.createClass({
</div>
);
}
let statusBarAreaClass = "mx_RoomView_statusArea mx_fadable";
if (isStatusAreaExpanded) {
statusBarAreaClass += " mx_RoomView_statusArea_expanded";
}
const statusBarAreaClass = classNames(
"mx_RoomView_statusArea",
{
"mx_RoomView_statusArea_expanded": isStatusAreaExpanded,
},
);
const fadableSectionClasses = classNames(
"mx_RoomView_body", "mx_fadable",
{
"mx_fadable_faded": this.props.disabled,
},
);
return (
<div className={"mx_RoomView" + (inCall ? " mx_RoomView_inCall" : "")} ref="roomView">
@ -1827,16 +1822,18 @@ module.exports = React.createClass({
onLeaveClick={(myMember && myMember.membership === "join") ? this.onLeaveClick : null}
/>
{ auxPanel }
{ topUnreadMessagesBar }
{ messagePanel }
{ searchResultsPanel }
<div className={statusBarAreaClass} style={{opacity: this.props.opacity}}>
<div className="mx_RoomView_statusAreaBox">
<div className="mx_RoomView_statusAreaBox_line"></div>
{ statusBar }
<div className={fadableSectionClasses}>
{ topUnreadMessagesBar }
{ messagePanel }
{ searchResultsPanel }
<div className={statusBarAreaClass}>
<div className="mx_RoomView_statusAreaBox">
<div className="mx_RoomView_statusAreaBox_line"></div>
{ statusBar }
</div>
</div>
{ messageComposer }
</div>
{ messageComposer }
</div>
);
},

View file

@ -148,6 +148,7 @@ module.exports = React.createClass({
onFillRequest: function(backwards) { return Promise.resolve(false); },
onUnfillRequest: function(backwards, scrollToken) {},
onScroll: function() {},
onResize: function() {},
};
},

View file

@ -89,9 +89,6 @@ var TimelinePanel = React.createClass({
// callback which is called when the read-up-to mark is updated.
onReadMarkerUpdated: React.PropTypes.func,
// opacity for dynamic UI fading effects
opacity: React.PropTypes.number,
// maximum number of events to show in a timeline
timelineCap: React.PropTypes.number,
@ -1157,7 +1154,6 @@ var TimelinePanel = React.createClass({
onScroll={this.onMessageListScroll}
onFillRequest={this.onMessageListFillRequest}
onUnfillRequest={this.onMessageListUnfillRequest}
opacity={this.props.opacity}
isTwelveHour={this.state.isTwelveHour}
alwaysShowTimestamps={this.state.alwaysShowTimestamps}
className={this.props.className}

View file

@ -118,6 +118,10 @@ const SETTINGS_LABELS = [
id: 'TextualBody.disableBigEmoji',
label: _td('Disable big emoji in chat'),
},
{
id: 'VideoView.flipVideoHorizontally',
label: _td('Mirror local video feed'),
},
/*
{
id: 'useFixedWidthFont',
@ -271,9 +275,9 @@ module.exports = React.createClass({
MatrixClientPeg.get().on("RoomMember.membership", this._onInviteStateChange);
dis.dispatch({
action: 'ui_opacity',
sideOpacity: 0.3,
middleOpacity: 0.3,
action: 'panel_disable',
sideDisabled: true,
middleDisabled: true,
});
this._refreshFromServer();
@ -311,9 +315,9 @@ module.exports = React.createClass({
componentWillUnmount: function() {
this._unmounted = true;
dis.dispatch({
action: 'ui_opacity',
sideOpacity: 1.0,
middleOpacity: 1.0,
action: 'panel_disable',
sideDisabled: false,
middleDisabled: false,
});
dis.unregister(this.dispatcherRef);
const cli = MatrixClientPeg.get();
@ -1328,8 +1332,11 @@ module.exports = React.createClass({
<div className="mx_UserSettings_avatarPicker">
<div className="mx_UserSettings_avatarPicker_remove" onClick={this.onAvatarRemoveClick}>
<img src="img/cancel.svg" width="15" height="15"
alt={_t("Remove avatar")} title={_t("Remove avatar")} />
<img src="img/cancel.svg"
width="15" height="15"
className="mx_filterFlipColor"
alt={_t("Remove avatar")}
title={_t("Remove avatar")} />
</div>
<div onClick={this.onAvatarPickerClick} className="mx_UserSettings_avatarPicker_imgContainer">
<ChangeAvatar ref="changeAvatar" initialAvatarUrl={avatarUrl}

View file

@ -166,7 +166,7 @@ module.exports = React.createClass({
} else if (this.state.progress === "sent_email") {
resetPasswordJsx = (
<div>
{ _t('An email has been sent to') } { this.state.email }. { _t("Once you've followed the link it contains, click below") }.
{ _t("An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", { emailAddress: this.state.email }) }
<br />
<input className="mx_Login_submit" type="button" onClick={this.onVerify}
value={_t('I have verified my email address')} />

View file

@ -302,7 +302,7 @@ module.exports = React.createClass({
} : {};
return this._matrixClient.register(
this.state.formVals.username,
this.state.formVals.username.toLowerCase(),
this.state.formVals.password,
undefined, // session id: included in the auth dict already
auth,

View file

@ -110,7 +110,7 @@ module.exports = React.createClass({
let idx = 0;
const initial = name[0];
if ((initial === '@' || initial === '#') && name[1]) {
if ((initial === '@' || initial === '#' || initial === '+') && name[1]) {
idx++;
}

View file

@ -24,10 +24,12 @@ export default React.createClass({
propTypes: {
groupId: PropTypes.string,
groupName: PropTypes.string,
groupAvatarUrl: PropTypes.string,
width: PropTypes.number,
height: PropTypes.number,
resizeMethod: PropTypes.string,
onClick: PropTypes.func,
},
getDefaultProps: function() {
@ -52,11 +54,11 @@ export default React.createClass({
// extract the props we use from props so we can pass any others through
// should consider adding this as a global rule in js-sdk?
/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
const {groupId, groupAvatarUrl, ...otherProps} = this.props;
const {groupId, groupAvatarUrl, groupName, ...otherProps} = this.props;
return (
<BaseAvatar
name={this.props.groupId[1]}
name={groupName || this.props.groupId[1]}
idName={this.props.groupId}
url={this.getGroupAvatarUrl()}
{...otherProps}

View file

@ -272,20 +272,27 @@ module.exports = React.createClass({
const topicEvent = room.currentState.getStateEvents('m.room.topic', '');
const name = nameEvent ? nameEvent.getContent().name : '';
const canonicalAlias = room.getCanonicalAlias();
const aliasEvents = room.currentState.getStateEvents('m.room.aliases');
const aliases = aliasEvents.map((ev) => ev.getContent().aliases).reduce((a, b) => {
return a.concat(b);
}, []);
const topic = topicEvent ? topicEvent.getContent().topic : '';
const nameMatch = (name || '').toLowerCase().includes(lowerCaseQuery);
const aliasMatch = (canonicalAlias || '').toLowerCase().includes(lowerCaseQuery);
const aliasMatch = aliases.some((alias) =>
(alias || '').toLowerCase().includes(lowerCaseQuery),
);
const topicMatch = (topic || '').toLowerCase().includes(lowerCaseQuery);
if (!(nameMatch || topicMatch || aliasMatch)) {
return;
}
const avatarEvent = room.currentState.getStateEvents('m.room.avatar', '');
const avatarUrl = avatarEvent ? avatarEvent.getContent().url : undefined;
results.push({
room_id: room.roomId,
avatar_url: avatarUrl,
name: name || canonicalAlias,
name: name || canonicalAlias || aliases[0] || _t('Unnamed Room'),
});
});
this._processResults(results, query);
@ -489,7 +496,12 @@ module.exports = React.createClass({
const AddressTile = sdk.getComponent("elements.AddressTile");
for (let i = 0; i < this.state.userList.length; i++) {
query.push(
<AddressTile key={i} address={this.state.userList[i]} canDismiss={true} onDismissed={this.onDismissed(i)} />,
<AddressTile
key={i}
address={this.state.userList[i]}
canDismiss={true}
onDismissed={this.onDismissed(i)}
showAddress={this.props.pickerType === 'user'} />,
);
}
}
@ -539,6 +551,7 @@ module.exports = React.createClass({
addressSelector = (
<AddressSelector ref={(ref) => {this.addressSelector = ref;}}
addressList={this.state.queryList}
showAddress={this.props.pickerType === 'user'}
onSelected={this.onSelected}
truncateAt={TRUNCATE_QUERY_LIST}
/>

View file

@ -36,6 +36,7 @@ export default React.createClass({
// group member object. Supply either this or 'member'
groupMember: GroupMemberType,
action: React.PropTypes.string.isRequired, // eg. 'Ban'
title: React.PropTypes.string.isRequired, // eg. 'Ban this user?'
// Whether to display a text field for a reason
// If true, the second argument to onFinished will
@ -75,7 +76,6 @@ export default React.createClass({
const MemberAvatar = sdk.getComponent("views.avatars.MemberAvatar");
const BaseAvatar = sdk.getComponent("views.avatars.BaseAvatar");
const title = _t("%(actionVerb)s this person?", { actionVerb: this.props.action});
const confirmButtonClass = classnames({
'mx_Dialog_primary': true,
'danger': this.props.danger,
@ -113,7 +113,7 @@ export default React.createClass({
return (
<BaseDialog className="mx_ConfirmUserActionDialog" onFinished={this.props.onFinished}
onEnterPressed={this.onOk}
title={title}
title={this.props.title}
>
<div className="mx_Dialog_content">
<div className="mx_ConfirmUserActionDialog_avatar">

View file

@ -21,10 +21,6 @@ import dis from '../../../dispatcher';
import { _t } from '../../../languageHandler';
import MatrixClientPeg from '../../../MatrixClientPeg';
// We match fairly liberally and leave it up to the server to reject if
// there are invalid characters etc.
const GROUP_REGEX = /^\+(.*?):(.*)$/;
export default React.createClass({
displayName: 'CreateGroupDialog',
propTypes: {
@ -58,22 +54,9 @@ export default React.createClass({
},
_checkGroupId: function(e) {
const parsedGroupId = this._parseGroupId(this.state.groupId);
let error = null;
if (parsedGroupId === null) {
error = _t(
"Group IDs must be of the form +localpart:%(domain)s",
{domain: MatrixClientPeg.get().getDomain()},
);
} else {
const domain = parsedGroupId[1];
if (domain !== MatrixClientPeg.get().getDomain()) {
error = _t(
"It is currently only possible to create groups on your own home server: "+
"use a group ID ending with %(domain)s",
{domain: MatrixClientPeg.get().getDomain()},
);
}
if (!/^[a-z0-9=_\-\.\/]*$/.test(this.state.groupId)) {
error = _t("Community IDs may only contain characters a-z, 0-9, or '=_-./'");
}
this.setState({
groupIdError: error,
@ -86,14 +69,13 @@ export default React.createClass({
if (this._checkGroupId()) return;
const parsedGroupId = this._parseGroupId(this.state.groupId);
const profile = {};
if (this.state.groupName !== '') {
profile.name = this.state.groupName;
}
this.setState({creating: true});
MatrixClientPeg.get().createGroup({
localpart: parsedGroupId[0],
localpart: this.state.groupId,
profile: profile,
}).then((result) => {
dis.dispatch({
@ -112,22 +94,6 @@ export default React.createClass({
this.props.onFinished(false);
},
/**
* Parse a string that may be a group ID
* If the string is a valid group ID, return a list of [localpart, domain],
* otherwise return null.
*
* @param {string} groupId The ID of the group
* @return {string[]} array of localpart, domain
*/
_parseGroupId: function(groupId) {
const matches = GROUP_REGEX.exec(this.state.groupId);
if (!matches || matches.length < 3) {
return null;
}
return [matches[1], matches[2]];
},
render: function() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
const Spinner = sdk.getComponent('elements.Spinner');
@ -142,7 +108,7 @@ export default React.createClass({
// rather than displaying what the server gives us, but synapse doesn't give
// any yet.
createErrorNode = <div className="error">
<div>{ _t('Room creation failed') }</div>
<div>{ _t('Something went wrong whilst creating your community') }</div>
<div>{ this.state.createError.message }</div>
</div>;
}
@ -150,13 +116,13 @@ export default React.createClass({
return (
<BaseDialog className="mx_CreateGroupDialog" onFinished={this.props.onFinished}
onEnterPressed={this._onFormSubmit}
title={_t('Create Group')}
title={_t('Create Community')}
>
<form onSubmit={this._onFormSubmit}>
<div className="mx_Dialog_content">
<div className="mx_CreateGroupDialog_inputRow">
<div className="mx_CreateGroupDialog_label">
<label htmlFor="groupname">{ _t('Group Name') }</label>
<label htmlFor="groupname">{ _t('Community Name') }</label>
</div>
<div>
<input id="groupname" className="mx_CreateGroupDialog_input"
@ -169,16 +135,21 @@ export default React.createClass({
</div>
<div className="mx_CreateGroupDialog_inputRow">
<div className="mx_CreateGroupDialog_label">
<label htmlFor="groupid">{ _t('Group ID') }</label>
<label htmlFor="groupid">{ _t('Community ID') }</label>
</div>
<div>
<input id="groupid" className="mx_CreateGroupDialog_input"
size="64"
placeholder={_t('+example:%(domain)s', {domain: MatrixClientPeg.get().getDomain()})}
<div className="mx_CreateGroupDialog_input_group">
<span className="mx_CreateGroupDialog_prefix">+</span>
<input id="groupid"
className="mx_CreateGroupDialog_input mx_CreateGroupDialog_input_hasPrefixAndSuffix"
size="32"
placeholder={_t('example')}
onChange={this._onGroupIdChange}
onBlur={this._onGroupIdBlur}
value={this.state.groupId}
/>
<span className="mx_CreateGroupDialog_suffix">
:{ MatrixClientPeg.get().getDomain() }
</span>
</div>
</div>
<div className="error">

View file

@ -30,6 +30,8 @@ export default React.createClass({
// List of the addresses to display
addressList: React.PropTypes.arrayOf(UserAddressType).isRequired,
// Whether to show the address on the address tiles
showAddress: React.PropTypes.bool,
truncateAt: React.PropTypes.number.isRequired,
selected: React.PropTypes.number,
@ -142,7 +144,13 @@ export default React.createClass({
key={this.props.addressList[i].addressType + "/" + this.props.addressList[i].address}
ref={(ref) => { this.addressListElement = ref; }}
>
<AddressTile address={this.props.addressList[i]} justified={true} networkName="vector" networkUrl="img/search-icon-vector.svg" />
<AddressTile
address={this.props.addressList[i]}
showAddress={this.props.showAddress}
justified={true}
networkName="vector"
networkUrl="img/search-icon-vector.svg"
/>
</div>,
);
}

View file

@ -87,7 +87,10 @@ export default React.createClass({
info = (
<div className="mx_AddressTile_mx">
<div className={nameClasses}>{ name }</div>
<div className={idClasses}>{ address.address }</div>
{ this.props.showAddress ?
<div className={idClasses}>{ address.address }</div> :
<div />
}
</div>
);
} else if (isMatrixAddress) {

View file

@ -172,18 +172,29 @@ export default React.createClass({
*/
_onDeleteClick: function() {
if (this._canUserModify()) {
console.log("Delete widget %s", this.props.id);
this.setState({deleting: true});
MatrixClientPeg.get().sendStateEvent(
this.props.room.roomId,
'im.vector.modular.widgets',
{}, // empty content
this.props.id,
).then(() => {
console.log('Deleted widget');
}, (e) => {
console.error('Failed to delete widget', e);
this.setState({deleting: false});
// Show delete confirmation dialog
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createTrackedDialog('Delete Widget', '', QuestionDialog, {
title: _t("Delete Widget"),
description: _t(
"Deleting a widget removes it for all users in this room." +
" Are you sure you want to delete this widget?"),
button: _t("Delete widget"),
onFinished: (confirmed) => {
if (!confirmed) {
return;
}
this.setState({deleting: true});
MatrixClientPeg.get().sendStateEvent(
this.props.room.roomId,
'im.vector.modular.widgets',
{}, // empty content
this.props.id,
).catch((e) => {
console.error('Failed to delete widget', e);
this.setState({deleting: false});
});
},
});
} else {
console.log("Revoke widget permissions - %s", this.props.id);
@ -305,7 +316,7 @@ export default React.createClass({
let deleteIcon = 'img/cancel.svg';
let deleteClasses = 'mx_filterFlipColor mx_AppTileMenuBarWidget';
if(this._canUserModify()) {
deleteIcon = 'img/cancel-red.svg';
deleteIcon = 'img/icon-delete-pink.svg';
deleteClasses += ' mx_AppTileMenuBarWidgetDelete';
}

View file

@ -84,7 +84,9 @@ module.exports = React.createClass({
onNewItemChanged: PropTypes.func,
onItemAdded: PropTypes.func,
onItemEdited: PropTypes.func,
onItemRemoved: PropTypes. func,
onItemRemoved: PropTypes.func,
canEdit: PropTypes.bool,
},
getDefaultProps: function() {
@ -136,14 +138,16 @@ module.exports = React.createClass({
{ label }
</div>
{ editableItems }
<EditableItem
key={-1}
initialValue={this.props.newItem}
onAdd={this.onItemAdded}
onChange={this.onNewItemChanged}
addOnChange={true}
placeholder={this.props.placeholder}
/>
{ this.props.canEdit ?
<EditableItem
key={-1}
initialValue={this.props.newItem}
onAdd={this.onItemAdded}
onChange={this.onNewItemChanged}
addOnChange={true}
placeholder={this.props.placeholder}
/> : <div />
}
</div>);
},
});

View file

@ -20,123 +20,9 @@ import React from 'react';
import PropTypes from 'prop-types';
import {MatrixClient} from 'matrix-js-sdk';
import UserSettingsStore from '../../../UserSettingsStore';
import FlairStore from '../../../stores/FlairStore';
import dis from '../../../dispatcher';
import Promise from 'bluebird';
const BULK_REQUEST_DEBOUNCE_MS = 200;
// Does the server support groups? Assume yes until we receive M_UNRECOGNIZED.
// If true, flair can function and we should keep sending requests for groups and avatars.
let groupSupport = true;
const USER_GROUPS_CACHE_BUST_MS = 1800000; // 30 mins
const GROUP_PROFILES_CACHE_BUST_MS = 1800000; // 30 mins
// TODO: Cache-busting based on time. (The server won't inform us of membership changes.)
// This applies to userGroups and groupProfiles. We can provide a slightly better UX by
// cache-busting when the current user joins/leaves a group.
const userGroups = {
// $userId: ['+group1:domain', '+group2:domain', ...]
};
const groupProfiles = {
// $groupId: {
// avatar_url: 'mxc://...'
// }
};
// Represents all unsettled promises to retrieve the groups for each userId. When a promise
// is settled, it is deleted from this object.
const usersPending = {
// $userId: {
// prom: Promise
// resolve: () => {}
// reject: () => {}
// }
};
let debounceTimeoutID;
function getPublicisedGroupsCached(matrixClient, userId) {
if (userGroups[userId]) {
return Promise.resolve(userGroups[userId]);
}
// Bulk lookup ongoing, return promise to resolve/reject
if (usersPending[userId]) {
return usersPending[userId].prom;
}
usersPending[userId] = {};
usersPending[userId].prom = new Promise((resolve, reject) => {
usersPending[userId].resolve = resolve;
usersPending[userId].reject = reject;
}).then((groups) => {
userGroups[userId] = groups;
setTimeout(() => {
delete userGroups[userId];
}, USER_GROUPS_CACHE_BUST_MS);
return userGroups[userId];
}).catch((err) => {
throw err;
}).finally(() => {
delete usersPending[userId];
});
// This debounce will allow consecutive requests for the public groups of users that
// are sent in intervals of < BULK_REQUEST_DEBOUNCE_MS to be batched and only requested
// when no more requests are received within the next BULK_REQUEST_DEBOUNCE_MS. The naive
// implementation would do a request that only requested the groups for `userId`, leading
// to a worst and best case of 1 user per request. This implementation's worst is still
// 1 user per request but only if the requests are > BULK_REQUEST_DEBOUNCE_MS apart and the
// best case is N users per request.
//
// This is to reduce the number of requests made whilst trading off latency when viewing
// a Flair component.
if (debounceTimeoutID) clearTimeout(debounceTimeoutID);
debounceTimeoutID = setTimeout(() => {
batchedGetPublicGroups(matrixClient);
}, BULK_REQUEST_DEBOUNCE_MS);
return usersPending[userId].prom;
}
async function batchedGetPublicGroups(matrixClient) {
// Take the userIds from the keys of usersPending
const usersInFlight = Object.keys(usersPending);
let resp = {
users: [],
};
try {
resp = await matrixClient.getPublicisedGroups(usersInFlight);
} catch (err) {
// Propagate the same error to all usersInFlight
usersInFlight.forEach((userId) => {
usersPending[userId].reject(err);
});
return;
}
const updatedUserGroups = resp.users;
usersInFlight.forEach((userId) => {
usersPending[userId].resolve(updatedUserGroups[userId] || []);
});
}
async function getGroupProfileCached(matrixClient, groupId) {
if (groupProfiles[groupId]) {
return groupProfiles[groupId];
}
const profile = await matrixClient.getGroupProfile(groupId);
groupProfiles[groupId] = {
groupId,
avatarUrl: profile.avatar_url,
};
setTimeout(() => {
delete groupProfiles[groupId];
}, GROUP_PROFILES_CACHE_BUST_MS);
return groupProfiles[groupId];
}
class FlairAvatar extends React.Component {
constructor() {
@ -156,11 +42,11 @@ class FlairAvatar extends React.Component {
render() {
const httpUrl = this.context.matrixClient.mxcUrlToHttp(
this.props.groupProfile.avatarUrl, 14, 14, 'scale', false);
this.props.groupProfile.avatarUrl, 16, 16, 'scale', false);
return <img
src={httpUrl}
width="14px"
height="14px"
width="16"
height="16"
onClick={this.onClick}
title={this.props.groupProfile.groupId} />;
}
@ -193,14 +79,14 @@ export default class Flair extends React.Component {
componentWillMount() {
this._unmounted = false;
if (UserSettingsStore.isFeatureEnabled('feature_groups') && groupSupport) {
if (UserSettingsStore.isFeatureEnabled('feature_groups') && FlairStore.groupSupport()) {
this._generateAvatars();
}
this.context.matrixClient.on('RoomState.events', this.onRoomStateEvents);
}
onRoomStateEvents(event) {
if (event.getType() === 'm.room.related_groups' && groupSupport) {
if (event.getType() === 'm.room.related_groups' && FlairStore.groupSupport()) {
this._generateAvatars();
}
}
@ -210,7 +96,7 @@ export default class Flair extends React.Component {
for (const groupId of groups) {
let groupProfile = null;
try {
groupProfile = await getGroupProfileCached(this.context.matrixClient, groupId);
groupProfile = await FlairStore.getGroupProfileCached(this.context.matrixClient, groupId);
} catch (err) {
console.error('Could not get profile for group', groupId, err);
}
@ -220,19 +106,7 @@ export default class Flair extends React.Component {
}
async _generateAvatars() {
let groups;
try {
groups = await getPublicisedGroupsCached(this.context.matrixClient, this.props.userId);
} catch (err) {
// Indicate whether the homeserver supports groups
if (err.errcode === 'M_UNRECOGNIZED') {
console.warn('Cannot display flair, server does not support groups');
groupSupport = false;
// Return silently to avoid spamming for non-supporting servers
return;
}
console.error('Could not get groups for user', this.props.userId, err);
}
let groups = await FlairStore.getPublicisedGroupsCached(this.context.matrixClient, this.props.userId);
if (this.props.roomId && this.props.showRelated) {
const relatedGroupsEvent = this.context.matrixClient
.getRoom(this.props.roomId)
@ -253,7 +127,7 @@ export default class Flair extends React.Component {
}
const profiles = await this._getGroupProfiles(groups);
if (!this.unmounted) {
this.setState({profiles});
this.setState({profiles: profiles.filter((profile) => {return profile.avatarUrl;})});
}
}

View file

@ -22,7 +22,7 @@ const GroupsButton = function(props) {
const ActionButton = sdk.getComponent('elements.ActionButton');
return (
<ActionButton action="view_my_groups"
label={_t("Groups")}
label={_t("Communities")}
iconPath="img/icons-groups.svg"
size={props.size}
tooltip={props.tooltip}

View file

@ -86,7 +86,6 @@ module.exports = React.createClass({
const summaries = orderedTransitionSequences.map((transitions) => {
const userNames = eventAggregates[transitions];
const nameList = this._renderNameList(userNames);
const plural = userNames.length > 1;
const splitTransitions = transitions.split(',');
@ -101,13 +100,13 @@ module.exports = React.createClass({
const descs = coalescedTransitions.map((t) => {
return this._getDescriptionForTransition(
t.transitionType, plural, t.repeats,
t.transitionType, userNames.length, t.repeats,
);
});
const desc = this._renderCommaSeparatedList(descs);
return nameList + " " + desc;
return _t('%(nameList)s %(transitionList)s', { nameList: nameList, transitionList: desc });
});
if (!summaries) {
@ -208,148 +207,75 @@ module.exports = React.createClass({
* For a certain transition, t, describe what happened to the users that
* underwent the transition.
* @param {string} t the transition type.
* @param {boolean} plural whether there were multiple users undergoing the same
* transition.
* @param {integer} userCount number of usernames
* @param {number} repeats the number of times the transition was repeated in a row.
* @returns {string} the written Human Readable equivalent of the transition.
*/
_getDescriptionForTransition(t, plural, repeats) {
_getDescriptionForTransition(t, userCount, repeats) {
// The empty interpolations 'severalUsers' and 'oneUser'
// are there only to show translators to non-English languages
// that the verb is conjugated to plural or singular Subject.
let res = null;
switch(t) {
case "joined":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)sjoined %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)sjoined %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)sjoined", { severalUsers: "" })
: _t("%(oneUser)sjoined", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)sjoined %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)sjoined %(count)s times", { oneUser: "", count: repeats });
break;
case "left":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)sleft %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)sleft %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)sleft", { severalUsers: "" })
: _t("%(oneUser)sleft", { oneUser: "" });
}
break;
res = (userCount > 1)
? _t("%(severalUsers)sleft %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)sleft %(count)s times", { oneUser: "", count: repeats });
break;
case "joined_and_left":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)sjoined and left %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)sjoined and left %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)sjoined and left", { severalUsers: "" })
: _t("%(oneUser)sjoined and left", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)sjoined and left %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)sjoined and left %(count)s times", { oneUser: "", count: repeats });
break;
case "left_and_joined":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)sleft and rejoined %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)sleft and rejoined %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)sleft and rejoined", { severalUsers: "" })
: _t("%(oneUser)sleft and rejoined", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)sleft and rejoined %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)sleft and rejoined %(count)s times", { oneUser: "", count: repeats });
break;
case "invite_reject":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)srejected their invitations %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)srejected their invitation %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)srejected their invitations", { severalUsers: "" })
: _t("%(oneUser)srejected their invitation", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)srejected their invitations %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)srejected their invitation %(count)s times", { oneUser: "", count: repeats });
break;
case "invite_withdrawal":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)shad their invitations withdrawn %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)shad their invitation withdrawn %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)shad their invitations withdrawn", { severalUsers: "" })
: _t("%(oneUser)shad their invitation withdrawn", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)shad their invitations withdrawn %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)shad their invitation withdrawn %(count)s times", { oneUser: "", count: repeats });
break;
case "invited":
if (repeats > 1) {
res = (plural)
? _t("were invited %(repeats)s times", { repeats: repeats })
: _t("was invited %(repeats)s times", { repeats: repeats });
} else {
res = (plural)
? _t("were invited")
: _t("was invited");
}
res = (userCount > 1)
? _t("were invited %(count)s times", { count: repeats })
: _t("was invited %(count)s times", { count: repeats });
break;
case "banned":
if (repeats > 1) {
res = (plural)
? _t("were banned %(repeats)s times", { repeats: repeats })
: _t("was banned %(repeats)s times", { repeats: repeats });
} else {
res = (plural)
? _t("were banned")
: _t("was banned");
}
res = (userCount > 1)
? _t("were banned %(count)s times", { count: repeats })
: _t("was banned %(count)s times", { count: repeats });
break;
case "unbanned":
if (repeats > 1) {
res = (plural)
? _t("were unbanned %(repeats)s times", { repeats: repeats })
: _t("was unbanned %(repeats)s times", { repeats: repeats });
} else {
res = (plural)
? _t("were unbanned")
: _t("was unbanned");
}
res = (userCount > 1)
? _t("were unbanned %(count)s times", { count: repeats })
: _t("was unbanned %(count)s times", { count: repeats });
break;
case "kicked":
if (repeats > 1) {
res = (plural)
? _t("were kicked %(repeats)s times", { repeats: repeats })
: _t("was kicked %(repeats)s times", { repeats: repeats });
} else {
res = (plural)
? _t("were kicked")
: _t("was kicked");
}
res = (userCount > 1)
? _t("were kicked %(count)s times", { count: repeats })
: _t("was kicked %(count)s times", { count: repeats });
break;
case "changed_name":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)schanged their name %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)schanged their name %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)schanged their name", { severalUsers: "" })
: _t("%(oneUser)schanged their name", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)schanged their name %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)schanged their name %(count)s times", { oneUser: "", count: repeats });
break;
case "changed_avatar":
if (repeats > 1) {
res = (plural)
? _t("%(severalUsers)schanged their avatar %(repeats)s times", { severalUsers: "", repeats: repeats })
: _t("%(oneUser)schanged their avatar %(repeats)s times", { oneUser: "", repeats: repeats });
} else {
res = (plural)
? _t("%(severalUsers)schanged their avatar", { severalUsers: "" })
: _t("%(oneUser)schanged their avatar", { oneUser: "" });
}
res = (userCount > 1)
? _t("%(severalUsers)schanged their avatar %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)schanged their avatar %(count)s times", { oneUser: "", count: repeats });
break;
}
@ -376,11 +302,9 @@ module.exports = React.createClass({
return "";
} else if (items.length === 1) {
return items[0];
} else if (remaining) {
} else if (remaining > 0) {
items = items.slice(0, itemLimit);
return (remaining > 1)
? _t("%(items)s and %(remaining)s others", { items: items.join(', '), remaining: remaining } )
: _t("%(items)s and one other", { items: items.join(', ') });
return _t("%(items)s and %(count)s others", { items: items.join(', '), count: remaining } )
} else {
const lastItem = items.pop();
return _t("%(items)s and %(lastItem)s", { items: items.join(', '), lastItem: lastItem });

View file

@ -37,11 +37,20 @@ const Pill = React.createClass({
isMessagePillUrl: (url) => {
return !!REGEX_LOCAL_MATRIXTO.exec(url);
},
roomNotifPos: (text) => {
return text.indexOf("@room");
},
roomNotifLen: () => {
return "@room".length;
},
TYPE_USER_MENTION: 'TYPE_USER_MENTION',
TYPE_ROOM_MENTION: 'TYPE_ROOM_MENTION',
TYPE_AT_ROOM_MENTION: 'TYPE_AT_ROOM_MENTION', // '@room' mention
},
props: {
// The Type of this Pill. If url is given, this is auto-detected.
type: PropTypes.string,
// The URL to pillify (no validation is done, see isPillUrl and isMessagePillUrl)
url: PropTypes.string,
// Whether the pill is in a message
@ -72,14 +81,20 @@ const Pill = React.createClass({
regex = REGEX_LOCAL_MATRIXTO;
}
// Default to the empty array if no match for simplicity
// resource and prefix will be undefined instead of throwing
const matrixToMatch = regex.exec(nextProps.url) || [];
let matrixToMatch;
let resourceId;
let prefix;
const resourceId = matrixToMatch[1]; // The room/user ID
const prefix = matrixToMatch[2]; // The first character of prefix
if (nextProps.url) {
// Default to the empty array if no match for simplicity
// resource and prefix will be undefined instead of throwing
matrixToMatch = regex.exec(nextProps.url) || [];
const pillType = {
resourceId = matrixToMatch[1]; // The room/user ID
prefix = matrixToMatch[2]; // The first character of prefix
}
const pillType = this.props.type || {
'@': Pill.TYPE_USER_MENTION,
'#': Pill.TYPE_ROOM_MENTION,
'!': Pill.TYPE_ROOM_MENTION,
@ -88,6 +103,10 @@ const Pill = React.createClass({
let member;
let room;
switch (pillType) {
case Pill.TYPE_AT_ROOM_MENTION: {
room = nextProps.room;
}
break;
case Pill.TYPE_USER_MENTION: {
const localMember = nextProps.room.getMember(resourceId);
member = localMember;
@ -160,6 +179,17 @@ const Pill = React.createClass({
let href = this.props.url;
let onClick;
switch (this.state.pillType) {
case Pill.TYPE_AT_ROOM_MENTION: {
const room = this.props.room;
if (room) {
linkText = "@room";
if (this.props.shouldShowPillAvatar) {
avatar = <RoomAvatar room={room} width={16} height={16} />;
}
pillClass = 'mx_AtRoomPill';
}
}
break;
case Pill.TYPE_USER_MENTION: {
// If this user is not a member of this room, default to the empty member
const member = this.state.member;

View file

@ -38,29 +38,27 @@ export default React.createClass({
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
const EmojiText = sdk.getComponent('elements.EmojiText');
const av = (
<BaseAvatar name={this.props.group.name} width={24} height={24}
url={this.props.group.avatarUrl}
/>
);
const groupName = this.props.group.name || this.props.group.groupId;
const av = <BaseAvatar name={groupName} width={24} height={24} url={this.props.group.avatarUrl} />;
const label = <EmojiText
element="div"
title={this.props.group.name}
className="mx_GroupInviteTile_name"
title={this.props.group.groupId}
className="mx_RoomTile_name"
dir="auto"
>
{ this.props.group.name }
{ groupName }
</EmojiText>;
const badge = <div className="mx_GroupInviteTile_badge">!</div>;
const badge = <div className="mx_RoomSubList_badge mx_RoomSubList_badgeHighlight">!</div>;
return (
<AccessibleButton className="mx_GroupInviteTile" onClick={this.onClick}>
<div className="mx_GroupInviteTile_avatarContainer">
<AccessibleButton className="mx_RoomTile mx_RoomTile_highlight" onClick={this.onClick}>
<div className="mx_RoomTile_avatar">
{ av }
</div>
<div className="mx_GroupInviteTile_nameContainer">
<div className="mx_RoomTile_nameContainer">
{ label }
{ badge }
</div>

View file

@ -17,50 +17,66 @@ limitations under the License.
import PropTypes from 'prop-types';
import React from 'react';
import { MatrixClient } from 'matrix-js-sdk';
import dis from '../../../dispatcher';
import Modal from '../../../Modal';
import sdk from '../../../index';
import { _t } from '../../../languageHandler';
import { GroupMemberType } from '../../../groups';
import { groupMemberFromApiObject } from '../../../groups';
import withMatrixClient from '../../../wrappers/withMatrixClient';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import AccessibleButton from '../elements/AccessibleButton';
import GeminiScrollbar from 'react-gemini-scrollbar';
module.exports = withMatrixClient(React.createClass({
module.exports = React.createClass({
displayName: 'GroupMemberInfo',
contextTypes: {
matrixClient: PropTypes.instanceOf(MatrixClient),
},
propTypes: {
matrixClient: PropTypes.object.isRequired,
groupId: PropTypes.string,
groupMember: GroupMemberType,
isInvited: PropTypes.bool,
},
getInitialState: function() {
return {
fetching: false,
removingUser: false,
groupMembers: null,
isUserPrivilegedInGroup: null,
};
},
componentWillMount: function() {
this._fetchMembers();
this._initGroupStore(this.props.groupId);
},
_fetchMembers: function() {
this.setState({fetching: true});
this.props.matrixClient.getGroupUsers(this.props.groupId).then((result) => {
this.setState({
groupMembers: result.chunk.map((apiMember) => {
return groupMemberFromApiObject(apiMember);
}),
fetching: false,
});
}).catch((e) => {
this.setState({fetching: false});
console.error("Failed to get group groupMember list: ", e);
componentWillReceiveProps(newProps) {
if (newProps.groupId !== this.props.groupId) {
this._unregisterGroupStore();
this._initGroupStore(newProps.groupId);
}
},
_initGroupStore(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(
this.context.matrixClient, this.props.groupId,
);
this._groupStore.registerListener(this.onGroupStoreUpdated);
},
_unregisterGroupStore() {
if (this._groupStore) {
this._groupStore.unregisterListener(this.onGroupStoreUpdated);
}
},
onGroupStoreUpdated: function() {
this.setState({
isUserInvited: this._groupStore.getGroupInvitedMembers().some(
(m) => m.userId === this.props.groupMember.userId,
),
isUserPrivilegedInGroup: this._groupStore.isUserPrivileged(),
});
},
@ -68,13 +84,15 @@ module.exports = withMatrixClient(React.createClass({
const ConfirmUserActionDialog = sdk.getComponent("dialogs.ConfirmUserActionDialog");
Modal.createDialog(ConfirmUserActionDialog, {
groupMember: this.props.groupMember,
action: _t('Remove from group'),
action: this.state.isUserInvited ? _t('Disinvite') : _t('Remove from community'),
title: this.state.isUserInvited ? _t('Disinvite this user from community?')
: _t('Remove this user from community?'),
danger: true,
onFinished: (proceed) => {
if (!proceed) return;
this.setState({removingUser: true});
this.props.matrixClient.removeUserFromGroup(
this.context.matrixClient.removeUserFromGroup(
this.props.groupId, this.props.groupMember.userId,
).then(() => {
// return to the user list
@ -86,7 +104,9 @@ module.exports = withMatrixClient(React.createClass({
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove user from group', '', ErrorDialog, {
title: _t('Error'),
description: _t('Failed to remove user from group'),
description: this.state.isUserInvited ?
_t('Failed to withdraw invitation') :
_t('Failed to remove user from community'),
});
}).finally(() => {
this.setState({removingUser: false});
@ -111,24 +131,17 @@ module.exports = withMatrixClient(React.createClass({
},
render: function() {
if (this.state.fetching || this.state.removingUser) {
if (this.state.removingUser) {
const Spinner = sdk.getComponent("elements.Spinner");
return <Spinner />;
}
if (!this.state.groupMembers) return null;
const targetIsInGroup = this.state.groupMembers.some((m) => {
return m.userId === this.props.groupMember.userId;
});
let kickButton;
let adminButton;
if (targetIsInGroup) {
kickButton = (
let adminTools;
if (this.state.isUserPrivilegedInGroup) {
const kickButton = (
<AccessibleButton className="mx_MemberInfo_field"
onClick={this._onKick}>
{ _t('Remove from group') }
{ this.state.isUserInvited ? _t('Disinvite') : _t('Remove from community') }
</AccessibleButton>
);
@ -137,22 +150,19 @@ module.exports = withMatrixClient(React.createClass({
giveModButton = <AccessibleButton className="mx_MemberInfo_field" onClick={this.onModToggle}>
{giveOpLabel}
</AccessibleButton>;*/
if (kickButton) {
adminTools =
<div className="mx_MemberInfo_adminTools">
<h3>{ _t("Admin Tools") }</h3>
<div className="mx_MemberInfo_buttons">
{ kickButton }
</div>
</div>;
}
}
let adminTools;
if (kickButton || adminButton) {
adminTools =
<div className="mx_MemberInfo_adminTools">
<h3>{ _t("Admin Tools") }</h3>
<div className="mx_MemberInfo_buttons">
{ kickButton }
{ adminButton }
</div>
</div>;
}
const avatarUrl = this.props.matrixClient.mxcUrlToHttp(
const avatarUrl = this.context.matrixClient.mxcUrlToHttp(
this.props.groupMember.avatarUrl,
36, 36, 'crop',
);
@ -173,7 +183,7 @@ module.exports = withMatrixClient(React.createClass({
<div className="mx_MemberInfo">
<GeminiScrollbar autoshow={true}>
<AccessibleButton className="mx_MemberInfo_cancel"onClick={this._onCancel}>
<img src="img/cancel.svg" width="18" height="18" />
<img src="img/cancel.svg" width="18" height="18" className="mx_filterFlipColor" />
</AccessibleButton>
<div className="mx_MemberInfo_avatar">
{ avatar }
@ -192,4 +202,4 @@ module.exports = withMatrixClient(React.createClass({
</div>
);
},
}));
});

View file

@ -17,7 +17,7 @@ limitations under the License.
import React from 'react';
import { _t } from '../../../languageHandler';
import sdk from '../../../index';
import { groupMemberFromApiObject } from '../../../groups';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import GeminiScrollbar from 'react-gemini-scrollbar';
import PropTypes from 'prop-types';
import withMatrixClient from '../../../wrappers/withMatrixClient';
@ -27,36 +27,39 @@ const INITIAL_LOAD_NUM_MEMBERS = 30;
export default withMatrixClient(React.createClass({
displayName: 'GroupMemberList',
propTypes: {
contextTypes: {
matrixClient: PropTypes.object.isRequired,
},
propTypes: {
groupId: PropTypes.string.isRequired,
},
getInitialState: function() {
return {
fetching: false,
members: null,
invitedMembers: null,
truncateAt: INITIAL_LOAD_NUM_MEMBERS,
};
},
componentWillMount: function() {
this._unmounted = false;
this._fetchMembers();
this._initGroupStore(this.props.groupId);
},
_initGroupStore: function(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(this.context.matrixClient, groupId);
this._groupStore.registerListener(() => {
this._fetchMembers();
});
},
_fetchMembers: function() {
this.setState({fetching: true});
this.props.matrixClient.getGroupUsers(this.props.groupId).then((result) => {
this.setState({
members: result.chunk.map((apiMember) => {
return groupMemberFromApiObject(apiMember);
}),
fetching: false,
});
}).catch((e) => {
this.setState({fetching: false});
console.error("Failed to get group member list: " + e);
if (this._unmounted) return;
this.setState({
members: this._groupStore.getGroupMembers(),
invitedMembers: this._groupStore.getGroupInvitedMembers(),
});
},
@ -83,11 +86,10 @@ export default withMatrixClient(React.createClass({
this.setState({ searchQuery: ev.target.value });
},
makeGroupMemberTiles: function(query) {
makeGroupMemberTiles: function(query, memberList) {
const GroupMemberTile = sdk.getComponent("groups.GroupMemberTile");
const TruncatedList = sdk.getComponent("elements.TruncatedList");
query = (query || "").toLowerCase();
let memberList = this.state.members;
if (query) {
memberList = memberList.filter((m) => {
const matchesName = m.displayname.toLowerCase().indexOf(query) !== -1;
@ -101,12 +103,11 @@ export default withMatrixClient(React.createClass({
});
}
memberList = memberList.map((m) => {
return (
<GroupMemberTile key={m.userId} groupId={this.props.groupId} member={m} />
);
const uniqueMembers = {};
memberList.forEach((m) => {
if (!uniqueMembers[m.userId]) uniqueMembers[m.userId] = m;
});
memberList = Object.keys(uniqueMembers).map((userId) => uniqueMembers[userId]);
memberList.sort((a, b) => {
// TODO: should put admins at the top: we don't yet have that info
if (a < b) {
@ -118,36 +119,51 @@ export default withMatrixClient(React.createClass({
}
});
return memberList;
const memberTiles = memberList.map((m) => {
return (
<GroupMemberTile key={m.userId} groupId={this.props.groupId} member={m} />
);
});
return <TruncatedList className="mx_MemberList_wrapper" truncateAt={this.state.truncateAt}
createOverflowElement={this._createOverflowTile}
>
{ memberTiles }
</TruncatedList>;
},
render: function() {
if (this.state.fetching) {
if (this.state.fetching || this.state.fetchingInvitedMembers) {
const Spinner = sdk.getComponent("elements.Spinner");
return (<div className="mx_MemberList">
<Spinner />
</div>);
} else if (this.state.members === null) {
return null;
}
const inputBox = (
<form autoComplete="off">
<input className="mx_GroupMemberList_query" id="mx_GroupMemberList_query" type="text"
onChange={this.onSearchQueryChanged} value={this.state.searchQuery}
placeholder={_t('Filter group members')} />
placeholder={_t('Filter community members')} />
</form>
);
const TruncatedList = sdk.getComponent("elements.TruncatedList");
const joined = this.state.members ? <div className="mx_MemberList_joined">
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.members) }
</div> : <div />;
const invited = (this.state.invitedMembers && this.state.invitedMembers.length > 0) ?
<div className="mx_MemberList_invited">
<h2>{ _t("Invited") }</h2>
{ this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers) }
</div> : <div />;
return (
<div className="mx_MemberList">
{ inputBox }
<GeminiScrollbar autoshow={true} className="mx_MemberList_joined mx_MemberList_outerWrapper">
<TruncatedList className="mx_MemberList_wrapper" truncateAt={this.state.truncateAt}
createOverflowElement={this._createOverflowTile}>
{ this.makeGroupMemberTiles(this.state.searchQuery) }
</TruncatedList>
<GeminiScrollbar autoshow={true} className="mx_MemberList_outerWrapper">
{ joined }
{ invited }
</GeminiScrollbar>
</div>
);

View file

@ -0,0 +1,242 @@
/*
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import PropTypes from 'prop-types';
import React from 'react';
import { MatrixClient } from 'matrix-js-sdk';
import dis from '../../../dispatcher';
import Modal from '../../../Modal';
import sdk from '../../../index';
import { _t } from '../../../languageHandler';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import GeminiScrollbar from 'react-gemini-scrollbar';
module.exports = React.createClass({
displayName: 'GroupRoomInfo',
contextTypes: {
matrixClient: PropTypes.instanceOf(MatrixClient),
},
propTypes: {
groupId: PropTypes.string,
groupRoomId: PropTypes.string,
},
getInitialState: function() {
return {
isUserPrivilegedInGroup: null,
groupRoom: null,
groupRoomPublicityLoading: false,
groupRoomRemoveLoading: false,
};
},
componentWillMount: function() {
this._initGroupStore(this.props.groupId);
},
componentWillReceiveProps(newProps) {
if (newProps.groupId !== this.props.groupId) {
this._unregisterGroupStore();
this._initGroupStore(newProps.groupId);
}
},
componentWillUnmount() {
this._unregisterGroupStore();
},
_initGroupStore(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(
this.context.matrixClient, this.props.groupId,
);
this._groupStore.registerListener(this.onGroupStoreUpdated);
},
_unregisterGroupStore() {
if (this._groupStore) {
this._groupStore.unregisterListener(this.onGroupStoreUpdated);
}
},
_updateGroupRoom() {
this.setState({
groupRoom: this._groupStore.getGroupRooms().find(
(r) => r.roomId === this.props.groupRoomId,
),
});
},
onGroupStoreUpdated: function() {
this.setState({
isUserPrivilegedInGroup: this._groupStore.isUserPrivileged(),
});
this._updateGroupRoom();
},
_onRemove: function(e) {
const groupId = this.props.groupId;
const roomName = this.state.groupRoom.displayname;
e.preventDefault();
e.stopPropagation();
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createTrackedDialog('Confirm removal of group from room', '', QuestionDialog, {
title: _t("Are you sure you want to remove '%(roomName)s' from %(groupId)s?", {roomName, groupId}),
description: _t("Removing a room from the community will also remove it from the community page."),
button: _t("Remove"),
onFinished: (proceed) => {
if (!proceed) return;
this.setState({groupRoomRemoveLoading: true});
const groupId = this.props.groupId;
const roomId = this.props.groupRoomId;
this._groupStore.removeRoomFromGroup(roomId).then(() => {
dis.dispatch({
action: "view_group_room_list",
});
}).catch((err) => {
console.error(`Error whilst removing ${roomId} from ${groupId}`, err);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove room from group', '', ErrorDialog, {
title: _t("Failed to remove room from community"),
description: _t(
"Failed to remove '%(roomName)s' from %(groupId)s", {groupId, roomName},
),
});
}).finally(() => {
this.setState({groupRoomRemoveLoading: false});
});
},
});
},
_onCancel: function(e) {
dis.dispatch({
action: "view_group_room_list",
});
},
_changeGroupRoomPublicity(e) {
const isPublic = e.target.value === "public";
this.setState({
groupRoomPublicityLoading: true,
});
const groupId = this.props.groupId;
const roomId = this.props.groupRoomId;
const roomName = this.state.groupRoom.displayname;
this._groupStore.updateGroupRoomAssociation(roomId, isPublic).catch((err) => {
console.error(`Error whilst changing visibility of ${roomId} in ${groupId} to ${isPublic}`, err);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove room from group', '', ErrorDialog, {
title: _t("Something went wrong!"),
description: _t(
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.",
{roomName, groupId},
),
});
}).finally(() => {
this.setState({
groupRoomPublicityLoading: false,
});
});
},
render: function() {
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
const EmojiText = sdk.getComponent('elements.EmojiText');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
const InlineSpinner = sdk.getComponent('elements.InlineSpinner');
if (this.state.groupRoomRemoveLoading || !this.state.groupRoom) {
const Spinner = sdk.getComponent("elements.Spinner");
return <div className="mx_MemberInfo">
<Spinner />
</div>;
}
let adminTools;
if (this.state.isUserPrivilegedInGroup) {
adminTools =
<div className="mx_MemberInfo_adminTools">
<h3>{ _t("Admin Tools") }</h3>
<div className="mx_MemberInfo_buttons">
<AccessibleButton className="mx_MemberInfo_field" onClick={this._onRemove}>
{ _t('Remove from community') }
</AccessibleButton>
</div>
<h3>
{ _t('Visibility in Room List') }
{ this.state.groupRoomPublicityLoading ?
<InlineSpinner /> : <div />
}
</h3>
<div>
<label>
<input type="radio"
value="public"
checked={this.state.groupRoom.isPublic}
onClick={this._changeGroupRoomPublicity}
/>
<div className="mx_MemberInfo_label_text">
{ _t('Visible to everyone') }
</div>
</label>
</div>
<div>
<label>
<input type="radio"
value="private"
checked={!this.state.groupRoom.isPublic}
onClick={this._changeGroupRoomPublicity}
/>
<div className="mx_MemberInfo_label_text">
{ _t('Only visible to community members') }
</div>
</label>
</div>
</div>;
}
const avatarUrl = this.context.matrixClient.mxcUrlToHttp(
this.state.groupRoom.avatarUrl,
36, 36, 'crop',
);
const groupRoomName = this.state.groupRoom.displayname;
const avatar = <BaseAvatar name={groupRoomName} width={36} height={36} url={avatarUrl} />;
return (
<div className="mx_MemberInfo">
<GeminiScrollbar autoshow={true}>
<AccessibleButton className="mx_MemberInfo_cancel" onClick={this._onCancel}>
<img src="img/cancel.svg" width="18" height="18" className="mx_filterFlipColor" />
</AccessibleButton>
<div className="mx_MemberInfo_avatar">
{ avatar }
</div>
<EmojiText element="h2">{ groupRoomName }</EmojiText>
<div className="mx_MemberInfo_profile">
<div className="mx_MemberInfo_profileField">
{ this.state.groupRoom.canonical_alias }
</div>
</div>
{ adminTools }
</GeminiScrollbar>
</div>
);
},
});

View file

@ -16,7 +16,6 @@ limitations under the License.
import React from 'react';
import { _t } from '../../../languageHandler';
import sdk from '../../../index';
import { groupRoomFromApiObject } from '../../../groups';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import GeminiScrollbar from 'react-gemini-scrollbar';
import PropTypes from 'prop-types';
@ -48,24 +47,20 @@ export default React.createClass({
_initGroupStore: function(groupId) {
this._groupStore = GroupStoreCache.getGroupStore(this.context.matrixClient, groupId);
this._groupStore.on('update', () => {
this._groupStore.registerListener(() => {
this._fetchRooms();
});
this._groupStore.on('error', (err) => {
console.error('Error in group store (listened to by GroupRoomList)', err);
this.setState({
rooms: null,
});
});
this._fetchRooms();
},
_fetchRooms: function() {
if (this._unmounted) return;
this.setState({
rooms: this._groupStore.getGroupRooms().map((apiRoom) => {
return groupRoomFromApiObject(apiRoom);
}),
rooms: this._groupStore.getGroupRooms(),
});
},
@ -126,7 +121,7 @@ export default React.createClass({
<form autoComplete="off">
<input className="mx_GroupRoomList_query" id="mx_GroupRoomList_query" type="text"
onChange={this.onSearchQueryChanged} value={this.state.searchQuery}
placeholder={_t('Filter group rooms')} />
placeholder={_t('Filter community rooms')} />
</form>
);

View file

@ -16,13 +16,10 @@ limitations under the License.
import React from 'react';
import {MatrixClient} from 'matrix-js-sdk';
import { _t } from '../../../languageHandler';
import PropTypes from 'prop-types';
import sdk from '../../../index';
import dis from '../../../dispatcher';
import { GroupRoomType } from '../../../groups';
import GroupStoreCache from '../../../stores/GroupStoreCache';
import Modal from '../../../Modal';
const GroupRoomTile = React.createClass({
displayName: 'GroupRoomTile',
@ -32,68 +29,11 @@ const GroupRoomTile = React.createClass({
groupRoom: GroupRoomType.isRequired,
},
getInitialState: function() {
return {
name: this.calculateRoomName(this.props.groupRoom),
};
},
componentWillReceiveProps: function(newProps) {
this.setState({
name: this.calculateRoomName(newProps.groupRoom),
});
},
calculateRoomName: function(groupRoom) {
return groupRoom.name || groupRoom.canonicalAlias || _t("Unnamed Room");
},
removeRoomFromGroup: function() {
const groupId = this.props.groupId;
const groupStore = GroupStoreCache.getGroupStore(this.context.matrixClient, groupId);
const roomName = this.state.name;
const roomId = this.props.groupRoom.roomId;
groupStore.removeRoomFromGroup(roomId)
.catch((err) => {
console.error(`Error whilst removing ${roomId} from ${groupId}`, err);
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove room from group', '', ErrorDialog, {
title: _t("Failed to remove room from group"),
description: _t("Failed to remove '%(roomName)s' from %(groupId)s", {groupId, roomName}),
});
});
},
onClick: function(e) {
let roomId;
let roomAlias;
if (this.props.groupRoom.canonicalAlias) {
roomAlias = this.props.groupRoom.canonicalAlias;
} else {
roomId = this.props.groupRoom.roomId;
}
dis.dispatch({
action: 'view_room',
room_id: roomId,
room_alias: roomAlias,
});
},
onDeleteClick: function(e) {
const groupId = this.props.groupId;
const roomName = this.state.name;
e.preventDefault();
e.stopPropagation();
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
Modal.createTrackedDialog('Confirm removal of group from room', '', QuestionDialog, {
title: _t("Are you sure you want to remove '%(roomName)s' from %(groupId)s?", {roomName, groupId}),
description: _t("Removing a room from the group will also remove it from the group page."),
button: _t("Remove"),
onFinished: (success) => {
if (success) {
this.removeRoomFromGroup();
}
},
action: 'view_group_room',
groupId: this.props.groupId,
groupRoomId: this.props.groupRoom.roomId,
});
},
@ -106,7 +46,7 @@ const GroupRoomTile = React.createClass({
);
const av = (
<BaseAvatar name={this.state.name}
<BaseAvatar name={this.props.groupRoom.displayname}
width={36} height={36}
url={avatarUrl}
/>
@ -118,11 +58,8 @@ const GroupRoomTile = React.createClass({
{ av }
</div>
<div className="mx_GroupRoomTile_name">
{ this.state.name }
{ this.props.groupRoom.displayname }
</div>
<AccessibleButton className="mx_GroupRoomTile_delete" onClick={this.onDeleteClick}>
<img src="img/cancel-small.svg" />
</AccessibleButton>
</AccessibleButton>
);
},

View file

@ -20,7 +20,7 @@ import url from 'url';
import classnames from 'classnames';
import sdk from '../../../index';
import { _t } from '../../../languageHandler';
import { _t, _tJsx } from '../../../languageHandler';
/* This file contains a collection of components which are used by the
* InteractiveAuth to prompt the user to enter the information needed
@ -256,7 +256,7 @@ export const EmailIdentityAuthEntry = React.createClass({
} else {
return (
<div>
<p>{ _t("An email has been sent to") } <i>{ this.props.inputs.emailAddress }</i></p>
<p>{ _tJsx("An email has been sent to %(emailAddress)s", /%\(emailAddress\)s/, (sub) => <i>{this.props.inputs.emailAddress}</i>) }</p>
<p>{ _t("Please check your email to continue registration.") }</p>
</div>
);
@ -370,7 +370,7 @@ export const MsisdnAuthEntry = React.createClass({
});
return (
<div>
<p>{ _t("A text message has been sent to") } +<i>{ this._msisdn }</i></p>
<p>{ _tJsx("A text message has been sent to %(msisdn)s", /%\(msisdn\)s/, (sub) => <i>{this._msisdn}</i>) }</p>
<p>{ _t("Please enter the code it contains:") }</p>
<div className="mx_InteractiveAuthEntryComponents_msisdnWrapper">
<form onSubmit={this._onFormSubmit}>

View file

@ -19,6 +19,7 @@
import React from 'react';
import sdk from '../../../index';
import Flair from '../elements/Flair.js';
import { _tJsx } from '../../../languageHandler';
export default function SenderProfile(props) {
const EmojiText = sdk.getComponent('elements.EmojiText');
@ -30,23 +31,39 @@ export default function SenderProfile(props) {
return <span />; // emote message must include the name so don't duplicate it
}
// Name + flair
const nameElem = [
<EmojiText key='name' className="mx_SenderProfile_name">{ name || '' }</EmojiText>,
props.enableFlair ?
<Flair key='flair'
userId={mxEvent.getSender()}
roomId={mxEvent.getRoomId()}
showRelated={true} />
: null,
];
let content = '';
if(props.text) {
// Replace senderName, and wrap surrounding text in spans with the right class
content = _tJsx(props.text, /^(.*)\%\(senderName\)s(.*)$/m, (p1, p2) => [
p1 ? <span className='mx_SenderProfile_aux'>{ p1 }</span> : null,
nameElem,
p2 ? <span className='mx_SenderProfile_aux'>{ p2 }</span> : null,
]);
} else {
content = nameElem;
}
return (
<div className="mx_SenderProfile" dir="auto" onClick={props.onClick}>
<EmojiText className="mx_SenderProfile_name">{ name || '' }</EmojiText>
{ props.enableFlair ?
<Flair
userId={mxEvent.getSender()}
roomId={mxEvent.getRoomId()}
showRelated={true} />
: null
}
{ props.aux ? <EmojiText className="mx_SenderProfile_aux"> { props.aux }</EmojiText> : null }
{ content }
</div>
);
}
SenderProfile.propTypes = {
mxEvent: React.PropTypes.object.isRequired, // event whose sender we're showing
aux: React.PropTypes.string, // stuff to go after the sender name, if anything
text: React.PropTypes.string, // Text to show. Defaults to sender name
onClick: React.PropTypes.func,
};

View file

@ -34,6 +34,7 @@ import MatrixClientPeg from '../../../MatrixClientPeg';
import ContextualMenu from '../../structures/ContextualMenu';
import {RoomMember} from 'matrix-js-sdk';
import classNames from 'classnames';
import PushProcessor from 'matrix-js-sdk/lib/pushprocessor';
linkifyMatrix(linkify);
@ -169,8 +170,10 @@ module.exports = React.createClass({
pillifyLinks: function(nodes) {
const shouldShowPillAvatar = !UserSettingsStore.getSyncedSetting("Pill.shouldHidePillAvatar", false);
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
let node = nodes[0];
while (node) {
let pillified = false;
if (node.tagName === "A" && node.getAttribute("href")) {
const href = node.getAttribute("href");
@ -189,10 +192,71 @@ module.exports = React.createClass({
ReactDOM.render(pill, pillContainer);
node.parentNode.replaceChild(pillContainer, node);
// Pills within pills aren't going to go well, so move on
pillified = true;
// update the current node with one that's now taken its place
node = pillContainer;
}
} else if (node.nodeType == Node.TEXT_NODE) {
const Pill = sdk.getComponent('elements.Pill');
let currentTextNode = node;
const roomNotifTextNodes = [];
// Take a textNode and break it up to make all the instances of @room their
// own textNode, adding those nodes to roomNotifTextNodes
while (currentTextNode !== null) {
const roomNotifPos = Pill.roomNotifPos(currentTextNode.textContent);
let nextTextNode = null;
if (roomNotifPos > -1) {
let roomTextNode = currentTextNode;
if (roomNotifPos > 0) roomTextNode = roomTextNode.splitText(roomNotifPos);
if (roomTextNode.textContent.length > Pill.roomNotifLen()) {
nextTextNode = roomTextNode.splitText(Pill.roomNotifLen());
}
roomNotifTextNodes.push(roomTextNode);
}
currentTextNode = nextTextNode;
}
if (roomNotifTextNodes.length > 0) {
const pushProcessor = new PushProcessor(MatrixClientPeg.get());
const atRoomRule = pushProcessor.getPushRuleById(".m.rule.roomnotif");
if (pushProcessor.ruleMatchesEvent(atRoomRule, this.props.mxEvent)) {
// Now replace all those nodes with Pills
for (const roomNotifTextNode of roomNotifTextNodes) {
const pillContainer = document.createElement('span');
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
const pill = <Pill
type={Pill.TYPE_AT_ROOM_MENTION}
inMessage={true}
room={room}
shouldShowPillAvatar={true}
/>;
ReactDOM.render(pill, pillContainer);
roomNotifTextNode.parentNode.replaceChild(pillContainer, roomNotifTextNode);
// Set the next node to be processed to the one after the node
// we're adding now, since we've just inserted nodes into the structure
// we're iterating over.
// Note we've checked roomNotifTextNodes.length > 0 so we'll do this at least once
node = roomNotifTextNode.nextSibling;
}
// Nothing else to do for a text node (and we don't need to advance
// the loop pointer because we did it above)
continue;
}
}
} else if (node.children && node.children.length) {
this.pillifyLinks(node.children);
}
if (node.childNodes && node.childNodes.length && !pillified) {
this.pillifyLinks(node.childNodes);
}
node = node.nextSibling;
}
},

View file

@ -25,7 +25,10 @@ module.exports = React.createClass({
render: function() {
let tooltip = _t("Removed or unknown message type");
if (this.props.mxEvent.isRedacted()) {
tooltip = _t("Message removed by %(userId)s", {userId: this.props.mxEvent.getSender()});
const redactedBecauseUserId = this.props.mxEvent.getUnsigned().redacted_because.sender;
tooltip = redactedBecauseUserId ?
_t("Message removed by %(userId)s", { userId: redactedBecauseUserId }) :
_t("Message removed");
}
const text = this.props.mxEvent.getContent().body;

View file

@ -262,6 +262,7 @@ module.exports = React.createClass({
items={this.state.domainToAliases[localDomain] || []}
newItem={this.state.newAlias}
onNewItemChanged={this.onNewAliasChanged}
canEdit={this.props.canSetAliases}
onItemAdded={this.onLocalAliasAdded}
onItemEdited={this.onLocalAliasChanged}
onItemRemoved={this.onLocalAliasDeleted}

View file

@ -27,7 +27,7 @@ module.exports = React.createClass({
propTypes: {
roomId: React.PropTypes.string.isRequired,
canSetRelatedRooms: React.PropTypes.bool.isRequired,
canSetRelatedGroups: React.PropTypes.bool.isRequired,
relatedGroupsEvent: React.PropTypes.instanceOf(MatrixEvent),
},
@ -37,7 +37,7 @@ module.exports = React.createClass({
getDefaultProps: function() {
return {
canSetRelatedRooms: false,
canSetRelatedGroups: false,
};
},
@ -63,9 +63,9 @@ module.exports = React.createClass({
validateGroupId: function(groupId) {
if (!GROUP_ID_REGEX.test(groupId)) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Invalid related group ID', '', ErrorDialog, {
title: _t('Invalid group ID'),
description: _t('\'%(groupId)s\' is not a valid group ID', { groupId }),
Modal.createTrackedDialog('Invalid related community ID', '', ErrorDialog, {
title: _t('Invalid community ID'),
description: _t('\'%(groupId)s\' is not a valid community ID', { groupId }),
});
return false;
}
@ -105,19 +105,20 @@ module.exports = React.createClass({
const localDomain = this.context.matrixClient.getDomain();
const EditableItemList = sdk.getComponent('elements.EditableItemList');
return (<div>
<h3>{ _t('Related Groups') }</h3>
<h3>{ _t('Related Communities') }</h3>
<EditableItemList
items={this.state.newGroupsList}
className={"mx_RelatedGroupSettings"}
newItem={this.state.newGroupId}
canEdit={this.props.canSetRelatedGroups}
onNewItemChanged={this.onNewGroupChanged}
onItemAdded={this.onGroupAdded}
onItemEdited={this.onGroupEdited}
onItemRemoved={this.onGroupDeleted}
itemsLabel={_t('Related groups for this room:')}
noItemsLabel={_t('This room has no related groups')}
itemsLabel={_t('Related communities for this room:')}
noItemsLabel={_t('This room has no related communities')}
placeholder={_t(
'New group ID (e.g. +foo:%(localDomain)s)', {localDomain},
'New community ID (e.g. +foo:%(localDomain)s)', {localDomain},
)}
/>
</div>);

View file

@ -1,5 +1,23 @@
/*
Copyright 2016 Aviral Dasgupta
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import flatMap from 'lodash/flatMap';
import isEqual from 'lodash/isEqual';
@ -7,8 +25,9 @@ import sdk from '../../../index';
import type {Completion} from '../../../autocomplete/Autocompleter';
import Promise from 'bluebird';
import UserSettingsStore from '../../../UserSettingsStore';
import { Room } from 'matrix-js-sdk';
import {getCompletions} from '../../../autocomplete/Autocompleter';
import Autocompleter from '../../../autocomplete/Autocompleter';
const COMPOSER_SELECTED = 0;
@ -17,6 +36,7 @@ export default class Autocomplete extends React.Component {
constructor(props) {
super(props);
this.autocompleter = new Autocompleter(props.room);
this.completionPromise = null;
this.hide = this.hide.bind(this);
this.onCompletionClicked = this.onCompletionClicked.bind(this);
@ -41,6 +61,11 @@ export default class Autocomplete extends React.Component {
}
componentWillReceiveProps(newProps, state) {
if (this.props.room.roomId !== newProps.room.roomId) {
this.autocompleter.destroy();
this.autocompleter = new Autocompleter(newProps.room);
}
// Query hasn't changed so don't try to complete it
if (newProps.query === this.props.query) {
return;
@ -49,6 +74,10 @@ export default class Autocomplete extends React.Component {
this.complete(newProps.query, newProps.selection);
}
componentWillUnmount() {
this.autocompleter.destroy();
}
complete(query, selection) {
this.queryRequested = query;
if (this.debounceCompletionsRequest) {
@ -83,7 +112,7 @@ export default class Autocomplete extends React.Component {
}
processQuery(query, selection) {
return getCompletions(
return this.autocompleter.getCompletions(
query, selection, this.state.forceComplete,
).then((completions) => {
// Only ever process the completions for the most recent query being processed
@ -267,8 +296,11 @@ export default class Autocomplete extends React.Component {
Autocomplete.propTypes = {
// the query string for which to show autocomplete suggestions
query: React.PropTypes.string.isRequired,
query: PropTypes.string.isRequired,
// method invoked with range and text content when completion is confirmed
onConfirm: React.PropTypes.func.isRequired,
onConfirm: PropTypes.func.isRequired,
// The room in which we're autocompleting
room: PropTypes.instanceOf(Room),
};

View file

@ -116,7 +116,9 @@ module.exports = React.createClass({
nameEl = (
<div className="mx_EntityTile_details">
<img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12" />
<EmojiText element="div" className="mx_EntityTile_name_hover" dir="auto">{ name }</EmojiText>
<EmojiText element="div" className="mx_EntityTile_name mx_EntityTile_name_hover" dir="auto">
{ name }
</EmojiText>
<PresenceLabel activeAgo={activeAgo}
currentlyActive={this.props.presenceCurrentlyActive}
presenceState={this.props.presenceState} />

View file

@ -19,7 +19,7 @@ limitations under the License.
const React = require('react');
const classNames = require("classnames");
import { _t } from '../../../languageHandler';
import { _t, _td } from '../../../languageHandler';
const Modal = require('../../../Modal');
const sdk = require('../../../index');
@ -502,12 +502,12 @@ module.exports = withMatrixClient(React.createClass({
}
if (needsSenderProfile) {
let aux = null;
let text = null;
if (!this.props.tileShape) {
if (msgtype === 'm.image') aux = _t('sent an image');
else if (msgtype === 'm.video') aux = _t('sent a video');
else if (msgtype === 'm.file') aux = _t('uploaded a file');
sender = <SenderProfile onClick={this.onSenderProfileClick} mxEvent={this.props.mxEvent} enableFlair={!aux} aux={aux} />;
if (msgtype === 'm.image') text = _td('%(senderName)s sent an image');
else if (msgtype === 'm.video') text = _td('%(senderName)s sent a video');
else if (msgtype === 'm.file') text = _td('%(senderName)s uploaded a file');
sender = <SenderProfile onClick={this.onSenderProfileClick} mxEvent={this.props.mxEvent} enableFlair={!text} text={text} />;
} else {
sender = <SenderProfile mxEvent={this.props.mxEvent} enableFlair={true} />;
}

View file

@ -30,10 +30,9 @@ module.exports = React.createClass({
componentWillMount: function() {
dis.dispatch({
action: 'ui_opacity',
leftOpacity: 1.0,
rightOpacity: 0.3,
middleOpacity: 0.5,
action: 'panel_disable',
rightDisabled: true,
middleDisabled: true,
});
},
@ -43,9 +42,9 @@ module.exports = React.createClass({
componentWillUnmount: function() {
dis.dispatch({
action: 'ui_opacity',
sideOpacity: 1.0,
middleOpacity: 1.0,
action: 'panel_disable',
sideDisabled: false,
middleDisabled: false,
});
document.removeEventListener('keydown', this._onKeyDown);
},

View file

@ -133,8 +133,9 @@ module.exports = React.createClass({
{ p["og:description"] }
</div>
</div>
<img className="mx_LinkPreviewWidget_cancel" src="img/cancel.svg" width="18" height="18"
onClick={this.props.onCancelClick} />
<img className="mx_LinkPreviewWidget_cancel mx_filterFlipColor"
src="img/cancel.svg" width="18" height="18"
onClick={this.props.onCancelClick} />
</div>
);
},

View file

@ -39,6 +39,7 @@ import { findReadReceiptFromUserId } from '../../../utils/Receipt';
import withMatrixClient from '../../../wrappers/withMatrixClient';
import AccessibleButton from '../elements/AccessibleButton';
import GeminiScrollbar from 'react-gemini-scrollbar';
import RoomViewStore from '../../../stores/RoomViewStore';
module.exports = withMatrixClient(React.createClass({
@ -81,6 +82,7 @@ module.exports = withMatrixClient(React.createClass({
cli.on("Room.receipt", this.onRoomReceipt);
cli.on("RoomState.events", this.onRoomStateEvents);
cli.on("RoomMember.name", this.onRoomMemberName);
cli.on("RoomMember.membership", this.onRoomMemberMembership);
cli.on("accountData", this.onAccountData);
this._checkIgnoreState();
@ -91,7 +93,7 @@ module.exports = withMatrixClient(React.createClass({
},
componentWillReceiveProps: function(newProps) {
if (this.props.member.userId != newProps.member.userId) {
if (this.props.member.userId !== newProps.member.userId) {
this._updateStateForNewMember(newProps.member);
}
},
@ -107,6 +109,7 @@ module.exports = withMatrixClient(React.createClass({
client.removeListener("Room.receipt", this.onRoomReceipt);
client.removeListener("RoomState.events", this.onRoomStateEvents);
client.removeListener("RoomMember.name", this.onRoomMemberName);
client.removeListener("RoomMember.membership", this.onRoomMemberMembership);
client.removeListener("accountData", this.onAccountData);
}
if (this._cancelDeviceList) {
@ -122,12 +125,12 @@ module.exports = withMatrixClient(React.createClass({
_disambiguateDevices: function(devices) {
const names = Object.create(null);
for (let i = 0; i < devices.length; i++) {
var name = devices[i].getDisplayName();
const name = devices[i].getDisplayName();
const indexList = names[name] || [];
indexList.push(i);
names[name] = indexList;
}
for (name in names) {
for (const name in names) {
if (names[name].length > 1) {
names[name].forEach((j)=>{
devices[j].ambiguous = true;
@ -141,7 +144,7 @@ module.exports = withMatrixClient(React.createClass({
return;
}
if (userId == this.props.member.userId) {
if (userId === this.props.member.userId) {
// no need to re-download the whole thing; just update our copy of
// the list.
@ -186,8 +189,12 @@ module.exports = withMatrixClient(React.createClass({
this.forceUpdate();
},
onRoomMemberMembership: function(ev, member) {
if (this.props.member.userId === member.userId) this.forceUpdate();
},
onAccountData: function(ev) {
if (ev.getType() == 'm.direct') {
if (ev.getType() === 'm.direct') {
this.forceUpdate();
}
},
@ -242,17 +249,19 @@ module.exports = withMatrixClient(React.createClass({
ignoredUsers.push(this.props.member.userId);
}
this.props.matrixClient.setIgnoredUsers(ignoredUsers).then(() => this.setState({isIgnoring: !this.state.isIgnoring}));
this.props.matrixClient.setIgnoredUsers(ignoredUsers).then(() => {
return this.setState({isIgnoring: !this.state.isIgnoring});
});
},
onKick: function() {
const membership = this.props.member.membership;
const kickLabel = membership === "invite" ? _t("Disinvite") : _t("Kick");
const ConfirmUserActionDialog = sdk.getComponent("dialogs.ConfirmUserActionDialog");
Modal.createTrackedDialog('Confirm User Action Dialog', 'onKick', ConfirmUserActionDialog, {
member: this.props.member,
action: kickLabel,
askReason: membership == "join",
action: membership === "invite" ? _t("Disinvite") : _t("Kick"),
title: membership === "invite" ? _t("Disinvite this user?") : _t("Kick this user?"),
askReason: membership === "join",
danger: true,
onFinished: (proceed, reason) => {
if (!proceed) return;
@ -284,15 +293,16 @@ module.exports = withMatrixClient(React.createClass({
const ConfirmUserActionDialog = sdk.getComponent("dialogs.ConfirmUserActionDialog");
Modal.createTrackedDialog('Confirm User Action Dialog', 'onBanOrUnban', ConfirmUserActionDialog, {
member: this.props.member,
action: this.props.member.membership == 'ban' ? _t("Unban") : _t("Ban"),
askReason: this.props.member.membership != 'ban',
danger: this.props.member.membership != 'ban',
action: this.props.member.membership === 'ban' ? _t("Unban") : _t("Ban"),
title: this.props.member.membership === 'ban' ? _t("Unban this user?") : _t("Ban this user?"),
askReason: this.props.member.membership !== 'ban',
danger: this.props.member.membership !== 'ban',
onFinished: (proceed, reason) => {
if (!proceed) return;
this.setState({ updating: this.state.updating + 1 });
let promise;
if (this.props.member.membership == 'ban') {
if (this.props.member.membership === 'ban') {
promise = this.props.matrixClient.unban(
this.props.member.roomId, this.props.member.userId,
);
@ -327,15 +337,11 @@ module.exports = withMatrixClient(React.createClass({
const roomId = this.props.member.roomId;
const target = this.props.member.userId;
const room = this.props.matrixClient.getRoom(roomId);
if (!room) {
return;
}
const powerLevelEvent = room.currentState.getStateEvents(
"m.room.power_levels", "",
);
if (!powerLevelEvent) {
return;
}
if (!room) return;
const powerLevelEvent = room.currentState.getStateEvents("m.room.power_levels", "");
if (!powerLevelEvent) return;
const isMuted = this.state.muted;
const powerLevels = powerLevelEvent.getContent();
const levelToSend = (
@ -350,7 +356,7 @@ module.exports = withMatrixClient(React.createClass({
}
level = parseInt(level);
if (level !== NaN) {
if (!isNaN(level)) {
this.setState({ updating: this.state.updating + 1 });
this.props.matrixClient.setPowerLevel(roomId, target, level, powerLevelEvent).then(
function() {
@ -375,19 +381,14 @@ module.exports = withMatrixClient(React.createClass({
const roomId = this.props.member.roomId;
const target = this.props.member.userId;
const room = this.props.matrixClient.getRoom(roomId);
if (!room) {
return;
}
const powerLevelEvent = room.currentState.getStateEvents(
"m.room.power_levels", "",
);
if (!powerLevelEvent) {
return;
}
if (!room) return;
const powerLevelEvent = room.currentState.getStateEvents("m.room.power_levels", "");
if (!powerLevelEvent) return;
const me = room.getMember(this.props.matrixClient.credentials.userId);
if (!me) {
return;
}
if (!me) return;
const defaultLevel = powerLevelEvent.getContent().users_default;
let modLevel = me.powerLevel - 1;
if (modLevel > 50 && defaultLevel < 50) modLevel = 50; // try to stick with the vector level defaults
@ -400,7 +401,7 @@ module.exports = withMatrixClient(React.createClass({
// get out of sync if we force setState here!
console.log("Mod toggle success");
}, function(err) {
if (err.errcode == 'M_GUEST_ACCESS_FORBIDDEN') {
if (err.errcode === 'M_GUEST_ACCESS_FORBIDDEN') {
dis.dispatch({action: 'view_set_mxid'});
} else {
console.error("Toggle moderator error:" + err);
@ -436,7 +437,6 @@ module.exports = withMatrixClient(React.createClass({
},
onPowerChange: function(powerLevel) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
const roomId = this.props.member.roomId;
const target = this.props.member.userId;
const room = this.props.matrixClient.getRoom(roomId);
@ -497,19 +497,14 @@ module.exports = withMatrixClient(React.createClass({
modifyLevel: false,
};
const room = this.props.matrixClient.getRoom(member.roomId);
if (!room) {
return defaultPerms;
}
const powerLevels = room.currentState.getStateEvents(
"m.room.power_levels", "",
);
if (!powerLevels) {
return defaultPerms;
}
if (!room) return defaultPerms;
const powerLevels = room.currentState.getStateEvents("m.room.power_levels", "");
if (!powerLevels) return defaultPerms;
const me = room.getMember(this.props.matrixClient.credentials.userId);
if (!me) {
return defaultPerms;
}
if (!me) return defaultPerms;
const them = member;
return {
can: this._calculateCanPermissions(
@ -545,14 +540,13 @@ module.exports = withMatrixClient(React.createClass({
can.ban = me.powerLevel >= powerLevels.ban;
can.mute = me.powerLevel >= editPowerLevel;
can.toggleMod = me.powerLevel > them.powerLevel && them.powerLevel >= levelToSend;
can.modifyLevel = me.powerLevel > them.powerLevel;
can.modifyLevel = me.powerLevel > them.powerLevel && me.powerLevel >= editPowerLevel;
return can;
},
_isMuted: function(member, powerLevelContent) {
if (!powerLevelContent || !member) {
return false;
}
if (!powerLevelContent || !member) return false;
const levelToSend = (
(powerLevelContent.events ? powerLevelContent.events["m.room.message"] : null) ||
powerLevelContent.events_default
@ -568,14 +562,15 @@ module.exports = withMatrixClient(React.createClass({
},
onMemberAvatarClick: function() {
const avatarUrl = this.props.member.user ? this.props.member.user.avatarUrl : this.props.member.events.member.getContent().avatar_url;
const member = this.props.member;
const avatarUrl = member.user ? member.user.avatarUrl : member.events.member.getContent().avatar_url;
if(!avatarUrl) return;
const httpUrl = this.props.matrixClient.mxcUrlToHttp(avatarUrl);
const ImageView = sdk.getComponent("elements.ImageView");
const params = {
src: httpUrl,
name: this.props.member.name,
name: member.name,
};
Modal.createDialog(ImageView, params, "mx_Dialog_lightbox");
@ -589,9 +584,7 @@ module.exports = withMatrixClient(React.createClass({
},
_renderDevices: function() {
if (!this._enableDevices) {
return null;
}
if (!this._enableDevices) return null;
const devices = this.state.devices;
const MemberDeviceInfo = sdk.getComponent('rooms.MemberDeviceInfo');
@ -629,6 +622,8 @@ module.exports = withMatrixClient(React.createClass({
const member = this.props.member;
let ignoreButton = null;
let insertPillButton = null;
let inviteUserButton = null;
let readReceiptButton = null;
// Only allow the user to ignore the user if its not ourselves
@ -653,29 +648,71 @@ module.exports = withMatrixClient(React.createClass({
});
};
const onInsertPillButton = function() {
dis.dispatch({
action: 'insert_mention',
user_id: member.userId,
});
};
readReceiptButton = (
<AccessibleButton onClick={onReadReceiptButton} className="mx_MemberInfo_field">
{ _t('Jump to read receipt') }
</AccessibleButton>
);
insertPillButton = (
<AccessibleButton onClick={onInsertPillButton} className={"mx_MemberInfo_field"}>
{ _t('Mention') }
</AccessibleButton>
);
}
if (!member || !member.membership || member.membership === 'leave') {
const roomId = member && member.roomId ? member.roomId : RoomViewStore.getRoomId();
const onInviteUserButton = async () => {
try {
await cli.invite(roomId, member.userId);
} catch (err) {
const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog');
Modal.createTrackedDialog('Failed to invite', '', ErrorDialog, {
title: _t('Failed to invite'),
description: ((err && err.message) ? err.message : "Operation failed"),
});
}
};
inviteUserButton = (
<AccessibleButton onClick={onInviteUserButton} className="mx_MemberInfo_field">
{ _t('Invite') }
</AccessibleButton>
);
}
}
if (!ignoreButton && !readReceiptButton) return null;
if (!ignoreButton && !readReceiptButton && !insertPillButton && !inviteUserButton) return null;
return (
<div>
<h3>{ _t("User Options") }</h3>
<div className="mx_MemberInfo_buttons">
{ readReceiptButton }
{ insertPillButton }
{ ignoreButton }
{ inviteUserButton }
</div>
</div>
);
},
render: function() {
let startChat, kickButton, banButton, muteButton, giveModButton, spinner;
let startChat;
let kickButton;
let banButton;
let muteButton;
let giveModButton;
let spinner;
if (this.props.member.userId !== this.props.matrixClient.credentials.userId) {
const dmRoomMap = new DMRoomMap(this.props.matrixClient);
const dmRooms = dmRoomMap.getDMRoomsForUserId(this.props.member.userId);
@ -689,7 +726,7 @@ module.exports = withMatrixClient(React.createClass({
const me = room.getMember(this.props.matrixClient.credentials.userId);
const highlight = (
room.getUnreadNotificationCount('highlight') > 0 ||
me.membership == "invite"
me.membership === "invite"
);
tiles.push(
<RoomTile key={room.roomId} room={room}
@ -697,7 +734,7 @@ module.exports = withMatrixClient(React.createClass({
selected={false}
unread={Unread.doesRoomHaveUnreadMessages(room)}
highlight={highlight}
isInvite={me.membership == "invite"}
isInvite={me.membership === "invite"}
onClick={this.onRoomTileClick}
/>,
);
@ -742,7 +779,7 @@ module.exports = withMatrixClient(React.createClass({
}
if (this.state.can.ban) {
let label = _t("Ban");
if (this.props.member.membership == 'ban') {
if (this.props.member.membership === 'ban') {
label = _t("Unban");
}
banButton = (
@ -768,9 +805,6 @@ module.exports = withMatrixClient(React.createClass({
</AccessibleButton>;
}
// TODO: we should have an invite button if this MemberInfo is showing a user who isn't actually in the current room yet
// e.g. clicking on a linkified userid in a room
let adminTools;
if (kickButton || banButton || muteButton || giveModButton) {
adminTools =
@ -788,16 +822,39 @@ module.exports = withMatrixClient(React.createClass({
const memberName = this.props.member.name;
let presenceState;
let presenceLastActiveAgo;
let presenceCurrentlyActive;
if (this.props.member.user) {
var presenceState = this.props.member.user.presence;
var presenceLastActiveAgo = this.props.member.user.lastActiveAgo;
const presenceLastTs = this.props.member.user.lastPresenceTs;
var presenceCurrentlyActive = this.props.member.user.currentlyActive;
presenceState = this.props.member.user.presence;
presenceLastActiveAgo = this.props.member.user.lastActiveAgo;
presenceCurrentlyActive = this.props.member.user.currentlyActive;
}
let roomMemberDetails = null;
if (this.props.member.roomId) { // is in room
const PowerSelector = sdk.getComponent('elements.PowerSelector');
const PresenceLabel = sdk.getComponent('rooms.PresenceLabel');
roomMemberDetails = <div>
<div className="mx_MemberInfo_profileField">
{ _t("Level:") } <b>
<PowerSelector controlled={true}
value={parseInt(this.props.member.powerLevel)}
disabled={!this.state.can.modifyLevel}
onChange={this.onPowerChange} />
</b>
</div>
<div className="mx_MemberInfo_profileField">
<PresenceLabel activeAgo={presenceLastActiveAgo}
currentlyActive={presenceCurrentlyActive}
presenceState={presenceState} />
</div>
</div>;
}
const MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
const PowerSelector = sdk.getComponent('elements.PowerSelector');
const PresenceLabel = sdk.getComponent('rooms.PresenceLabel');
const EmojiText = sdk.getComponent('elements.EmojiText');
return (
<div className="mx_MemberInfo">
@ -813,14 +870,7 @@ module.exports = withMatrixClient(React.createClass({
<div className="mx_MemberInfo_profileField">
{ this.props.member.userId }
</div>
<div className="mx_MemberInfo_profileField">
{ _t("Level:") } <b><PowerSelector controlled={true} value={parseInt(this.props.member.powerLevel)} disabled={!this.state.can.modifyLevel} onChange={this.onPowerChange} /></b>
</div>
<div className="mx_MemberInfo_profileField">
<PresenceLabel activeAgo={presenceLastActiveAgo}
currentlyActive={presenceCurrentlyActive}
presenceState={presenceState} />
</div>
{ roomMemberDetails }
</div>
{ this._renderUserOptions() }

View file

@ -371,7 +371,7 @@ export default class MessageComposer extends React.Component {
);
return (
<div className="mx_MessageComposer mx_fadable" style={{ opacity: this.props.opacity }}>
<div className="mx_MessageComposer">
<div className="mx_MessageComposer_wrapper">
<div className="mx_MessageComposer_row">
{ controls }
@ -410,9 +410,6 @@ MessageComposer.propTypes = {
// callback when a file to upload is chosen
uploadFile: React.PropTypes.func.isRequired,
// opacity for dynamic UI fading effects
opacity: React.PropTypes.number,
// string representing the current room app drawer state
showApps: React.PropTypes.bool,
};

View file

@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -1130,10 +1131,12 @@ export default class MessageComposerInput extends React.Component {
<div className="mx_MessageComposer_autocomplete_wrapper">
<Autocomplete
ref={(e) => this.autocomplete = e}
room={this.props.room}
onConfirm={this.setDisplayedCompletion}
onSelectionChange={this.setDisplayedCompletion}
query={this.getAutocompleteQuery(content)}
selection={selection} />
selection={selection}
/>
</div>
<div className={className}>
<img className="mx_MessageComposer_input_markdownIndicator mx_filterFlipColor"

View file

@ -115,7 +115,9 @@ module.exports = React.createClass({
return (
<div className="mx_PinnedEventsPanel">
<div className="mx_PinnedEventsPanel_body">
<AccessibleButton className="mx_PinnedEventsPanel_cancel" onClick={this.props.onCancelClick}><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton>
<AccessibleButton className="mx_PinnedEventsPanel_cancel" onClick={this.props.onCancelClick}>
<img className="mx_filterFlipColor" src="img/cancel.svg" width="18" height="18" />
</AccessibleButton>
<h3 className="mx_PinnedEventsPanel_header">{ _t("Pinned Messages") }</h3>
{ tiles }
</div>

View file

@ -0,0 +1,145 @@
/*
Copyright 2017 New Vector Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import sdk from '../../../index';
import dis from '../../../dispatcher';
import React from 'react';
import { _t } from '../../../languageHandler';
import linkifyString from 'linkifyjs/string';
import sanitizeHtml from 'sanitize-html';
import { ContentRepo } from 'matrix-js-sdk';
import MatrixClientPeg from '../../../MatrixClientPeg';
import PropTypes from 'prop-types';
function getDisplayAliasForRoom(room) {
return room.canonicalAlias || (room.aliases ? room.aliases[0] : "");
}
const RoomDetailRow = React.createClass({
propTypes: {
room: PropTypes.shape({
name: PropTypes.string,
topic: PropTypes.string,
roomId: PropTypes.string,
avatarUrl: PropTypes.string,
numJoinedMembers: PropTypes.number,
canonicalAlias: PropTypes.string,
aliases: PropTypes.arrayOf(PropTypes.string),
worldReadable: PropTypes.bool,
guestCanJoin: PropTypes.bool,
}),
},
onClick: function(ev) {
ev.preventDefault();
dis.dispatch({
action: 'view_room',
room_id: this.props.room.roomId,
room_alias: this.props.room.canonicalAlias || (this.props.room.aliases || [])[0],
});
},
onTopicClick: function(ev) {
// When clicking a link in the topic, prevent the event being propagated
// to `onClick`.
ev.stopPropagation();
},
render: function() {
const BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
const room = this.props.room;
const name = room.name || getDisplayAliasForRoom(room) || _t('Unnamed room');
const topic = linkifyString(sanitizeHtml(room.topic || ''));
const guestRead = room.worldReadable ? (
<div className="mx_RoomDirectory_perm">{ _t('World readable') }</div>
) : <div />;
const guestJoin = room.guestCanJoin ? (
<div className="mx_RoomDirectory_perm">{ _t('Guests can join') }</div>
) : <div />;
const perms = (guestRead || guestJoin) ? (<div className="mx_RoomDirectory_perms">
{ guestRead }
{ guestJoin }
</div>) : <div />;
return <tr key={room.roomId} onClick={this.onClick}>
<td className="mx_RoomDirectory_roomAvatar">
<BaseAvatar width={24} height={24} resizeMethod='crop'
name={name} idName={name}
url={ContentRepo.getHttpUriForMxc(
MatrixClientPeg.get().getHomeserverUrl(),
room.avatarUrl, 24, 24, "crop")} />
</td>
<td className="mx_RoomDirectory_roomDescription">
<div className="mx_RoomDirectory_name">{ name }</div>&nbsp;
{ perms }
<div className="mx_RoomDirectory_topic"
onClick={this.onTopicClick}
dangerouslySetInnerHTML={{ __html: topic }} />
<div className="mx_RoomDirectory_alias">{ getDisplayAliasForRoom(room) }</div>
</td>
<td className="mx_RoomDirectory_roomMemberCount">
{ room.numJoinedMembers }
</td>
</tr>;
},
});
export default React.createClass({
displayName: 'RoomDetailList',
propTypes: {
rooms: PropTypes.arrayOf(PropTypes.shape({
name: PropTypes.string,
topic: PropTypes.string,
roomId: PropTypes.string,
avatarUrl: PropTypes.string,
numJoinedMembers: PropTypes.number,
canonicalAlias: PropTypes.string,
aliases: PropTypes.arrayOf(PropTypes.string),
worldReadable: PropTypes.bool,
guestCanJoin: PropTypes.bool,
})),
},
getRows: function() {
if (!this.props.rooms) return [];
return this.props.rooms.map((room, index) => {
return <RoomDetailRow key={index} room={room} />;
});
},
render() {
const rows = this.getRows();
let rooms;
if (rows.length == 0) {
rooms = <i>{ _t('No rooms to show') }</i>;
} else {
rooms = <table ref="directory_table" className="mx_RoomDirectory_table">
<tbody>
{ this.getRows() }
</tbody>
</table>;
}
return <div className="mx_RoomDetailList">
{ rooms }
</div>;
},
});

View file

@ -309,8 +309,11 @@ module.exports = React.createClass({
<input id="avatarInput" type="file" onChange={this.onAvatarSelected} />
</div>
<div className="mx_RoomHeader_avatarPicker_remove" onClick={this.onAvatarRemoveClick}>
<img src="img/cancel.svg" width="10"
alt={_t("Remove avatar")} title={_t("Remove avatar")} />
<img src="img/cancel.svg"
className="mx_filterFlipColor"
width="10"
alt={_t("Remove avatar")}
title={_t("Remove avatar")} />
</div>
</div>
);

View file

@ -34,27 +34,18 @@ const Receipt = require('../../../utils/Receipt');
const HIDE_CONFERENCE_CHANS = true;
function phraseForSection(section) {
// These would probably be better as individual strings,
// but for some reason we have translations for these strings
// as-is, so keeping it like this for now.
let verb;
switch (section) {
case 'm.favourite':
verb = _t('to favourite');
break;
return _t('Drop here to favourite');
case 'im.vector.fake.direct':
verb = _t('to tag direct chat');
break;
return _t('Drop here to tag direct chat');
case 'im.vector.fake.recent':
verb = _t('to restore');
break;
return _t('Drop here to restore');
case 'm.lowpriority':
verb = _t('to demote');
break;
return _t('Drop here to demote');
default:
return _t('Drop here to tag %(section)s', {section: section});
}
return _t('Drop here %(toAction)s', {toAction: verb});
}
module.exports = React.createClass({
@ -564,13 +555,23 @@ module.exports = React.createClass({
render: function() {
const RoomSubList = sdk.getComponent('structures.RoomSubList');
const inviteSectionExtraTiles = this._makeGroupInviteTiles();
const self = this;
return (
<GeminiScrollbar className="mx_RoomList_scrollbar"
autoshow={true} onScroll={self._whenScrolling} ref="gemscroll">
<div className="mx_RoomList">
<RoomSubList list={[]}
extraTiles={this._makeGroupInviteTiles()}
label={_t('Community Invites')}
editable={false}
order="recent"
isInvite={true}
collapsed={self.props.collapsed}
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
/>
<RoomSubList list={self.state.lists['im.vector.fake.invite']}
label={_t('Invites')}
editable={false}
@ -582,7 +583,6 @@ module.exports = React.createClass({
searchFilter={self.props.searchFilter}
onHeaderClick={self.onSubListHeaderClick}
onShowMoreRooms={self.onShowMoreRooms}
extraTiles={inviteSectionExtraTiles}
/>
<RoomSubList list={self.state.lists['m.favourite']}

View file

@ -83,10 +83,8 @@ module.exports = React.createClass({
}
},
_roomNameElement: function(fallback) {
fallback = fallback || _t('a room');
const name = this.props.room ? this.props.room.name : (this.props.room_alias || "");
return name ? name : fallback;
_roomNameElement: function() {
return this.props.room ? this.props.room.name : (this.props.room_alias || "");
},
render: function() {
@ -150,7 +148,7 @@ module.exports = React.createClass({
</div>
);
} else if (kicked || banned) {
const roomName = this._roomNameElement(_t('This room'));
const roomName = this._roomNameElement();
const kickerMember = this.props.room.currentState.getMember(
myMember.events.member.getSender(),
);
@ -167,9 +165,17 @@ module.exports = React.createClass({
let actionText;
if (kicked) {
actionText = _t("You have been kicked from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
if(roomName) {
actionText = _t("You have been kicked from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
} else {
actionText = _t("You have been kicked from this room by %(userName)s.", {userName: kickerName});
}
} else if (banned) {
actionText = _t("You have been banned from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
if(roomName) {
actionText = _t("You have been banned from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName});
} else {
actionText = _t("You have been banned from this room by %(userName)s.", {userName: kickerName});
}
} // no other options possible due to the kicked || banned check above.
joinBlock = (
@ -203,7 +209,7 @@ module.exports = React.createClass({
joinBlock = (
<div>
<div className="mx_RoomPreviewBar_join_text">
{ _t('You are trying to access %(roomName)s.', {roomName: name}) }
{ name ? _t('You are trying to access %(roomName)s.', {roomName: name}) : _t('You are trying to access a room.') }
<br />
{ _tJsx("<a>Click here</a> to join the discussion!",
/<a>(.*?)<\/a>/,

View file

@ -19,7 +19,6 @@ import Promise from 'bluebird';
import React from 'react';
import { _t, _tJsx, _td } from '../../../languageHandler';
import MatrixClientPeg from '../../../MatrixClientPeg';
import SdkConfig from '../../../SdkConfig';
import sdk from '../../../index';
import Modal from '../../../Modal';
import ObjectUtils from '../../../ObjectUtils';
@ -72,6 +71,7 @@ const BannedUser = React.createClass({
Modal.createTrackedDialog('Confirm User Action Dialog', 'onUnbanClick', ConfirmUserActionDialog, {
member: this.props.member,
action: _t('Unban'),
title: _t('Unban this user?'),
danger: false,
onFinished: (proceed) => {
if (!proceed) return;
@ -158,9 +158,9 @@ module.exports = React.createClass({
});
dis.dispatch({
action: 'ui_opacity',
sideOpacity: 0.3,
middleOpacity: 0.3,
action: 'panel_disable',
sideDisabled: true,
middleDisabled: true,
});
},
@ -171,9 +171,9 @@ module.exports = React.createClass({
}
dis.dispatch({
action: 'ui_opacity',
sideOpacity: 1.0,
middleOpacity: 1.0,
action: 'panel_disable',
sideDisabled: false,
middleDisabled: false,
});
},
@ -867,21 +867,21 @@ module.exports = React.createClass({
disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)}
checked={historyVisibility === "shared"}
onChange={this._onHistoryRadioToggle} />
{ _t('Members only') } ({ _t('since the point in time of selecting this option') })
{ _t('Members only (since the point in time of selecting this option)') }
</label>
<label>
<input type="radio" name="historyVis" value="invited"
disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)}
checked={historyVisibility === "invited"}
onChange={this._onHistoryRadioToggle} />
{ _t('Members only') } ({ _t('since they were invited') })
{ _t('Members only (since they were invited)') }
</label>
<label >
<input type="radio" name="historyVis" value="joined"
disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)}
checked={historyVisibility === "joined"}
onChange={this._onHistoryRadioToggle} />
{ _t('Members only') } ({ _t('since they joined') })
{ _t('Members only (since they joined)') }
</label>
</div>
</div>

View file

@ -184,7 +184,8 @@ module.exports = React.createClass({
});
},
onClickChange: function() {
onClickChange: function(ev) {
ev.preventDefault();
const oldPassword = this.state.cachedPassword || this.refs.old_input.value;
const newPassword = this.refs.new_input.value;
const confirmPassword = this.refs.confirm_input.value;

View file

@ -18,10 +18,13 @@ limitations under the License.
import React from 'react';
import ReactDOM from 'react-dom';
import classNames from 'classnames';
import sdk from '../../../index';
import dis from '../../../dispatcher';
import UserSettingsStore from '../../../UserSettingsStore';
module.exports = React.createClass({
displayName: 'VideoView',
@ -108,14 +111,18 @@ module.exports = React.createClass({
document.mozFullScreenElement ||
document.webkitFullscreenElement);
const maxVideoHeight = fullscreenElement ? null : this.props.maxHeight;
const localVideoFeedClasses = classNames("mx_VideoView_localVideoFeed",
{ "mx_VideoView_localVideoFeed_flipped":
UserSettingsStore.getSyncedSetting('VideoView.flipVideoHorizontally', false),
},
);
return (
<div className="mx_VideoView" ref={this.setContainer} onClick={this.props.onClick}>
<div className="mx_VideoView_remoteVideoFeed">
<VideoFeed ref="remote" onResize={this.props.onResize}
maxHeight={maxVideoHeight} />
</div>
<div className="mx_VideoView_localVideoFeed">
<div className={localVideoFeedClasses}>
<VideoFeed ref="local" />
</div>
</div>

View file

@ -15,6 +15,7 @@ limitations under the License.
*/
import PropTypes from 'prop-types';
import { _t } from './languageHandler.js';
export const GroupMemberType = PropTypes.shape({
userId: PropTypes.string.isRequired,
@ -23,6 +24,7 @@ export const GroupMemberType = PropTypes.shape({
});
export const GroupRoomType = PropTypes.shape({
displayname: PropTypes.string,
name: PropTypes.string,
roomId: PropTypes.string.isRequired,
canonicalAlias: PropTypes.string,
@ -39,9 +41,15 @@ export function groupMemberFromApiObject(apiObject) {
export function groupRoomFromApiObject(apiObject) {
return {
displayname: apiObject.name || apiObject.canonical_alias || _t("Unnamed Room"),
name: apiObject.name,
roomId: apiObject.room_id,
canonicalAlias: apiObject.canonical_alias,
avatarUrl: apiObject.avatar_url,
topic: apiObject.topic,
numJoinedMembers: apiObject.num_joined_members,
worldReadable: apiObject.world_readable,
guestCanJoin: apiObject.guest_can_join,
isPublic: apiObject.is_public !== false,
};
}

View file

@ -1,29 +1,6 @@
{
"People": "Gent",
"Add a widget": "Afegeix un giny",
"af": "Afrikaans",
"ar-ae": "Àrab (Emirats Àrabs Units)",
"ar-bh": "Àrab (Bahrain)",
"ar-dz": "Àrab (Algèria)",
"ar-eg": "Àrab (Egipte)",
"ar-iq": "Àrab (Iraq)",
"ar-jo": "Àrab (Jordània)",
"ar-kw": "Àrab (Kuwait)",
"ar-lb": "Àrab (Líban)",
"ar-ly": "Àrab (Líbia)",
"ar-ma": "Àrab (Marroc)",
"ar-om": "Àrab (Oman)",
"ar-qa": "Àrab (Qatar)",
"ar-sa": "Àrab (Aràbia Saudita)",
"ca": "Català",
"cs": "Txec",
"de-at": "Alemany (Àustria)",
"de-ch": "Alemany (Suïssa)",
"de": "Alemany",
"de-li": "Alemany (Liechtenstein)",
"el": "Grec",
"de-lu": "Alemany (Luxemburg)",
"en-au": "Anglès (Austràlia)",
"Account": "Compte",
"VoIP": "Veu IP",
"No Microphones detected": "No s'ha detectat cap micròfon",
@ -35,7 +12,6 @@
"Hide removed messages": "Amaga els missatges esborrats",
"Always show message timestamps": "Mostra sempre la marca de temps del missatge",
"Alias (optional)": "Àlies (opcional)",
"and": "i",
"An email has been sent to": "S'ha enviat un correu electrònic a",
"Cancel": "Cancel·la",
"Close": "Tanca",
@ -54,12 +30,7 @@
"Notifications": "Notificacions",
"Remove": "Elimina",
"unknown error code": "codi d'error desconegut",
"Sunday": "Diumenge",
"Monday": "Dilluns",
"Tuesday": "Dimarts",
"Wednesday": "Dimecres",
"Thursday": "Dijous",
"Friday": "Divendres",
"Saturday": "Dissabte",
"OK": "D'acord"
"OK": "D'acord",
"a room": "una sala",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "S'ha enviat un missatge de text a +%(msisdn)s. Entreu si us plau el codi de verificació que conté"
}

View file

@ -55,13 +55,6 @@
"Operation failed": "Chyba operace",
"Remove": "Odebrat",
"unknown error code": "neznámý kód chyby",
"Sunday": "Neděle",
"Monday": "Pondělí",
"Tuesday": "Úterý",
"Wednesday": "Středa",
"Thursday": "Čtvrtek",
"Friday": "Pátek",
"Saturday": "Sobota",
"OK": "OK",
"Failed to forget room %(errCode)s": "Nepodařilo se zapomenout místnost %(errCode)s",
"Dismiss": "Zahodit",
@ -81,7 +74,6 @@
"Add email address": "Přidat e-mailovou adresu",
"Add phone number": "Přidat telefonní číslo",
"Admin": "Správce",
"Admin tools": "Nástroje pro správu",
"Allow": "Povolit",
"VoIP": "VoIP",
"No Microphones detected": "Nerozpoznány žádné mikrofony",
@ -94,7 +86,6 @@
"Hide removed messages": "Skrýt odstraněné zprávy",
"Always show message timestamps": "Vždy zobrazovat časové značky zpráv",
"Authentication": "Ověření",
"and": "a",
"A new password must be entered.": "Musíte zadat nové heslo.",
"An error has occurred.": "Nastala chyba.",
"Anyone": "Kdokoliv",
@ -203,7 +194,6 @@
"Failed to save settings": "Uložení nastavení se nezdařilo",
"Failed to reject invitation": "Odmítnutí pozvánky se nezdařilo",
"Failed to reject invite": "Odmítnutí pozvání se nezdařilo",
"Failed to register as guest:": "Registrace jako host se nezdařila:",
"Failed to send request.": "Odeslání žádosti se nezdařilo.",
"Failed to set avatar.": "Nastavení avataru se nezdařilo.",
"Failed to set display name": "Nastavení zobrazovaného jména se nezdařilo",
@ -215,33 +205,21 @@
"Forget room": "Zapomenout místnost",
"Forgot your password?": "Zapomněli jste své heslo?",
"For security, this session has been signed out. Please sign in again.": "Z bezpečnostních důvodů bylo toto přihlášení ukončeno. Přihlašte se prosím znovu.",
"all room members, from the point they are invited": "všichni členové místnosti od chvíle jejich pozvání",
"all room members, from the point they joined": "všichni členové místnosti od chvíle jejich vstupu",
"%(names)s and one other are typing": "%(names)s a jeden další píší",
"%(names)s and %(lastPerson)s are typing": "%(names)s a %(lastPerson)s píší",
"and %(count)s others...|other": "a %(count)s další...",
"%(names)s and %(count)s others are typing": "%(names)s a %(count)s další píší",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget upravil/a %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget odstranil/a %(senderName)s",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget přidal/a %(senderName)s",
"Automatically replace plain text Emoji": "Automaticky nahrazovat textové emodži",
"Failed to upload image": "Obrázek se nepodařilo nahrát",
"Failed to update group": "Aktualizace skupiny se nepodařila",
"Edit Group": "Upravit skupinu",
"Join an existing group": "Přidat se do existující skupiny",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Pro přidání se do existující skupiny je nutno znát její identifikátor. Vypadá nějak takto: <i>+skupina:matrix.org</i>.",
"You are a member of these groups:": "Jste členem těchto skupin:",
"Room creation failed": "Místnost se nepodařilo vytvořit",
"%(senderName)s answered the call.": "%(senderName)s přijal/a hovor.",
"Click to mute audio": "Kliknutím ztlumíte zvuk",
"Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste kliknul/a na zaslaný odkaz",
"Found a bug?": "Našli jste chybu?",
"Guest access is disabled on this Home Server.": "Na tomto domovském serveru je hostům vstup odepřen.",
"Guests can't set avatars. Please register.": "Hosté si nemohou nastavovat avatar. Zaregistrujte se prosím.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Hosté nemohou vytvářet nové místnosti. Abyste mohli místnosti vytvářet a chatovat v nich, nejprve se prosím zaregistrujte.",
"Guest users can't upload files. Please register to upload.": "Hosté nemohou nahrávat soubory. Abyste je mohli nahrávat, nejprve se prosím zaregistrujte.",
"Guests cannot join this room even if explicitly invited.": "Hosté nemohou vstoupit do této místnosti, i když jsou přímo pozváni.",
"had": "měl/a",
"Hide read receipts": "Skrýt potvrzení o přečtení",
"Homeserver is": "Domovský server je",
"Identity Server is": "Server identity je",
@ -279,7 +257,6 @@
"Mobile phone number": "Číslo mobilního telefonu",
"Mobile phone number (optional)": "Číslo mobilního telefonu (nepovinné)",
"Moderator": "Moderátor",
"my Matrix ID": "moje Matrix ID",
"Name": "Jméno",
"New address (e.g. #foo:%(localDomain)s)": "Nová adresa (např. #neco:%(localDomain)s)",
"New password": "Nové heslo",
@ -310,11 +287,9 @@
"Power level must be positive integer.": "Úroveň moci musí být kladné celé číslo.",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (moc %(powerLevelNumber)s)",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tuto změnu nepůjde vrátit zpět, protože tomuto uživateli nastavujete stejnou úroveň moci, jakou máte vy.",
"And %(count)s more...": "A %(count)s další...",
"Alias (optional)": "Alias (nepovinný)",
"Room name (optional)": "Název místnosti (nepovinný)",
"Report it": "Nahlásit to",
"restore": "obnovit",
"Results from DuckDuckGo": "Výsledky z DuckDuckGo",
"Return to app": "Vrátit k aplikaci",
"Return to login screen": "Vrátit k přihlašovací obrazovce",
@ -345,7 +320,6 @@
"Session ID": "ID sezení",
"%(senderName)s set a profile picture.": "%(senderName)s si nastavil/a profilový obrázek.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si změnil/a zobrazované jméno na %(displayName)s.",
"Set": "Nastavit",
"Sets the room topic": "Nastavuje téma místnosti",
"Show Apps": "Zobrazit aplikace",
"Show panel": "Zobrazit panel",
@ -358,7 +332,6 @@
"Start authentication": "Začít ověření",
"Submit": "Odeslat",
"Success": "Úspěch",
"tag as %(tagName)s": "oštítkovat jako %(tagName)s",
"The main address for this room is": "Hlavní adresa této místnosti je",
"The phone number entered looks invalid": "Zadané telefonní číslo se zdá být neplatné",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Zadaný podepisovací klíč se shoduje s klíčem obdrženým od uživatele %(userId)s ze zařízení %(deviceId)s. Zařízení je označeno jako ověřené.",
@ -368,7 +341,6 @@
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Soubor '%(fileName)s' překračuje maximální velikost povolenou na tomto domovském serveru",
"The file '%(fileName)s' failed to upload": "Soubor '%(fileName)s' se nepodařilo nahrát",
"This Home Server does not support login using email address.": "Tento domovský server nepodporuje přihlašování e-mailovou adresou.",
"There was a problem logging in.": "Při přihlašování se vyskytl problém.",
"This room has no local addresses": "Tato místnost nemá žádné místní adresy",
"This room is not recognised.": "Tato místnost nebyla rozpoznána.",
"These are experimental features that may break in unexpected ways": "Tyto funkce jsou experimentální a mohou se pokazit nečekanými způsoby",
@ -389,8 +361,6 @@
"You do not have permission to post to this room": "Na přispívání do této místnosti nemáte právo",
"You have been banned from %(roomName)s by %(userName)s.": "%(userName)s vás vykázal/a z místnosti %(roomName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s vás vykopnul/a z místnosti %(roomName)s.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Zadali jste neplatný kontakt. Zkuste jejich Matrix ID nebo e-mailovou adresu.",
"you must be a": "musíte být",
"You need to enter a user name.": "Musíte zadat uživatelské jméno.",
"Your password has been reset": "Vaše heslo bylo resetováno",
"Your home server does not support device management.": "Váš domovský server nepodporuje správu zařízení.",
@ -412,13 +382,10 @@
"click to reveal": "klikněte pro odhalení",
"Click to unmute video": "Klikněte pro povolení videa",
"Click to unmute audio": "Klikněte pro povolení zvuku",
"demote": "degradovat",
"Devices will not yet be able to decrypt history from before they joined the room": "Zařízení nebudou schopna dešifrovat historii před tím než se připojila k místnosti",
"Disable markdown formatting": "Zakázat formátování v markdownu",
"Displays action": "Zobrazí akci",
"Do you want to load widget from URL:": "Chcete načíst widget z URL:",
"Ed25519 fingerprint": "Ed25519 otisk",
"favourite": "oblíbené",
"Fill screen": "Vyplnit obrazovku",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s",
"This doesn't appear to be a valid email address": "Emailová adresa se zdá být nevalidní",
@ -426,20 +393,8 @@
"This phone number is already in use": "Tohle číslo už se používá",
"This room is not accessible by remote Matrix servers": "Tahle místnost není přístupná vzdálenými Matrix servery",
"This room's internal ID is": "Vnitřní ID místnosti je",
"times": "krát",
"To ban users": "Zablokovat uživatele",
"to browse the directory": "prohlížet adresář",
"To configure the room": "Nastavit místnost",
"To invite users into the room": "Pozvat uživatele do místnosti",
"To kick users": "Vyhodit uživatele",
"to make a room or": "vytvořit místnost nebo",
"To remove other users' messages": "Smazat zprávy ostatních uživatelů",
"To reset your password, enter the email address linked to your account": "K resetování hesla, vložte emailovou adresu spojenou s vaším účtem",
"to restore": "obnovit",
"To send events of type": "Odeslat události typu",
"To send messages": "Odeslat zprávy",
"to start a chat with someone": "začít chat s někým",
"to tag as %(tagName)s": "oštítkovat jako %(tagName)s",
"to tag direct chat": "oštítkovat přímý chat",
"To use it, just wait for autocomplete results to load and tab through them.": "Pro použití vyčkejte k načtení automatického doplňování a tabem přeskakujte mezi výsledky.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nemáte práva k zobrazení zprávy v daném časovém úseku.",
@ -450,7 +405,6 @@
"Unable to add email address": "Nepodařilo se přidat emailovou adresu",
"Unable to create widget.": "Nepodařilo se vytvořit widget.",
"Unable to remove contact information": "Nepodařilo se smazat kontaktní údaje",
"Unable to restore previous session": "Nepodařilo se obnovit předchozí sezení",
"Unable to verify email address.": "Nepodařilo se ověřit emailovou adresu.",
"Unban": "Odblokovat",
"Unbans user with given id": "Odblokuje uživatele s daným id",
@ -466,7 +420,6 @@
"unknown device": "neznámé zařízení",
"Unknown room %(roomId)s": "Neznámá místnost %(roomId)s",
"Unknown (user, device) pair:": "Neznámý pár (uživatel, zařízení):",
"unknown": "neznámý",
"Unmute": "Povolit",
"Unnamed Room": "Nepojmenovaná Místnost",
"Unrecognised command:": "Nerozpoznaný příkaz:",

View file

@ -10,7 +10,6 @@
"New passwords must match each other.": "Nye adgangskoder skal matche hinanden.",
"A new password must be entered.": "Der skal indtastes en ny adgangskode.",
"The email address linked to your account must be entered.": "Den emailadresse, der tilhører til din adgang, skal indtastes.",
"Failed to send email: ": "Kunne ikke sende e-mail: ",
"unknown device": "ukendt enhed",
"NOT verified": "IKKE verificeret",
"Blacklisted": "blokeret",
@ -44,46 +43,27 @@
"Login as guest": "Log ind som gæst",
"Return to app": "Tilbage til app",
"Sign in": "Log ind",
"Create a new account": "Oprette en ny bruger",
"Send an encrypted message": "Send en krypteret meddelelse",
"Send a message (unencrypted)": "Send en meddelelse (ukrypteret)",
"Warning!": "Advarsel!",
"accept": "acceptere",
"accepted an invitation": "Godkendt en invitation",
"accepted the invitation for": "Accepteret invitationen til",
"Account": "Konto",
"Add email address": "Tilføj e-mail-adresse",
"Add phone number": "Tilføj telefonnummer",
"Admin": "Administrator",
"Advanced": "Avanceret",
"an address": "en adresse",
"and": "og",
"An email has been sent to": "En e-mail blev sendt til",
"answered the call.": "svarede på kaldet",
"Anyone who knows the room's link, apart from guests": "Alle der kender link til rummet, bortset fra gæster",
"Anyone who knows the room's link, including guests": "Alle der kender link til rummet, inklusiv gæster",
"Are you sure you want to leave the room?": "Er du sikker på du vil forlade rummet?",
"Are you sure you want to reject the invitation?": "Er du sikker på du vil afvise invitationen?",
"Are you sure you want to upload the following files?": "Er du sikker på du vil sende de følgende filer?",
"banned": "bortvist",
"Banned users": "Bortviste brugere",
"Bug Report": "Fejlrapport",
"Bulk Options": "Masseindstillinger",
"Can't connect to homeserver - please check your connectivity and ensure your": "Kan ikke oprette forbindelse til homeserver - Kontroller din forbindelse og sørg for din ",
"Can't load user settings": "Kan ikke indlæse brugerindstillinger",
"changed avatar": "Ændret avatar",
"changed name": "Ændret navn",
"changed their display name from": "Ændret deres visningsnavn fra",
"changed their profile picture": "Ændret deres profilbillede",
"changed the power level of": "Ændret effektniveauet på",
"changed the room name to": "Ændrede rumnavnet til",
"changed the topic to": "Ændret emnet til",
"Changes to who can read history will only apply to future messages in this room": "Ændringer til hvem der kan læse historie gælder kun for fremtidige meddelelser i dette rum",
"Clear Cache and Reload": "Ryd cache og genindlæs",
"Clear Cache": "Ryd cache",
"Click here": "Klik her",
"Click here to fix": "Klik her for at rette",
"*️⃣ Commands": "kommandoer",
"Confirm your new password": "Bekræft din nye adgangskode",
"Continue": "fortsætte",
"Could not connect to the integration server": "Kunne ikke oprette forbindelse til integrationsserveren",
@ -92,24 +72,19 @@
"Cryptography": "Kryptografi",
"Deactivate Account": "Deaktiver brugerkonto",
"Deactivate my account": "Deaktiver min brugerkonto",
"decline": "nedgang",
"Default": "Standard",
"demote": "degradere",
"Devices will not yet be able to decrypt history from before they joined the room": "Enhederne vil ikke være i stand til at dekryptere historikken fra, før de kom til rummet",
"Disable inline URL previews by default": "Deaktiver forrige weblinks forhåndsvisninger som standard",
"Display name": "Visningsnavn",
"Email Address": "Email adresse",
"Email, name or matrix ID": "E-mail, navn eller matrix-id",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Krypterede meddelelser vil ikke være synlige på klienter, der endnu ikke implementerer kryptering",
"Encrypted room": "Krypteret rummet",
"Encryption is enabled in this room": "Kryptering er aktiveret i dette rum",
"Encryption is not enabled in this room": "Kryptering er ikke aktiveret i dette rum",
"ended the call.": "Afsluttede opkaldet.",
"End-to-end encryption is in beta and may not be reliable": "End-to-end kryptering er i beta og kan ikke være pålidelig",
"Error": "Fejl",
"Export E2E room keys": "Eksporter E2E rum nøgler",
"Failed to change password. Is your password correct?": "Kunne ikke ændre adgangskode. Er din adgangskode korrekt?",
"Failed to forget room": "Kunne ikke glemme rummet",
"Failed to leave room": "Kunne ikke forlade rum",
"Failed to reject invitation": "Kunne ikke afvise invitationen",
"Failed to send email": "Kunne ikke sende e-mail",
@ -120,56 +95,10 @@
"Remove": "Fjerne",
"Settings": "Indstillinger",
"unknown error code": "Ukendt fejlkode",
"en": "Engelsk",
"pt-br": "Brasiliansk Portugisisk",
"de": "Tysk",
"da": "Dansk",
"ru": "Russisk",
"%(targetName)s accepted an invitation.": "%(targetName)s accepterede en invitation.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepteret invitationen til %(displayName)s.",
"%(names)s and %(lastPerson)s are typing": "%(names)s og %(lastPerson)s er ved at skrive",
"%(names)s and one other are typing": "%(names)s og den anden skriver",
"%(names)s and %(count)s others are typing": "%(names)s og %(count)s andre skriver",
"%(senderName)s answered the call.": "%(senderName)s besvarede opkaldet.",
"Add a widget": "Tilføj en widget",
"ar-ae": "Arabisk (U.A.E.)",
"ar-bh": "Arabisk (Bahrain)",
"ar-dz": "Arabisk (Algeriet)",
"ar-iq": "Arabisk (Irak)",
"ar-jo": "Arabisk (Jordan)",
"ar-kw": "Arabisk (Kuwait)",
"ar-lb": "Arabisk (Libanon)",
"ar-ly": "Arabisk (Libyen)",
"ar-om": "Arabisk (Oman)",
"ar-qa": "Arabisk (Qatar)",
"ar-ye": "Arabisk (Jemen)",
"ar-tn": "Arabisk (Tunesien)",
"de-li": "Tysk (Liechtenstein)",
"de-lu": "Tysk (Luxembourg)",
"en-bz": "Engelsk (Belize)",
"en-gb": "Engelsk (United Kingdom)",
"en-jm": "Engelsk (Jamaica)",
"en-tt": "Engelsk (Trinidad)",
"es-co": "Spansk (Colombia)",
"es-cr": "Spansk (Costa Rica)",
"es-do": "Spansk (Dominikanske Republik)",
"es-gt": "Spansk (Guatemala)",
"es-pa": "Spansk (Panama)",
"es-pe": "Spansk (Peru)",
"es-pr": "Spansk (Puerto Rico)",
"es-sv": "Spansk (El Salvador)",
"eu": "Baskisk (Baskien)",
"fo": "Færøsk",
"fr-lu": "Fransk (Luxembourg)",
"gd": "Gælisk (Skotland)",
"it-ch": "Italiensk (Schweiz)",
"ko": "Koreansk",
"mk": "Makedonsk (FYROM)",
"nl-be": "Nederlandsk (Belgien)",
"rm": "Rætoromansk",
"ro-mo": "Rumænsk (Republikken Moldova)",
"ru-mo": "Russisk (Republikken Moldova)",
"sv-fi": "Svensk (Finland)",
"sx": "Sutu",
"sz": "Samisk (Lappisk)"
"Add a widget": "Tilføj en widget"
}

View file

@ -10,7 +10,6 @@
"New passwords must match each other.": "Die neuen Passwörter müssen identisch sein.",
"A new password must be entered.": "Es muss ein neues Passwort eingegeben werden.",
"The email address linked to your account must be entered.": "Es muss die mit dem Benutzerkonto verbundene E-Mail-Adresse eingegeben werden.",
"Failed to send email: ": "Email konnte nicht versendet werden: ",
"unknown device": "Unbekanntes Gerät",
"NOT verified": "NICHT verifiziert",
"Blacklisted": "Blockiert",
@ -45,34 +44,21 @@
"Login as guest": "Als Gast anmelden",
"Return to app": "Zurück zur Anwendung",
"Sign in": "Anmelden",
"Create a new account": "Erstelle einen neuen Benutzer",
"Send an encrypted message": "Verschlüsselte Nachricht senden",
"Send a message (unencrypted)": "Nachricht senden (unverschlüsselt)",
"Warning!": "Warnung!",
"Error": "Fehler",
"accept": "akzeptiere",
"accepted an invitation": "Einladung akzeptieren",
"accepted the invitation for": "Akzeptierte die Einladung für",
"Add email address": "E-Mail-Adresse hinzufügen",
"Advanced": "Erweitert",
"and": "und",
"An email has been sent to": "Eine E-Mail wurde gesendet an",
"Anyone who knows the room's link, apart from guests": "Alle, denen der Raum-Link bekannt ist (ausgenommen Gäste)",
"Anyone who knows the room's link, including guests": "Alle, denen der Raum-Link bekannt ist (auch Gäste)",
"Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?",
"Are you sure you want to reject the invitation?": "Bist du sicher, dass du die Einladung ablehnen willst?",
"Are you sure you want to upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen möchtest?",
"banned": "gebannt",
"Banned users": "Verbannte Benutzer",
"Bug Report": "Fehlerbericht",
"changed avatar": "änderte Avatar",
"changed their display name from": "änderte seinen Anzeigenamen von",
"changed their profile picture": "änderte sein Profilbild",
"changed the room name to": "änderte den Raumnamen zu",
"changed the topic to": "änderte das Thema zu",
"Changes to who can read history will only apply to future messages in this room": "Änderungen, die bestimmen, wer den Chatverlauf lesen kann, gelten nur für zukünftige Nachrichten in diesem Raum",
"Clear Cache and Reload": "Cache leeren und neu laden",
"Click here": "Hier klicken,",
"Confirm your new password": "Neues Passwort bestätigen",
"Continue": "Fortfahren",
"Create an account": "Benutzerkonto erstellen",
@ -80,67 +66,45 @@
"Cryptography": "Verschlüsselung",
"Deactivate Account": "Benutzerkonto deaktivieren",
"Deactivate my account": "Mein Benutzerkonto deaktivieren",
"decline": "Ablehnen",
"Devices will not yet be able to decrypt history from before they joined the room": "Geräte werden nicht in der Lage sein, den bisherigen Chatverlauf vor dem Betreten des Raumes zu entschlüsseln",
"Display name": "Anzeigename",
"Email Address": "E-Mail-Adresse",
"Email, name or matrix ID": "E-Mail, Name oder Matrix-ID",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Verschlüsselte Nachrichten werden nicht in Matrix-Clients sichtbar sein, die die Verschlüsselung noch nicht implementiert haben",
"Encrypted room": "Verschlüsselter Raum",
"Encryption is enabled in this room": "Verschlüsselung ist in diesem Raum aktiviert",
"Encryption is not enabled in this room": "Verschlüsselung ist in diesem Raum nicht aktiviert",
"ended the call.": "beendete den Anruf.",
"End-to-end encryption is in beta and may not be reliable": "Die Ende-zu-Ende-Verschlüsselung befindet sich aktuell im Beta-Stadium und ist eventuell noch nicht hundertprozentig zuverlässig",
"Failed to send email": "Fehler beim Senden der E-Mail",
"Account": "Benutzerkonto",
"Add phone number": "Telefonnummer hinzufügen",
"an address": "an Adresse",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du wirst erst Benachrichtigungen auf anderen Geräten empfangen können, wenn du dich dort erneut anmeldest",
"answered the call.": "beantwortete den Anruf.",
"Can't load user settings": "Benutzereinstellungen können nicht geladen werden",
"changed name": "änderte Namen",
"changed the power level of": "änderte Berechtigungslevel von",
"Clear Cache": "Cache leeren",
"Click here to fix": "Zum reparieren hier klicken",
"*️⃣ Commands": "*️⃣ Befehle",
"Default": "Standard",
"demote": "Berechtigungslevel herabstufen",
"Export E2E room keys": "E2E-Raum-Schlüssel exportieren",
"Failed to change password. Is your password correct?": "Passwortänderung fehlgeschlagen. Ist dein Passwort richtig?",
"Failed to forget room": "Vergessen des Raums schlug fehl",
"Failed to leave room": "Verlassen des Raums fehlgeschlagen",
"Failed to reject invitation": "Einladung konnte nicht abgelehnt werden",
"Failed to set avatar.": "Fehler beim Setzen des Profilbilds.",
"Failed to unban": "Aufheben der Verbannung fehlgeschlagen",
"Failed to upload file": "Datei-Upload fehlgeschlagen",
"Favourite": "Favorit",
"favourite": "Favorit",
"Forget room": "Raum entfernen",
"Forgot your password?": "Passwort vergessen?",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Aus Sicherheitsgründen werden beim Ausloggen alle Ende-zu-Ende-Verschlüsselungs-Schlüssel in diesem Browser gelöscht. Wenn du in späteren Riot-Sitzungen den bisherigen Chatverlauf entschlüsseln möchtest, exportiere bitte deine Schlüssel zur sicheren Aufbewahrung.",
"For security, this session has been signed out. Please sign in again.": "Aus Sicherheitsgründen wurde diese Sitzung beendet. Bitte melde dich erneut an.",
"Found a bug?": "Fehler gefunden?",
"Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.",
"had": "hatte",
"Hangup": "Auflegen",
"Homeserver is": "Home-Server:",
"Identity Server is": "Identitätsserver:",
"I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert",
"Import E2E room keys": "E2E-Raum-Schlüssel importieren",
"Invalid Email Address": "Ungültige E-Mail-Adresse",
"invited": "eingeladen",
"Invite new room members": "Neue Raum-Mitglieder einladen",
"is a": "ist ein",
"is trusted": "wird vertraut",
"Sign in with": "Anmelden mit",
"joined and left": "hat den Raum betreten und wieder verlassen",
"joined": "hat den Raum betreten",
"joined the room": "trat dem Raum bei",
"Leave room": "Raum verlassen",
"left and rejoined": "ging(en) und trat(en) erneut bei",
"left": "hat den Raum verlassen",
"left the room": "verließ den Raum",
"Logged in as": "Angemeldet als",
"Logout": "Abmelden",
"Manage Integrations": "Integrationen verwalten",
"Members only": "Nur Mitglieder",
@ -151,34 +115,23 @@
"Never send encrypted messages to unverified devices in this room from this device": "Niemals verschlüsselte Nachrichten an unverifizierte Geräte in diesem Raum von diesem Gerät aus senden",
"New password": "Neues Passwort",
"Notifications": "Benachrichtigungen",
" (not supported by this browser)": " (von diesem Browser nicht unterstützt)",
"<not supported>": "<nicht unterstützt>",
"No users have specific privileges in this room": "Kein Benutzer hat in diesem Raum besondere Berechtigungen",
"olm version": "OLM-Version",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Sobald Verschlüsselung für einen Raum aktiviert wird, kann diese (aktuell noch) nicht wieder deaktiviert werden",
"Only people who have been invited": "Nur Personen, die eingeladen wurden",
"or": "oder",
"other": "weiteres",
"others": "andere",
"Password": "Passwort",
"Permissions": "Berechtigungen",
"Phone": "Telefon",
"placed a": "plazierte einen",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Bitte prüfe deinen E-Mail-Posteingang und klicke auf den in der E-Mail enthaltenen Link. Anschließend auf \"Fortsetzen\" klicken.",
"Privacy warning": "Datenschutzwarnung",
"Privileged Users": "Privilegierte Nutzer",
"Profile": "Profil",
"Refer a friend to Riot:": "Freunde zu Riot einladen:",
"rejected": "abgelehnt",
"Once you've followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten",
"rejected the invitation.": "lehnte die Einladung ab.",
"Reject invitation": "Einladung ablehnen",
"Remove Contact Information?": "Kontakt-Informationen entfernen?",
"removed their display name": "löschte den eigenen Anzeigenamen",
"Remove": "Entfernen",
"requested a VoIP conference": "hat eine VoIP-Konferenz angefordert",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ein Zurücksetzen des Passworts hat aktuell zur Folge, dass sämtliche Ende-zu-Ende-Verschlüsselungs-Schlüssel auf allen Geräten zurückgesetzt werden. Um zu verhindern, dass der bereits verschlüsselte Chatverlauf unlesbar wird, sollten die Raum-Schlüssel deshalb zuvor exportiert und anschließend wieder importiert werden. In Zukunft wird diese Vorgehensweise weiter verbessert und vereinfacht werden.",
"restore": "Zum zurücksetzen",
"Return to login screen": "Zur Anmeldemaske zurückkehren",
"Room Colour": "Raumfarbe",
"Room name (optional)": "Raumname (optional)",
@ -186,11 +139,8 @@
"Send Invites": "Einladungen senden",
"Send Reset Email": "E-Mail zum Zurücksetzen senden",
"sent an image": "hat ein Bild gesendet",
"sent an invitation to": "sandte eine Einladung an",
"sent a video": "hat ein Video gesendet",
"Server may be unavailable or overloaded": "Server ist eventuell nicht verfügbar oder überlastet",
"set a profile picture": "setzte ein Profilbild",
"set their display name to": "setzte den Anzeigenamen auf",
"Settings": "Einstellungen",
"Signed Out": "Abgemeldet",
"Sign out": "Abmelden",
@ -201,29 +151,19 @@
"Start a chat": "Chat starten",
"Start Chat": "Chat beginnen",
"Success": "Erfolg",
"tag direct chat": "Zum kennzeichnen als direkten Chat",
"The default role for new room members is": "Das Standard-Berechtigungslevel für neue Raum-Mitglieder ist",
"their invitations": "ihre Einladungen",
"their invitation": "ihre Einladung",
"These are experimental features that may break in unexpected ways. Use with caution": "Dies sind experimentelle Funktionen die in unerwarteter Weise Fehler verursachen können. Mit Vorsicht benutzen",
"The visibility of existing history will be unchanged": "Die Sichtbarkeit des bereits vorhandenen Chatverlaufs bleibt unverändert",
"This doesn't appear to be a valid email address": "Dies scheint keine gültige E-Mail-Adresse zu sein",
"this invitation?": "diese Einladung?",
"This is a preview of this room. Room interactions have been disabled": "Dies ist eine Vorschau dieses Raumes. Raum-Interaktionen wurden deaktiviert",
"This room is not accessible by remote Matrix servers": "Remote-Matrix-Server können auf diesen Raum nicht zugreifen",
"This room's internal ID is": "Die interne ID dieses Raumes ist",
"to join the discussion": "um an der Diskussion teilzunehmen",
"Admin": "Administrator",
"Server may be unavailable, overloaded, or you hit a bug.": "Server ist nicht verfügbar, überlastet oder du bist auf einen Fehler gestoßen.",
"Could not connect to the integration server": "Konnte keine Verbindung zum Integrations-Server herstellen",
"Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren",
"Labs": "Labor",
"Show panel": "Panel anzeigen",
"To redact messages": "Zum Nachrichten verbergen",
"Can't connect to homeserver - please check your connectivity and ensure your": "Die Verbindung mit dem Homeserver ist fehlgeschlagen. Bitte überprüfe deine Verbindung und stelle sicher, dass dein(e) ",
"tag as": "kennzeichne als",
"To reset your password, enter the email address linked to your account": "Um dein Passwort zurückzusetzen, gib bitte die mit deinem Account verknüpfte E-Mail-Adresse ein",
"turned on end-to-end encryption (algorithm": "aktivierte Ende-zu-Ende-Verschlüsselung (Algorithmus",
"Unable to add email address": "E-Mail-Adresse konnte nicht hinzugefügt werden",
"Unable to remove contact information": "Die Kontakt-Informationen konnten nicht gelöscht werden",
"Unable to verify email address.": "Die E-Mail-Adresse konnte nicht verifiziert werden.",
@ -248,20 +188,15 @@
"was invited": "wurde eingeladen",
"was kicked": "wurde gekickt",
"was unbanned": "wurde von der Verbannung aus dem Raum befreit",
"was": "wurde",
"Who can access this room?": "Wer hat Zugang zu diesem Raum?",
"Who can read history?": "Wer kann den bisherigen Chatverlauf lesen?",
"Who would you like to add to this room?": "Wen möchtest du zu diesem Raum hinzufügen?",
"Who would you like to communicate with?": "Mit wem möchtest du kommunizieren?",
"Would you like to": "Möchtest du",
"You do not have permission to post to this room": "Du hast keine Berechtigung, in diesem Raum etwas zu senden",
"You have been invited to join this room by %(inviterName)s": "%(inviterName)s hat dich in diesen Raum eingeladen",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Du wurdest auf allen Geräten abgemeldet und wirst keine Push-Benachrichtigungen mehr erhalten. Um die Benachrichtigungen zu reaktivieren, musst du dich auf jedem Gerät neu anmelden",
"you must be a": "Berechtigungslevel",
"Your password has been reset": "Dein Passwort wurde zurückgesetzt",
"You should not yet trust it to secure data": "Du solltest aktuell noch nicht darauf vertrauen, dass deine Daten zuverlässig verschlüsselt werden",
"removed their profile picture": "löschte das eigene Profilbild",
"times": "mal",
"Bulk Options": "Bulk-Optionen",
"Call Timeout": "Anruf-Timeout",
"Conference call failed.": "Konferenzgespräch fehlgeschlagen.",
@ -325,18 +260,16 @@
"Make this room private": "Mache diesen Raum privat",
"Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen",
"Encrypt room": "Raum verschlüsseln",
"To send events of type": "Zum Senden von Ereignissen mit Typ",
"%(names)s and %(lastPerson)s are typing": "%(names)s und %(lastPerson)s schreiben",
"%(targetName)s accepted an invitation.": "%(targetName)s hat eine Einladung angenommen.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s akzeptierte die Einladung für %(displayName)s.",
"%(names)s and one other are typing": "%(names)s und ein weiteres Raum-Mitglied schreiben",
"%(names)s and %(count)s others are typing": "%(names)s und %(count)s weitere Raum-Mitglieder schreiben",
"%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s dauerhaft aus dem Raum verbannt.",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von \"%(oldDisplayName)s\" auf \"%(displayName)s\" geändert.",
"%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".",
"/ddg is not a command": "/ddg ist kein Kommando",
"%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.",
@ -350,7 +283,7 @@
"%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle Raum-Mitglieder.",
"%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder.",
"%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Jeder.",
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).",
"Missing room_id in request": "Fehlende room_id in Anfrage",
@ -380,41 +313,17 @@
"You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Nutzer einzuladen, um diese Aktion ausführen zu können.",
"You need to be logged in.": "Du musst angemeldet sein.",
"There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum",
"Error changing language": "Fehler beim Ändern der Sprache",
"Riot was unable to find the correct Data for the selected Language.": "Riot war nicht in der Lage die korrekten Daten für die ausgewählte Sprache zu finden.",
"Connectivity to the server has been lost.": "Verbindung zum Server wurde unterbrochen.",
"Sent messages will be stored until your connection has returned.": "Gesendete Nachrichten werden gespeichert, bis die Internetverbindung wiederhergestellt wird.",
"Resend all": "Alle erneut senden",
"cancel all": "alles abbrechen",
"now. You can also select individual messages to resend or cancel.": "jetzt. Du kannst auch einzelne Nachrichten zum erneuten Senden oder Abbrechen auswählen.",
"Active call": "Aktiver Anruf",
"withdrawn": "zurückgezogen",
"To link to a room it must have": "Um einen Raum zu verlinken, benötigt er",
"were": "wurden",
"en": "Englisch",
"pt-br": "Portugisisch (Brasilien)",
"de": "Deutsch",
"da": "Dänisch",
"ru": "Russisch",
"Drop here %(toAction)s": "Hierher ziehen: %(toAction)s",
"Drop here to tag %(section)s": "Hierher ziehen: %(section)s taggen",
"to browse the directory": "um das Raum-Verzeichnis zu durchsuchen",
"to demote": "um die Priorität herabzusetzen",
"to favourite": "zum Favorisieren",
"to make a room or": "um einen Raum zu erstellen, oder",
"to restore": "zum wiederherstellen",
"to start a chat with someone": "um einen Chat mit jemandem zu starten",
"to tag direct chat": "als Direkt-Chat markieren",
"You're not in any rooms yet! Press": "Du bist noch keinem Raum beigetreten! Drücke",
"click to reveal": "anzeigen",
"You are trying to access %(roomName)s.": "Du versuchst, auf den Raum \"%(roomName)s\" zuzugreifen.",
"Monday": "Montag",
"Tuesday": "Dienstag",
"Wednesday": "Mittwoch",
"Thursday": "Donnerstag",
"Friday": "Freitag",
"Saturday": "Samstag",
"Sunday": "Sonntag",
"Failed to forget room %(errCode)s": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Eine Textnachricht wurde an +%(msisdn)s gesendet. Bitte den darin enthaltenen Verifizierungscode eingeben",
"and %(count)s others...|other": "und %(count)s weitere...",
@ -422,7 +331,6 @@
"Are you sure?": "Bist du sicher?",
"Attachment": "Anhang",
"Ban": "Verbannen",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Verbindungsaufbau zum Heimserver nicht möglich - bitte Internetverbindung überprüfen und sicherstellen, ob das <a>SSL-Zertifikat des Heimservers</a> vertrauenswürdig ist.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Es kann keine Verbindung zum Heimserver via HTTP aufgebaut werden, wenn die Adresszeile des Browsers eine HTTPS-URL enthält. Entweder HTTPS verwenden oder alternativ <a>unsichere Skripte erlauben</a>.",
"Click to mute audio": "Klicke um den Ton stumm zu stellen",
"Click to mute video": "Klicken, um das Video stummzuschalten",
@ -436,7 +344,7 @@
"Enter Code": "Code eingeben",
"Failed to ban user": "Verbannen des Benutzers fehlgeschlagen",
"Failed to change power level": "Ändern des Berechtigungslevels fehlgeschlagen",
"Failed to delete device": "Löschen des Geräts fehlgeschlagen",
"Failed to delete device": "Entfernen des Geräts fehlgeschlagen",
"Failed to join room": "Betreten des Raumes ist fehlgeschlagen",
"Failed to kick": "Kicken fehlgeschlagen",
"Failed to mute user": "Stummschalten des Nutzers fehlgeschlagen",
@ -452,7 +360,6 @@
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' ist kein gültiges Alias-Format",
"Join Room": "Dem Raum beitreten",
"Kick": "Kicken",
"Level": "Berechtigungslevel",
"Local addresses for this room:": "Lokale Adressen dieses Raumes:",
"Markdown is disabled": "Markdown ist deaktiviert",
"Markdown is enabled": "Markdown ist aktiviert",
@ -473,23 +380,19 @@
"Server unavailable, overloaded, or something else went wrong.": "Server ist nicht verfügbar, überlastet oder ein anderer Fehler ist aufgetreten.",
"Some of your messages have not been sent.": "Einige deiner Nachrichten wurden nicht gesendet.",
"Submit": "Absenden",
"The main address for this room is: %(canonical_alias_section)s": "Die Hauptadresse für diesen Raum ist: %(canonical_alias_section)s",
"%(actionVerb)s this person?": "Diese Person %(actionVerb)s?",
"This room has no local addresses": "Dieser Raum hat keine lokale Adresse",
"This room is private or inaccessible to guests. You may be able to join if you register": "Dieser Raum ist privat oder für Gäste nicht zugänglich. Du kannst jedoch eventuell beitreten, wenn du dich registrierst",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden. Dir fehlt jedoch die Berechtigung, die betreffende Nachricht zu sehen.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden, der Punkt konnte jedoch nicht gefunden werden.",
"Turn Markdown off": "Markdown deaktiveren",
"Turn Markdown on": "Markdown aktivieren",
"Unable to load device list": "Geräteliste konnte nicht geladen werden",
"Unknown room %(roomId)s": "Unbekannter Raum %(roomId)s",
"Usage: /markdown on|off": "Verwendung: /markdown on|off",
"You seem to be in a call, are you sure you want to quit?": "Du scheinst in einem Anruf zu sein. Bist du sicher schließen zu wollen?",
"You seem to be uploading files, are you sure you want to quit?": "Du scheinst Dateien hochzuladen. Bist du sicher schließen zu wollen?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du wirst diese Änderung nicht rückgängig machen können, da der Nutzer dasselbe Berechtigungslevel wie du selbst erhalten wird.",
"Make Moderator": "Zum Moderator ernennen",
"Room": "Raum",
"(~%(searchCount)s results)": "(~%(searchCount)s Ergebnisse)",
"Cancel": "Abbrechen",
"bold": "Fett",
"italic": "Kursiv",
@ -507,7 +410,6 @@
"Autoplay GIFs and videos": "GIF-Dateien und Videos automatisch abspielen",
"Don't send typing notifications": "Schreibbenachrichtigungen unterdrücken",
"Hide read receipts": "Lesebestätigungen verbergen",
"Never send encrypted messages to unverified devices in this room": "In diesem Raum keine verschlüsselten Nachrichten an unverifizierte Geräte senden",
"numbullet": "Nummerierung",
"%(items)s and %(remaining)s others": "%(items)s und %(remaining)s weitere",
"%(items)s and one other": "%(items)s und ein(e) weitere(r)",
@ -527,10 +429,9 @@
"%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)shaben den Raum verlassen und %(repeats)s mal neu betreten",
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal verlassen und wieder neu betreten",
"%(severalUsers)sleft and rejoined": "%(severalUsers)shaben den Raum verlassen und wieder neu betreten",
"%(oneUser)sleft left and rejoined": "%(oneUser)sging und trat erneut bei",
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)shaben ihre Einladung %(repeats)s-mal abgelehnt",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt",
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt",
"%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladungen abgelehnt",
"%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung abgelehnt",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)swurden die ursprünglichen Einladungen %(repeats)s mal wieder entzogen",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)swurde die Einladung %(repeats)s mal wieder entzogen",
@ -594,7 +495,6 @@
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Die exportierte Datei ist mit einer Passphrase geschützt. Du kannst die Passphrase hier eingeben, um die Datei zu entschlüsseln.",
"You must join the room to see its files": "Du musst dem Raum beitreten, um die Raum-Dateien sehen zu können",
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s Einladungen ablehnen",
"Start new Chat": "Starte neuen Chat",
"Failed to invite": "Einladen fehlgeschlagen",
"Failed to invite user": "Einladen des Nutzers ist fehlgeschlagen",
"Confirm Removal": "Entfernen bestätigen",
@ -696,7 +596,6 @@
"Camera": "Kamera",
"Device already verified!": "Gerät bereits verifiziert!",
"Export": "Export",
"Failed to register as guest:": "Die Registrierung als Gast ist fehlgeschlagen:",
"Guest access is disabled on this Home Server.": "Gastzugang ist auf diesem Heimserver deaktivert.",
"Import": "Importieren",
"Incorrect username and/or password.": "Inkorrekter Nutzername und/oder Passwort.",
@ -715,7 +614,6 @@
"Password:": "Passwort:",
"Register": "Registrieren",
"Save": "Speichern",
"Setting a user name will create a fresh account": "Die Eingabe eines Benutzernamens wird ein neues Konto erzeugen",
"Tagged as: ": "Markiert als: ",
"This Home Server does not support login using email address.": "Dieser Heimserver unterstützt den Login mittels E-Mail-Adresse nicht.",
"Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:",
@ -738,7 +636,6 @@
"Error: Problem communicating with the given homeserver.": "Fehler: Problem bei der Kommunikation mit dem angegebenen Home-Server.",
"Failed to fetch avatar URL": "Abrufen der Avatar-URL fehlgeschlagen",
"The phone number entered looks invalid": "Die eingegebene Telefonnummer scheint ungültig zu sein",
"This room is private or inaccessible to guests. You may be able to join if you register.": "Dieser Raum ist privat oder für Gäste nicht betretbar. Du kannst evtl. beitreten wenn du dich registrierst.",
"Uploading %(filename)s and %(count)s others|zero": "%(filename)s wird hochgeladen",
"Uploading %(filename)s and %(count)s others|one": "%(filename)s und %(count)s weitere Dateien werden hochgeladen",
"Uploading %(filename)s and %(count)s others|other": "%(filename)s und %(count)s weitere Dateien werden hochgeladen",
@ -764,7 +661,6 @@
"Accept": "Akzeptieren",
"Active call (%(roomName)s)": "Aktiver Anruf (%(roomName)s)",
"Admin Tools": "Admin-Werkzeuge",
"And %(count)s more...": "Und %(count)s weitere...",
"Alias (optional)": "Alias (optional)",
"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.": "Verbindung zum Heimserver fehlgeschlagen - bitte überprüfe die Internetverbindung und stelle sicher, dass dem <a>SSL-Zertifikat deines Heimservers</a> vertraut wird und dass Anfragen nicht durch eine Browser-Erweiterung blockiert werden.",
"<a>Click here</a> to join the discussion!": "<a>Hier klicken</a>, um an der Diskussion teilzunehmen!",
@ -794,7 +690,6 @@
"%(roomName)s is not accessible at this time.": "%(roomName)s ist aktuell nicht zugreifbar.",
"Seen by %(userName)s at %(dateTime)s": "Gesehen von %(userName)s um %(dateTime)s",
"Send anyway": "Trotzdem senden",
"Set": "Setze",
"Start authentication": "Authentifizierung beginnen",
"Show Text Formatting Toolbar": "Text-Formatierungs-Werkzeugleiste anzeigen",
"This invitation was sent to an email address which is not associated with this account:": "Diese Einladung wurde an eine E-Mail-Adresse gesendet, die nicht mit diesem Benutzerkonto verknüpft ist:",
@ -849,7 +744,6 @@
"Hide Apps": "Apps verbergen",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Betreten-/Verlassen-Benachrichtigungen verbergen (gilt nicht für Einladungen/Kicks/Bans)",
"Hide avatar and display name changes": "Profilbild- und Anzeigenamen-Änderungen verbergen",
"Matrix Apps": "Matrix-Apps",
"Revoke widget access": "Ziehe Widget-Zugriff zurück",
"Sets the room topic": "Setzt das Raum-Thema",
"Show Apps": "Apps anzeigen",
@ -860,30 +754,14 @@
"You do not have permission to do that in this room.": "Du hast keine Berechtigung, dies in diesem Raum zu tun.",
"Verifies a user, device, and pubkey tuple": "Verifiziert ein Tupel aus Nutzer, Gerät und öffentlichem Schlüssel",
"Autocomplete Delay (ms):": "Verzögerung bei Autovervollständigung (ms):",
"This Home server does not support groups": "Dieser Heimserver unterstützt keine Gruppen",
"Loading device info...": "Lädt Geräte-Info...",
"Groups": "Gruppen",
"Create a new group": "Erstelle eine neue Gruppe",
"Create Group": "Erstelle Gruppe",
"Group Name": "Gruppenname",
"Example": "Beispiel",
"Create": "Erstelle",
"Group ID": "Gruppen-ID",
"+example:%(domain)s": "+beispiel:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Gruppen-IDs müssen von der Form '+lokalteil:%(domain)s' sein",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Es ist aktuell nur möglich, Gruppen auf deinem eigenen Heimserver zu erstellen. Nutze eine Gruppen-ID, die mit %(domain)s endet",
"Room creation failed": "Raum-Erstellung fehlgeschlagen",
"You are a member of these groups:": "Du bist Mitglied in folgenden Gruppen:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Gruppe um deine Community darzustellen! Definiere eine Menge von Räumen und deine eigene angepasste Startseite um deinen Bereich im Matrix-Universum zu markieren.",
"Join an existing group": "Trete eine existierenden Gruppe bei",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Um einer bereits vorhandenen Gruppe beitreten zu können, muss dir die Gruppen-Kennung bekannt sein. Diese sieht aus wie <i>+example:matrix.org</i>.",
"Featured Rooms:": "Hervorgehobene Räume:",
"Error whilst fetching joined groups": "Fehler beim Laden beigetretener Gruppen",
"Featured Users:": "Hervorgehobene Nutzer:",
"Edit Group": "Gruppe bearbeiten",
"Automatically replace plain text Emoji": "Klartext-Emoji automatisch ersetzen",
"Failed to upload image": "Bild-Hochladen fehlgeschlagen",
"Failed to update group": "Aktualisieren der Gruppe fehlgeschlagen",
"Hide avatars in user and room mentions": "Profilbilder in Benutzer- und Raum-Erwähnungen verbergen",
"AM": "a. m.",
"PM": "p. m.",
@ -896,8 +774,88 @@
"%(widgetName)s widget removed by %(senderName)s": "Widget \"%(widgetName)s\" von %(senderName)s entfernt",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen <a>Webbrowser</a> verwenden",
"%(widgetName)s widget modified by %(senderName)s": "Das Widget '%(widgetName)s' wurde von %(senderName)s bearbeitet",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s",
"Copied!": "Kopiert!",
"Failed to copy": "Kopieren fehlgeschlagen"
"Failed to copy": "Kopieren fehlgeschlagen",
"Ignored Users": "Ignorierte Benutzer",
"Ignore": "Ignorieren",
"You are now ignoring %(userId)s": "Du ignorierst jetzt %(userId)s",
"You are no longer ignoring %(userId)s": "%(userId)s wird nicht mehr ignoriert",
"Message removed by %(userId)s": "Nachricht wurde von %(userId)s entfernt",
"Name or matrix ID": "Name oder Matrix-ID",
"Unable to leave room": "Verlassen des Raumes fehlgeschlagen",
"Leave": "Verlassen",
"Failed to invite the following users to %(groupId)s:": "Die folgenden Benutzer konnten nicht in die Gruppe %(groupId)s eingeladen werden:",
"Leave %(groupName)s?": "%(groupName)s verlassen?",
"Add a Room": "Raum hinzufügen",
"Add a User": "Benutzer hinzufügen",
"Light theme": "Helles Thema",
"Dark theme": "Dunkles Thema",
"You have entered an invalid address.": "Du hast eine ungültige Adresse eingegeben.",
"Matrix ID": "Matrix-ID",
"Advanced options": "Erweiterte Optionen",
"Block users on other matrix homeservers from joining this room": "Blockiere Nutzer anderer Matrix-Heimserver die diesen Raum betreten wollen",
"This setting cannot be changed later!": "Diese Einstellung kann nachträglich nicht mehr geändert werden!",
"Unignore": "Entignorieren",
"User Options": "Benutzer-Optionen",
"Unignored user": "Benutzer entignoriert",
"Ignored user": "Benutzer ignoriert",
"Stops ignoring a user, showing their messages going forward": "Beendet das Ignorieren eines Benutzers, nachfolgende Nachrichten werden wieder angezeigt",
"Ignores a user, hiding their messages from you": "Ignoriert einen Benutzer und verbirgt dessen Nachrichten",
"Disable Emoji suggestions while typing": "Emoji-Vorschläge während des Schreibens deaktivieren",
"Banned by %(displayName)s": "Gebannt von %(displayName)s",
"To send messages, you must be a": "Um Nachrichten zu senden musst du sein ein",
"To invite users into the room, you must be a": "Notwendiges Berechtigungslevel, um Benutzer in diesen Raum einladen zu können:",
"To configure the room, you must be a": "Notwendiges Berechtigungslevel, um diesen Raum konfigurieren:",
"To kick users, you must be a": "Notwendiges Berechtigungslevel, um Benutzer zu kicken:",
"To ban users, you must be a": "Notwendiges Berechtigungslevel, um einen Benutzer zu verbannen:",
"To remove other users' messages, you must be a": "Um Nachrichten von Benutzern zu löschen, musst du sein ein",
"To send events of type <eventType/>, you must be a": "Um Ereignisse desTyps <eventType/> zu senden, musst du sein ein",
"To change the room's avatar, you must be a": "Um das Raumbild zu ändern, musst du sein ein",
"To change the room's name, you must be a": "Um den Raumnamen zu ändern, musst du sein ein",
"To change the room's main address, you must be a": "Um die Hauptadresse des Raumes zu ändern, musst du sein ein",
"To change the room's history visibility, you must be a": "Um die Sichtbarkeit des bisherigen Chatverlaufs zu ändern, musst du sein ein",
"To change the permissions in the room, you must be a": "Um Berechtigungen in diesem Raum zu ändern, musst du sein ein",
"To change the topic, you must be a": "Um das Thema zu ändern, musst du sein ein",
"To modify widgets in the room, you must be a": "Um Widgets in dem Raum zu ändern, musst du sein ein",
"Description": "Beschreibung",
"Unable to accept invite": "Einladung kann nicht akzeptiert werden",
"Failed to invite users to %(groupId)s": "Benutzer konnten nicht in %(groupId)s eingeladen werden",
"Unable to reject invite": "Einladung konnte nicht abgelehnt werden",
"Who would you like to add to this summary?": "Wen möchtest zu dieser Übersicht hinzufügen?",
"Add to summary": "Zur Übersicht hinzufügen",
"Failed to add the following users to the summary of %(groupId)s:": "Die folgenden Benutzer konnten nicht zur Übersicht von %(groupId)s hinzugefügt werden:",
"Which rooms would you like to add to this summary?": "Welche Räume möchtest du zu dieser Übersicht hinzufügen?",
"Room name or alias": "Raum-Name oder Alias",
"Failed to add the following rooms to the summary of %(groupId)s:": "Folgende Räume konnten nicht zur Übersicht von %(groupId)s hinzugefügt werden:",
"Failed to remove the room from the summary of %(groupId)s": "Raum konnte nicht aus der Übersicht von %(groupId)s entfernt werden",
"The room '%(roomName)s' could not be removed from the summary.": "Der Raum '%(roomName)s' konnte nicht aus der Übersicht entfernt werden.",
"Failed to remove a user from the summary of %(groupId)s": "Benutzer konnte nicht aus der Übersicht von %(groupId)s entfernt werden",
"The user '%(displayName)s' could not be removed from the summary.": "Der Benutzer '%(displayName)s' konnte nicht aus der Übersicht entfernt werden.",
"Unknown": "Unbekannt",
"Failed to add the following rooms to %(groupId)s:": "Die folgenden Räume konnten %(groupId)s nicht hinzugefügt werden:",
"Matrix Room ID": "Matrix-Raum-ID",
"email address": "E-Mail-Adresse",
"Try using one of the following valid address types: %(validTypesList)s.": "Versuche eine der folgenden validen Adresstypen zu benutzen: %(validTypesList)s.",
"Failed to remove '%(roomName)s' from %(groupId)s": "Entfernen von '%(roomName)s' aus %(groupId)s fehlgeschlagen",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Bist du sicher, dass du '%(roomName)s' aus '%(groupId)s' entfernen möchtest?",
"Invites sent": "Einladungen gesendet",
"Remove avatar": "Profilbild entfernen",
"Disable big emoji in chat": "Große Emojis im Chat deaktiveren",
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Sonst ist hier niemand! Möchtest Du <a>Benutzer einladen</a> oder die <a>Warnungen über den leeren Raum deaktivieren</a>?",
"Pinned Messages": "Angeheftete Nachrichten",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.",
"Jump to read receipt": "Zur Lesebestätigung springen",
"Message Pinning": "Nachricht-Anheftung",
"Publish this community on your profile": "Diese Community in deinem Profil veröffentlichen",
"Long Description (HTML)": "Lange Beschreibung (HTML)",
"Jump to message": "Zur Nachricht springen",
"No pinned messages.": "Keine angehefteten Nachrichten.",
"Loading...": "Lade...",
"Unpin Message": "Nachricht losheften",
"Unnamed room": "Unbenannter Raum",
"World readable": "Lesbar für die Welt",
"Guests can join": "Gäste können beitreten",
"No rooms to show": "Keine Räume anzuzeigen",
"Community Settings": "Community-Einstellungen",
"Community Member Settings": "Community-Mitglieder-Einstellungen"
}

View file

@ -8,8 +8,6 @@
"Search": "Αναζήτηση",
"Settings": "Ρυθμίσεις",
"unknown error code": "άγνωστος κωδικός σφάλματος",
"Sunday": "Κυριακή",
"accept": "αποδοχή",
"%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.",
"Account": "Λογαριασμός",
@ -27,7 +25,6 @@
"Algorithm": "Αλγόριθμος",
"Hide removed messages": "Απόκρυψη διαγραμμένων μηνυμάτων",
"Authentication": "Πιστοποίηση",
"and": "και",
"An email has been sent to": "Ένα email στάλθηκε σε",
"A new password must be entered.": "Ο νέος κωδικός πρόσβασης πρέπει να εισαχθεί.",
"%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε την κλήση.",
@ -46,14 +43,12 @@
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει",
"Access Token:": "Κωδικός πρόσβασης:",
"Always show message timestamps": "Εμφάνιση πάντα της ένδειξης ώρας στα μηνύματα",
"an address": "μία διεύθηνση",
"%(items)s and %(remaining)s others": "%(items)s και %(remaining)s ακόμα",
"%(items)s and one other": "%(items)s και ένας ακόμα",
"and %(count)s others...|one": "και ένας ακόμα...",
"and %(count)s others...|other": "και %(count)s άλλοι...",
"%(names)s and %(lastPerson)s are typing": "%(names)s και %(lastPerson)s γράφουν",
"%(names)s and one other are typing": "%(names)s και ένας ακόμα γράφουν",
"%(names)s and %(count)s others are typing": "%(names)s και %(count)s άλλοι γράφουν",
"Anyone who knows the room's link, including guests": "Οποιοσδήποτε γνωρίζει τον σύνδεσμο του δωματίου, συμπεριλαμβανομένων των επισκεπτών",
"Blacklisted": "Στη μαύρη λίστα",
"Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη",
@ -67,7 +62,6 @@
"Bans user with given id": "Αποκλεισμός χρήστη με το συγκεκριμένο αναγνωριστικό",
"%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.",
"Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη",
"Click here": "Κάνε κλικ εδώ",
"Drop here %(toAction)s": "Αποθέστε εδώ %(toAction)s",
"Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.",
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
@ -83,7 +77,6 @@
"/ddg is not a command": "/ddg δεν αναγνωρίζεται ως εντολή",
"Deactivate Account": "Απενεργοποίηση λογαριασμού",
"Deactivate my account": "Απενεργοποίηση του λογαριασμού μου",
"decline": "απόρριψη",
"Decrypt %(text)s": "Αποκρυπτογράφηση %(text)s",
"Decryption error": "Σφάλμα αποκρυπτογράφησης",
"Delete": "Διαγραφή",
@ -120,14 +113,12 @@
"Failed to join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Failed to leave room": "Δεν ήταν δυνατή η αποχώρηση από το δωμάτιο",
"Failed to mute user": "Δεν ήταν δυνατή η σίγαση του χρήστη",
"Failed to register as guest:": "Δεν ήταν δυνατή η εγγραφή ως επισκέπτης:",
"Failed to reject invite": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων",
"Failed to send email": "Δεν ήταν δυνατή η αποστολή ηλ. αλληλογραφίας",
"Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επιβεβαίωση του μηνύματος ηλεκτρονικής αλληλογραφίας βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε",
"Favourite": "Αγαπημένο",
"favourite": "αγαπημένο",
"Favourites": "Αγαπημένα",
"Fill screen": "Γέμισε την οθόνη",
"Filter room members": "Φιλτράρισμα μελών",
@ -136,7 +127,6 @@
"For security, this session has been signed out. Please sign in again.": "Για λόγους ασφαλείας, αυτή η συνεδρία έχει τερματιστεί. Παρακαλούμε συνδεθείτε ξανά.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Για λόγους ασφαλείας, τα κλειδιά κρυπτογράφησης θα διαγράφονται από τον περιηγητή κατά την αποσύνδεση σας. Εάν επιθυμείτε να αποκρυπτογραφήσετε τις συνομιλίες σας στο μέλλον, εξάγετε τα κλειδιά σας και κρατήστε τα ασφαλή.",
"Found a bug?": "Βρήκατε κάποιο πρόβλημα;",
"had": "είχε",
"Hangup": "Κλείσιμο",
"Historical": "Ιστορικό",
"Homeserver is": "Ο διακομιστής είναι",
@ -151,11 +141,8 @@
"Invite new room members": "Προσκαλέστε νέα μέλη",
"Invited": "Προσκλήθηκε",
"Invites": "Προσκλήσεις",
"is a": "είναι ένα",
"%(displayName)s is typing": "Ο χρήστης %(displayName)s γράφει",
"Sign in with": "Συνδεθείτε με",
"joined and left": "συνδέθηκε και έφυγε",
"joined": "συνδέθηκε",
"%(targetName)s joined the room.": "ο %(targetName)s συνδέθηκε στο δωμάτιο.",
"Jump to first unread message.": "Πηγαίνετε στο πρώτο μη αναγνωσμένο μήνυμα.",
"%(senderName)s kicked %(targetName)s.": "Ο %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
@ -163,10 +150,7 @@
"Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id",
"Labs": "Πειραματικά",
"Leave room": "Αποχώρηση από το δωμάτιο",
"left and rejoined": "έφυγε και ξανασυνδέθηκε",
"left": "έφυγε",
"%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.",
"Level": "Επίπεδο",
"Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:",
"Logged in as:": "Συνδεθήκατε ως:",
"Login as guest": "Σύνδεση ως επισκέπτης",
@ -229,16 +213,8 @@
"Success": "Επιτυχία",
"Start Chat": "Συνομιλία",
"Cancel": "Ακύρωση",
"cancel all": "ακύρωση όλων",
"or": "ή",
"Custom Server Options": "Προσαρμοσμένες ρυθμίσεις διακομιστή",
"Dismiss": "Απόρριψη",
"Monday": "Δευτέρα",
"Tuesday": "Τρίτη",
"Wednesday": "Τετάρτη",
"Thursday": "Πέμπτη",
"Friday": "Παρασκευή",
"Saturday": "Σάββατο",
"bold": "έντονα",
"italic": "πλάγια",
"underline": "υπογράμμιση",
@ -260,7 +236,6 @@
"Active call (%(roomName)s)": "Ενεργή κλήση (%(roomName)s)",
"Add": "Προσθήκη",
"Admin Tools": "Εργαλεία διαχειριστή",
"And %(count)s more...": "Και %(count)s περισσότερα...",
"No media permissions": "Χωρίς δικαιώματα πολυμέσων",
"Alias (optional)": "Ψευδώνυμο (προαιρετικό)",
"Ban": "Αποκλεισμός",
@ -306,15 +281,12 @@
"Reason": "Αιτία",
"Reason: %(reasonText)s": "Αιτία: %(reasonText)s",
"Revoke Moderator": "Ανάκληση συντονιστή",
"Registration required": "Απαιτείται εγγραφή",
"rejected": "απορρίφθηκε",
"%(targetName)s rejected the invitation.": "Ο %(targetName)s απέρριψε την πρόσκληση.",
"Reject invitation": "Απόρριψη πρόσκλησης",
"Remote addresses for this room:": "Απομακρυσμένες διευθύνσεις για το δωμάτιο:",
"Remove Contact Information?": "Αφαίρεση πληροφοριών επαφής;",
"Remove %(threePid)s?": "Αφαίρεση %(threePid)s;",
"Report it": "Αναφορά",
"restore": "επαναφορά",
"Results from DuckDuckGo": "Αποτελέσματα από DuckDuckGo",
"Return to app": "Επιστροφή στην εφαρμογή",
"Return to login screen": "Επιστροφή στην οθόνη σύνδεσης",
@ -329,7 +301,6 @@
"Server may be unavailable or overloaded": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος ή υπερφορτωμένος",
"Session ID": "Αναγνωριστικό συνεδρίας",
"%(senderName)s set a profile picture.": "Ο %(senderName)s όρισε τη φωτογραφία του προφίλ του.",
"Set": "Ορισμός",
"Start authentication": "Έναρξη πιστοποίησης",
"Submit": "Υποβολή",
"Tagged as: ": "Με ετικέτα: ",
@ -342,8 +313,6 @@
"This phone number is already in use": "Αυτός ο αριθμός τηλεφώνου είναι ήδη σε χρήση",
"This room": "Αυτό το δωμάτιο",
"This room's internal ID is": "Το εσωτερικό αναγνωριστικό του δωματίου είναι",
"times": "φορές",
"to browse the directory": "για περιήγηση στο ευρετήριο",
"to restore": "για επαναφορά",
"Turn Markdown off": "Απενεργοποίηση Markdown",
"Turn Markdown on": "Ενεργοποίηση Markdown",
@ -385,7 +354,6 @@
"Who would you like to communicate with?": "Με ποιον θα θέλατε να επικοινωνήσετε;",
"You are already in a call.": "Είστε ήδη σε μια κλήση.",
"You have no visible notifications": "Δεν έχετε ορατές ειδοποιήσεις",
"you must be a": "πρέπει να είστε",
"You must <a>register</a> to use this functionality": "Πρέπει να <a>εγγραφείτε</a> για να χρησιμοποιήσετε αυτή την λειτουργία",
"You need to be logged in.": "Πρέπει να είστε συνδεδεμένος.",
"You need to enter a user name.": "Πρέπει να εισάγετε ένα όνομα χρήστη.",
@ -533,7 +501,6 @@
"Mobile phone number (optional)": "Αριθμός κινητού τηλεφώνου (προαιρετικό)",
"Must be viewing a room": "Πρέπει να βλέπετε ένα δωμάτιο",
"Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή",
"Never send encrypted messages to unverified devices in this room": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές σε αυτό το δωμάτιο",
"Never send encrypted messages to unverified devices in this room from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές, σε αυτό το δωμάτιο, από αυτή τη συσκευή",
"not set": "δεν έχει οριστεί",
"not specified": "μη καθορισμένο",
@ -567,8 +534,6 @@
"Some of your messages have not been sent.": "Μερικά από τα μηνύματα σας δεν έχουν αποσταλεί.",
"This room is not recognised.": "Αυτό το δωμάτιο δεν αναγνωρίζεται.",
"to favourite": "στα αγαπημένα",
"to make a room or": "για δημιουργία ενός δωματίου ή",
"to start a chat with someone": "για να ξεκινήσετε μια συνομιλία με κάποιον",
"Unable to capture screen": "Αδυναμία σύλληψης οθόνης",
"Unknown (user, device) pair:": "Άγνωστο ζεύγος (χρήστη, συσκευής):",
"Uploading %(filename)s and %(count)s others|zero": "Γίνεται αποστολή του %(filename)s",
@ -589,7 +554,6 @@
"Who can read history?": "Ποιος μπορεί να διαβάσει το ιστορικό;",
"Who would you like to add to this room?": "Ποιον θέλετε να προσθέσετε σε αυτό το δωμάτιο;",
"%(senderName)s withdrew %(targetName)s's invitation.": "Ο %(senderName)s ανακάλεσε την πρόσκληση του %(targetName)s.",
"You're not in any rooms yet! Press": "Δεν είστε ακόμη σε κάνενα δωμάτιο! Πατήστε",
"You cannot place a call with yourself.": "Δεν μπορείτε να καλέσετε τον ευατό σας.",
"You cannot place VoIP calls in this browser.": "Δεν μπορείτε να πραγματοποιήσετε κλήσεις VoIP με αυτόν τον περιηγητή.",
"You do not have permission to post to this room": "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτό το δωμάτιο",
@ -653,7 +617,6 @@
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Ο %(senderName)s έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.",
"%(senderName)s set their display name to %(displayName)s.": "Ο %(senderName)s όρισε το όνομα του σε %(displayName)s.",
"Sorry, this homeserver is using a login which is not recognised ": "Συγγνώμη, ο διακομιστής χρησιμοποιεί έναν τρόπο σύνδεσης που δεν αναγνωρίζεται ",
"tag direct chat": "προσθήκη ετικέτας στην απευθείας συνομιλία",
"The phone number entered looks invalid": "Ο αριθμός που καταχωρίσατε δεν είναι έγκυρος",
"The email address linked to your account must be entered.": "Πρέπει να εισηχθεί η διεύθυνση ηλ. αλληλογραφίας που είναι συνδεδεμένη με τον λογαριασμό σας.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Το αρχείο '%(fileName)s' υπερβαίνει το όριο μεγέθους του διακομιστή για αποστολές",
@ -697,13 +660,11 @@
"You must join the room to see its files": "Πρέπει να συνδεθείτε στο δωμάτιο για να δείτε τα αρχεία του",
"Reject all %(invitedRooms)s invites": "Απόρριψη όλων των προσκλήσεων %(invitedRooms)s",
"Failed to invite the following users to the %(roomName)s room:": "Δεν ήταν δυνατή η πρόσκληση των χρηστών στο δωμάτιο %(roomName)s:",
"demote": "υποβίβαση",
"Deops user with given id": "Deop χρήστη με το συγκεκριμένο αναγνωριστικό",
"Disable inline URL previews by default": "Απενεργοποίηση προεπισκόπησης συνδέσμων από προεπιλογή",
"Drop here to tag %(section)s": "Απόθεση εδώ για ορισμό ετικέτας στο %(section)s",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Συμμετάσχετε με <voiceText>φωνή</voiceText> ή <videoText>βίντεο</videoText>.",
"Joins room with given alias": "Συνδέεστε στο δωμάτιο με δοσμένο ψευδώνυμο",
"Setting a user name will create a fresh account": "Ορίζοντας ένα όνομα χρήστη θα δημιουργήσει ένα νέο λογαριασμό",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Εμφάνιση χρονικών σημάνσεων σε 12ωρη μορφή ώρας (π.χ. 2:30 μ.μ.)",
"since the point in time of selecting this option": "από το χρονικό σημείο επιλογής αυτής της ρύθμισης",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Το κλειδί υπογραφής που δώσατε αντιστοιχεί στο κλειδί υπογραφής που λάβατε από τη συσκευή %(userId)s %(deviceId)s. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.",
@ -717,7 +678,6 @@
"This allows you to use this app with an existing Matrix account on a different home server.": "Αυτό σας επιτρέπει να χρησιμοποιήσετε την εφαρμογή με έναν υπάρχον λογαριασμό Matrix σε έναν διαφορετικό διακομιστή.",
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Μπορείτε επίσης να ορίσετε έναν προσαρμοσμένο διακομιστή ταυτοποίησης, αλλά αυτό συνήθως θα αποτρέψει την αλληλεπίδραση με τους χρήστες που βασίζονται στην ηλεκτρονική διεύθυνση αλληλογραφίας.",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "Η προεπισκόπηση συνδέσμων είναι %(globalDisableUrlPreview)s από προεπιλογή για τους συμμετέχοντες του δωματίου.",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Κλήση συνδιάσκεψης σε εξέλιξη %(supportedText)s. %(joinText)s",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Αυτό θα είναι το όνομα του λογαριασμού σας στον διακομιστή <span></span>, ή μπορείτε να επιλέξετε <a>διαφορετικό διακομιστή</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Αν έχετε ήδη λογαριασμό Matrix μπορείτε να <a>συνδεθείτε</a>.",
"Failed to load timeline position": "Δεν ήταν δυνατή η φόρτωση της θέσης του χρονολόγιου",

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,6 @@
"AM": "AM",
"PM": "PM",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains",
"accept": "accept",
"%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.",
"Account": "Account",
@ -26,8 +25,6 @@
"Hide removed messages": "Hide removed messages",
"Always show message timestamps": "Always show message timestamps",
"Authentication": "Authentication",
"an address": "an address",
"and": "and",
"%(items)s and %(remaining)s others": "%(items)s and %(remaining)s others",
"%(items)s and one other": "%(items)s and one other",
"%(items)s and %(lastItem)s": "%(items)s and %(lastItem)s",
@ -35,7 +32,6 @@
"and %(count)s others...|one": "and one other...",
"%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
"%(names)s and one other are typing": "%(names)s and one other are typing",
"%(names)s and %(count)s others are typing": "%(names)s and %(count)s others are typing",
"An email has been sent to": "An email has been sent to",
"A new password must be entered.": "A new password must be entered.",
"%(senderName)s answered the call.": "%(senderName)s answered the call.",
@ -57,7 +53,6 @@
"Bug Report": "Bug Report",
"Bulk Options": "Bulk Options",
"Call Timeout": "Call Timeout",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.",
"Can't load user settings": "Can't load user settings",
"Change Password": "Change Password",
@ -73,7 +68,6 @@
"Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key",
"Clear Cache and Reload": "Clear Cache and Reload",
"Clear Cache": "Clear Cache",
"Click here": "Click here",
"Click here to fix": "Click here to fix",
"Click to mute audio": "Click to mute audio",
"Click to mute video": "Click to mute video",
@ -99,11 +93,9 @@
"/ddg is not a command": "/ddg is not a command",
"Deactivate Account": "Deactivate Account",
"Deactivate my account": "Deactivate my account",
"decline": "decline",
"Decrypt %(text)s": "Decrypt %(text)s",
"Decryption error": "Decryption error",
"Delete": "Delete",
"demote": "demote",
"Deops user with given id": "Deops user with given id",
"Default": "Default",
"Delete widget": "Delete widget",
@ -156,7 +148,6 @@
"Failed to load timeline position": "Failed to load timeline position",
"Failed to lookup current room": "Failed to lookup current room",
"Failed to mute user": "Failed to mute user",
"Failed to register as guest:": "Failed to register as guest:",
"Failed to reject invite": "Failed to reject invite",
"Failed to reject invitation": "Failed to reject invitation",
"Failed to save settings": "Failed to save settings",
@ -171,7 +162,6 @@
"Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email",
"Failure to create room": "Failure to create room",
"Favourite": "Favorite",
"favourite": "favorite",
"Favourites": "Favorites",
"Fill screen": "Fill screen",
"Filter room members": "Filter room members",
@ -183,7 +173,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
"had": "had",
"Hangup": "Hangup",
"Hide Apps": "Hide Apps",
"Hide read receipts": "Hide read receipts",
@ -206,14 +195,11 @@
"Invited": "Invited",
"Invites": "Invites",
"Invites user with given id to current room": "Invites user with given id to current room",
"is a": "is a",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
"%(displayName)s is typing": "%(displayName)s is typing",
"Sign in with": "Sign in with",
"Join Room": "Join Room",
"joined and left": "joined and left",
"joined": "joined",
"%(targetName)s joined the room.": "%(targetName)s joined the room.",
"Joins room with given alias": "Joins room with given alias",
"Jump to first unread message.": "Jump to first unread message.",
@ -232,10 +218,7 @@
"Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward",
"Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you",
"Leave room": "Leave room",
"left and rejoined": "left and rejoined",
"left": "left",
"%(targetName)s left the room.": "%(targetName)s left the room.",
"Level": "Level",
"Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?",
"Local addresses for this room:": "Local addresses for this room:",
"Logged in as:": "Logged in as:",
@ -251,7 +234,6 @@
"Markdown is disabled": "Markdown is disabled",
"Markdown is enabled": "Markdown is enabled",
"matrix-react-sdk version:": "matrix-react-sdk version:",
"Matrix Apps": "Matrix Apps",
"Members only": "Members only",
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
"Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
@ -264,7 +246,6 @@
"Mute": "Mute",
"Name": "Name",
"Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
"Never send encrypted messages to unverified devices in this room": "Never send encrypted messages to unverified devices in this room",
"Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device",
"New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
"New password": "New password",
@ -304,7 +285,6 @@
"Revoke widget access": "Revoke widget access",
"Refer a friend to Riot:": "Refer a friend to Riot:",
"Register": "Register",
"rejected": "rejected",
"%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.",
"Reject invitation": "Reject invitation",
"Remote addresses for this room:": "Remote addresses for this room:",
@ -316,7 +296,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.",
"Report it": "Report it",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
"restore": "restore",
"Results from DuckDuckGo": "Results from DuckDuckGo",
"Return to app": "Return to app",
"Return to login screen": "Return to login screen",
@ -368,7 +347,6 @@
"Start Chat": "Start Chat",
"Submit": "Submit",
"Success": "Success",
"tag direct chat": "tag direct chat",
"Tagged as: ": "Tagged as: ",
"The default role for new room members is": "The default role for new room members is",
"The main address for this room is": "The main address for this room is",
@ -386,21 +364,14 @@
"These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways",
"The visibility of existing history will be unchanged": "The visibility of existing history will be unchanged",
"This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address",
"this invitation?": "this invitation?",
"This is a preview of this room. Room interactions have been disabled": "This is a preview of this room. Room interactions have been disabled",
"This phone number is already in use": "This phone number is already in use",
"This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
"This room's internal ID is": "This room's internal ID is",
"times": "times",
"to browse the directory": "to browse the directory",
"to demote": "to demote",
"to favourite": "to favorite",
"to join the discussion": "to join the discussion",
"To link to a room it must have": "To link to a room it must have",
"to make a room or": "to make a room or",
"To reset your password, enter the email address linked to your account": "To reset your password, enter the email address linked to your account",
"to restore": "to restore",
"to start a chat with someone": "to start a chat with someone",
"to tag direct chat": "to tag direct chat",
"To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
@ -459,9 +430,7 @@
"Who would you like to add to this room?": "Who would you like to add to this room?",
"Who would you like to communicate with?": "Who would you like to communicate with?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.",
"Would you like to": "Would you like to",
"You are already in a call.": "You are already in a call.",
"You're not in any rooms yet! Press": "You're not in any rooms yet! Press",
"You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.",
"You cannot place a call with yourself.": "You cannot place a call with yourself.",
"You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
@ -471,7 +440,6 @@
"You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.",
"You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.",
"You have no visible notifications": "You have no visible notifications",
"you must be a": "you must be a",
"You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
"You need to be logged in.": "You need to be logged in.",
"You need to enter a user name.": "You need to enter a user name.",
@ -525,20 +493,8 @@
"Room": "Room",
"Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
"Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
"Resend all": "Resend all",
"(~%(searchCount)s results)": "(~%(searchCount)s results)",
"Cancel": "Cancel",
"cancel all": "cancel all",
"or": "or",
"now. You can also select individual messages to resend or cancel.": "now. You can also select individual messages to resend or cancel.",
"Active call": "Active call",
"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Sunday": "Sunday",
"bold": "bold",
"italic": "italic",
"strike": "strike",
@ -713,7 +669,6 @@
"a room": "a room",
"Add": "Add",
"Admin Tools": "Admin tools",
"And %(count)s more...": "And %(count)s more...",
"Alias (optional)": "Alias (optional)",
"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.": "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.",
"<a>Click here</a> to join the discussion!": "<a>Click here</a> to join the discussion!",
@ -754,7 +709,6 @@
"%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
"Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
"Send anyway": "Send anyway",
"Set": "Set",
"Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
"Start authentication": "Start authentication",
"The phone number entered looks invalid": "The phone number entered looks invalid",
@ -831,38 +785,20 @@
"You are not in this room.": "You are not in this room.",
"You do not have permission to do that in this room.": "You do not have permission to do that in this room.",
"Autocomplete Delay (ms):": "Autocomplete Delay (ms):",
"This Home server does not support groups": "This Home server does not support groups",
"Loading device info...": "Loading device info...",
"Message removed by %(userId)s": "Message removed by %(userId)s",
"Groups": "Groups",
"Create a new group": "Create a new group",
"Create Group": "Create Group",
"Group Name": "Group Name",
"Example": "Example",
"Create": "Create",
"Group ID": "Group ID",
"+example:%(domain)s": "+example:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Group IDs must be of the form +localpart:%(domain)s",
"Room creation failed": "Room creation failed",
"Pinned Messages": "Pinned Messages",
"You are a member of these groups:": "You are a member of these groups:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.",
"Join an existing group": "Join an existing group",
"Featured Rooms:": "Featured Rooms:",
"Error whilst fetching joined groups": "Error while fetching joined groups",
"Featured Users:": "Featured Users:",
"Edit Group": "Edit Group",
"Automatically replace plain text Emoji": "Automatically replace plain text Emoji",
"Failed to upload image": "Failed to upload image",
"Failed to update group": "Failed to update group",
"Hide avatars in user and room mentions": "Hide avatars in user and room mentions",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot check is currently unavailable on desktop - please use a <a>web browser</a>",
"Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s"
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room."
}

View file

@ -1,6 +1,5 @@
{
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un mensaje de texto ha sido enviado a +%(msisdn)s. Por favor ingrese el código de verificación que lo contiene",
"accept": "Aceptar",
"%(targetName)s accepted an invitation.": "%(targetName)s ha aceptado una invitación.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha aceptado la invitación para %(displayName)s.",
"Account": "Cuenta",
@ -12,8 +11,6 @@
"Algorithm": "Algoritmo",
"Always show message timestamps": "Siempre mostrar la hora del mensaje",
"Authentication": "Autenticación",
"an address": "una dirección",
"and": "y",
"%(items)s and %(remaining)s others": "%(items)s y %(remaining)s otros",
"%(items)s and one other": "%(items)s y otro",
"%(items)s and %(lastItem)s": "%(items)s y %(lastItem)s",
@ -21,7 +18,6 @@
"and %(count)s others...|one": "y otro...",
"%(names)s and %(lastPerson)s are typing": "%(names)s y %(lastPerson)s están escribiendo",
"%(names)s and one other are typing": "%(names)s y otro están escribiendo",
"%(names)s and %(count)s others are typing": "%(names)s y %(count)s otros están escribiendo",
"An email has been sent to": "Un correo ha sido enviado a",
"A new password must be entered.": "Una nueva clave debe ser ingresada.",
"%(senderName)s answered the call.": "%(senderName)s atendió la llamada.",
@ -30,7 +26,6 @@
"Anyone who knows the room's link, including guests": "Cualquiera que sepa del enlace de la sala, incluyendo los invitados",
"Are you sure?": "¿Estás seguro?",
"Are you sure you want to reject the invitation?": "¿Estás seguro que quieres rechazar la invitación?",
"Are you sure you want upload the following files?": "¿Estás seguro que quieres subir los siguientes archivos?",
"Attachment": "Adjunto",
"Autoplay GIFs and videos": "Reproducir automáticamente GIFs y videos",
"%(senderName)s banned %(targetName)s.": "%(senderName)s ha bloqueado a %(targetName)s.",
@ -41,7 +36,6 @@
"Bug Report": "Reporte de fallo",
"Bulk Options": "Opciones masivas",
"Call Timeout": "Tiempo de espera de la llamada",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "No se puede conectar con el servidor - Por favor verifique su conexión y asegúrese de que su <a>certificado SSL del servidor</a> sea confiable.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "No se puede conectar al servidor via HTTP, cuando es necesario un enlace HTTPS en la barra de direcciones de tu navegador. Ya sea usando HTTPS o <a>habilitando los scripts inseguros</a>.",
"Can't load user settings": "No se puede cargar las configuraciones del usuario",
"Change Password": "Cambiar clave",
@ -56,7 +50,6 @@
"Claimed Ed25519 fingerprint key": "Clave Ed25519 es necesaria",
"Clear Cache and Reload": "Borrar caché y recargar",
"Clear Cache": "Borrar caché",
"Click here": "Haz clic aquí",
"Click here to fix": "Haz clic aquí para arreglar",
"Click to mute audio": "Haz clic para silenciar audio",
"Click to mute video": "Haz clic para silenciar video",
@ -81,11 +74,9 @@
"/ddg is not a command": "/ddg no es un comando",
"Deactivate Account": "Desactivar Cuenta",
"Deactivate my account": "Desactivar mi cuenta",
"decline": "rechazar",
"Decrypt %(text)s": "Descifrar %(text)s",
"Decryption error": "Error al decifrar",
"Delete": "Eliminar",
"demote": "degradar",
"Deops user with given id": "Deops usuario con ID dado",
"Default": "Por defecto",
"Device ID": "ID del dispositivo",
@ -142,7 +133,6 @@
"Failed to verify email address: make sure you clicked the link in the email": "Falló al verificar el correo electrónico: Asegúrese hacer clic en el enlace del correo",
"Failure to create room": "Fallo al crear la sala",
"Favourite": "Favorito",
"favourite": "favorito",
"Favourites": "Favoritos",
"Fill screen": "Llenar pantalla",
"Filter room members": "Filtrar los miembros de la sala",
@ -153,7 +143,6 @@
"Found a bug?": "¿Encontraste un error?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s",
"Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.",
"had": "tuvo",
"Hangup": "Colgar",
"Hide read receipts": "Ocultar mensajes leídos",
"Hide Text Formatting Toolbar": "Ocultar barra de herramientas de formato de texto",
@ -172,14 +161,11 @@
"Invite new room members": "Invitar nuevos miembros a la sala",
"Invites": "Invitar",
"Invites user with given id to current room": "Invitar a usuario con ID dado a esta sala",
"is a": "es un",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' no es un formato válido para una dirección",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' no es un formato válido para un alias",
"%(displayName)s is typing": "%(displayName)s está escribiendo",
"Sign in with": "Quiero iniciar sesión con",
"Join Room": "Unirte a la sala",
"joined and left": "unido y dejado",
"joined": "unido",
"%(targetName)s joined the room.": "%(targetName)s se ha unido a la sala.",
"Joins room with given alias": "Unirse a la sala con el alias dado",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s ha expulsado a %(targetName)s.",
@ -187,10 +173,7 @@
"Kicks user with given id": "Expulsar usuario con ID dado",
"Labs": "Laboratorios",
"Leave room": "Dejar sala",
"left and rejoined": "dejado y reunido",
"left": "dejado",
"%(targetName)s left the room.": "%(targetName)s ha dejado la sala.",
"Level": "Nivel",
"Local addresses for this room:": "Direcciones locales para esta sala:",
"Logged in as:": "Sesión iniciada como:",
"Login as guest": "Iniciar sesión como invitado",
@ -232,7 +215,6 @@
"Error: Problem communicating with the given homeserver.": "Error: No es posible comunicar con el servidor indicado.",
"Export": "Exportar",
"Failed to fetch avatar URL": "Fallo al obtener la URL del avatar",
"Failed to register as guest:": "Fallo al registrarse como invitado:",
"Failed to upload profile picture!": "¡Fallo al enviar la foto de perfil!",
"Home": "Inicio",
"Import": "Importar",
@ -330,7 +312,6 @@
"Session ID": "ID de sesión",
"%(senderName)s set a profile picture.": "%(senderName)s puso una foto de perfil.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s cambió su nombre a %(displayName)s.",
"Set": "Configurar",
"Settings": "Configuración",
"Show panel": "Mostrar panel",
"Show Text Formatting Toolbar": "Mostrar la barra de formato de texto",
@ -348,7 +329,6 @@
"Start Chat": "Comenzar la conversación",
"Submit": "Enviar",
"Success": "Éxito",
"tag direct chat": "etiquetar la conversación directa",
"Tagged as: ": "Etiquetado como: ",
"The default role for new room members is": "El nivel por defecto para los nuevos miembros de esta sala es",
"The main address for this room is": "La dirección principal de esta sala es",
@ -382,7 +362,6 @@
"%(serverName)s Matrix ID": "%(serverName)s ID de Matrix",
"Name": "Nombre",
"Never send encrypted messages to unverified devices from this device": "No enviar nunca mensajes cifrados, desde este dispositivo, a dispositivos sin verificar",
"Never send encrypted messages to unverified devices in this room": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala",
"Never send encrypted messages to unverified devices in this room from this device": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala, desde este dispositivo",
"New address (e.g. #foo:%(localDomain)s)": "Nueva dirección (ej: #foo:%(localDomain)s)",
"New password": "Nueva contraseña",
@ -425,7 +404,6 @@
"Revoke Moderator": "Eliminar Moderador",
"Refer a friend to Riot:": "Informar a un amigo sobre Riot:",
"Register": "Registrarse",
"rejected": "rechazado",
"%(targetName)s rejected the invitation.": "%(targetName)s ha rechazado la invitación.",
"Reject invitation": "Rechazar invitación",
"Rejoin": "Volver a unirse",
@ -438,7 +416,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s ha solicitado una conferencia Voz-IP.",
"Report it": "Informar",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Reiniciar la contraseña también reiniciará las claves de cifrado extremo-a-extremo, haciendo ilegible el historial de las conversaciones, salvo que exporte previamente las claves de sala, y las importe posteriormente. Esto será mejorado en futuras versiones.",
"restore": "restaurar",
"Results from DuckDuckGo": "Resultados desde DuckDuckGo",
"Return to app": "Volver a la aplicación",
"Return to login screen": "Volver a la pantalla de inicio de sesión",
@ -469,12 +446,9 @@
"This room": "Esta sala",
"This room is not accessible by remote Matrix servers": "Esta sala no es accesible por otros servidores Matrix",
"This room's internal ID is": "El ID interno de la sala es",
"times": "veces",
"to browse the directory": "navegar el directorio",
"to demote": "degradar",
"to favourite": "marcar como favorito",
"To link to a room it must have <a>an address</a>.": "Para enlazar una sala, debe tener <a>una dirección</a>.",
"to make a room or": "hacer una sala o",
"To reset your password, enter the email address linked to your account": "Para reiniciar su contraseña, introduzca el e-mail asociado a su cuenta",
"to restore": "restaurar",
"Cancel": "Cancelar",
@ -483,13 +457,6 @@
"Room directory": "Directorio de salas",
"Custom Server Options": "Opciones de Servidor Personalizado",
"unknown error code": "Código de error desconocido",
"Sunday": "Domingo",
"Monday": "Lunes",
"Tuesday": "Martes",
"Wednesday": "Miércoles",
"Thursday": "Jueves",
"Friday": "Viernes",
"Saturday": "Sábado",
"Start verification": "Comenzar la verificación",
"Skip": "Saltar",
"To return to your account in future you need to set a password": "Para volver a usar su cuenta en el futuro es necesario que establezca una contraseña",
@ -498,9 +465,7 @@
"Do you want to set an email address?": "¿Quieres poner una dirección de correo electrónico?",
"This will allow you to reset your password and receive notifications.": "Esto te permitirá reiniciar tu contraseña y recibir notificaciones.",
"Authentication check failed: incorrect password?": "La verificación de la autentificación ha fallado: ¿El password es el correcto?",
"And %(count)s more...": "Y %(count)s más...",
"Press <StartChatButton> to start a chat with someone": "Pulsa <StartChatButton> para empezar a charlar con alguien",
"to start a chat with someone": "para empezar a charlar con alguien",
"to tag direct chat": "para etiquetar como charla directa",
"Add a widget": "Añadir widget",
"Allow": "Permitir",
@ -512,7 +477,6 @@
"Hide Apps": "Ocultar aplicaciones",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensajes de entrada/salida (no afecta invitaciones/kicks/bans)",
"Hide avatar and display name changes": "Ocultar cambios de avatar y nombre visible",
"Matrix Apps": "Aplicaciones Matrix",
"Once you've followed the link it contains, click below": "Cuando haya seguido el enlace que contiene, haga click debajo",
"Sets the room topic": "Configura el tema de la sala",
"Show Apps": "Mostrar aplicaciones",
@ -616,7 +580,6 @@
"You have <a>enabled</a> URL previews by default.": "Ha <a>habilitado</a> vista previa de URL por defecto.",
"You have no visible notifications": "No tiene notificaciones visibles",
"You may wish to login with a different account, or add this email to this account.": "Puede ingresar con una cuenta diferente, o agregar este e-mail a esta cuenta.",
"you must be a": "usted debe ser un",
"You must <a>register</a> to use this functionality": "Usted debe ser un <a>registrar</a> para usar esta funcionalidad",
"You need to be able to invite users to do that.": "Usted debe ser capaz de invitar usuarios para hacer eso.",
"You need to be logged in.": "Necesita estar autenticado.",

View file

@ -19,13 +19,6 @@
"Search": "Bilatu",
"Settings": "Ezarpenak",
"unknown error code": "errore kode ezezaguna",
"Monday": "Astelehena",
"Tuesday": "Asteartea",
"Wednesday": "Asteazkena",
"Thursday": "Osteguna",
"Friday": "Ostirala",
"Saturday": "Larunbata",
"Sunday": "Igandea",
"Room directory": "Gelen direktorioa",
"Start chat": "Hasi txata",
"Custom Server Options": "Zerbitzari pertsonalizatuaren aukerak",
@ -37,8 +30,6 @@
"Delete": "Ezabatu",
"Active call": "Dei aktiboa",
"Conference calls are not supported in encrypted rooms": "Konferentzia deiak ez daude onartuta zifratutako geletan",
"or": "edo",
"and": "eta",
"Sign out": "Amaitu saioa",
"Home": "Hasiera",
"Favourites": "Gogokoak",
@ -98,7 +89,6 @@
"This email address is already in use": "E-mail helbide hau erabilita dago",
"This phone number is already in use": "Telefono zenbaki hau erabilita dago",
"Topic": "Gaia",
"favourite": "gogokoa",
"none": "bat ere ez",
"Who can read history?": "Nork irakurri dezake historiala?",
"Who can access this room?": "Nor sartu daiteke gelara?",
@ -162,7 +152,6 @@
"Add a topic": "Gehitu gai bat",
"Admin": "Kudeatzailea",
"Admin Tools": "Kudeaketa tresnak",
"And %(count)s more...": "Eta %(count)s gehiago...",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Media baimenak falta dira, egin klik eskatzeko.",
"No Microphones detected": "Ez da mikrofonorik atzeman",
@ -174,10 +163,8 @@
"Camera": "Kamera",
"Hide removed messages": "Ezkutatu kendutako mezuak",
"Alias (optional)": "Ezizena (aukerazkoa)",
"and one other...": "eta beste bat...",
"%(names)s and %(lastPerson)s are typing": "%(names)s eta %(lastPerson)s idazten ari dira",
"%(names)s and one other are typing": "%(names)s eta beste inor idazten ari dira",
"%(names)s and %(count)s others are typing": "%(names)s eta beste %(count)s idazten ari dira",
"An email has been sent to": "E-mail bat bidali da hona:",
"An error has occurred.": "Errore bat gertatu da.",
"Are you sure?": "Ziur zaude?",
@ -219,7 +206,6 @@
"Deactivate my account": "Desaktibatu nire kontua",
"Decline": "Ukatu",
"Decrypt %(text)s": "Deszifratu %(text)s",
"demote": "Jaitsi maila",
"Default": "Lehenetsia",
"Device already verified!": "Gailua egiaztatuta dago!",
"Device ID:": "Gailuaren IDa:",
@ -233,7 +219,6 @@
"Drop File Here": "Jaregin fitxategia hona",
"%(items)s and one other": "%(items)s eta beste bat",
"%(items)s and %(lastItem)s": "%(items)s eta %(lastItem)s",
"and %(overflowCount)s others...": "eta beste %(overflowCount)s...",
"%(senderName)s answered the call.": "%(senderName)s erabiltzaileak deia erantzun du.",
"Can't load user settings": "Ezin izan dira erabiltzailearen ezarpenak kargatu",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s erabiltzaileak gelaren izena kendu du.",
@ -271,7 +256,6 @@
"Failed to load timeline position": "Huts egin du denbora-lerroko puntua kargatzean",
"Failed to lookup current room": "Huts egin du uneko gela bilatzean",
"Failed to mute user": "Huts egin du erabiltzailea mututzean",
"Failed to register as guest:": "Huts egin du bisitari gisa erregistratzean:",
"Failed to reject invite": "Huts egin du gonbidapena baztertzean",
"Failed to reject invitation": "Huts egin du gonbidapena baztertzean",
"Failed to save settings": "Huts egin du ezarpenak gordetzean",
@ -318,15 +302,11 @@
"%(displayName)s is typing": "%(displayName)s idazten ari da",
"Sign in with": "Hasi saioa honekin:",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Elkartu <voiceText>ahotsa</voiceText> edo <videoText>bideoa</videoText> erabiliz.",
"joined and left": "elkartu eta atera da",
"joined": "elkartuta",
"%(targetName)s joined the room.": "%(targetName)s erabiltzailea gelara elkartu da.",
"Joins room with given alias": "Gelara emandako ezizenarekin elkartu da",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s kanporatu du.",
"Kick": "Kanporatu",
"Kicks user with given id": "Kanporatu emandako ID-a duen erabiltzailea",
"left and rejoined": "atera eta berriro elkartu da",
"left": "atera da",
"%(targetName)s left the room.": "%(targetName)s erabiltzailea gelatik atera da.",
"Level:": "Maila:",
"Local addresses for this room:": "Gela honen tokiko helbideak:",
@ -346,7 +326,6 @@
"Missing room_id in request": "Gelaren ID-a falta da eskaeran",
"Missing user_id in request": "Erabiltzailearen ID-a falta da eskaeran",
"Mobile phone number": "Mugikorraren telefono zenbakia",
"Never send encrypted messages to unverified devices in this room": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gela honetan",
"Never send encrypted messages to unverified devices in this room from this device": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gela honetan gailu honetatik",
"New address (e.g. #foo:%(localDomain)s)": "Helbide berria (adib. #foo:%(localDomain)s)",
"New passwords don't match": "Pasahitz berriak ez datoz bat",
@ -381,7 +360,6 @@
"Reason: %(reasonText)s": "Arrazoia: %(reasonText)s",
"Revoke Moderator": "Kendu moderatzaile baimena",
"Refer a friend to Riot:": "Aipatu Riot lagun bati:",
"rejected": "baztertua",
"%(targetName)s rejected the invitation.": "%(targetName)s erabiltzaileak gonbidapena baztertu du.",
"Reject invitation": "Baztertu gonbidapena",
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s erabiltzailek bere gonbidapenak baztertu dituzte %(repeats)s aldiz",
@ -399,7 +377,6 @@
"Report it": "Eman berri",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen.",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Une honetan egiaztatu gabeko gailuak blokeatzen ari zara, gailu hauetara mezuak bidali ahal izateko egiaztatu behar dituzu.",
"restore": "berreskuratu",
"Results from DuckDuckGo": "DuckDuckGo bilatzaileko emaitzak",
"Return to app": "Itzuli aplikaziora",
"Riot does not have permission to send you notifications - please check your browser settings": "Riotek ez du zuri jakinarazpenak bidaltzeko baimenik, egiaztatu nabigatzailearen ezarpenak",
@ -430,7 +407,6 @@
"Server unavailable, overloaded, or something else went wrong.": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo zerbaitek huts egin du.",
"%(senderName)s set a profile picture.": "%(senderName)s erabiltzaileak profileko argazkia ezarri du.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s erabiltzaileak %(displayName)s ezarri du pantaila izen gisa.",
"Set": "Ezarri",
"Show panel": "Erakutsi panela",
"Show Text Formatting Toolbar": "Erakutsi testu-formatuaren tresna-barra",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Erakutsi denbora-zigiluak 12 ordutako formatuan (adib. 2:30pm)",
@ -441,7 +417,6 @@
"since they were invited": "gonbidatu zaienetik",
"Some of your messages have not been sent.": "Zure mezu batzuk ez dira bidali.",
"Sorry, this homeserver is using a login which is not recognised ": "Hasiera zerbitzari honek ezagutzen ez den saio bat erabiltzen du ",
"tag direct chat": "jarri etiketa txat zuzenari",
"Tagged as: ": "Jarritako etiketa: ",
"The default role for new room members is": "Gelako kide berrien lehenetsitako rola:",
"The main address for this room is": "Gela honen helbide nagusia:",
@ -462,15 +437,11 @@
"This room": "Gela hau",
"This room is not accessible by remote Matrix servers": "Gela hau ez dago eskuragarri urruneko zerbitzarietan",
"This room's internal ID is": "Gela honen barne ID-a:",
"times": "aldi",
"to browse the directory": "direktorioa arakatzea",
"to demote": "mailaz jaistea",
"to favourite": "gogoko egitea",
"To link to a room it must have <a>an address</a>.": "Gelara estekatzeko honek <a>helbide bat</a> izan behar du.",
"to make a room or": "gela bat egitea edo",
"To reset your password, enter the email address linked to your account": "Zure pasahitza berrezartzeko, sartu zure kontuarekin lotutako e-mail helbidea",
"to restore": "berreskuratzea",
"to start a chat with someone": "norbaitekin txat bat hastea",
"to tag direct chat": "txat zuzena etiketatzea",
"To use it, just wait for autocomplete results to load and tab through them.": "Erabiltzeko, itxaron osatze automatikoaren emaitzak kargatu arte eta gero tabuladorearekin hautatu.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Gela honen denbora-lerroko puntu zehatz bat kargatzen saiatu zara, baina ez duzu mezu zehatz hori ikusteko baimenik.",
@ -491,7 +462,6 @@
"unencrypted": "zifratu gabe",
"Unencrypted message": "Zifratu gabeko mezua",
"unknown caller": "deitzaile ezezaguna",
"Unknown command": "Agindu ezezaguna",
"Unknown room %(roomId)s": "%(roomId)s gela ezezaguna da",
"Unknown (user, device) pair:": "Erabiltzaile eta gailu bikote ezezaguna:",
"Unmute": "Audioa aktibatu",
@ -549,7 +519,6 @@
"You have <a>enabled</a> URL previews by default.": "Lehenetsita URLak aurreikustea <a>gaitu</a> duzu.",
"You have no visible notifications": "Ez daukazu jakinarazpen ikusgairik",
"You may wish to login with a different account, or add this email to this account.": "Agian beste kontu batekin hasi nahi duzu saioa, edo e-mail hau kontu honetara gehitu.",
"you must be a": "hau izan behar duzu:",
"You must <a>register</a> to use this functionality": "Funtzionaltasun hau erabiltzeko <a>erregistratu</a>",
"You need to be able to invite users to do that.": "Erabiltzaileak gonbidatzeko baimena behar duzu hori egiteko.",
"You need to be logged in.": "Saioa hasi duzu.",
@ -759,7 +728,6 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Zure egiaztatu gabeko '%(displayName)s' gailua zifratze-gakoak eskatzen ari da.",
"Encryption key request": "Zifratze-gakoa eskatuta",
"Deops user with given id": "Emandako ID-a duen erabiltzailea mailaz jaisten du",
"had": "zuen",
"Disable Peer-to-Peer for 1:1 calls": "Desgaitu P2P biren arteko deietan",
"Add a widget": "Gehitu trepeta bat",
"Allow": "Baimendu",
@ -777,7 +745,6 @@
"Hide avatar and display name changes": "Ezkutatu abatarra eta pantaila-izen aldaketak",
"Integrations Error": "Integrazio errorea",
"Publish this room to the public in %(domain)s's room directory?": "Argitaratu gela hau publikora %(domain)s domeinuko gelen direktorioan?",
"Matrix Apps": "Matrix Aplikazioak",
"AM": "AM",
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "OHARRA: Aplikazioek ez dute muturretik muturrerako zifratzea",
@ -791,39 +758,43 @@
"You are not in this room.": "Ez zaude gela honetan.",
"You do not have permission to do that in this room.": "Ez duzu gela honetan hori egiteko baimenik.",
"Autocomplete Delay (ms):": "Osatze automatikoaren atzerapena (ms):",
"This Home server does not support groups": "Hasiera zerbitzari honek ez ditu taldeak onartzen",
"Loading device info...": "Gailuaren informazioa kargatzen...",
"Groups": "Taldeak",
"Create a new group": "Sortu talde berria",
"Create Group": "Sortu taldea",
"Group Name": "Taldearen izena",
"Example": "Adibidea",
"Create": "Sortu",
"Group ID": "Taldearen IDa",
"+example:%(domain)s": "+adibidea:%(domain)s",
"Room creation failed": "Taldea sortzeak huts egin du",
"You are a member of these groups:": "Talde hauetako kidea zara:",
"Join an existing group": "Elkartu badagoen talde batetara",
"Featured Rooms:": "Nabarmendutako gelak:",
"Featured Users:": "Nabarmendutako erabiltzaileak:",
"Edit Group": "Editatu taldea",
"Failed to update group": "Taldea eguneratzeak huts egin du",
"Group IDs must be of the form +localpart:%(domain)s": "Taldeen IDek forma hau dute +partelokala:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Une honetan zure hasiera zerbitzarian besterik ezin dituzu sortu taldeak: erabili %(domain)s bukaera duen talde ID bat",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Sortu talde bat zure komunitatea adierazteko! Zehaztu talde multzo bat eta zure hasiera horri pertsonalizatua zure espazioa markatzeko Matrix unibertsoan.",
"Error whilst fetching joined groups": "Errorea elkartutako taldeak eskuratzean",
"Automatically replace plain text Emoji": "Automatikoki ordezkatu Emoji testu soila",
"Failed to upload image": "Irudia igotzeak huts egin du",
"Hide avatars in user and room mentions": "Ezkutatu abatarrak erabiltzaile eta gelen aipamenetan",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s trepeta gehitu du %(senderName)s erabiltzaileak",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s trepeta kendu du %(senderName)s erabiltzaileak",
"Verifies a user, device, and pubkey tuple": "Erabiltzaile, gailu eta gako publiko multzoa egiaztatzen du",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Dagoen talde batetara elkartzeko taldearen identifikatzailea ezagutu behar duzu, honen antza du: <i>+adibidea:matrix.org</i>.",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot egiaztaketa orain ez dago eskuragarri mahaigainean - erabili <a>web nabigatzailea</a>",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s trepeta aldatu du %(senderName)s erabiltzaileak",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)sk %(day)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)sko %(monthName)sk %(day)s",
"Copied!": "Kopiatuta!",
"Failed to copy": "Kopiak huts egin du",
"Cancel": "Utzi"
"Cancel": "Utzi",
"Advanced options": "Aukera aurreratuak",
"Block users on other matrix homeservers from joining this room": "Eragotzi beste matrix hasiera-zerbitzarietako erabiltzaileak gela honetara elkartzea",
"This setting cannot be changed later!": "Ezarpen hau ezin da gero aldatu!",
"Ignored Users": "Ezikusitako erabiltzaileak",
"Ignore": "Ezikusi",
"Unignore": "Ez ezikusi",
"User Options": "Erabiltzaile-aukerak",
"You are now ignoring %(userId)s": "%(userId)s ezikusten ari zara",
"You are no longer ignoring %(userId)s": "Ez zaude jada %(userId)s ezikusten",
"Unignored user": "Ez ezikusitako erabiltzailea",
"Ignored user": "Ezikusitako erabiltzailea",
"Stops ignoring a user, showing their messages going forward": "Utzi erabiltzailea ezikusteari, erakutsi bere mezuak",
"Ignores a user, hiding their messages from you": "Ezikusi erabiltzailea, ezkutatu bere mezuak zuretzat",
"Disable Emoji suggestions while typing": "Desgaitu Emoji proposamenak idaztean",
"Banned by %(displayName)s": "%(displayName)s erabiltzaileak debekatuta",
"Message removed by %(userId)s": "%(userId)s erabiltzaileak kendu du mezua",
"To send messages, you must be a": "Mezuak bidaltzeko hau izan behar zara:",
"To invite users into the room, you must be a": "Erabiltzaileak gonbidatzeko hau izan behar zara:",
"To configure the room, you must be a": "Gela konfiguratzeko hau izan behar zara:",
"To kick users, you must be a": "Erabiltzaileak kanporatzeko hau izan behar zara:",
"To ban users, you must be a": "Erabiltzaileak debekatzeko hau izan behar zara:",
"To remove other users' messages, you must be a": "Beste erabiltzaileen mezuak kentzeko hau izan behar zara:"
}

View file

@ -20,13 +20,6 @@
"Settings": "Asetukset",
"Start chat": "Aloita keskustelu",
"unknown error code": "tuntematon virhekoodi",
"Sunday": "Sunnuntai",
"Monday": "Maanantai",
"Tuesday": "Tiistai",
"Wednesday": "Keskiviikko",
"Thursday": "Torstai",
"Friday": "Perjantai",
"Saturday": "Lauantai",
"Failed to change password. Is your password correct?": "Salasanan muuttaminen epäonnistui. Onko salasanasi oikein?",
"Continue": "Jatka",
"powered by Matrix": "Matrix-pohjainen",
@ -36,9 +29,7 @@
"Add email address": "Lisää sähköpostiosoite",
"Add phone number": "Lisää puhelinnumero",
"Admin": "Ylläpitäjä",
"Admin tools": "Ylläpitotyökalut",
"Allow": "Salli",
"And %(count)s more...": "Ja %(count)s lisää...",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Mediaoikeudet puuttuvat. Klikkaa tästä pyytääksesi oikeudet.",
"No Microphones detected": "Mikrofonia ei löytynyt",
@ -54,15 +45,11 @@
"Always show message timestamps": "Näytä aina viestien aikaleimat",
"Authentication": "Autentikointi",
"Alias (optional)": "Alias (valinnainen)",
"and": "ja",
"%(items)s and %(remaining)s others": "%(items)s ja %(remaining)s lisää",
"%(items)s and one other": "%(items)s ja yksi lisää",
"%(items)s and %(lastItem)s": "%(items)s ja %(lastItem)s",
"and %(count)s others....other": "ja %(count)s lisää...",
"and %(count)s others....one": "ja yksi lisää...",
"%(names)s and %(lastPerson)s are typing": "%(names)s ja %(lastPerson)s kirjoittavat",
"%(names)s and one other are typing": "%(names)s ja yksi muu kirjoittavat",
"%(names)s and %(count)s others are typing": "%(names)s ja %(count)s muuta kirjoittavat",
"An email has been sent to": "Sähköposti on lähetetty osoitteeseen",
"A new password must be entered.": "Sinun täytyy syöttää uusi salasana.",
"%(senderName)s answered the call.": "%(senderName)s vastasi puheluun.",
@ -125,7 +112,6 @@
"Decline": "Hylkää",
"Decryption error": "Virhe salauksen purkamisessa",
"Delete": "Poista",
"demote": "alenna",
"Default": "Oletusarvo",
"Device already verified!": "Laite on jo varmennettu!",
"Device ID": "Laitetunniste",
@ -170,7 +156,6 @@
"Failed to leave room": "Huoneesta poistuminen epäonnistui",
"Failed to load timeline position": "Aikajanapaikan lataaminen epäonnistui",
"Failed to mute user": "Käyttäjän mykistäminen epäonnistui",
"Failed to register as guest:": "Vieraana rekisteröityminen epäonnistui:",
"Failed to reject invite": "Kutsun hylkääminen epäonnistui",
"Failed to reject invitation": "Kutsun hylkääminen epäonnistui",
"Failed to save settings": "Asetusten tallentaminen epäonnistui",
@ -182,9 +167,8 @@
"Failed to unban": "Porttikiellon poistaminen epäonnistui",
"Failed to upload file": "Tiedoston lataaminen epäonnistui",
"Failed to upload profile picture!": "Profiilikuvan lataaminen epäonnistui",
"Failed to verify email address: make sure you clicked the link in the email": "Varmenna sähköpostiosoitteesi: varmista että klikkasit sähköpostissa olevaa linkkiä",
"Failed to verify email address: make sure you clicked the link in the email": "Sähköpostin varmennus epäonnistui: varmista että seurasit sähköpostissa olevaa linkkiä",
"Failure to create room": "Huoneen luominen epäonnistui",
"favourite": "suosikki",
"Favourites": "Suosikit",
"Fill screen": "Täytä näyttö",
"Filter room members": "Suodata huoneen jäsenet",
@ -193,7 +177,6 @@
"For security, this session has been signed out. Please sign in again.": "Turvallisuussyistä tämä istunto on vanhentunut. Ole hyvä ja kirjaudu uudestaan.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Turvallusuussyistä uloskirjautuminen poistaa kaikki päästä päähän-salausavaimet tästä selaimesta. Jos haluat purkaa keskustelujen salaukset tulevaisuudessa pitää sinun viedä purkuavaimet ja pitää ne turvallisesti tallessa.",
"Found a bug?": "Löysitkö virheen?",
"had": "oli",
"Hide Apps": "Piilota sovellukset",
"Hide read receipts": "Piilota lukukuittaukset",
"Hide Text Formatting Toolbar": "Piilota tekstinmuotoilutyökalupalkki",
@ -218,8 +201,6 @@
"Invites user with given id to current room": "Kutsuu annetun käyttäjätunnisteen mukaisen käyttäjän huoneeseen",
"Sign in with": "Kirjaudu käyttäen",
"Join Room": "Liity huoneeseen",
"joined and left": "liittyi ja poistui",
"joined": "liittyi",
"Joins room with given alias": "Liittyy huoneeseen jolla on annettu alias",
"Jump to first unread message.": "Hyppää ensimmäiseen lukemattomaan viestiin.",
"Kick": "Poista huoneesta",
@ -227,8 +208,6 @@
"Labs": "Laboratorio",
"Last seen": "Viimeksi nähty",
"Leave room": "Poistu huoneesta",
"left and rejoined": "poistui ja liittyi jälleen",
"left": "poistui",
"Level:": "Taso:",
"Local addresses for this room:": "Tämän huoneen paikalliset osoitteet:",
"Logged in as:": "Kirjautunut käyttäjänä:",
@ -239,7 +218,6 @@
"Markdown is disabled": "Markdown on pois päältä",
"Markdown is enabled": "Mardown on päällä",
"matrix-react-sdk version:": "Matrix-react-sdk versio:",
"Matrix Apps": "Matrix ohjelmat",
"Members only": "Vain jäsenet",
"Message not sent due to unknown devices being present": "Viestiä ei lähetetty koska paikalla on tuntemattomia laitteita",
"Mobile phone number": "Matkapuhelinnumero",
@ -278,7 +256,6 @@
"Reason": "Syy",
"Reason: %(reasonText)s": "Syy: %(reasonText)s",
"Register": "Rekisteröi",
"rejected": "hylätty",
"Reject invitation": "Hylkää kutsu",
"Rejoin": "Liity uudestaan",
"Remove Contact Information?": "Poista yhteystiedot?",
@ -303,7 +280,6 @@
"sent a video": "lähetti videon",
"Server error": "Palvelinvirhe",
"Session ID": "Istuntotunniste",
"Set": "Aseta",
"Sets the room topic": "Asettaa huoneen aiheen",
"Show panel": "Näytä paneeli",
"Sign in": "Kirjaudu sisään",
@ -330,7 +306,7 @@
"unknown caller": "tuntematon soittaja",
"unknown device": "tuntematon laite",
"Unknown room %(roomId)s": "Tuntematon huone %(roomId)s",
"Unknown (user, device) pair:": "Tuntematon (käyttäjä,laite) -pari.",
"Unknown (user, device) pair:": "Tuntematon (käyttäjä, laite) -pari:",
"Unmute": "Poista mykistys",
"Unnamed Room": "Nimeämätön huone",
"Unrecognised command:": "Tuntematon komento:",
@ -345,9 +321,6 @@
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Salatut viestit eivät näy ohjelmissa joissa salaus ei ole vielä implementoitu",
"%(senderName)s ended the call.": "%(senderName)s lopetti puhelun.",
"Guest access is disabled on this Home Server.": "Vierailijat on estetty tällä kotipalvelimella.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Vierailijat eivät voi luoda huoneita. Ole hyvä ja rekisteröidy luodaksesi huoneen ja aloittaaksesi keskustelun.",
"Guest users can't upload files. Please register to upload.": "Vierailijat eivät voi ladata tiedostoja. Ole hyvä ja rekisteröidy voidaksesi ladata tiedostoja.",
"Guests can't use labs features. Please register.": "Vierailijat eivät voi käyttää kokeellisia toimintoja. Ole hyvä ja rekisteröidy.",
"Guests cannot join this room even if explicitly invited.": "Vierailijat eivät voi liittyä tähän huoneeseen vaikka heidät on eksplisiittisesti kutsuttu.",
"Hangup": "Lopeta",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Piilota liittymis-/poistumisviestit (ei koske kutsuja/poistamisia/porttikieltoja)",
@ -356,7 +329,6 @@
"Invalid file%(extra)s": "Virheellinen tiedosto%(extra)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s kutsui käyttäjän %(targetName)s.",
"%(displayName)s is typing": "%(displayName)s kirjoittaa",
"%(senderName)s made future room history visible to": "%(senderName)s teki tulevista viesteistä näkyviä",
"none": "Ei mikään",
"No devices with registered encryption keys": "Ei laitteita joilla rekisteröityjä salausavaimia",
"No users have specific privileges in this room": "Kellään käyttäjällä ei ole erityisiä oikeuksia",
@ -364,7 +336,6 @@
"Remove %(threePid)s?": "Poista %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s pyysi VoIP konferenssia.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s asetti näyttönimekseen %(displayName)s.",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Vierailija ei voi suorittaa tätä toimintoa. Ole hyvä ja rekisteröidy suorittaaksesi toiminnon.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Tiedosto %(fileName)s ylittää tämän kotipalvelimen maksimitiedostokoon",
"The file '%(fileName)s' failed to upload": "Tiedoston %(fileName)s lataaminen epäonnistui",
"This Home Server does not support login using email address.": "Kotipalvelin ei tue kirjatumista sähköpostiosoitteen avulla.",
@ -374,7 +345,6 @@
"This doesn't appear to be a valid email address": "Olemassa olevan historian näkyvyys ei muutu",
"This is a preview of this room. Room interactions have been disabled": "Tämä on huoneen ennakokatselu. Vuorovaikutus ei ole mahdollista",
"This phone number is already in use": "Puhelinnumero on jo käytössä",
"times": "kertaa",
"To link to a room it must have <a>an address</a>.": "Linkittääksesi tähän huoneseen sillä on oltava <a>osoite</a>.",
"Turn Markdown off": "Ota Markdown pois käytöstä",
"Turn Markdown on": "Ota Markdown käyttöön",
@ -413,7 +383,6 @@
"You have been kicked from %(roomName)s by %(userName)s.": "Käyttäjä %(userName)s on poistanut sinut huoneesta %(roomName)s.",
"You have <a>disabled</a> URL previews by default.": "Olet oletusarvoisesti ottanut URL esikatselut <a>pois käytöstä</a>.",
"You have <a>enabled</a> URL previews by default.": "Olet oletusarvoisesti ottanut URL esikatselut <a>käyttöön</a>.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Olet syöttänyt virheellisen kontaktin. Yritä käyttää heidän Matrixtunnistetta tai sähköpostiosoitetta.",
"You have no visible notifications": "Sinulla ei ole näkyviä ilmoituksia",
"You must <a>register</a> to use this functionality": "Sinun pitää <a>rekisteröityä</a> käyttääksesi tätä toiminnallisuutta",
"You need to be able to invite users to do that.": "Sinun pitää pystyä kutsua käyttäjiä voidaksesi tehdä tuon.",
@ -431,7 +400,6 @@
"Fri": "Pe",
"Sat": "La",
"Set a display name:": "Aseta näyttönimi:",
"Set a Display Name": "Aseta näyttönimi",
"This server does not support authentication with a phone number.": "Tämä palvelin ei tue autentikointia puhelinnumeron avulla.",
"Missing password.": "Salasana puuttuu.",
"Passwords don't match.": "Salasanat eivät täsmää.",
@ -451,11 +419,9 @@
"Failed to copy": "Kopiointi epäonnistui",
"Connectivity to the server has been lost.": "Yhteys palvelimeen menetettiin.",
"Sent messages will be stored until your connection has returned.": "Lähetetyt viestit tallennetaan kunnes yhteys on taas muodostettu.",
"Auto-complete": "Automaattitäydennys",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Uudelleenlähetä kaikki</a> tai <a>hylkää kaikki</a> nyt. Voit myös valita yksittäisiä viestejä uudelleenlähetettäväksi tai hylättäväksi.",
"(~%(count)s results)|one": "(~%(count)s tulos)",
"(~%(count)s results)|other": "(~%(count)s tulosta)",
"or": "tai",
"Active call": "Aktiivinen puhelu",
"bold": "lihavoitu",
"italic": "kursiivi",
@ -484,7 +450,6 @@
"You must join the room to see its files": "Sinun pitää liittyä huoneeseen voidaksesi nähdä sen sisältämät tiedostot",
"Reject all %(invitedRooms)s invites": "Hylkää kaikki %(invitedRooms)s kutsut",
"Start new chat": "Aloita uusi keskustelu",
"Guest users can't invite users. Please register.": "Vierailijat eivät voi lähettää kutsuja. Ole hyvä ja rekisteröidy.",
"Failed to invite": "Kutsu epäonnistui",
"Failed to invite user": "Käyttäjän kutsuminen epäonnistui",
"Failed to invite the following users to the %(roomName)s room:": "Seuraavian käyttäjien kutsuminen huoneeseen %(roomName)s epäonnistui:",
@ -524,7 +489,6 @@
"Missing user_id in request": "user_id puuttuu kyselystä",
"Must be viewing a room": "Pakko olla huoneessa",
"Never send encrypted messages to unverified devices from this device": "Älä koskaa lähetä salattuja viestejä varmentamattomiin laitteisiin tältä laitteelta",
"Never send encrypted messages to unverified devices in this room": "Älä koskaa lähetä salattuja viestejä varmentamattomiin laitteisiin tässä huoneessa",
"Never send encrypted messages to unverified devices in this room from this device": "Älä koskaa lähetä salattuja viestejä varmentamattomiin laitteisiin tässä huoneessa tältä laitteelta",
"New address (e.g. #foo:%(localDomain)s)": "Uusi osoite (esim. #foo:%(localDomain)s)",
"Press <StartChatButton> to start a chat with someone": "Paina <StartChatButton>",
@ -534,7 +498,6 @@
"Remote addresses for this room:": "Tämän huoneen etäosoitteet:",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s poisti näyttönimensä (%(oldDisplayName)s).",
"Report it": "Ilmoita siitä",
"restore": "palauta",
"Return to app": "Palaa ohjelmaan",
"Riot does not have permission to send you notifications - please check your browser settings": "Riotilla ei ole oikeuksia lähettää sinulle ilmoituksia. Ole hyvä ja tarkista selaimen asetukset",
"Riot was not given permission to send notifications - please try again": "Riotilla ei saannut oikeuksia lähettää ilmoituksia. Ole hyvä ja yritä uudelleen",
@ -552,8 +515,6 @@
"since the point in time of selecting this option": "tämän asetuksen valitsemisesta",
"Start authentication": "Aloita tunnistus",
"Success": "Onnistuminen",
"tag as %(tagName)s": "lisää tägi %(tagName)s",
"tag direct chat": "tägää suora viestittely",
"Tagged as: ": "Tägit: ",
"The default role for new room members is": "Huoneen uusien jäsenten oletusrooli on",
"The main address for this room is": "Tämän huoneen pääosoite on",
@ -561,7 +522,6 @@
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Syöttämäsi allekirjoitusavain vastaa käyttäjän %(userId)s laitteelta %(deviceId)s saamaasi allekirjoitusavainta. Laite on merkitty varmennetuksi.",
"Unable to add email address": "Sähköpostiosoitteen lisääminen epäonnistui",
"Unable to remove contact information": "Yhteystietojen poistaminen epäonnistui",
"Unable to restore previous session": "Edellisen istunnon palauttaminen epäonnistui",
"Unable to verify email address.": "Sähköpostin varmentaminen epäonnistui.",
"Unbans user with given id": "Poistaa porttikiellon annetun ID:n omaavalta käyttäjältä",
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s poisti porttikiellon käyttäjältä %(targetName)s.",
@ -625,7 +585,6 @@
"Otherwise, <a>click here</a> to send a bug report.": "Paina muutoin <a>tästä</a> lähettääksesi virheraportin.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Ole hyvä ja tarkista sähköpostisi ja seuraa sen sisältämää linkkiä. Kun olet valmis, paina jatka.",
"Power level must be positive integer.": "Oikeustason pitää olla positiivinen kokonaisluku.",
"Press": "Paina",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan uudelleenalustus uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.",
"Server may be unavailable, overloaded, or search timed out :(": "Palvelin saattaa olla saavuttamattomissa, ylikuormitettu tai haku kesti liian kauan :(",
"Server may be unavailable, overloaded, or the file too big": "Palvelin saattaa olla saavuttamattomissa, ylikuormitettu, tai tiedosto on liian suuri",
@ -715,23 +674,11 @@
"You added a new device '%(displayName)s', which is requesting encryption keys.": "Lisäsit laitteen '%(displayName)s' joka pyytää salausavaimia.",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Sinun varmentamaton laitteesi '%(displayName)s' pyytää salausavaimia.",
"Encryption key request": "Salausavainpyyntö",
"This Home server does not support groups": "Kotipalvelin ei tue ryhmiä",
"Loading device info...": "Ladataan laitetiedot...",
"Groups": "Ryhmät",
"Create a new group": "Luo uusi ryhmä",
"Create Group": "Luo ryhmä",
"Group Name": "Ryhmän nimi",
"Example": "Esimerkki",
"Create": "Luo",
"Group ID": "Ryhmän tunniste",
"+example:%(domain)s": "+esimerkki:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Ryhmätunnisteiden pitää olla muotoa +paikallinen:%(domain)s",
"Room creation failed": "Huoneen luonti epäonnistui",
"You are a member of these groups:": "Olet seuraavien ryhmien jäsen:",
"Join an existing group": "Liity olemassaolevaan ryhmään",
"Edit Group": "Muokkaa ryhmää",
"Failed to upload image": "Kuvan lataaminen epäonnistui",
"Failed to update group": "Ryhmän päivitys epäonnistui",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robottitarkistus ei tällä hetkellä toimi työpöytäversiossa. Ole hyvä ja käytä <a>nettiselainta</a>",
"Add a widget": "Lisää sovelma",
"Cannot add any more widgets": "Lisää sovelmia ei voida enää lisätä",

View file

@ -1,6 +1,4 @@
{
"anyone": "n'importe qui",
"Direct Chat": "Discussion directe",
"Direct chats": "Discussions directes",
"Disable inline URL previews by default": "Désactiver laperçu des liens",
"Disinvite": "Désinviter",
@ -11,7 +9,6 @@
"Drop here %(toAction)s": "Déposer ici %(toAction)s",
"Drop here to tag %(section)s": "Déposer ici pour étiqueter comme %(section)s",
"Ed25519 fingerprint": "Empreinte Ed25519",
"Email Address": "Adresse e-mail",
"Email, name or matrix ID": "E-mail, nom ou identifiant Matrix",
"Emoji": "Émoticône",
"Enable encryption": "Activer le chiffrement",
@ -30,19 +27,11 @@
"Failed to change power level": "Échec du changement de rang",
"Failed to delete device": "Échec de la suppression de l'appareil",
"Failed to forget room %(errCode)s": "Échec de l'oubli du salon %(errCode)s",
"Please Register": "Veuillez vous inscrire",
"Remove": "Supprimer",
"was banned": "a été banni(e)",
"was invited": "a été invité(e)",
"was kicked": "a été exclu(e)",
"was unbanned": "a vu son bannissement révoqué",
"Monday": "Lundi",
"Tuesday": "Mardi",
"Wednesday": "Mercredi",
"Thursday": "Jeudi",
"Friday": "Vendredi",
"Saturday": "Samedi",
"Sunday": "Dimanche",
"bold": "gras",
"italic": "italique",
"strike": "barré",
@ -50,9 +39,7 @@
"Favourite": "Favoris",
"Notifications": "Notifications",
"Settings": "Paramètres",
"Failed to join the room": "Échec de l'inscription au salon",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un SMS a été envoyé à +%(msisdn)s. Merci de saisir le code de vérification qu'il contient",
"accept": "Accepter",
"%(targetName)s accepted an invitation.": "%(targetName)s a accepté une invitation.",
"Account": "Compte",
"Add email address": "Ajouter une adresse e-mail",
@ -60,17 +47,11 @@
"Admin": "Administrateur",
"Advanced": "Avancé",
"Algorithm": "Algorithme",
"all room members": "tous les membres du salon",
"all room members, from the point they are invited": "tous les membres du salon, depuis le moment où ils ont été invités",
"all room members, from the point they joined": "tous les membres du salon, depuis le moment où ils l'ont rejoint",
"an address": "une adresse",
"and": "et",
"%(items)s and %(remaining)s others": "%(items)s et %(remaining)s autres",
"%(items)s and one other": "%(items)s et un autre",
"%(items)s and %(lastItem)s": "%(items)s et %(lastItem)s",
"%(names)s and %(lastPerson)s are typing": "%(names)s et %(lastPerson)s écrivent",
"%(names)s and one other are typing": "%(names)s et un autre écrivent",
"%(names)s and %(count)s others are typing": "%(names)s et %(count)s autres écrivent",
"and %(count)s others...|other": "et %(count)s autres...",
"and %(count)s others...|one": "et un autre...",
"An email has been sent to": "Un e-mail a été envoyé à",
@ -89,7 +70,6 @@
"Blacklisted": "Sur liste noire",
"Bug Report": "Rapport d'erreur",
"Call Timeout": "Délai dappel expiré",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Connexion au Home Server impossible - merci de vérifier votre connectivité et que le <a>certificat SSL de votre Home Server</a> est de confiance.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Impossible de se connecter au serveur d'accueil en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou <a>activez le support des scripts non-vérifiés</a>.",
"Can't load user settings": "Impossible de charger les paramètres de l'utilisateur",
"Change Password": "Changer le mot de passe",
@ -103,7 +83,6 @@
"Claimed Ed25519 fingerprint key": "Clé d'empreinte Ed25519 déclarée",
"Clear Cache and Reload": "Vider le cache et rafraîchir",
"Clear Cache": "Vider le cache",
"Click here": "Cliquer ici",
"Click here to fix": "Cliquer ici pour réparer",
"Click to mute audio": "Cliquer pour couper le son",
"Click to mute video": "Cliquer ici pour couper la vidéo",
@ -128,16 +107,13 @@
"/ddg is not a command": "/ddg n'est pas une commande",
"Deactivate Account": "Supprimer le compte",
"Deactivate my account": "Supprimer mon compte",
"decline": "décliner",
"Decrypt %(text)s": "Déchiffrer %(text)s",
"Decryption error": "Erreur de déchiffrement",
"Delete": "Supprimer",
"demote": "rétrograder",
"Deops user with given id": "Retire le rang dopérateur dun utilisateur à partir de son identifiant",
"Device ID": "Identifiant de l'appareil",
"Devices": "Appareils",
"Devices will not yet be able to decrypt history from before they joined the room": "Les appareils ne pourront pas encore déchiffrer l'historique de messages d'avant leur arrivée sur le salon",
"ml": "Malayalam",
"Failed to join room": "Échec de linscription au salon",
"Failed to kick": "Échec de l'exclusion",
"Failed to leave room": "Échec du départ du salon",
@ -163,7 +139,6 @@
"Failed to upload file": "Échec de l'envoi du fichier",
"Failed to verify email address: make sure you clicked the link in the email": "Échec de la vérification de ladresse e-mail : vérifiez que vous avez bien cliqué sur le lien dans le-mail",
"Failure to create room": "Échec de la création du salon",
"favourite": "favoris",
"Favourites": "Favoris",
"Fill screen": "Plein écran",
"Filter room members": "Filtrer les membres du salon",
@ -172,7 +147,6 @@
"For security, this session has been signed out. Please sign in again.": "Par mesure de sécurité, la session a expiré. Merci de vous authentifier à nouveau.",
"Found a bug?": "Vous avez trouvé un problème ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s",
"had": "avait",
"Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de lecture",
"Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte",
@ -191,14 +165,11 @@
"Invited": "Invités",
"Invites": "Invitations",
"Invites user with given id to current room": "Invite un utilisateur dans le salon actuel à partir de son identifiant",
"is a": "est un",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' n'est pas un format valide pour une adresse",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' n'est pas un format valide pour un alias",
"%(displayName)s is typing": "%(displayName)s écrit",
"Sign in with": "Se connecter avec",
"Join Room": "Rejoindre le salon",
"joined and left": "a rejoint et est parti",
"joined": "a rejoint",
"%(targetName)s joined the room.": "%(targetName)s a rejoint le salon.",
"Joins room with given alias": "Rejoint le salon avec l'alias renseigné",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s a exclu %(targetName)s.",
@ -206,10 +177,7 @@
"Kicks user with given id": "Exclut l'utilisateur à partir de son identifiant",
"Labs": "Laboratoire",
"Leave room": "Quitter le salon",
"left and rejoined": "est parti et revenu",
"left": "est parti",
"%(targetName)s left the room.": "%(targetName)s a quitté le salon.",
"Level": "Niveau",
"Local addresses for this room:": "Adresses locales pour ce salon :",
"Logged in as:": "Identifié en tant que :",
"Login as guest": "Se connecter en tant que visiteur",
@ -234,7 +202,6 @@
"%(serverName)s Matrix ID": "%(serverName)s identifiant Matrix",
"Name": "Nom",
"Never send encrypted messages to unverified devices from this device": "Ne jamais envoyer de message chiffré aux appareils non vérifiés depuis cet appareil",
"Never send encrypted messages to unverified devices in this room": "Ne jamais envoyer de message chiffré aux appareils non vérifiés dans ce salon",
"Never send encrypted messages to unverified devices in this room from this device": "Ne jamais envoyer de message chiffré aux appareils non vérifiés dans ce salon depuis cet appareil",
"New address (e.g. #foo:%(localDomain)s)": "Nouvelle adresse (par ex. #foo:%(localDomain)s)",
"New password": "Nouveau mot de passe",
@ -253,7 +220,6 @@
"OK": "OK",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Une fois le chiffrement activé dans un salon il ne peut pas être désactivé (pour le moment)",
"Only people who have been invited": "Seul les personnes ayant été invitées",
"or": "ou",
"Password": "Mot de passe",
"Passwords can't be empty": "Le mot de passe ne peut pas être vide",
"People": "Personnes",
@ -267,8 +233,6 @@
"Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe",
"Failed to set avatar.": "Échec de la définition de l'avatar.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Par mesure de sécurité une déconnexion supprimera toutes les clés de chiffrement de ce navigateur. Si vous voulez être capable de déchiffrer lhistorique de votre conversation lors des prochaines sessions de Riot, veuillez exporter les clés de salon pour les garder en lieu sûr.",
"Guests can't set avatars. Please register.": "Les visiteurs ne peuvent pas définir d'avatar. Veuillez vous inscrire.",
"Guests can't use labs features. Please register.": "Les visiteurs ne peuvent pas utiliser les fonctionnalités du laboratoire. Veuillez vous inscrire.",
"Guests cannot join this room even if explicitly invited.": "Les visiteurs ne peuvent pas rejoindre ce salon, même s'ils ont été explicitement invités.",
"Invalid file%(extra)s": "Fichier %(extra)s non valide",
"Mute": "Mettre en sourdine",
@ -284,7 +248,6 @@
"Reason": "Raison",
"Revoke Moderator": "Révoquer le modérateur",
"Refer a friend to Riot:": "Recommander Riot à un ami :",
"rejected": "rejeté",
"%(targetName)s rejected the invitation.": "%(targetName)s a rejeté linvitation.",
"Reject invitation": "Rejeter l'invitation",
"Remove Contact Information?": "Supprimer les informations du contact ?",
@ -294,7 +257,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une téléconférence audio.",
"Report it": "Le signaler",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pour le moment, réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant lhistorique des salons chiffrés illisible, à moins que vous exportiez d'abord les clés de salon puis que vous les ré-importiez après. Cela sera amélioré prochainement.",
"restore": "restaurer",
"Return to app": "Retourner à lapplication",
"Return to login screen": "Retourner à lécran de connexion",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot na pas la permission de vous envoyer des notifications - merci de vérifier les paramètres de votre navigateur",
@ -342,7 +304,6 @@
"Start Chat": "Commencer une discussion",
"Submit": "Soumettre",
"Success": "Succès",
"tag direct chat": "marquer comme discussion directe",
"The default role for new room members is": "Le rôle par défaut des nouveaux membres est",
"The main address for this room is": "L'adresse principale pour ce salon est",
"This email address is already in use": "Cette adresse e-mail est déjà utilisée",
@ -357,21 +318,14 @@
"These are experimental features that may break in unexpected ways": "Ce sont des fonctionnalités expérimentales qui peuvent créer des problèmes inattendus",
"The visibility of existing history will be unchanged": "La visibilité de lhistorique existant restera inchangée",
"This doesn't appear to be a valid email address": "Cette adresse e-mail ne semble pas valide",
"this invitation?": "cette invitation ?",
"This is a preview of this room. Room interactions have been disabled": "Ceci est un aperçu du salon. Les interactions avec le salon ont été désactivées",
"This phone number is already in use": "Ce numéro de téléphone est déjà utilisé",
"This room is not accessible by remote Matrix servers": "Ce salon nest pas accessible par les serveurs Matrix distants",
"This room's internal ID is": "L'identifiant interne de ce salon est",
"times": "fois",
"to browse the directory": "pour parcourir le répertoire",
"to demote": "pour réduire la priorité",
"to favourite": "pour marquer comme favori",
"to join the discussion": "pour rejoindre la discussion",
"To link to a room it must have": "Pour avoir un lien vers un salon, il doit avoir",
"to make a room or": "pour créer un salon ou",
"To reset your password, enter the email address linked to your account": "Pour réinitialiser votre mot de passe, merci dentrer ladresse e-mail liée à votre compte",
"to restore": "pour restaurer",
"to start a chat with someone": "pour démarrer une discussion avec quelquun",
"to tag direct chat": "pour marquer comme conversation directe",
"To use it, just wait for autocomplete results to load and tab through them.": "Pour lutiliser, attendez simplement que les résultats de lauto-complétion saffichent et défilez avec la touche Tab.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Un instant donné de la chronologie na pu être chargé car vous navez pas la permission de le visualiser.",
@ -419,9 +373,7 @@
"Who would you like to add to this room?": "Qui voulez-vous inviter dans ce salon ?",
"Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a annulé linvitation de %(targetName)s.",
"Would you like to": "Voulez-vous",
"You are already in a call.": "Vous avez déjà un appel en cours.",
"You're not in any rooms yet! Press": "Vous nêtes dans aucun salon ! Cliquez",
"You are trying to access %(roomName)s.": "Vous essayez d'accéder à %(roomName)s.",
"You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.",
"You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel en Voix sur IP dans ce navigateur.",
@ -429,11 +381,9 @@
"You have been invited to join this room by %(inviterName)s": "Vous avez été invité(e) à rejoindre ce salon par %(inviterName)s",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notifications, reconnectez-vous sur tous les appareils",
"You have no visible notifications": "Vous n'avez pas de notification visible",
"you must be a": "vous devez être un(e)",
"You need to be able to invite users to do that.": "Vous devez être capable dinviter des utilisateurs pour faire ça.",
"You need to be logged in.": "Vous devez être identifié.",
"You need to enter a user name.": "Vous devez entrer un nom dutilisateur.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés de chiffrement pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas ; veuillez nous excuser pour la gêne occasionnée.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas être associée à un identifiant Matrix sur ce serveur d'accueil.",
"Your password has been reset": "Votre mot de passe a été réinitialisé",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos autres appareils jusquà ce que vous vous identifiez à nouveau",
@ -484,11 +434,7 @@
"Room": "Salon",
"Connectivity to the server has been lost.": "La connectivité au serveur a été perdue.",
"Sent messages will be stored until your connection has returned.": "Les messages envoyés seront stockés jusquà ce que votre connection revienne.",
"Resend all": "Tout renvoyer",
"(~%(searchCount)s results)": "(~%(searchCount)s résultats)",
"Cancel": "Annuler",
"cancel all": "tout annuler",
"now. You can also select individual messages to resend or cancel.": "maintenant. Vous pouvez aussi sélectionner individuellement les messages que vous voulez renvoyer ou annuler.",
"Active call": "Appel en cours",
"code": "code",
"quote": "citer",
@ -642,7 +588,6 @@
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s a changé lavatar de %(roomName)s",
"Device already verified!": "Appareil déjà vérifié !",
"Export": "Exporter",
"Failed to register as guest:": "Échec de linscription en tant que visiteur :",
"Guest access is disabled on this Home Server.": "Laccès en tant que visiteur est désactivé sur ce serveur d'accueil.",
"Import": "Importer",
"Incorrect username and/or password.": "Nom dutilisateur et/ou mot de passe incorrect.",
@ -688,7 +633,6 @@
"Error: Problem communicating with the given homeserver.": "Erreur : problème de communication avec le homeserver.",
"Failed to fetch avatar URL": "Échec lors de la récupération de lURL de lavatar",
"The phone number entered looks invalid": "Le numéro de téléphone entré semble être invalide",
"This room is private or inaccessible to guests. You may be able to join if you register.": "Ce salon est privé ou interdits aux visiteurs. Vous pourrez peut-être le joindre si vous vous enregistrez.",
"Uploading %(filename)s and %(count)s others|zero": "Envoi de %(filename)s",
"Uploading %(filename)s and %(count)s others|one": "Envoi de %(filename)s et %(count)s autre",
"Uploading %(filename)s and %(count)s others|other": "Envoi de %(filename)s et %(count)s autres",
@ -711,7 +655,6 @@
"a room": "un salon",
"Accept": "Accepter",
"Active call (%(roomName)s)": "Appel en cours (%(roomName)s)",
"Admin tools": "Outils d'administration",
"Alias (optional)": "Alias (facultatif)",
"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.": "Impossible de se connecter au serveur d'accueil - veuillez vérifier votre connexion, assurez-vous que le <a>certificat SSL de votre serveur d'accueil</a> est un certificat de confiance, et qu'aucune extension du navigateur ne bloque les requêtes.",
"<a>Click here</a> to join the discussion!": "<a>Cliquer ici</a> pour rejoindre la discussion !",
@ -764,11 +707,9 @@
"Home": "Accueil",
"To link to a room it must have <a>an address</a>.": "Pour récupérer le lien vers un salon celui-ci doit avoir <a>une adresse</a>.",
"Upload new:": "Envoyer un nouveau :",
"And %(count)s more...": "Et %(count)s autres...",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Rejoindre en <voiceText>audio</voiceText> ou en <videoText>vidéo</videoText>.",
"Last seen": "Vu pour la dernière fois",
"Level:": "Niveau :",
"Set": "Défini",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (rang %(powerLevelNumber)s)",
"(could not connect media)": "(impossible de se connecter au média)",
"(no answer)": "(pas de réponse)",
@ -801,7 +742,6 @@
"Hide Apps": "Masquer les applications",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Masquer les messages d'arrivée/départ (n'affecte pas les invitations/exclusions/bannissements)",
"Hide avatar and display name changes": "Masquer les changements d'avatar et de nom affiché",
"Matrix Apps": "Applications Matrix",
"Revoke widget access": "Révoquer les accès du widget",
"Sets the room topic": "Défini le sujet du salon",
"Show Apps": "Afficher les applications",
@ -811,30 +751,14 @@
"You are not in this room.": "Vous n'êtes pas dans ce salon.",
"You do not have permission to do that in this room.": "Vous n'avez pas la permission d'effectuer cette action dans ce salon.",
"Autocomplete Delay (ms):": "Délai pour l'auto-complétion (ms) :",
"This Home server does not support groups": "Ce serveur d'accueil ne supporte pas les groupes",
"Loading device info...": "Chargement des informations de l'appareil...",
"Groups": "Groupes",
"Create a new group": "Créer un nouveau groupe",
"Create Group": "Créer le groupe",
"Group Name": "Nom du groupe",
"Example": "Exemple",
"Create": "Créer",
"Group ID": "Identifiant du groupe",
"+example:%(domain)s": "+exemple:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Les identifiants de groupe doivent être au format +partlocale:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Pour le moment, il n'est possible de créer des groupes que sur votre propre serveur d'accueil : utilisez un identifiant de groupe terminant par %(domain)s",
"Room creation failed": "Échec de création du salon",
"You are a member of these groups:": "Vous êtes membre des groupes suivants :",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Créez un groupe pour représenter votre communauté ! Définissez un jeu de salons et votre propre page d'accueil pour marquer votre espace dans l'univers Matrix.",
"Join an existing group": "Rejoindre un groupe existant",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Pour rejoindre un groupe existant, vous devez connaître l'identifiant de ce groupe ; il ressemblera à <i>+exemple:matrix.org</i>.",
"Featured Rooms:": "Salons mis en avant :",
"Error whilst fetching joined groups": "Erreur en récupérant la liste des groupes rejoints",
"Featured Users:": "Utilisateurs mis en avant :",
"Edit Group": "Modifier le groupe",
"Automatically replace plain text Emoji": "Remplacer automatiquement le texte par des Émoticônes",
"Failed to upload image": "Impossible d'envoyer l'image",
"Failed to update group": "Impossible de mettre à jour le groupe",
"Hide avatars in user and room mentions": "Masquer les avatars dans les mentions d'utilisateur et de salon",
"Do you want to load widget from URL:": "Voulez-vous charger le widget depuis lURL :",
"%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s ajouté par %(senderName)s",
@ -846,8 +770,6 @@
"NOTE: Apps are not end-to-end encrypted": "NOTE : Les applications ne sont pas chiffrées de bout en bout",
"AM": "AM",
"PM": "PM",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s %(day)s %(monthName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s %(monthName)s %(fullYear)s",
"Copied!": "Copié !",
"Failed to copy": "Échec de la copie",
"Verifies a user, device, and pubkey tuple": "Vérifie un utilisateur, un appareil et une clé publique",

View file

@ -15,14 +15,6 @@
"Remove": "Törlés",
"Settings": "Beállítások",
"unknown error code": "ismeretlen hiba kód",
"Sunday": "Vasárnap",
"Monday": "Hétfő",
"Tuesday": "Kedd",
"Wednesday": "Szerda",
"Thursday": "Csütörtök",
"Friday": "Péntek",
"Saturday": "Szombat",
"A registered account is required for this action": "Regisztrált fiókra van szükség ehhez a művelethez",
"a room": "egy szoba",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Elküldtük a szöveges üzenetet ide: +%(msisdn)s. Kérlek add meg az ellenőrző kódot ami benne van",
"Accept": "Elfogad",
@ -36,8 +28,7 @@
"Add email address": "E-mail cím megadása",
"Add phone number": "Telefonszám megadása",
"Admin": "Adminisztrátor",
"Admin Tools": "Admin. eszközök",
"And %(count)s more...": "És még %(count)s...",
"Admin Tools": "Admin. Eszközök",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Hiányzó Média jogosultság, kattintson ide az igényléshez.",
"No Microphones detected": "Nem található mikrofon",
@ -56,13 +47,9 @@
"Failed to change password. Is your password correct?": "Nem sikerült megváltoztatni a jelszót. Helyesen írtad be a jelszavadat?",
"Continue": "Folytatás",
"Create new room": "Új szoba létrehozása",
"sb": "Szorb",
"rm": "Rétoromán",
"tn": "Tswana",
"Close": "Bezár",
"Room directory": "Szobák listája",
"Start chat": "Csevegés indítása",
"and": "és",
"%(items)s and %(remaining)s others": "%(items)s és még: %(remaining)s",
"%(items)s and one other": "%(items)s és még egy",
"%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s",
@ -70,7 +57,6 @@
"and %(count)s others...|one": "és még egy...",
"%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak",
"%(names)s and one other are typing": "%(names)s és még valaki ír",
"%(names)s and %(count)s others are typing": "%(names)s és %(count)s ember ír",
"An email has been sent to": "Az e-mail ide lett küldve:",
"A new password must be entered.": "Új jelszót kell megadni.",
"%(senderName)s answered the call.": "%(senderName)s felvette a telefont.",
@ -141,7 +127,6 @@
"Decrypt %(text)s": "%(text)s visszafejtése",
"Decryption error": "Visszafejtési hiba",
"Delete": "Töröl",
"demote": "hozzáférési szint csökkentése",
"Default": "Alapértelmezett",
"Device already verified!": "Készülék már ellenőrizve!",
"Device ID": "Készülék azonosító",
@ -197,7 +182,6 @@
"Failed to load timeline position": "Az idővonal pozíciót nem sikerült betölteni",
"Failed to lookup current room": "Az aktuális szoba felkeresése sikertelen",
"Failed to mute user": "A felhasználót nem sikerült hallgatásra bírni",
"Failed to register as guest:": "Nem sikerült vendégként regisztrálni:",
"Failed to reject invite": "A meghívót nem sikerült elutasítani",
"Failed to reject invitation": "A meghívót nem sikerült elutasítani",
"Failed to save settings": "A beállításokat nem sikerült elmenteni",
@ -212,7 +196,6 @@
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailnél lévő linkre rákattintottál",
"Failure to create room": "Szoba létrehozása sikertelen",
"favourite": "kedvenc",
"Favourites": "Kedvencek",
"Fill screen": "Képernyő kitöltése",
"Filter room members": "Szoba tagság szűrése",
@ -224,7 +207,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Saját szerveren.",
"Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.",
"had": "van",
"Hangup": "Megszakít",
"Hide read receipts": "Olvasási visszajelzés elrejtése",
"Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése",
@ -256,8 +238,6 @@
"Sign in with": "Belépés ezzel:",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Csatlakozás <voiceText>hang</voiceText>gal vagy <videoText>videó</videoText>val.",
"Join Room": "Belépés a szobába",
"joined and left": "be-, és kilépett",
"joined": "belépett",
"%(targetName)s joined the room.": "%(targetName)s belépett a szobába.",
"Joins room with given alias": "A megadott becenévvel belépett a szobába",
"Jump to first unread message.": "Ugrás az első olvasatlan üzenetre.",
@ -267,8 +247,6 @@
"Labs": "Labor",
"Last seen": "Utoljára láttuk",
"Leave room": "Szoba elhagyása",
"left and rejoined": "ki-, és belépett",
"left": "kilépett",
"%(targetName)s left the room.": "%(targetName)s elhagyta a szobát.",
"Level:": "Szint:",
"Local addresses for this room:": "A szoba helyi címe:",
@ -296,7 +274,6 @@
"%(serverName)s Matrix ID": "%(serverName)s Matrix azonosítóm",
"Name": "Név",
"Never send encrypted messages to unverified devices from this device": "Soha ne küldj titkosított üzenetet ellenőrizetlen eszközre erről az eszközről",
"Never send encrypted messages to unverified devices in this room": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre",
"Never send encrypted messages to unverified devices in this room from this device": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre erről az eszközről",
"New address (e.g. #foo:%(localDomain)s)": "Új cím (e.g. #foo:%(localDomain)s)",
"New password": "Új jelszó",
@ -336,7 +313,6 @@
"Revoke Moderator": "Moderátor visszahívása",
"Refer a friend to Riot:": "Ismerős meghívása a Riotba:",
"Register": "Regisztráció",
"rejected": "elutasítva",
"%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.",
"Reject invitation": "Meghívó elutasítása",
"Rejoin": "Újracsatlakozás",
@ -347,7 +323,6 @@
"Remove %(threePid)s?": "Töröl: %(threePid)s?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.",
"Report it": "Jelent",
"restore": "visszaállít",
"Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból",
"Return to app": "Vissza az alkalmazáshoz",
"Return to login screen": "Vissza a bejelentkezési képernyőre",
@ -386,7 +361,6 @@
"Session ID": "Kapcsolat azonosító",
"%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a megjelenítési nevét megváltoztatta erre: %(displayName)s.",
"Set": "Beállít",
"Show panel": "Panel megjelenítése",
"Show Text Formatting Toolbar": "Szöveg formázási eszköztár megjelenítése",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Az időbélyegek 12 órás formátumban mutatása (pl.: 2:30pm)",
@ -404,7 +378,6 @@
"Start Chat": "Csevegés indítása",
"Submit": "Elküld",
"Success": "Sikeres",
"tag direct chat": "megjelölés közvetlen csevegésnek",
"Tagged as: ": "Címkék: ",
"The default role for new room members is": "Az alapértelmezett szerep új tagoknak:",
"The main address for this room is": "A szoba elsődleges címe:",
@ -431,14 +404,10 @@
"This room": "Ebben a szobában",
"This room is not accessible by remote Matrix servers": "Ez a szoba távoli Matrix szerverről nem érhető el",
"This room's internal ID is": "A szoba belső azonosítója:",
"times": "alkalommal",
"to browse the directory": "a könyvtárban való kereséshez",
"to favourite": "kedvencekhez",
"To link to a room it must have <a>an address</a>.": "Szobához való kötéshez szükséges <a>egy cím</a>.",
"to make a room or": "szoba létrehozásához vagy",
"To reset your password, enter the email address linked to your account": "A jelszó alaphelyzetbe állításához add meg a fiókodhoz kötött e-mail címet",
"to restore": "visszaállításhoz",
"to start a chat with someone": "csevegés indításához valakivel",
"to tag direct chat": "megjelölni közvetlen csevegésnek",
"To use it, just wait for autocomplete results to load and tab through them.": "A használatához csak várd meg az automatikus kiegészítéshez a találatok betöltését és TAB-bal választhatsz közülük.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nincs jogod a kérdéses üzenetek megjelenítéséhez.",
@ -524,7 +493,6 @@
"You have <a>enabled</a> URL previews by default.": "Az URL előnézet alapból <a>engedélyezve</a> van.",
"You have no visible notifications": "Nincsenek látható értesítéseid",
"You may wish to login with a different account, or add this email to this account.": "Lehet, hogy más fiókba szeretnél belépni vagy ezt az e-mail címet szeretnéd ehhez a fiókhoz kötni.",
"you must be a": "szükséges szerep:",
"You must <a>register</a> to use this functionality": "<a>Regisztrálnod kell</a> hogy ezt használhasd",
"You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.",
"You need to be logged in.": "Be kell jelentkezz.",
@ -585,7 +553,6 @@
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "Most <a>újraküldöd mind</a> vagy <a>eldobod mind</a>. Újraküldésre vagy eldobásra egyenként is kiválaszthatod az üzeneteket.",
"(~%(count)s results)|one": "(~%(count)s db eredmény)",
"(~%(count)s results)|other": "(~%(count)s db eredmény)",
"or": "vagy",
"Active call": "Folyamatban lévő hívás",
"bold": "félkövér",
"italic": "dőlt",
@ -776,7 +743,6 @@
"Hide Apps": "Alkalmazások elrejtése",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Belép/kilép üzenetek elrejtése (meghívók, kirúgások, kitiltások nem érintettek)",
"Hide avatar and display name changes": "Profilkép és megjelenítési név változás üzenetek elrejtése",
"Matrix Apps": "Mátrix alkalmazások",
"AM": "de",
"PM": "du",
"Revoke widget access": "Kisalkalmazás hozzáférésének visszavonása",
@ -789,30 +755,14 @@
"You do not have permission to do that in this room.": "Nincs jogod ezt tenni ebben a szobában.",
"Verifies a user, device, and pubkey tuple": "A felhasználó, eszköz és publikus kulcs hármas ellenőrzése",
"Autocomplete Delay (ms):": "Várakozás automatikus kiegészítés előtt (ms):",
"This Home server does not support groups": "Ez a saját szerver nem támogatja a csoportokat",
"Loading device info...": "Eszköz információk betöltése...",
"Groups": "Csoportok",
"Create a new group": "Új csoport létrehozása",
"Create Group": "Csoport létrehozása",
"Group Name": "Csoport neve",
"Example": "Példa",
"Create": "Létrehoz",
"Group ID": "Csoport azonosító",
"+example:%(domain)s": "+példa:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "A csoport azonosítónak az alábbi formában kell lennie: +helyirész:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Egyenlőre csoportokat csak a saját szerveren lehet létrehozni: használd a csoport azonosítót a %(domain)s végződéssel",
"Room creation failed": "Szoba létrehozás sikertelen",
"You are a member of these groups:": "Ezeknek a csoportoknak vagy a tagja:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Hozz létre csoportot a közösség meghatározásához! Jelölj ki szobákat és saját kezdőoldalt amivel meghatározhatod a territóriumodat a Matrix univerzumában.",
"Join an existing group": "Csatlakozz meglévő csoporthoz",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Ahhoz, hogy meglévő csoporthoz csatlakozhass tudnod kell a csoport azonosítóját ami valahogy így nézhet ki: <i>+example:matrix.org</i>.",
"Featured Rooms:": "Kiemelt szobák:",
"Error whilst fetching joined groups": "Hiba a csatlakozott csoportok betöltésénél",
"Featured Users:": "Kiemelt felhasználók:",
"Edit Group": "Csoport szerkesztése",
"Automatically replace plain text Emoji": "Egyszerű szöveg automatikus cseréje Emoji-ra",
"Failed to upload image": "Kép feltöltése sikertelen",
"Failed to update group": "Csoport frissítése sikertelen",
"Hide avatars in user and room mentions": "Profilképek elrejtése felhasználó és szoba említésekben",
"Cannot add any more widgets": "Nem lehet több kisalkalmazást hozzáadni",
"Do you want to load widget from URL:": "Betöltöd a kisalkalmazást erről az URL-ről:",
@ -824,8 +774,133 @@
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s eltávolította",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot ellenőrzés az asztali verzióban nem érhető el - használd a <a>web böngészőt</a>",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s módosította",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s %(monthName)s %(day)s",
"Copied!": "Lemásolva!",
"Failed to copy": "Sikertelen másolás"
"Failed to copy": "Sikertelen másolás",
"Advanced options": "További beállítások",
"Block users on other matrix homeservers from joining this room": "Felhasználók szobába való belépésének megakadályozása távoli szerverekről",
"This setting cannot be changed later!": "Ezt a beállítást később nem lehet megváltoztatni!",
"Ignored Users": "Figyelmen kívül hagyott felhasználók",
"Ignore": "Figyelmen kívül hagy",
"Unignore": "Figyelembe vesz",
"User Options": "Felhasználói beállítások",
"You are now ignoring %(userId)s": "Most figyelmen kívül hagyod: %(userId)s",
"You are no longer ignoring %(userId)s": "Ismét figyelembe veszed: %(userId)s",
"Unignored user": "Figyelembe vett felhasználó",
"Ignored user": "Figyelmen kívül hagyott felhasználó",
"Stops ignoring a user, showing their messages going forward": "Felhasználót újra figyelembe vesszük és megmutatjuk az új üzeneteit",
"Ignores a user, hiding their messages from you": "Felhasználó figyelmen kívül hagyásával elrejtheted az üzeneteit magad elől",
"Disable Emoji suggestions while typing": "Emoji ajánlások kikapcsolása gépelés közben",
"Banned by %(displayName)s": "Kitiltotta: %(displayName)s",
"Message removed by %(userId)s": "Üzenetet törölte: %(userId)s",
"To send messages, you must be a": "Ahhoz, hogy üzenetet tudj küldeni, neked ilyen szinten kell lenned:",
"To invite users into the room, you must be a": "Hogy meghívj valakit a szobába, ilyen szinten kell lenned:",
"To configure the room, you must be a": "A szoba beállításához ilyen szinten kell lenned:",
"To kick users, you must be a": "Felhasználó kirúgásához ilyen szinten kell lenned:",
"To ban users, you must be a": "Felhasználó kizárásához ilyen szinten kell lenned:",
"To remove other users' messages, you must be a": "Más üzenetének a törléséhez ilyen szinten kell lenned:",
"To send events of type <eventType/>, you must be a": "<eventType/> esemény küldéséhez ilyen szinten kell lenned:",
"To change the room's avatar, you must be a": "A szoba avatar-jának a megváltoztatásához ilyen szinten kell lenned:",
"To change the room's name, you must be a": "A szoba nevének megváltoztatásához ilyen szinten kell lenned:",
"To change the room's main address, you must be a": "A szoba elsődleges címének a megváltoztatásához ilyen szinten kell lenned:",
"To change the room's history visibility, you must be a": "A szoba naplója elérhetőségének a megváltoztatásához ilyen szinten kell lenned:",
"To change the permissions in the room, you must be a": "A szobában a jogosultság megváltoztatásához ilyen szinten kell lenned:",
"To change the topic, you must be a": "A téma megváltoztatásához ilyen szinten kell lenned:",
"To modify widgets in the room, you must be a": "A szoba kisalkalmazásainak megváltoztatásához ilyen szinten kell lenned:",
"Description": "Leírás",
"Name or matrix ID": "Név vagy Matrix azonosító",
"Unable to accept invite": "A meghívót nem lehet elfogadni",
"Unable to leave room": "A szobát nem lehet elhagyni",
"Leave": "Elhagy",
"Failed to invite the following users to %(groupId)s:": "Az alábbi felhasználókat nem sikerült meghívni a(z) %(groupId)s:",
"Failed to invite users to %(groupId)s": "Nem sikerült meghívni a felhasználókat ebbe a csoportba: %(groupId)s",
"Unable to reject invite": "Nem sikerül elutasítani a meghívót",
"Leave %(groupName)s?": "Elhagyod a csoportot: %(groupName)s?",
"Add a Room": "Szoba hozzáadása",
"Add a User": "Felhasználó hozzáadása",
"Who would you like to add to this summary?": "Kit szeretnél hozzáadni ehhez az összefoglalóhoz?",
"Add to summary": "Összefoglalóhoz adás",
"Failed to add the following users to the summary of %(groupId)s:": "Az alábbi felhasználókat nem sikerült hozzáadni a(z) %(groupId)s csoport összefoglalójához:",
"Which rooms would you like to add to this summary?": "Melyik szobákat szeretnéd hozzáadni ehhez az összefoglalóhoz?",
"Room name or alias": "Szoba neve vagy beceneve",
"Failed to add the following rooms to the summary of %(groupId)s:": "Az alábbi szobákat nem sikerült hozzáadni a(z) %(groupId)s csoport összefoglalójához:",
"Failed to remove the room from the summary of %(groupId)s": "Az alábbi szobákat nem sikerült eltávolítani a(z) %(groupId)s csoport összefoglalójából",
"The room '%(roomName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a szobát: '%(roomName)s'.",
"Failed to remove a user from the summary of %(groupId)s": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "Nem sikerült törölni az összefoglalóból ezt a felhasználót: %(groupId)s.",
"Light theme": "Világos téma",
"Dark theme": "Sötét téma",
"Unknown": "Ismeretlen",
"Failed to add the following rooms to %(groupId)s:": "Az alábbi szobákat nem sikerült hozzáadni a(z) %(groupId)s csoporthoz:",
"Matrix ID": "Matrix azonosító",
"Matrix Room ID": "Szoba Matrix azonosító",
"email address": "E-mail cím",
"Try using one of the following valid address types: %(validTypesList)s.": "Próbáld meg valamelyik érvényes cím típust: %(validTypesList)s.",
"You have entered an invalid address.": "Érvénytelen címet adtál meg.",
"Failed to remove '%(roomName)s' from %(groupId)s": "A(z) %(groupId)s csoportból nem sikerült törölni: %(roomName)s",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Biztos, hogy törlöd a(z) %(roomName)s szobát a(z) %(groupId)s csoportból?",
"Invites sent": "Meghívó elküldve",
"Jump to read receipt": "Olvasási visszaigazolásra ugrás",
"Disable big emoji in chat": "Nagy emoji-k tiltása a csevegésben",
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Itt nincs senki más! Szeretnél <a>meghívni másokat</a> vagy <a>ne figyelmeztessünk az üres szobával kapcsolatban</a>?",
"Message Pinning": "Üzenet kitűzése",
"Remove avatar": "Avatar törlése",
"Pinned Messages": "Kitűzött üzenetek",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s megváltoztatta a szoba kitűzött szövegeit.",
"Who would you like to add to this community?": "Kit szeretnél hozzáadni ehhez a közösséghez?",
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden személy akit hozzáadsz a közösséghez mindenki számára látható lesz aki ismeri a közösség azonosítóját",
"Invite new community members": "Új tagok meghívása a közösségbe",
"Invite to Community": "Meghívás a közösségbe",
"Which rooms would you like to add to this community?": "Melyik szobákat szeretnéd hozzáadni a közösséghez?",
"Warning: any room you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden szoba amit a közösséghez adsz látható lesz bárki számára aki ismeri a közösség azonosítóját",
"Add rooms to the community": "Szobák hozzáadása a közösséghez",
"Add to community": "Hozzáadás a közösséghez",
"Your community invitations have been sent.": "Elküldtük a közösségi meghívókat.",
"Failed to invite users to community": "Nem sikerült tagokat meghívni a közösségbe",
"Communities": "Közösségek",
"Unpin Message": "Üzenet levétele",
"Jump to message": "Üzenetre ugrás",
"No pinned messages.": "Nincsenek kitűzött üzenetek.",
"Loading...": "Betöltés...",
"Unnamed room": "Névtelen szoba",
"World readable": "Nyilvános",
"Guests can join": "Vendégek is csatlakozhatnak",
"No rooms to show": "Nincsenek megjelenítendő szobák",
"Invalid community ID": "Érvénytelen közösségi azonosító",
"'%(groupId)s' is not a valid community ID": "%(groupId)s nem egy érvényes közösségi azonosító",
"Related Communities": "Kapcsolódó közösségek",
"Related communities for this room:": "Kapcsolódó közösségek ehhez a szobához:",
"This room has no related communities": "Ebben a szobában nincsenek kapcsolódó közösségek",
"New community ID (e.g. +foo:%(localDomain)s)": "Új közösségi azonosító (pl.: +foo:%(localDomain)s)",
"Remove from community": "Elküldés a közösségből",
"Failed to remove user from community": "Nem sikerült elküldeni felhasználót a közösségből",
"Filter community members": "Közösségi tagok szűrése",
"Filter community rooms": "Közösségi szobák szűrése",
"Failed to remove room from community": "Nem sikerült kivenni a szobát a közösségből",
"Removing a room from the community will also remove it from the community page.": "A szoba kivétele a közösségből törölni fogja a közösség oldaláról is.",
"Community IDs may only contain alphanumeric characters": "A közösségi azonosító csak alfanumerikus karaktereket tartalmazhat",
"Create Community": "Új közösség",
"Community Name": "Közösség neve",
"Community ID": "Közösség azonosító",
"Add rooms to the community summary": "Szobák hozzáadása a közösségi összefoglalóhoz",
"Add users to the community summary": "Felhasználók hozzáadása a közösségi összefoglalóhoz",
"Failed to update community": "Közösség frissítése sikertelen",
"Leave Community": "Közösség elhagyása",
"Add rooms to this community": "Szobák hozzáadása ehhez a közösséghez",
"%(inviter)s has invited you to join this community": "%(inviter)s meghívott ebbe a közösségbe",
"You are a member of this community": "Tagja vagy ennek a közösségnek",
"You are an administrator of this community": "Adminisztrátora vagy ennek a közösségnek",
"Community Member Settings": "Közösségi tag beállítások",
"Publish this community on your profile": "Közösség publikálása a profilodon",
"Long Description (HTML)": "Hosszú leírás (HTML)",
"Community Settings": "Közösségi beállítások",
"Community %(groupId)s not found": "%(groupId)s közösség nem található",
"This Home server does not support communities": "Ez a saját szerver nem támogatja a közösségeket",
"Error whilst fetching joined communities": "Hiba a csatlakozott közösségek betöltésénél",
"Create a new community": "Új közösség létrehozása",
"Create a community to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Közösséged megjelenítéséhez hozz létre egy közösséget! Add meg a szobákat és az egyedi kezdő oldaladat amivel kijelölheted a helyed a Matrix univerzumban.",
"Join an existing community": "Meglévő közösséghez csatlakozás",
"To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Ahhoz hogy csatlakozni tudj egy meglévő közösséghez ismerned kell a közösségi azonosítót ami például így nézhet ki: <i>+pelda:matrix.org</i>.",
"example": "példa",
"Failed to load %(groupId)s": "Nem sikerült betölteni: %(groupId)s",
"Your Communities": "Közösségeid"
}

View file

@ -10,7 +10,6 @@
"Microphone": "Mikrofon",
"Camera": "Kamera",
"Alias (optional)": "Alias (pilihan)",
"and": "dan",
"Are you sure?": "Anda yakin?",
"An error has occurred.": "Telah terjadi kesalahan.",
"Are you sure you want to reject the invitation?": "Anda yakin menolak undangannya?",
@ -57,7 +56,6 @@
"Failed to reject invitation": "Gagal menolak undangan",
"Failed to send email": "Gagal mengirim email",
"Favourite": "Favorit",
"favourite": "favorit",
"Favourites": "Favorit",
"Forgot your password?": "Lupa password?",
"Found a bug?": "Menemukan bug?",
@ -66,8 +64,6 @@
"Invalid Email Address": "Alamat email tidak benar",
"Invited": "Diundang",
"Sign in with": "Masuk dengan",
"joined": "bergabung",
"joined and left": "bergabung dan berpisah",
"Leave room": "Meninggalkan ruang",
"Level:": "Tingkat:",
"Login as guest": "Masuk sebagai tamu",
@ -95,7 +91,6 @@
"Public Chat": "Obrolan Publik",
"Reason": "Alasan",
"Register": "Registrasi",
"rejected": "ditolak",
"Report it": "Laporkan",
"Return to app": "Kembali ke aplikasi",
"riot-web version:": "riot-web versi:",
@ -112,7 +107,6 @@
"Server error": "Server bermasalah",
"Session ID": "ID Sesi",
"Settings": "Pengaturan",
"Set": "Isi",
"Show panel": "Tampilkan panel",
"Sign in": "Masuk",
"Sign out": "Keluar",
@ -122,13 +116,11 @@
"Success": "Sukses",
"This email address was not found": "Alamat email ini tidak ada",
"This room": "Ruang ini",
"times": "kali",
"Turn Markdown off": "Matikan Markdown",
"Unable to add email address": "Tidak dapat menambahkan alamat email",
"Unable to verify email address.": "Tidak dapat memverifikasi alamat email.",
"Unable to load device list": "Tidak dapat memuat daftar perangkat",
"unencrypted": "tidak terenkripsi",
"Unknown command": "Perintah tidak diketahui",
"unknown error code": "kode kesalahan tidak diketahui",
"unknown device": "perangkat tidak diketahui",
"User ID": "ID Pengguna",
@ -170,7 +162,6 @@
"Active call (%(roomName)s)": "Panggilan aktif (%(roomName)s)",
"Admin": "Admin",
"Admin Tools": "Alat admin",
"And %(count)s more...": "Dan %(count)s lagi...",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Tidak ada Izin Media, klik disini untuk meminta.",
"No Webcams detected": "Tidak ada Webcam terdeteksi",
@ -180,15 +171,12 @@
"Hide removed messages": "Sembunyikan pesan yang dihapus",
"Always show message timestamps": "Selalu tampilkan cap waktu dari pesan",
"Authentication": "Autentikasi",
"and one other...": "dan satu lainnya...",
"An email has been sent to": "Sebuah email telah dikirim ke",
"Are you sure you want to leave the room '%(roomName)s'?": "Anda yakin ingin meninggalkan ruang '%(roomName)s'?",
"A new password must be entered.": "Password baru harus diisi.",
"%(names)s and one other are typing": "%(names)s dan satu lagi sedang mengetik",
"%(items)s and %(lastItem)s": "%(items)s dan %(lastItem)s",
"%(names)s and %(lastPerson)s are typing": "%(names)s dan %(lastPerson)s sedang mengetik",
"%(names)s and %(count)s others are typing": "%(names)s dan %(count)s lainnya sedang mengetik",
"and %(overflowCount)s others...": "dan %(overflowCount)s lainnya...",
"%(items)s and %(remaining)s others": "%(items)s dan %(remaining)s lainnya",
"%(items)s and one other": "%(items)s dan satu lainnya",
"%(senderName)s answered the call.": "%(senderName)s telah menjawab panggilan.",

View file

@ -17,13 +17,6 @@
"Dismiss": "Scarta",
"Error": "Errore",
"Favourite": "Preferito",
"Sunday": "Domenica",
"Monday": "Lunedì",
"Tuesday": "Martedì",
"Wednesday": "Mercoledì",
"Thursday": "Giovedì",
"Friday": "Venerdì",
"Saturday": "Sabato",
"OK": "OK",
"Drop here %(toAction)s": "Rilascia qui %(toAction)s",
"Failed to change password. Is your password correct?": "Modifica password fallita. La tua password è corretta?",
@ -52,11 +45,6 @@
"Always show message timestamps": "Mostra sempre il timestamps dei messaggi",
"Authentication": "Autenticazione",
"Alias (optional)": "Alias (opzionale)",
"all room members": "Tutti i membri della stanza",
"all room members, from the point they are invited": "Tutti i membri della stanza, dal punto in cui sono stati/e invitati/e",
"all room members, from the point they joined": "tutti i membri della stanza, dal punto in cui si sono uniti",
"and": "e",
"Add a widget": "Aggiungi un widget",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un messaggio di testo è stato inviato a +%(msisdn)s. Inserisci il codice di verifica che contiene",
"and": "e"
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un messaggio di testo è stato inviato a +%(msisdn)s. Inserisci il codice di verifica che contiene"
}

View file

@ -13,7 +13,6 @@
"Enable encryption": "暗号会話開始",
"Encryption is enabled in this room": "この部屋の発言は暗号化されています",
"Favourite": "お気に入り",
"favourite": "お気に入り",
"Favourites": "お気に入り",
"Hide read receipts": "発言を読んでも既読状態にしない",
"Invited": "招待中",
@ -30,13 +29,6 @@
"Settings": "設定",
"Start chat": "対話開始",
"New Password": "新しいパスワード",
"Sunday": "日曜日",
"Monday": "月曜日",
"Tuesday": "火曜日",
"Wednesday": "水曜日",
"Thursday": "木曜日",
"Friday": "金曜日",
"Saturday": "土曜日",
"Failed to change password. Is your password correct?": "パスワード変更に失敗しました。パスワードは正しいですか?",
"Only people who have been invited": "この部屋に招待された人のみ参加可能",
"Hide removed messages": "削除された発言の印を表示しない",
@ -65,6 +57,5 @@
"No Webcams detected": "カメラが見つかりません",
"Microphone": "マイク",
"Camera": "カメラ",
"%(names)s and %(count)s others are typing": "%(names)s と、他 %(count)s 名が入力中",
"Are you sure?": "本当によろしいですか?"
}

View file

@ -14,13 +14,6 @@
"Settings": "설정",
"Start chat": "이야기하기",
"unknown error code": "알 수 없는 오류 코드",
"Sunday": "일요일",
"Monday": "월요일",
"Tuesday": "화요일",
"Wednesday": "수요일",
"Thursday": "목요일",
"Friday": "금요일",
"Saturday": "토요일",
"OK": "알았어요",
"Continue": "게속하기",
"a room": "방",
@ -44,7 +37,6 @@
"Always show message timestamps": "항상 메시지에 시간을 보이기",
"Authentication": "인증",
"Alias (optional)": "별명 (선택)",
"and": "그리고",
"A new password must be entered.": "새 비밀번호를 입력해주세요.",
"An error has occurred.": "오류가 일어났어요.",
"Anyone": "누구나",
@ -85,15 +77,12 @@
"Favourite": "즐겨찾기",
"Operation failed": "작업 실패",
"Failed to change password. Is your password correct?": "비밀번호를 바꾸지 못했어요. 이 비밀번호가 정말 맞으세요?",
"sl": "슬로베니아어",
"sq": "알바니아어",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s로 문자 메시지를 보냈어요. 인증 번호를 입력해주세요",
"%(targetName)s accepted an invitation.": "%(targetName)s님이 초대를 수락했어요.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s님이 %(displayName)s님에게서 초대를 수락했어요.",
"Access Token:": "접근 토큰:",
"Active call (%(roomName)s)": "(%(roomName)s)에서 전화를 걸고 받을 수 있어요",
"Add a topic": "주제 추가",
"And %(count)s more...": "그리고 %(count)s 더 보기...",
"Missing Media Permissions, click here to request.": "저장소 권한을 잃었어요, 여기를 눌러 다시 요청해주세요.",
"You may need to manually permit Riot to access your microphone/webcam": "수동으로 라이엇에 마이크와 카메라를 허용해야 할 수도 있어요",
"%(items)s and %(remaining)s others": "%(items)s과 %(remaining)s",
@ -103,7 +92,6 @@
"and %(count)s others...|other": "그리고 %(count)s...",
"%(names)s and %(lastPerson)s are typing": "%(names)s님과 %(lastPerson)s님이 입력중",
"%(names)s and one other are typing": "%(names)s님과 다른 분이 입력중",
"%(names)s and %(count)s others are typing": "%(names)s님과 %(count)s 분들이 입력중",
"An email has been sent to": "이메일을 보냈어요",
"%(senderName)s answered the call.": "%(senderName)s님이 전화를 받았어요.",
"Anyone who knows the room's link, apart from guests": "손님을 제외하고, 방의 주소를 아는 누구나",
@ -152,7 +140,6 @@
"Decrypt %(text)s": "해독 %(text)s",
"Decryption error": "해독 오류",
"Delete": "지우기",
"demote": "등급 낮추기",
"Deops user with given id": "받은 ID로 사용자의 등급을 낮추기",
"Device ID:": "장치 ID:",
"Device key:": "장치 키:",
@ -196,7 +183,6 @@
"Failed to load timeline position": "타임라인 위치를 불러오지 못했어요",
"Failed to lookup current room": "현재 방을 찾지 못했어요",
"Failed to mute user": "사용자의 알림을 끄지 못했어요",
"Failed to register as guest:": "손님으로 등록하지 못했어요:",
"Failed to reject invite": "초대를 거절하지 못했어요",
"Failed to reject invitation": "초대를 거절하지 못했어요",
"Failed to save settings": "설정을 저장하지 못했어요",
@ -211,7 +197,6 @@
"Failed to upload profile picture!": "자기 소개에 사진을 올리지 못했어요!",
"Failed to verify email address: make sure you clicked the link in the email": "이메일 주소를 확인하지 못했어요: 메일의 주소를 눌렀는지 확인해보세요",
"Failure to create room": "방을 만들지 못했어요",
"favourite": "즐겨찾기",
"Favourites": "즐겨찾기",
"Fill screen": "화면 채우기",
"Filter room members": "방 구성원 거르기",
@ -223,7 +208,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s를 %(fromPowerLevel)s에서 %(toPowerLevel)s로",
"Guest access is disabled on this Home Server.": "손님은 이 홈 서버에 접근하실 수 없어요.",
"Guests cannot join this room even if explicitly invited.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.",
"had": "했어요",
"Hangup": "전화 끊기",
"Hide read receipts": "읽음 확인 표시 숨기기",
"Hide Text Formatting Toolbar": "문자 서식 도구 숨기기",
@ -256,8 +240,6 @@
"Sign in with": "로그인",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText>음성</voiceText> 또는 <videoText>영상</videoText>으로 참여하세요.",
"Join Room": "방에 들어가기",
"joined and left": "들어왔다가 떠남",
"joined": "들어옴",
"%(targetName)s joined the room.": "%(targetName)s님이 방에 들어오셨어요.",
"Joins room with given alias": "받은 가명으로 방에 들어가기",
"Jump to first unread message.": "읽지 않은 첫 메시지로 이동할래요.",
@ -267,8 +249,6 @@
"Labs": "실험실",
"Last seen": "마지막으로 본 곳",
"Leave room": "방 떠나기",
"left and rejoined": "떠났다가 다시 들어옴",
"left": "떠났음",
"%(targetName)s left the room.": "%(targetName)s님이 방을 떠나셨어요.",
"Level:": "등급:",
"Local addresses for this room:": "이 방의 로컬 주소:",
@ -295,7 +275,6 @@
"Must be viewing a room": "방을 둘러봐야만 해요",
"Name": "이름",
"Never send encrypted messages to unverified devices from this device": "이 장치에서 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"Never send encrypted messages to unverified devices in this room": "이 방에서 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"Never send encrypted messages to unverified devices in this room from this device": "이 장치에서 이 방의 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요",
"New address (e.g. #foo:%(localDomain)s)": "새 주소 (예. #foo:%(localDomain)s)",
"New password": "새 비밀번호",
@ -340,7 +319,6 @@
"Revoke Moderator": "조정자 철회",
"Refer a friend to Riot:": "라이엇을 친구에게 추천해주세요:",
"Register": "등록하기",
"rejected": "거절함",
"%(targetName)s rejected the invitation.": "%(targetName)s님이 초대를 거절하셨어요.",
"Reject invitation": "초대 거절",
"Rejoin": "다시 들어가기",
@ -351,7 +329,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s님이 인터넷전화 회의를 요청하셨어요.",
"Report it": "보고하기",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 다시 설정하면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.",
"restore": "복구하기",
"Results from DuckDuckGo": "덕덕고에서 검색한 결과",
"Return to app": "앱으로 돌아가기",
"Return to login screen": "로그인 화면으로 돌아가기",
@ -389,7 +366,6 @@
"Server unavailable, overloaded, or something else went wrong.": "서버를 쓸 수 없거나 과부하거나, 다른 문제가 있어요.",
"Session ID": "세션 ID",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s님이 별명을 %(displayName)s로 바꾸셨어요.",
"Set": "설정하기",
"Show panel": "패널 보이기",
"Show Text Formatting Toolbar": "문자 서식 도구 보이기",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "시간을 12시간제로 보이기 (예. 오후 2:30)",
@ -407,7 +383,6 @@
"Start Chat": "이야기하기",
"Submit": "보내기",
"Success": "성공",
"tag direct chat": "직접 이야기 지정하기",
"Tagged as: ": "지정함: ",
"The default role for new room members is": "방 새 구성원의 기본 역할",
"The main address for this room is": "이 방의 주요 주소",
@ -432,15 +407,11 @@
"This room": "이 방",
"This room is not accessible by remote Matrix servers": "이 방은 원격 매트릭스 서버에 접근할 수 없어요",
"This room's internal ID is": "방의 내부 ID",
"times": "번",
"to browse the directory": "목록에서 찾으려면",
"to demote": "우선순위 낮추기",
"to favourite": "즐겨찾기",
"To link to a room it must have <a>an address</a>.": "방에 연결하려면 <a>주소</a>가 있어야 해요.",
"to make a room or": "방을 만들거나 혹은",
"To reset your password, enter the email address linked to your account": "비밀번호을 다시 설정하려면, 계정과 연결한 이메일 주소를 입력해주세요",
"to restore": "복구하려면",
"to start a chat with someone": "다른 사람과 이야기하기",
"to tag direct chat": "직접 이야기를 지정하려면",
"To use it, just wait for autocomplete results to load and tab through them.": "이 기능을 사용하시려면, 자동완성 결과가 나오길 기다리신 뒤에 탭으로 움직여주세요.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 문제의 메시지를 볼 수 있는 권한이 없어요.",
@ -513,7 +484,6 @@
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "초대를 <acceptText>받아들이거나</acceptText> <declineText>거절</declineText>하시겠어요?",
"You already have existing direct chats with this user:": "이미 이 사용자와 직접 이야기하는 중이에요:",
"You are already in a call.": "이미 자신이 통화 중이네요.",
"You're not in any rooms yet! Press": "어떤 방에도 들어가 있지 않으세요! 누르세요",
"Press <StartChatButton> to start a chat with someone": "다른 사람과 이야기하려면 <StartChatButton>을 누르세요",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "주의: 키 확인 실패! %(userId)s와 장치 %(deviceId)s의 서명 키 \"%(fprint)s\"는 주어진 키 \"%(fingerprint)s\"와 맞지 않아요. 누가 이야기를 가로채는 중일 수도 있어요!",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "어떤 방에도 들어가 있지 않으세요! <CreateRoomButton>을 눌러서 방을 만들거나 <RoomDirectoryButton>를 눌러 목록에서 방을 찾아보세요",
@ -529,12 +499,10 @@
"You have <a>enabled</a> URL previews by default.": "URL 미리보기 <a>쓰기</a>를 기본으로 하셨어요.",
"You have no visible notifications": "보여드릴 알림이 없어요",
"You may wish to login with a different account, or add this email to this account.": "다른 계정으로 로그인하거나, 이 이메일을 이 계정에 추가할 수도 있어요.",
"you must be a": "해야해요",
"You must <a>register</a> to use this functionality": "이 기능을 쓰시려면 <a>계정을 등록</a>하셔야 해요",
"You need to be able to invite users to do that.": "그러려면 사용자를 초대하실 수 있어야 해요.",
"You need to be logged in.": "로그인하셔야 해요.",
"You need to enter a user name.": "사용자 이름을 입력하셔야 해요.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "이 장치에 종단간 암호화 키를 만들고 공개 키를 홈 서버에 보내려면 다시 로그인해야해요. 한 번만 하시면 돼요. 불편을 드려 죄송합니다.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "이메일 주소가 이 홈 서버의 매트릭스 ID와 관련이 없어요.",
"Your password has been reset": "비밀번호를 다시 설정했어요",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "비밀번호를 바꾸었어요. 다른 장치에서 다시 로그인할 때까지 알림을 받지 않을 거에요",
@ -588,7 +556,6 @@
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>전부 다시 보내거나</a> <a>취소하세요</a>. 다시 보내거나 취소할 메시지를 하나씩 고르실 수도 있어요.",
"(~%(count)s results)|one": "(~%(count)s 결과)",
"(~%(count)s results)|other": "(~%(count)s 결과)",
"or": "혹은",
"Active call": "전화 중",
"bold": "굵은 획",
"italic": "기울임꼴",

View file

@ -13,7 +13,6 @@
"Add phone number": "Pievieno tālruņa numuru",
"Admin": "Administrators",
"Admin Tools": "Administratora rīki",
"And %(count)s more...": "Un vēl %(count)s citi...",
"VoIP": "VoIP",
"Missing Media Permissions, click here to request.": "Nav pieejas medija saturam. Klikšķini šeit, lai pieprasītu.",
"No Microphones detected": "Mikrofoni nav atrasti",
@ -29,15 +28,11 @@
"Always show message timestamps": "Vienmēr rādīt ziņojumu laika zīmogu",
"Authentication": "Autentifikācija",
"Alias (optional)": "Aizstājējvārds (neobligāts)",
"and": "un",
"%(items)s and %(remaining)s others": "%(items)s un %(remaining)s citi",
"%(items)s and one other": "%(items)s un viens cits",
"%(items)s and %(lastItem)s": "%(items)s un %(lastItem)s",
"and %(overflowCount)s others...": "un %(overflowCount)s citi...",
"and one other...": "un viens cits...",
"%(names)s and %(lastPerson)s are typing": "%(names)s un %(lastPerson)s raksta",
"%(names)s and one other are typing": "%(names)s un viens cits raksta",
"%(names)s and %(count)s others are typing": "%(names)s un %(count)s citi raksta",
"An email has been sent to": "Epasts tika nosūtīts",
"A new password must be entered.": "Nepieciešams ievadīt jauno paroli.",
"%(senderName)s answered the call.": "%(senderName)s atbildēja zvanam.",
@ -110,7 +105,6 @@
"Decrypt %(text)s": "Atšifrēt %(text)s",
"Decryption error": "Atšifrēšanas kļūda",
"Delete": "Dzēst",
"demote": "samazināt",
"Deops user with given id": "Noņemt operatora statusu lietotājam ar norādīto id",
"Default": "Noklusējuma",
"Device already verified!": "Ierīce ir jau verificēta!",
@ -173,7 +167,6 @@
"Failed to load timeline position": "Neizdevās ielādēt laikpaziņojumu pozīciju",
"Failed to lookup current room": "Neizdevās pārlūkot pašreizējo istabu",
"Failed to mute user": "Neizdevās apklusināt lietotāju",
"Failed to register as guest:": "Neizdevās reģistrēt kā viesi:",
"Failed to reject invite": "Neizdevās noraidīt uzaicinājumu",
"Failed to reject invitation": "Neizdevās noraidīt uzaicinājumu",
"Failed to save settings": "Neizdevās saglabāt uzstādījumus",
@ -189,7 +182,6 @@
"Failed to verify email address: make sure you clicked the link in the email": "Neizdevās apstiprināt epasta adresi. Pārbaudi, vai Tu esi noklikšķinājis/usi saiti epasta ziņā",
"Failure to create room": "Neizdevās izveidot istabu",
"Favourite": "Favorīts",
"favourite": "favorīts",
"Favourites": "Favorīti",
"Fill screen": "Aizpildīt ekrānu",
"Filter room members": "Filtrēt istabas biedrus",
@ -201,7 +193,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Šajā serverī viesu pierakstīšanās nav iespējama.",
"Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai pat ja ir uzaicināti.",
"had": "bija",
"Hangup": "Aizturēt",
"Hide read receipts": "Slēpt izlasītās receptes",
"Hide Text Formatting Toolbar": "Slēpt teksta formatēšanas rīkjoslu",
@ -233,8 +224,6 @@
"Sign in with": "Pierakstīties ar",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Pievienoties kā <voiceText>balss</voiceText> vai <videoText>video</videoText>.",
"Join Room": "Pievienoties istabai",
"joined and left": "pievienojās un atstāja",
"joined": "pievienojās",
"%(targetName)s joined the room.": "%(targetName)s pievienojās istabai.",
"Joins room with given alias": "Pievieno istabai ar uzdoto aizstājējvārdu",
"Jump to first unread message.": "Pārlekt uz pirmo neizlasīto ziņu.",
@ -244,8 +233,6 @@
"Labs": "Laboratorija",
"Last seen": "Pēdējo reizi redzēts/a",
"Leave room": "Pamest istabu",
"left and rejoined": "atstāja un pievienojās atkārtoti",
"left": "atstāja",
"%(targetName)s left the room.": "%(targetName)s atstāja istabu.",
"Level:": "Līmenis:",
"Local addresses for this room:": "Šīs istabas lokālās adreses:",
@ -277,7 +264,6 @@
"%(serverName)s Matrix ID": "%(serverName)s Matrix ID",
"Name": "Vārds",
"Never send encrypted messages to unverified devices from this device": "Nekad nesūti no šīs ierīces šifrētas ziņas uz neverificētām ierīcēm",
"Never send encrypted messages to unverified devices in this room": "Nekad nesūti šifrētas ziņas uz neverificētām ierīcēm šajā istabā",
"Never send encrypted messages to unverified devices in this room from this device": "Nekad nesūti no šīs ierīces šifrētas ziņas neverificētām ierīcēm šajā istabā",
"New address (e.g. #foo:%(localDomain)s)": "Jauna adrese (piemēram #kautkas:%(localDomain)s)",
"New password": "Jauna parole",
@ -321,7 +307,6 @@
"Revoke Moderator": "Atcelt moderatoru",
"Refer a friend to Riot:": "Nosūtīt draugu uz Riot:",
"Register": "Reģistrēties",
"rejected": "noraidīts",
"%(targetName)s rejected the invitation.": "%(targetName)s noraidīja uzaicinājumu.",
"Reject invitation": "Noraidīt uzaicinājumu",
"Rejoin": "Pievienoties atkārtoti",
@ -334,7 +319,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s vēlas VoIP konferenci.",
"Report it": "Ziņot par to",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles atiestatīšana atiestatīs visas ierīce-ierīce šifrēšanas atslēgas visās ierīcēs, padarot čata šifrēto ziņu vēsturi nelasāmu, ja vien Tu pirms tam neesi eksportējis savas istabas atslēgas un atkārtoti importējis tās atpakaļ. Nākotnē šo ir plānots uzlabot.",
"restore": "atjaunot",
"Results from DuckDuckGo": "Rezultāti no DuckDuckGo",
"Return to app": "Atgriezties aplikācijā",
"Return to login screen": "Atgriezties uz pierakstīšanās lapu",
@ -462,7 +446,6 @@
"Server may be unavailable, overloaded, or you hit a bug.": "Serveris var nebūt pieejams, ir pārslogots, vai arī sastapi neparedzētu kļūdu.",
"Server unavailable, overloaded, or something else went wrong.": "Serveris nav pieejams, ir pārslogots, vai arī ir notikusi cita, neparedzēta, kļūda.",
"Session ID": "Sesijas identifikators (ID)",
"Set": "Iestatīt",
"Settings": "Iestatījumi",
"Show panel": "Rādīt paneli",
"Show Text Formatting Toolbar": "Rādīt teksta formatēšanas rīkjoslu",
@ -481,7 +464,6 @@
"Start Chat": "Sākt čatu",
"Submit": "Iesniegt",
"Success": "Veiksmīgi",
"tag direct chat": "atzīmēt tiešo čatu",
"Tagged as: ": "Atzīmēts,kā: ",
"The main address for this room is": "Galvenā šīs istabas adrese ir",
"The phone number entered looks invalid": "Ievadītais telefona numurs izskatās nepareizs",
@ -501,15 +483,11 @@
"This room": "Šī istaba",
"This room is not accessible by remote Matrix servers": "Šī istaba nav pieejama no attālinātajiem Matrix serveriem",
"This room's internal ID is": "Šīs istabas iekšējais ID ir",
"times": "reizes",
"to browse the directory": "lai pārlūkotu katalogu",
"to demote": "lai samazinātu",
"to favourite": "lai pievienotu favorītiem",
"To link to a room it must have <a>an address</a>.": "Lai ieliktu saiti uz istabu, tai ir jābūt piešķirtai <a>adresei</a>.",
"to make a room or": "lai izveidotu istabu vai",
"To reset your password, enter the email address linked to your account": "Lai atiestatītu savu paroli, ievadi tavam kontam piesaistīto epasta adresi",
"to restore": "lai atjaunotu",
"to start a chat with someone": "lai uzstāktu čatu ar kādu",
"to tag direct chat": "lai pieliktu birku tiešajam čatam",
"To use it, just wait for autocomplete results to load and tab through them.": "Lai to izmantotu, vienkārši gaidi, kamēr ielādējas automātiski ieteiktie rezultāti, un pārvietojies caur tiem.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Notika mēģinājums ielādēt šīs istabas specifisku laikpaziņojumu sadaļu, bet Tev nav atļaujas skatīt šo ziņu.",
@ -526,7 +504,6 @@
"unencrypted": "nešifrēts",
"Unencrypted message": "Nešifrēta ziņa",
"unknown caller": "nezināms zvanītājs",
"Unknown command": "Nezināma komanda",
"unknown device": "nezināma ierīce",
"unknown error code": "nezināms kļūdas kods",
"Unknown (user, device) pair:": "Nezināms (lietotājs, ierīce) pāris:",
@ -587,7 +564,6 @@
"You do not have permission to post to this room": "Tev nav vajadzīgās atļaujas pievienot ziņas šajā istabā",
"You have <a>disabled</a> URL previews by default.": "URL priekšskatījums pēc noklusējuma Tev ir <a>atspējots</a>.",
"You may wish to login with a different account, or add this email to this account.": "Tu varētu, iespējams, vēlēties pierakstīties no cita konta vai piesaistīt šo epastu šim kontam.",
"you must be a": "Tev ir jābūt",
"You must <a>register</a> to use this functionality": "Lai izmantotu šo funkcionalitāti, Tev ir <a>jāreģistrējas</a>",
"You need to be able to invite users to do that.": "Lai to darītu, Tev ir jāspēj uzaicināt lietotājus.",
"You need to be logged in.": "Tev ir jāpierakstās.",
@ -639,15 +615,7 @@
"Connectivity to the server has been lost.": "Savienojums ar serveri tika zaudēts.",
"Sent messages will be stored until your connection has returned.": "Nosūtītās ziņas tiks saglabātas tiklīdz savienojums tiks atjaunots.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Sūtīt vēlreiz visas</a> vai <a>atcelt visas</a>. Tu vari arī atlasīt atsevišķas ziņas, kuras sūtīt vai atcelt.",
"or": "vai",
"Active call": "Aktīvs zvans",
"Monday": "Pirmdiena",
"Tuesday": "Otrdiena",
"Wednesday": "Trešdiena",
"Thursday": "Ceturtdiena",
"Friday": "Piektdiena",
"Saturday": "Sestdiena",
"Sunday": "Svētdiena",
"bold": "trekns",
"italic": "itāļu",
"strike": "svītrots",
@ -779,7 +747,6 @@
"Hide avatar and display name changes": "Slēpt profila attēlu un rādīt redzamā vārda izmaiņas",
"Integrations Error": "Integrācijas kļūda",
"Publish this room to the public in %(domain)s's room directory?": "Publicēt šo istabu publiskajā %(domain)s katalogā?",
"Matrix Apps": "Matrix Aplikācijas",
"AM": "AM",
"PM": "PZ",
"NOTE: Apps are not end-to-end encrypted": "PIEZĪME: Aplikācijās nav ierīce-ierīce šifrēšanas",
@ -793,30 +760,14 @@
"You do not have permission to do that in this room.": "Tev nav atļaujas šai darbībai šajā istabā.",
"Verifies a user, device, and pubkey tuple": "Verificē lietotāju, ierīci, un publiskās atslēgas",
"Autocomplete Delay (ms):": "Automātiskās aizpildīšanas aiztures laiks (ms):",
"This Home server does not support groups": "Šis serveris neatbalsta grupas",
"Loading device info...": "Ielādē ierīces informāciju...",
"Groups": "Grupas",
"Create a new group": "Izveidot jaunu grupu",
"Create Group": "Izveidot grupu",
"Group Name": "Grupas nosaukums",
"Example": "Piemērs",
"Create": "Izveidot",
"Group ID": "Grupas ID",
"+example:%(domain)s": "+example:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Grupas ID ir jābūt sekojošā formātā: +localpart:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Vienīgi ir iespējams izveidot grupas tavā serverī: izmanto grupas ID, kurš beidzas ar %(domain)s",
"Room creation failed": "Neizdevās izveidot istabu",
"You are a member of these groups:": "Tu esi sekojošo grupu biedrs:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Izveido grupu, lai prezentētu savu komūnu! Definē istabu grupu un savu personīgo mājaslapu, lai iezīmētu savu vietu Matrix universumā.",
"Join an existing group": "Pievienoties eksistējošai grupai",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Lai pievienotos eksistējošai grupai, Tev ir jāzina šīs grupas identifikators. Piemēram: <i>+latvija:matrix.org</i>.",
"Featured Rooms:": "Ieteiktās istabas:",
"Error whilst fetching joined groups": "Notika kļūda, nosakot pievienotās grupas",
"Featured Users:": "Ieteiktie lietotāji:",
"Edit Group": "Labot grupu",
"Automatically replace plain text Emoji": "Automātiski aizvieto tekstu ar emocijikonu (emoji)",
"Failed to upload image": "Neizdevās augšupielādēt attēlu",
"Failed to update group": "Neizdevās atjaunināt grupu",
"Hide avatars in user and room mentions": "Slēpt profila attēlus lietotāja un istabas pieminējumatzīmēs (@mention)",
"%(widgetName)s widget added by %(senderName)s": "%(senderName)s pievienoja %(widgetName)s vidžetu",
"%(widgetName)s widget removed by %(senderName)s": "%(senderName)s dzēsa vidžetu %(widgetName)s",

View file

@ -18,13 +18,6 @@
"Settings": "സജ്ജീകരണങ്ങള്‍",
"Start chat": "ചാറ്റ് തുടങ്ങുക",
"unknown error code": "അപരിചിത എറര്‍ കോഡ്",
"Sunday": "ഞായര്‍",
"Monday": "തിങ്കള്‍",
"Tuesday": "ചൊവ്വ",
"Wednesday": "ബുധന്‍",
"Thursday": "വ്യാഴം",
"Friday": "വെള്ളി",
"Saturday": "ശനി",
"OK": "ശരി",
"Failed to change password. Is your password correct?": "രഹസ്യവാക്ക് മാറ്റാന്‍ സാധിച്ചില്ല. രഹസ്യവാക്ക് ശരിയാണോ ?",
"Continue": "മുന്നോട്ട്",

View file

@ -1,6 +1,5 @@
{
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Voer alsjeblieft de verificatiecode in die is verstuurd naar +%(msisdn)s",
"accept": "accepteer",
"%(targetName)s accepted an invitation.": "%(targetName)s heeft een uitnodiging geaccepteerd.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s heeft de uitnodiging voor %(displayName)s geaccepteerd.",
"Account": "Account",
@ -12,8 +11,6 @@
"Algorithm": "Algoritme",
"Always show message timestamps": "Laat altijd tijdstempels van berichten zien",
"Authentication": "Authenticatie",
"an address": "een adres",
"and": "en",
"%(items)s and %(remaining)s others": "%(items)s en %(remaining)s andere",
"%(items)s and one other": "%(items)s en één andere",
"%(items)s and %(lastItem)s": "%(items)s en %(lastItem)s",
@ -21,7 +18,6 @@
"and %(count)s others...|one": "en één andere...",
"%(names)s and %(lastPerson)s are typing": "%(names)s en %(lastPerson)s zijn aan het typen",
"%(names)s and one other are typing": "%(names)s en één andere zijn aan het typen",
"%(names)s and %(count)s others are typing": "%(names)s en %(count)s andere zijn aan het typen",
"An email has been sent to": "Er is een e-mail verzonden naar",
"A new password must be entered.": "Er moet een nieuw wachtwoord worden ingevoerd.",
"%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audiogesprek.",
@ -30,7 +26,6 @@
"Anyone who knows the room's link, including guests": "Iedereen die de kamerlink weet, inclusief gasten",
"Are you sure?": "Weet je het zeker?",
"Are you sure you want to reject the invitation?": "Weet je zeker dat je de uitnodiging wilt weigeren?",
"Are you sure you want upload the following files?": "Weet je zeker dat je de volgende bestanden wilt uploaden?",
"Attachment": "Bijlage",
"Autoplay GIFs and videos": "Start GIFs en videos automatisch",
"%(senderName)s banned %(targetName)s.": "%(senderName)s heeft %(targetName)s verbannen.",
@ -41,7 +36,6 @@
"Bug Report": "Bug report",
"Bulk Options": "Bulk opties",
"Call Timeout": "Gesprek time-out",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Kan niet met de homeserver verbinden - controleer alsjeblieft je verbinding en wees zeker dat je <a>homeserver's SSL certificaat</a> vertrouwd wordt.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of <a>activeer onveilige scripts</a>.",
"Can't load user settings": "Kan de gebruikersinstellingen niet laden",
"Change Password": "Wachtwoord veranderen",
@ -55,7 +49,6 @@
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde chat geschiedenis onleesbaar zou maken, behalve als je eerst je kamer sleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.",
"Clear Cache and Reload": "Legen cache en herlaad",
"Clear Cache": "Legen cache",
"Click here": "Klik hier",
"Click here to fix": "Klik hier om op te lossen",
"Click to mute audio": "Klik om audio te dempen",
"Click to mute video": "Klik om de video te dempen",
@ -79,7 +72,6 @@
"Add": "Toevoegen",
"Add a topic": "Een onderwerp toevoegen",
"Admin Tools": "Beheerhulpmiddelen",
"And %(count)s more...": "Nog %(count)s andere...",
"VoIP": "VoiP",
"Missing Media Permissions, click here to request.": "Ontbrekende mediatoestemmingen, klik hier om aan te vragen.",
"No Microphones detected": "Geen microfoons gevonden",
@ -113,13 +105,6 @@
"Settings": "Instellingen",
"Start chat": "Gesprek starten",
"unknown error code": "onbekende foutcode",
"Sunday": "Zondag",
"Monday": "Maandag",
"Tuesday": "Dinsdag",
"Wednesday": "Woensdag",
"Thursday": "Donderdag",
"Friday": "Vrijdag",
"Saturday": "Zaterdag",
"Search": "Zoeken",
"OK": "OK",
"Failed to change password. Is your password correct?": "Wachtwoord wijzigen mislukt. Is uw wachtwoord juist?",
@ -158,7 +143,6 @@
"Revoke Moderator": "Beheerder terugtrekken",
"Refer a friend to Riot:": "Laat een vriend weten over Riot:",
"Register": "Registreren",
"rejected": "verworpen",
"%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.",
"Reject invitation": "Uitnodiging weigeren",
"Rejoin": "Opnieuw toetreden",
@ -170,7 +154,6 @@
"Start Chat": "Gesprek starten",
"Submit": "Bevestigen",
"Success": "Gereed",
"tag direct chat": "Privéchat labelen",
"Tagged as: ": "Gelabeld als: ",
"Sun": "Zo",
"Mon": "Ma",
@ -212,7 +195,6 @@
"Decrypt %(text)s": "Ontsleutel %(text)s",
"Decryption error": "Ontsleutelfout",
"Delete": "Verwijderen",
"demote": "degraderen",
"Device already verified!": "Apparaat reeds geverifieerd!",
"Device ID": "Apparaat ID",
"Device ID:": "Apparaat ID:",
@ -270,7 +252,6 @@
"Failed to load timeline position": "Niet gelukt om de tijdlijnpositie te laden",
"Failed to lookup current room": "Niet gelukt om de huidige ruimte op te zoeken",
"Failed to mute user": "Niet gelukt om de gebruiker te dempen",
"Failed to register as guest:": "Niet gelukt om als gast te registreren:",
"Failed to reject invite": "Niet gelukt om de uitnodiging te weigeren",
"Failed to reject invitation": "Niet gelukt om de uitnodiging te weigeren",
"Failed to save settings": "Niet gelukt om de instellingen op te slaan",
@ -285,7 +266,6 @@
"Failed to upload profile picture!": "Niet gelukt om een profiel foto te uploaden!",
"Failed to verify email address: make sure you clicked the link in the email": "Niet gelukt om het e-mailadres te verifiëren: wees er zeker van dat je de link in de e-mail hebt aangeklikt",
"Failure to create room": "Het aanmaken van een ruimte is mislukt",
"favourite": "favoriet",
"Favourites": "Favorieten",
"Fill screen": "Scherm vullen",
"Filter room members": "Ruimteleden filteren",
@ -297,7 +277,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Gasttoegang is uitgeschakeld op deze thuisserver.",
"Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.",
"had": "had",
"Hangup": "Ophangen",
"Hide read receipts": "Leesbewijzen verbergen",
"Hide Text Formatting Toolbar": "Tekstopmaakgereedschapsbalk verbergen",
@ -329,16 +308,12 @@
"Sign in with": "Inloggen met",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Toetreden als <voiceText>spraak</voiceText> of <videoText>video</videoText>.",
"Join Room": "Ruimte toetreden",
"joined and left": "Toegetreden en verlaten",
"joined": "Toegetreden",
"%(targetName)s joined the room.": "%(targetName)s in de ruimte toegetreden.",
"Joins room with given alias": "Treed de ruimte toe met een gegeven naam",
"Jump to first unread message.": "Spring naar het eerste ongelezen bericht.",
"Labs": "Labs",
"Last seen": "Laatst gezien",
"Leave room": "Ruimte verlaten",
"left and rejoined": "verlaten en opnieuw toegetreden",
"left": "verlaten",
"%(targetName)s left the room.": "%(targetName)s heeft de ruimte verlaten.",
"Level:": "Niveau:",
"Local addresses for this room:": "Lokale adressen voor deze ruimte:",
@ -362,7 +337,6 @@
"Mobile phone number": "Mobiele-telefoonnummer",
"Mobile phone number (optional)": "Mobiele-telefoonnummer (optioneel)",
"Never send encrypted messages to unverified devices from this device": "Nooit versleutelde berichten vanaf dit apparaat naar niet geverifieerde apparaten versturen",
"Never send encrypted messages to unverified devices in this room": "Nooit versleutelde berichten naar niet geverifieerde apparaten sturen in deze ruimte",
"Never send encrypted messages to unverified devices in this room from this device": "Nooit vanaf dit apparaat versleutelde berichten naar niet geverifieerde apparaten in deze ruimte sturen",
"New address (e.g. #foo:%(localDomain)s)": "Nieuw adres (bijv. #foo:%(localDomain)s)",
"New passwords don't match": "Nieuwe wachtwoorden komen niet overeen",
@ -381,7 +355,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.",
"Report it": "Melden",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.",
"restore": "herstellen",
"Results from DuckDuckGo": "Resultaten van DuckDuckGo",
"Return to app": "Naar de app terugkeren",
"Return to login screen": "Naar het inlogscherm terugkeren",
@ -422,7 +395,6 @@
"Kicks user with given id": "Stuurt de gebruiker met het gegeven ID er uit",
"%(senderName)s set a profile picture.": "%(senderName)s heeft een profielfoto ingesteld.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam naar %(displayName)s veranderd.",
"Set": "Instellen",
"Show panel": "Paneel weergeven",
"Show Text Formatting Toolbar": "Tekstopmaakwerkbalk Weergeven",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Laat de tijd in twaalf uur formaat zien (bijv. 2:30pm)",
@ -458,15 +430,11 @@
"This room": "Deze ruimte",
"This room is not accessible by remote Matrix servers": "Deze ruimte is niet toegankelijk voor afgelegen Matrix-servers",
"This room's internal ID is": "Het interne ID van deze ruimte is",
"times": "keer",
"to browse the directory": "om de catalogus door te bladeren",
"to demote": "om te degraderen",
"to favourite": "om aan favorieten toe te voegen",
"To link to a room it must have <a>an address</a>.": "Om naar een ruimte te linken moet het <a>een adres</a> hebben.",
"to make a room or": "om een ruimte te maken of",
"To reset your password, enter the email address linked to your account": "Voer het e-mailadres dat met je account verbonden is in om je wachtwoord opnieuw in te stellen",
"to restore": "om te herstellen",
"to start a chat with someone": "om een gesprek met iemand te starten",
"to tag direct chat": "als directe chat etiketteren",
"To use it, just wait for autocomplete results to load and tab through them.": "Om het te gebruiken, wacht tot de automatisch aangevulde resultaten geladen zijn en tab er doorheen.",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Je probeerde een specifiek punt in de tijdlijn van deze ruimte te laden maar je hebt niet de permissie om de desbetreffende berichten te zien.",
@ -488,7 +456,6 @@
"unencrypted": "ontsleuteld",
"Unencrypted message": "Niet-versleuteld bericht",
"unknown caller": "onbekende beller",
"Unknown command": "Onbekende commando",
"unknown device": "Onbekend apparaat",
"Unknown room %(roomId)s": "Onbekende ruimte %(roomId)s",
"Unknown (user, device) pair:": "Onbekend (gebruiker, apparaat) paar:",
@ -555,7 +522,6 @@
"You have <a>enabled</a> URL previews by default.": "Je hebt URL-voorvertoningen standaard <a>aangezet</a>.",
"You have no visible notifications": "Je hebt geen zichtbare notificaties",
"You may wish to login with a different account, or add this email to this account.": "Je wilt misschien met een ander account inloggen of deze e-mail aan je account toevoegen.",
"you must be a": "wat je moet zijn is een",
"You must <a>register</a> to use this functionality": "Je moet je <a>registreren</a> om deze functionaliteit te gebruiken",
"You need to be able to invite users to do that.": "Je moet bevoegd zijn om gebruikers uit te nodigen om dat te doen.",
"You need to be logged in.": "Je moet ingelogd zijn.",
@ -590,7 +556,6 @@
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Verstuur alle</a> of <a>annuleer alle</a> nu. Je kan ook individuele berichten selecteren om te versturen of te annuleren.",
"(~%(count)s results)|one": "(~%(count)s resultaat)",
"(~%(count)s results)|other": "(~%(count)s resultaten)",
"or": "of",
"Active call": "Actief gesprek",
"bold": "vetgedrukt",
"italic": "schuingedrukt",
@ -782,7 +747,6 @@
"Hide avatar and display name changes": "Avatar en weergavenaam wijzigingen verbergen",
"Integrations Error": "Integratiesfout",
"Publish this room to the public in %(domain)s's room directory?": "Deze ruimte publiekelijk maken in %(domain)s's ruimte catalogus?",
"Matrix Apps": "Matrix Apps",
"AM": "AM",
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "OPMERKING: Apps zijn niet end-to-endbeveiligd",
@ -797,37 +761,19 @@
"You do not have permission to do that in this room.": "Je hebt geen permissie om dat te doen in deze ruimte.",
"Verifies a user, device, and pubkey tuple": "Verifieert een gebruiker, apparaat en pubkey tupel",
"Autocomplete Delay (ms):": "Automatisch-aanvullen-vertraging (ms):",
"This Home server does not support groups": "Deze thuisserver ondersteunt geen groepen",
"Loading device info...": "Apparaat info aan het laden...",
"Groups": "Groepen",
"Create a new group": "Maak een nieuwe groep",
"Create Group": "Groep Aanmaken",
"Group Name": "Groepsnaam",
"Example": "Voorbeeld",
"Create": "Creëer",
"Group ID": "Groeps-ID",
"+example:%(domain)s": "+voorbeeld:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Groeps-IDs moeten er als +lokaalgedeelte:%(domain)s uit zien",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Het is momenteel mogelijk om groepen op je eigen thuisserver aan te maken: gebruik een groeps-ID dat eindigt met %(domain)s",
"Room creation failed": "Het aanmaken van de ruimte is niet gelukt",
"You are a member of these groups:": "Je bent een deelnemer van deze groepen:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Maak een groep aan om je gemeenschap te representateren! Defineer een set van ruimtes en maak je eigen aangepaste homepagina om je eigen plek in het Matrix-universum te creëren.",
"Join an existing group": "Treed tot een bestaande groep toe",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Om tot een bestaande groep toe te treden moet je groepsidentificatie weten; dit zal er ongeveer uit zien als <i>+voorbeeld:matrix.org</i>.",
"Featured Rooms:": "Prominente Ruimtes:",
"Error whilst fetching joined groups": "Er is een fout opgetreden tijdens het ophalen van de tot toegretreden groepen",
"Featured Users:": "Prominente Gebruikers:",
"Edit Group": "Groep Wijzigen",
"Automatically replace plain text Emoji": "Automatisch normale tekst vervangen met Emoji",
"Failed to upload image": "Het is niet gelukt om de afbeelding te uploaden",
"Failed to update group": "Het is niet gelukt om de groep bij te werken",
"Hide avatars in user and room mentions": "Avatars in gebruiker- en ruimte-vermeldingen verbergen",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget toegevoegd door %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget verwijderd door %(senderName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot-check is momenteel niet beschikbaar op de desktop - gebruik in plaats daarvan een <a>webbrowser</a>",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget aangepast door %(senderName)s",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s %(day)s %(monthName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s %(monthName)s %(fullYear)s",
"Copied!": "Gekopieerd!",
"Failed to copy": "Kopiëren mislukt"
}

View file

@ -31,14 +31,6 @@
"Room directory": "Spis pokojów",
"Start chat": "Rozpocznij rozmowę",
"Create new room": "Utwórz nowy pokój",
"Sunday": "Niedziela",
"Wednesday": "Środa",
"Thursday": "Czwartek",
"Friday": "Piątek",
"Saturday": "Sobota",
"Monday": "Poniedziałek",
"Tuesday": "Wtorek",
"or": "lub",
"Cancel": "Anuluj",
"Room": "Pokój",
"Topic": "Temat",
@ -79,7 +71,6 @@
"Camera": "Kamera",
"Algorithm": "Algorytm",
"Hide removed messages": "Ukryj usunięte wiadomości",
"and": "i",
"Are you sure?": "Czy jesteś pewien?",
"Attachment": "Załącznik",
"Banned users": "Zbanowani użytkownicy",
@ -120,7 +111,6 @@
"Add email address": "Dodaj adres e-mail",
"Admin": "Administrator",
"Admin Tools": "Narzędzia administracyjne",
"And %(count)s more...": "Oraz %(count)s więcej...",
"VoIP": "VoIP (połączenie głosowe)",
"No Microphones detected": "Nie wykryto żadnego mikrofonu",
"No Webcams detected": "Nie wykryto żadnej kamerki internetowej",
@ -134,11 +124,8 @@
"%(items)s and %(remaining)s others": "%(items)s i %(remaining)s innych",
"%(items)s and one other": "%(items)s i jeszcze jeden",
"%(items)s and %(lastItem)s": "%(items)s i %(lastItem)s",
"and %(overflowCount)s others...": "i %(overflowCount)s innych...",
"and one other...": "i jeszcze jeden...",
"%(names)s and %(lastPerson)s are typing": "%(names)s i %(lastPerson)s piszą",
"%(names)s and one other are typing": "%(names)s i jeszcze ktoś piszą",
"%(names)s and %(count)s others are typing": "%(names)s i %(count)s innych osób pisze",
"An email has been sent to": "Wysłano wiadomość e-mail do",
"A new password must be entered.": "Musisz wprowadzić nowe hasło.",
"%(senderName)s answered the call.": "%(senderName)s odebrał połączenie.",
@ -168,9 +155,6 @@
"Cannot add any more widgets": "Nie można dodać już więcej widżetów",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s zmienił swoją nazwę z %(oldDisplayName)s na %(displayName)s.",
"%(senderName)s changed their profile picture.": "%(senderName)s zmienił swoje zdjęcie profilowe.",
"fo": "Farerski",
"rm": "Retoromański",
"tn": "Tswana",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom mocy %(powerLevelDiffText)s.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.",
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął nazwę pokoju.",
@ -207,7 +191,6 @@
"Decrypt %(text)s": "Odszyfruj %(text)s",
"Decryption error": "Błąd odszyfrowywania",
"Delete widget": "Usuń widżet",
"demote": "zdegraduj",
"Default": "Domyślny",
"Define the power level of a user": "Zdefiniuj poziom mocy użytkownika",
"Device already verified!": "Urządzenie jest już zweryfikowane!",
@ -266,7 +249,6 @@
"Failed to load timeline position": "Nie udało się wczytać pozycji osi czasu",
"Failed to lookup current room": "Nie udało się wyszukać aktualnego pokoju",
"Failed to mute user": "Nie udało się wyciszyć użytkownika",
"Failed to register as guest:": "Nie udało się zarejestrować jako gość:",
"Failed to reject invite": "Nie udało się odrzucić zaproszenia",
"Failed to reject invitation": "Nie udało się odrzucić zaproszenia",
"Failed to save settings": "Nie udało się zapisać ustawień",
@ -281,7 +263,6 @@
"Failed to upload profile picture!": "Nie udało się wgrać zdjęcia profilowego!",
"Failed to verify email address: make sure you clicked the link in the email": "Nie udało się zweryfikować adresu e-mail: upewnij się że kliknąłeś w link w e-mailu",
"Failure to create room": "Nie udało się stworzyć pokoju",
"favourite": "ulubiony",
"Favourites": "Ulubione",
"Fill screen": "Wypełnij ekran",
"Filter room members": "Filtruj uczestników pokoju",
@ -325,8 +306,6 @@
"Sign in with": "Zaloguj się używając",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Dołącz <voiceText>głosowo</voiceText> lub przez <videoText>wideo</videoText>.",
"Join Room": "Dołącz do pokoju",
"joined and left": "dołączył i wyszedł",
"joined": "dołączył",
"%(targetName)s joined the room.": "%(targetName)s dołączył do pokoju.",
"Joins room with given alias": "Dołącz do pokoju o podanym aliasie",
"Jump to first unread message.": "Przeskocz do pierwszej nieprzeczytanej wiadomości.",
@ -336,8 +315,6 @@
"Labs": "Laboratoria",
"Last seen": "Ostatnio widziany",
"Leave room": "Opuść pokój",
"left and rejoined": "wyszedł i ponownie dołączył",
"left": "wyszedł",
"%(targetName)s left the room.": "%(targetName)s opuścił pokój.",
"Level:": "Poziom:",
"Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokojów domeny %(domain)s?",
@ -355,7 +332,6 @@
"Markdown is disabled": "Markdown jest wyłączony",
"Markdown is enabled": "Markdown jest włączony",
"matrix-react-sdk version:": "Wersja matrix-react-sdk:",
"Matrix Apps": "Aplikacje Matrix",
"Members only": "Tylko dla członków",
"Message not sent due to unknown devices being present": "Wiadomość nie została wysłana z powodu obecności nieznanych urządzeń",
"Missing room_id in request": "Brakujące room_id w żądaniu",
@ -366,7 +342,6 @@
"%(serverName)s Matrix ID": "%(serverName)s Matrix ID",
"Name": "Imię",
"Never send encrypted messages to unverified devices from this device": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia",
"Never send encrypted messages to unverified devices in this room": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych urządzeń w tym pokoju",
"Never send encrypted messages to unverified devices in this room from this device": "Nigdy nie wysyłaj niezaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia",
"New address (e.g. #foo:%(localDomain)s)": "Nowy adres (np. #foo:%(localDomain)s)",
"New password": "Nowe hasło",
@ -391,7 +366,6 @@
"Once you've followed the link it contains, click below": "Po kliknięciu łącza, które jest tam zawarte kliknij poniżej",
"Only people who have been invited": "Tylko ludzie, którzy zostali zaproszeni",
"Otherwise, <a>click here</a> to send a bug report.": "W przeciwnym razie, <a>kliknij tutaj</a> by wysłać raport o błędzie.",
"had": "był",
"Password": "Hasło",
"Password:": "Hasło:",
"Passwords can't be empty": "Hasła nie mogą być puste",
@ -413,7 +387,6 @@
"Revoke widget access": "Usuń dostęp do widżetów",
"Refer a friend to Riot:": "Zaproś znajomego do Riota:",
"Register": "Zarejestruj",
"rejected": "odrzucone",
"%(targetName)s rejected the invitation.": "%(targetName)s odrzucił zaproszenie.",
"Reject invitation": "Odrzuć zaproszenie",
"Rejoin": "Dołącz ponownie",
@ -425,7 +398,6 @@
"Hide Apps": "Ukryj aplikacje",
"%(senderName)s requested a VoIP conference.": "%(senderName)s zażądał grupowego połączenia głosowego VoIP.",
"Report it": "Zgłoś",
"restore": "przywróć",
"Results from DuckDuckGo": "Wyniki z DuckDuckGo",
"Return to app": "Wróć do aplikacji",
"Return to login screen": "Wróć do ekranu logowania",
@ -468,7 +440,6 @@
"Session ID": "Identyfikator sesji",
"%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.",
"Set": "Ustaw",
"Sets the room topic": "Ustaw temat pokoju",
"Show Apps": "Pokaż aplikacje",
"Show panel": "Pokaż panel",
@ -488,7 +459,6 @@
"Start Chat": "Rozpocznij rozmowę",
"Submit": "Wyślij",
"Success": "Sukces",
"tag direct chat": "oznaczył bezpośrednią rozmowę",
"Tagged as: ": "Oznaczone jako: ",
"The default role for new room members is": "Domyślną rolą dla nowych członków pokoju jest",
"The main address for this room is": "Głównym adresem dla tego pokoju jest",
@ -498,7 +468,6 @@
"This email address is already in use": "Podany adres e-mail jest już w użyciu",
"This email address was not found": "Podany adres e-mail nie został znaleziony",
"%(actionVerb)s this person?": "%(actionVerb)s tą osobę?",
"changing room on a RoomView is not supported": "Zmiana pokoju na RoomView nie jest obsługiwana",
"Must be viewing a room": "Musi być w trakcie wyświetlania pokoju",
"The email address linked to your account must be entered.": "Musisz wpisać adres e-mail połączony z twoim kontem.",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Rozmiar folderu '%(fileName)s' przekracza możliwy limit do przesłania na serwer domowy",
@ -514,14 +483,10 @@
"This room": "Ten pokój",
"This room is not accessible by remote Matrix servers": "Ten pokój nie jest dostępny na zdalnych serwerach Matrix",
"This room's internal ID is": "Wewnętrzne ID tego pokoju to",
"times": "razy",
"to browse the directory": "żeby przeglądać katalog",
"to demote": "żeby zmniejszyć priorytet",
"To get started, please pick a username!": "Aby rozpocząć, wybierz nazwę użytkownika!",
"to make a room or": "żeby utworzyć pokój lub",
"To reset your password, enter the email address linked to your account": "Aby zresetować swoje hasło, wpisz adres e-mail powiązany z twoim kontem",
"to restore": "żeby przywrócić",
"to start a chat with someone": "żeby zacząć rozmowę z kimś",
"to tag direct chat": "żeby oznaczyć rozmowę bezpośrednią",
"Turn Markdown off": "Wyłącz Markdown",
"Turn Markdown on": "Włącz Markdown",
@ -598,7 +563,6 @@
"You have <a>disabled</a> URL previews by default.": "Masz domyślnie <a>wyłączone</a> podglądy linków.",
"You have no visible notifications": "Nie masz widocznych powiadomień",
"You may wish to login with a different account, or add this email to this account.": "Możesz chcieć zalogować się z innego konta lub dodać e-mail do tego konta.",
"you must be a": "musisz być",
"You must <a>register</a> to use this functionality": "Musisz się <a>zarejestrować</a> aby móc używać tej funkcji",
"You need to be able to invite users to do that.": "Aby to zrobić musisz mieć możliwość zapraszania użytkowników.",
"You need to be logged in.": "Musisz być zalogowany.",
@ -625,11 +589,7 @@
"underline": "podkreślenie",
"code": "kod",
"quote": "cytat",
"Edit Group": "Edytuj grupę",
"Join an existing group": "Dołącz do istniejącej grupy",
"Create a new group": "Stwórz nową grupę",
"Create": "Utwórz",
"Groups": "Grupy",
"Online": "Dostępny",
"Offline": "Niedostępny",
"Add an Integration": "Dodaj integrację",
@ -786,24 +746,14 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Twoje niezweryfikowane urządzenie '%(displayName)s' żąda kluczy szyfrujących.",
"Encryption key request": "Żądanie klucza szyfrującego",
"Autocomplete Delay (ms):": "Opóźnienie autouzupełniania (ms):",
"This Home server does not support groups": "Ten serwer domowy nie wspiera grup",
"Loading device info...": "Wczytywanie informacji o urządzeniu...",
"Create Group": "Utwórz grupę",
"Group Name": "Nazwa grupy",
"Example": "Przykład",
"Group ID": "ID grupy",
"+example:%(domain)s": "+przyklad:%(domain)s",
"Room creation failed": "Nie udało się utworzyć pokoju",
"You are a member of these groups:": "Jesteś członkiem następujących grup:",
"Drop file here to upload": "Upuść plik tutaj, aby go przesłać",
"Error whilst fetching joined groups": "Błąd podczas pobierania informacji o dołączonych grupach",
"Automatically replace plain text Emoji": "Automatycznie zastępuj tekstowe emotikony",
"Failed to upload image": "Przesyłanie obrazka nie powiodło się",
"Failed to update group": "Uaktualnienie grupy nie powiodło się",
"%(count)s new messages|one": "%(count)s nowa wiadomość",
"%(count)s new messages|other": "%(count)s nowe wiadomości",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s %(monthName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s",
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Zalecamy Ci przejście przez proces weryfikacyjny dla każdego urządzenia aby potwierdzić, że należy ono do ich prawdziwego właściciela. Możesz jednak wysłać tę wiadomość bez potwierdzania.",
"Unblacklist": "Usuń z czarnej listy",
"Blacklist": "Dodaj do czarnej listy",
@ -817,10 +767,6 @@
"URL Previews": "Podglądy linków",
"Enable URL previews for this room (affects only you)": "Włącz podglądy linków w tym pokoju (dotyczy tylko Ciebie)",
"Ongoing conference call%(supportedText)s.": "Połączenie grupowe %(supportedText)s w toku.",
"Group IDs must be of the form +localpart:%(domain)s": "ID grupy muszą mieć format +częśćlokalna:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "W chwili obecnej tworzenie grup jest możliwe wyłącznie na Twoim własnym serwerze domowym: użyj ID grupy kończącego się na %(domain)s",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Stwórz grupę, aby reprezentować Twoją społeczność! Zdefiniuj zestaw kanałów i Twoją własną stronę WWW by oznaczyć swoje miejsce w wszechświecie Matrixa.",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Aby dołączyć do istniejącej grupy musisz znać jej identyfikator; wygląda on mniej więcej tak: <i>+example:matrix.org</i>.",
"Featured Rooms:": "Wyróżnione pokoje:",
"Featured Users:": "Wyróżnieni użytkownicy:",
"Hide avatars in user and room mentions": "Ukryj awatary we wzmiankach użytkowników i pokoi",

View file

@ -1,44 +1,29 @@
{
"accept": "aceitar",
"accepted an invitation": "aceitou um convite",
"accepted the invitation for": "aceitou o convite para",
"Account": "Conta",
"Add email address": "Adicionar endereço de email",
"Add phone number": "Adicionar número de telefone",
"Admin": "Administrador",
"Advanced": "Avançado",
"Algorithm": "Algoritmo",
"an address": "um endereço",
"and": "e",
"An email has been sent to": "Um email foi enviado para",
"New passwords don't match": "As novas senhas não conferem",
"A new password must be entered.": "Uma nova senha precisa ser informada.",
"answered the call.": "respondeu à chamada.",
"Anyone who knows the room's link, apart from guests": "Qualquer pessoa que tenha o link da sala, exceto visitantes",
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
"Are you sure you want to upload the following files?": "Tem a certeza que quer enviar os seguintes ficheiros?",
"banned": "baniu",
"Banned users": "Usuárias/os banidas/os",
"Bans user with given id": "Banir usuários com o identificador informado",
"Blacklisted": "Bloqueado",
"Bug Report": "Repotar problemas de funcionamento",
"Bulk Options": "Opcões de Batelada",
"Can't load user settings": "Não é possível carregar configurações de usuário",
"changed avatar": "mudou sua imagem de perfil (avatar)",
"changed name": "mudou seu nome",
"changed their display name from": "mudou seu nome para",
"changed their profile picture": "alterou sua foto de perfil",
"changed the power level of": "mudou o nível de permissões de",
"changed the room name to": "mudou o nome da sala para",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala",
"Changes your display nickname": "Troca o seu apelido",
"Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519",
"Clear Cache and Reload": "Limpar Memória Cache e Recarregar",
"Clear Cache": "Limpar Memória Cache",
"Click here": "Clique aqui",
"Click here to fix": "Clique aqui para resolver isso",
"Commands": "Comandos",
"Confirm password": "Confirme a nova senha",
@ -46,17 +31,14 @@
"Continue": "Continuar",
"Could not connect to the integration server": "Não foi possível conectar ao servidor de integrações",
"Create an account": "Criar uma conta",
"Create a new account": "Criar uma conta",
"Create Room": "Criar Sala",
"Cryptography": "Criptografia",
"Current password": "Senha atual",
"Curve25519 identity key": "Chave de Indetificação Curve25519",
"Deactivate Account": "Desativar conta",
"Deactivate my account": "Desativar minha conta",
"decline": "rejeitar",
"Decryption error": "Erro de descriptografia",
"Default": "Padrão",
"demote": "reduzir prioridade",
"Deops user with given id": "Retirar função de moderador do usuário com o identificador informado",
"Device ID": "Identificador do dispositivo",
"Devices will not yet be able to decrypt history from before they joined the room": "Os dispositivos não serão ainda capazes de descriptografar o histórico anterior à sua entrada na sala",
@ -64,28 +46,23 @@
"Display name": "Nome",
"Displays action": "Visualizar atividades",
"Ed25519 fingerprint": "Impressão Digital Ed25519",
"Email Address": "endereço de email",
"Email, name or matrix ID": "Email, nome ou ID matrix",
"Emoji": "Emoji",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Mensagens criptografadas não serão visíveis em clientes que ainda não implementaram criptografia",
"Encrypted room": "Sala criptografada",
"Encryption is enabled in this room": "Criptografia está habilitada nesta sala",
"Encryption is not enabled in this room": "Criptografia não está habilitada nesta sala",
"ended the call.": "chamada encerrada.",
"End-to-end encryption information": "Informação criptografada ponta-a-ponta",
"End-to-end encryption is in beta and may not be reliable": "A criptografia ponta a ponta está em estágio beta e não deve ser totalmente confiável",
"Error": "Erro",
"Event information": "Informação do evento",
"Export E2E room keys": "Exportar chaves ponta-a-ponta da sala",
"Failed to change password. Is your password correct?": "Falha ao alterar a palavra-passe. A sua palavra-passe está correta?",
"Failed to forget room": "Não foi possível esquecer a sala",
"Failed to leave room": "Falha ao tentar deixar a sala",
"Failed to reject invitation": "Falha ao tentar rejeitar convite",
"Failed to send email: ": "Falha ao tentar enviar email",
"Failed to set avatar.": "Falha ao tentar definir foto do perfil.",
"Failed to unban": "Não foi possível desfazer o banimento",
"Failed to upload file": "Falha ao enviar o ficheiro",
"favourite": "favoritar",
"Favourite": "Favorito",
"Favourites": "Favoritos",
"Filter room members": "Filtrar integrantes da sala",
@ -95,7 +72,6 @@
"For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.",
"Found a bug?": "Encontrou um problema de funcionamento do sistema?",
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"had": "teve",
"Hangup": "Desligar",
"Historical": "Histórico",
"Homeserver is": "Servidor padrão é",
@ -103,23 +79,14 @@
"I have verified my email address": "Eu verifiquei o meu endereço de email",
"Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala",
"Invalid Email Address": "Endereço de email inválido",
"invited": "convidou",
"Invite new room members": "Convidar novas pessoas para ingressar na sala",
"Invites": "Convidar",
"Invites user with given id to current room": "Convidar usuários com um dado identificador para esta sala",
"is a": "é um(a)",
"Sign in with": "Quero entrar",
"joined and left": "entrou e saiu",
"joined": "entrou",
"joined the room": "entrou na sala",
"Joins room with given alias": "Entra na sala com o nome informado",
"Kicks user with given id": "Remove usuário com o identificador informado",
"Labs": "Laboratório",
"Leave room": "Sair da sala",
"left and rejoined": "saiu e entrou novamente",
"left": "saiu",
"left the room": "saiu da sala",
"Logged in as": "Logado como",
"Login as guest": "Entrar como visitante",
"Logout": "Sair",
"Low priority": "Baixa prioridade",
@ -134,38 +101,26 @@
"New passwords must match each other.": "As novas senhas informadas precisam ser idênticas.",
"none": "nenhum",
"Notifications": "Notificações",
" (not supported by this browser)": "não suportado por este navegador",
"<not supported>": "<não suportado>",
"NOT verified": "NÃO verificado",
"No users have specific privileges in this room": "Nenhum/a usuário/a possui privilégios específicos nesta sala",
"olm version: ": "Versão do olm: ",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Assim que a criptografia é ativada para uma sala, ela não poderá ser desativada novamente (ainda)",
"Once you've followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Only people who have been invited": "Apenas pessoas que tenham sido convidadas",
"or": "ou",
"other": "outro",
"others": "outros",
"Password": "Senha",
"Passwords can't be empty": "As senhas não podem estar em branco",
"People": "Pessoas",
"Permissions": "Permissões",
"Phone": "Telefone",
"placed a": "iniciou uma",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor verifique seu email e clique no link enviado. Quando finalizar este processo, clique para continuar.",
"Privacy warning": "Alerta sobre privacidade",
"Privileged Users": "Usuárias/os privilegiadas/os",
"Profile": "Perfil",
"Refer a friend to Riot:": "Recomendar Riot a um amigo:",
"rejected": "recusou",
"rejected the invitation.": "rejeitou o convite.",
"Reject invitation": "Rejeitar convite",
"Remove Contact Information?": "Remover informação de contato?",
"removed their display name": "removeu seu nome",
"removed their profile picture": "removeu sua foto de perfil",
"Remove": "Remover",
"requested a VoIP conference": "requisitou uma conferência VoIP",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado.",
"restore": "restaurar",
"Return to app": "Retornar ao aplicativo",
"Return to login screen": "Retornar à tela de login",
"Room Colour": "Cores da sala",
@ -180,13 +135,10 @@
"Send Invites": "Enviar convites",
"Send Reset Email": "Enviar email para redefinição de senha",
"sent an image": "enviou uma imagem",
"sent an invitation to": "enviou um convite para",
"sent a video": "enviou um vídeo",
"Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado",
"Server may be unavailable, overloaded, or you hit a bug.": "O servidor pode estar indisponível ou sobrecarregado, ou então você encontrou uma falha no sistema.",
"Session ID": "Identificador de sessão",
"set a profile picture": "colocou uma foto de perfil",
"set their display name to": "configurou seu nome para",
"Settings": "Configurações",
"Show panel": "Mostrar painel",
"Signed Out": "Deslogar",
@ -200,25 +152,14 @@
"Start a chat": "Começar uma conversa",
"Start Chat": "Começar conversa",
"Success": "Sucesso",
"tag as": "etiquetar como",
"tag direct chat": "definir como conversa pessoal",
"The default role for new room members is": "O papel padrão para novas/os integrantes da sala é",
"The email address linked to your account must be entered.": "O endereço de email relacionado a sua conta precisa ser informado.",
"their invitations": "seus convites",
"their invitation": "seu convite",
"These are experimental features that may break in unexpected ways. Use with caution": "Estes são recursos experimentais que podem não funcionar corretamente. Use com cuidado.",
"The visibility of existing history will be unchanged": "A visibilidade do histórico atual não será alterada",
"This doesn't appear to be a valid email address": "Este não aparenta ser um endereço de email válido",
"this invitation?": "este convite?",
"This is a preview of this room. Room interactions have been disabled": "Esta é uma pré visualização desta sala. As interações com a sala estão desabilitadas",
"This room is not accessible by remote Matrix servers": "Esta sala não é acessível para servidores Matrix remotos",
"This room's internal ID is": "O ID interno desta sala é",
"times": "vezes",
"to join the discussion": "para se juntar à conversa",
"To link to a room it must have": "Para fazer um link para uma sala, ela deve ter",
"To redact messages": "Para poder apagar mensagens",
"To reset your password, enter the email address linked to your account": "Para redefinir sua senha, entre com o email da sua conta",
"turned on end-to-end encryption (algorithm": "acionou a encriptação ponta-a-ponta (algoritmo",
"Unable to add email address": "Não foi possível adicionar endereço de email",
"Unable to remove contact information": "Não foi possível remover informação de contato",
"Unable to verify email address.": "Não foi possível verificar o endereço de email.",
@ -244,24 +185,17 @@
"VoIP conference finished.": "Conferência VoIP encerrada.",
"VoIP conference started.": "Conferência VoIP iniciada.",
"(warning: cannot be disabled again!)": "(atenção: esta operação não poderá ser desfeita depois!)",
"Warning": "Atenção!",
"was banned": "banida/o",
"was invited": "convidada/o",
"was kicked": "retirada/o da sala",
"was unbanned": "des-banida/o",
"was": "foi",
"were": "foram",
"Who can access this room?": "Quem pode acessar esta sala?",
"Who can read history?": "Quem pode ler o histórico da sala?",
"Who would you like to add to this room?": "Quais pessoas você gostaria de adicionar a esta sala?",
"Who would you like to communicate with?": "Com quem você gostaria de se comunicar?",
"withdrawn": "retirado",
"Would you like to": "Você gostaria de",
"You are trying to access": "Você está tentando acessar a sala",
"You do not have permission to post to this room": "Você não tem permissão de postar nesta sala",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Você foi desconectada/o de todos os dispositivos e portanto não receberá mais notificações no seu celular ou no computador. Para reativar as notificações, entre novamente em cada um dos dispositivos que costuma usar",
"You have no visible notifications": "Voce não possui notificações visíveis",
"you must be a": "você precisa ser",
"Your password has been reset": "Sua senha foi redefinida",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações em outros dispositivos até que você logue novamente por eles",
"You should not yet trust it to secure data": "Você não deve confiar nela ainda para preservar seus dados",
@ -288,11 +222,8 @@
"%(weekDayName)s %(time)s": "%(weekDayName)s às %(time)s",
"%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.",
"all room members, from the point they are invited": "todas/os as/os integrantes da sala, a partir do momento em que foram convidadas/os",
"all room members, from the point they joined": "todas/os as/os integrantes da sala, a partir do momento em que entraram na sala",
"%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo",
"%(names)s and one other are typing": "%(names)s e uma outra pessoa estão escrevendo",
"%(names)s and %(count)s others are typing": "%(names)s e %(count)s outras pessoas estão escrevendo",
"%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.",
"Call Timeout": "Tempo esgotado. Chamada encerrada",
@ -331,7 +262,6 @@
"Missing user_id in request": "Faltou o id de usuário na requisição",
"Must be viewing a room": "Tem que estar visualizando uma sala",
"(not supported by this browser)": "(não é compatível com este navegador)",
"olm version": "versão olm",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.",
"Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.",
"Reason": "Razão",
@ -354,12 +284,9 @@
"This room is not recognised.": "Esta sala não é reconhecida.",
"These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas",
"This phone number is already in use": "Este número de telefone já está sendo usado",
"to browse the directory": "para navegar na lista pública de salas",
"to demote": "para reduzir prioridade",
"to favourite": "para favoritar",
"to make a room or": "para criar uma sala ou",
"to restore": "para restaurar",
"to start a chat with someone": "para iniciar uma conversa com alguém",
"to tag direct chat": "para marcar a conversa como pessoal",
"To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).",
@ -372,7 +299,6 @@
"VoIP is unsupported": "Chamada de voz não permitida",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.",
"You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione",
"You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.",
"You cannot place a call with yourself.": "Você não pode iniciar uma chamada.",
"You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
@ -396,24 +322,10 @@
"Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os",
"Encrypt room": "Criptografar esta sala",
"There are no visible files in this room": "Não há arquivos públicos nesta sala",
"Error changing language": "Erro ao mudar de idioma",
"Riot was unable to find the correct Data for the selected Language.": "Não foi possível encontrar os dados para o idioma selecionado.",
"Connectivity to the server has been lost.": "A conexão com o servidor foi perdida. Verifique sua conexão de internet.",
"Sent messages will be stored until your connection has returned.": "Imagens enviadas ficarão armazenadas até que sua conexão seja reestabelecida.",
"Resend all": "Reenviar todas as mensagens",
"cancel all": "cancelar todas",
"now. You can also select individual messages to resend or cancel.": "agora. Você também pode escolher mensagens individuais e definir se vai reenviar ou cancelar o envio.",
"Active call": "Chamada ativa",
"Sunday": "Domingo",
"Monday": "Segunda-feira",
"ar-eg": "Árabe (Egito)",
"ar-tn": "Árabe (Tunísia)",
"Failed to forget room %(errCode)s": "Falha ao esquecer a sala %(errCode)s",
"Tuesday": "Terça-feira",
"Wednesday": "Quarta-feira",
"Thursday": "Quinta-feira",
"Friday": "Sexta-feira",
"Saturday": "Sábado",
"%(oneUser)schanged their avatar": "%(oneUser)salterou sua imagem pública",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Uma mensagem de texto foi enviada para +%(msisdn)s. Introduza o código de verificação nela contido",
"%(items)s and %(remaining)s others": "%(items)s e %(remaining)s outros",
@ -425,11 +337,6 @@
"Attachment": "Anexo",
"Autoplay GIFs and videos": "Reproduzir automaticamente GIFs e videos",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s de %(fullYear)s às %(time)s",
"fo": "Feroês",
"sx": "Sutu",
"sz": "Sami (Lappish)",
"ve": "Venda",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Não consigo conectar ao servidor padrão - favor checar sua conexão à internet e verificar se o certificado SSL do seu <a>servidor padrão</a> é confiável.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Não consigo conectar ao servidor padrão através de HTTP quando uma URL HTTPS está na barra de endereços do seu navegador. Use HTTPS ou então <a>habilite scripts não seguros no seu navegador</a>.",
"Change Password": "Alterar senha",
"Click to mute audio": "Clique para colocar o áudio no mudo",
@ -468,12 +375,10 @@
"Join Room": "Ingressar na sala",
"Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.",
"Kick": "Remover",
"Level": "Nível",
"Local addresses for this room:": "Endereço local desta sala:",
"Markdown is disabled": "A formatação 'Markdown' está desabilitada",
"Markdown is enabled": "A formatação 'Markdown' está habilitada",
"Message not sent due to unknown devices being present": "A mensagem não foi enviada por causa da presença de dispositivos desconhecidos",
"Never send encrypted messages to unverified devices in this room": "Nunca envie mensagens criptografadas para dispositivos não verificados nesta sala",
"New address (e.g. #foo:%(localDomain)s)": "Novo endereço (p.ex: #algo:%(localDomain)s)",
"not set": "não definido",
"not specified": "não especificado",
@ -505,7 +410,6 @@
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você.",
"Make Moderator": "Tornar moderador(a)",
"Room": "Sala",
"(~%(searchCount)s results)": "(±%(searchCount)s resultados)",
"Cancel": "Cancelar",
"bold": "negrito",
"italic": "itálico",
@ -669,7 +573,6 @@
"Offline": "Offline",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O arquivo exportado irá permitir a qualquer pessoa que o acesse a descriptografar qualquer uma das mensagens criptografadas que você veja, portanto seja bastante cuidadosa(o) em manter este arquivo seguro. Para deixar este arquivo mais protegido, recomendamos que você insira uma senha abaixo, que será usada para criptografar o arquivo. Só será possível importar os dados usando exatamente a mesma senha.",
"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.": "Este processo faz com que você possa importar as chaves de criptografia que tinha previamente exportado de outro cliente Matrix. Você poderá então descriptografar todas as mensagens que o outro cliente pôde criptografar.",
"You are about to be taken to a third-party site so you can authenticate your account for use with {integrationsUrl}. Do you wish to continue?": "",
"Start automatically after system login": "Iniciar automaticamente ao iniciar o sistema",
"Desktop specific": "Específico para o app de computadores desktop",
"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?": "Você será levado agora a um site de terceiros para poder autenticar a sua conta para uso com o serviço %(integrationsUrl)s. Você quer continuar?",
@ -678,7 +581,6 @@
"disabled": "desabilitado",
"enabled": "habilitado",
"Export": "Exportar",
"Failed to register as guest:": "Falha ao se registrar como visitante:",
"Guest access is disabled on this Home Server.": "O acesso para visitantes está desabilitado neste Servidor de Base.",
"Import": "Importar",
"Incorrect username and/or password.": "Nome de usuária(o) e/ou senha incorreto.",
@ -738,7 +640,6 @@
"Upload new:": "Enviar novo:",
"Private Chat": "Conversa privada",
"You must <a>register</a> to use this functionality": "Você deve <a>se registrar</a> para poder usar esta funcionalidade",
"And %(count)s more...": "E mais %(count)s...",
"Start chatting": "Iniciar a conversa",
"Public Chat": "Conversa pública",
"Uploading %(filename)s and %(count)s others|zero": "Enviando o arquivo %(filename)s",
@ -784,7 +685,6 @@
"If you already have a Matrix account you can <a>log in</a> instead.": "Se você já tem uma conta Matrix, pode também fazer <a>login</a>.",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o <a>certificado SSL do Servidor de Base</a> é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.",
"Encrypted by an unverified device": "Criptografado por um dispositivo não verificado",
"Set": "Definir",
"Unencrypted message": "Mensagem não criptografada",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Participar por <voiceText>voz</voiceText> ou por <videoText>vídeo</videoText>.",
"Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
@ -825,7 +725,6 @@
"Hide avatar and display name changes": "Ocultar mudanças de avatar e de nome público",
"Integrations Error": "Erro de integrações",
"Publish this room to the public in %(domain)s's room directory?": "Publicar esta sala ao público no diretório de salas de %(domain)s's?",
"Matrix Apps": "Apps Matrix",
"AM": "AM",
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "NOTA: As apps não são cifradas ponta-a-ponta",
@ -843,8 +742,6 @@
"You are not in this room.": "Não se encontra nesta sala.",
"You do not have permission to do that in this room.": "Não tem permissão para fazer isso nesta sala.",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Ainda não se encontra em nenhuma sala! Clique em <CreateRoomButton> para criar uma sala ou em <RoomDirectoryButton> para navegar o diretório de salas",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(day)s de %(monthName)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s de %(monthName)s de %(fullYear)s",
"Copied!": "Copiado!",
"Failed to copy": "Falha ao copiar",
"Verifies a user, device, and pubkey tuple": "Verifica um utilizador, o dispositivo e o tuplo da chave pública",
@ -865,33 +762,50 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "O seu dispositivo não verificado '%(displayName)s' está a pedir chaves de encriptação.",
"Encryption key request": "Pedido de chave de encriptação",
"Autocomplete Delay (ms):": "Atraso de preenchimento automático (ms):",
"This Home server does not support groups": "Este servidor (home server) não suporta grupos",
"Loading device info...": "A carregar as informações do dispositivo...",
"Groups": "Grupos",
"Create a new group": "Criar um novo grupo",
"Create Group": "Criar grupo",
"Group Name": "Nome do grupo",
"Example": "Exemplo",
"Create": "Criar",
"Group ID": "ID do grupo",
"+example:%(domain)s": "+exemplo:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "IDs de grupo têm que ser no formato +localpart:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Atualmente apenas é possível criar grupos no seu próprio servidor (home server): utilize um ID de grupo que termine com %(domain)s",
"Room creation failed": "Criação de sala falhou",
"You are a member of these groups:": "É um membro destes grupos:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Crie um grupo para representar a sua comunidade! Defina um conjunto de salas e a sua própria página inicial personalizada para marcar o seu espaço no universo Matrix.",
"Join an existing group": "Juntar-se a um grupo existente",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Para juntar-se a um grupo existente necessita de saber a identificação do grupo; isto será algo como <i>+exemplo:matrix.org</i>.",
"Featured Rooms:": "Salas em destaque:",
"Error whilst fetching joined groups": "Erro ao obter os seus grupos",
"Featured Users:": "Utilizadores em destaque:",
"Edit Group": "Editar grupo",
"Automatically replace plain text Emoji": "Substituir Emoji em texto automaticamente",
"Failed to upload image": "Falha ao carregar imagem",
"Failed to update group": "Falha ao atualizar grupo",
"Hide avatars in user and room mentions": "Ocultar avatares nas menções de utilizadores e salas",
"%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s removido por %(senderName)s",
"%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificado por %(senderName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>"
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>",
"Advanced options": "Opções avançadas",
"This setting cannot be changed later!": "Esta definição não pode ser alterada mais tarde!",
"Ignored Users": "Utilizadores Ignorados",
"Ignore": "Ignorar",
"User Options": "Opções de Utilizador",
"Ignored user": "Utilizador ignorado",
"Description": "Descrição",
"Name or matrix ID": "Nome ou ID do matrix",
"Leave": "Sair",
"Add a Room": "Adicionar uma sala",
"Add a User": "Adicionar um utilizador",
"Unknown": "Desconhecido",
"email address": "endereço de email",
"Invites sent": "Convites enviados",
"Block users on other matrix homeservers from joining this room": "Impede utilizadores de outros servidores base matrix de se juntar a esta sala",
"Unignore": "Deixar de ignorar",
"You are now ignoring %(userId)s": "Está agora a ignorar %(userId)s",
"You are no longer ignoring %(userId)s": "%(userId)s já não é ignorado",
"Unignored user": "Utilizador não ignorado",
"Stops ignoring a user, showing their messages going forward": "Deixa de ignorar um utilizador, mostrando as suas mensagens daqui para a frente",
"Ignores a user, hiding their messages from you": "Ignora um utilizador, deixando de mostrar as mensagens dele",
"Disable big emoji in chat": "Desativar emojis grandes no chat",
"Disable Emoji suggestions while typing": "Desativar sugestões de Emoji durante a escrita",
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Não há ninguém aqui! Gostarias de <a>convidar alguém</a> ou <a>parar avisos sobre a sala vazia</a>?",
"Remove avatar": "Remover avatar",
"Banned by %(displayName)s": "Banido por %(displayName)s",
"Message removed by %(userId)s": "Mensagem removida por %(userId)s",
"To send messages, you must be a": "Para enviar mensagens, tens de ser um(a)",
"To invite users into the room, you must be a": "Para convidar utilizadores para esta sala, tens de ser um(a)",
"To configure the room, you must be a": "Para configurar esta sala, tens de ser um(a)",
"To ban users, you must be a": "Para banir utilizadores, tens de ser um(a)",
"To remove other users' messages, you must be a": "Para remover mensagens de outros utilizadores, tens de ser um(a)",
"To send events of type <eventType/>, you must be a": "Para enviar eventos do tipo <eventType/>, tens de ser um(a)"
}

View file

@ -1,44 +1,29 @@
{
"accept": "aceitar",
"accepted an invitation": "aceitou um convite",
"accepted the invitation for": "aceitou o convite para",
"Account": "Conta",
"Add email address": "Adicionar endereço de email",
"Add phone number": "Adicionar número de telefone",
"Admin": "Administrador/a",
"Advanced": "Avançado",
"Algorithm": "Algoritmo",
"an address": "um endereço",
"and": "e",
"An email has been sent to": "Um email foi enviado para",
"New passwords don't match": "As novas senhas não conferem",
"A new password must be entered.": "Uma nova senha precisa ser informada.",
"answered the call.": "respondeu à chamada.",
"Anyone who knows the room's link, apart from guests": "Qualquer pessoa que tenha o link da sala, exceto visitantes",
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
"Are you sure you want to upload the following files?": "Você tem certeza que deseja enviar os seguintes arquivos?",
"banned": "baniu",
"Banned users": "Usuárias/os banidas/os",
"Bans user with given id": "Banir usuários com o identificador informado",
"Blacklisted": "Bloqueado",
"Bug Report": "Repotar problemas de funcionamento",
"Bulk Options": "Opcões de Batelada",
"Can't load user settings": "Não é possível carregar configurações de usuário",
"changed avatar": "mudou sua imagem de perfil (avatar)",
"changed name": "mudou seu nome",
"changed their display name from": "mudou seu nome para",
"changed their profile picture": "alterou sua foto de perfil",
"changed the power level of": "mudou o nível de permissões de",
"changed the room name to": "mudou o nome da sala para",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".",
"Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala",
"Changes your display nickname": "Troca o seu apelido",
"Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519",
"Clear Cache and Reload": "Limpar Memória Cache e Recarregar",
"Clear Cache": "Limpar Memória Cache",
"Click here": "Clique aqui",
"Click here to fix": "Clique aqui para resolver isso",
"Commands": "Comandos",
"Confirm password": "Confirme a nova senha",
@ -46,17 +31,14 @@
"Continue": "Continuar",
"Could not connect to the integration server": "Não foi possível conectar ao servidor de integrações",
"Create an account": "Criar uma conta",
"Create a new account": "Criar uma conta",
"Create Room": "Criar Sala",
"Cryptography": "Criptografia",
"Current password": "Senha atual",
"Curve25519 identity key": "Chave de Indetificação Curve25519",
"Deactivate Account": "Desativar conta",
"Deactivate my account": "Desativar minha conta",
"decline": "rejeitar",
"Decryption error": "Erro de descriptografia",
"Default": "Padrão",
"demote": "reduzir prioridade",
"Deops user with given id": "Retirar função de moderador do usuário com o identificador informado",
"Device ID": "Identificador do dispositivo",
"Devices will not yet be able to decrypt history from before they joined the room": "Os dispositivos não serão ainda capazes de descriptografar o histórico anterior à sua entrada na sala",
@ -64,28 +46,23 @@
"Display name": "Nome",
"Displays action": "Visualizar atividades",
"Ed25519 fingerprint": "Impressão Digital Ed25519",
"Email Address": "endereço de email",
"Email, name or matrix ID": "Email, nome ou ID matrix",
"Emoji": "Emoji",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Mensagens criptografadas não serão visíveis em clientes que ainda não implementaram criptografia",
"Encrypted room": "Sala criptografada",
"Encryption is enabled in this room": "Criptografia está habilitada nesta sala",
"Encryption is not enabled in this room": "Criptografia não está habilitada nesta sala",
"ended the call.": "chamada encerrada.",
"End-to-end encryption information": "Informação criptografada ponta-a-ponta",
"End-to-end encryption is in beta and may not be reliable": "A criptografia ponta a ponta está em estágio beta e não deve ser totalmente confiável",
"Error": "Erro",
"Event information": "Informação do evento",
"Export E2E room keys": "Exportar chaves ponta-a-ponta da sala",
"Failed to change password. Is your password correct?": "Não foi possível mudar a senha. A sua senha está correta?",
"Failed to forget room": "Não foi possível esquecer a sala",
"Failed to leave room": "Falha ao tentar deixar a sala",
"Failed to reject invitation": "Falha ao tentar rejeitar convite",
"Failed to send email: ": "Falha ao tentar enviar email",
"Failed to set avatar.": "Falha ao tentar definir foto do perfil.",
"Failed to unban": "Não foi possível desfazer o banimento",
"Failed to upload file": "Falha ao enviar o arquivo",
"favourite": "favoritar",
"Favourite": "Favorito",
"Favourites": "Favoritos",
"Filter room members": "Filtrar integrantes da sala",
@ -95,7 +72,6 @@
"For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.",
"Found a bug?": "Encontrou um problema de funcionamento do sistema?",
"Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.",
"had": "teve",
"Hangup": "Desligar",
"Historical": "Histórico",
"Homeserver is": "Servidor padrão é",
@ -103,23 +79,14 @@
"I have verified my email address": "Eu verifiquei o meu endereço de email",
"Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala",
"Invalid Email Address": "Endereço de email inválido",
"invited": "convidou",
"Invite new room members": "Convidar novas pessoas para ingressar na sala",
"Invites": "Convidar",
"Invites user with given id to current room": "Convidar usuários com um dado identificador para esta sala",
"is a": "é um(a)",
"Sign in with": "Quero entrar",
"joined and left": "entrou e saiu",
"joined": "entrou",
"joined the room": "entrou na sala",
"Joins room with given alias": "Entra na sala com o nome informado",
"Kicks user with given id": "Remove usuário com o identificador informado",
"Labs": "Laboratório",
"Leave room": "Sair da sala",
"left and rejoined": "saiu e entrou novamente",
"left": "saiu",
"left the room": "saiu da sala",
"Logged in as": "Logado como",
"Login as guest": "Entrar como visitante",
"Logout": "Sair",
"Low priority": "Baixa prioridade",
@ -134,38 +101,26 @@
"New passwords must match each other.": "As novas senhas informadas precisam ser idênticas.",
"none": "nenhum",
"Notifications": "Notificações",
" (not supported by this browser)": "não suportado por este navegador",
"<not supported>": "<não suportado>",
"NOT verified": "NÃO verificado",
"No users have specific privileges in this room": "Nenhum/a usuário/a possui privilégios específicos nesta sala",
"olm version: ": "Versão do olm: ",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Assim que a criptografia é ativada para uma sala, ela não poderá ser desativada novamente (ainda)",
"Once you've followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Only people who have been invited": "Apenas pessoas que tenham sido convidadas",
"or": "ou",
"other": "outro",
"others": "outros",
"Password": "Senha",
"Passwords can't be empty": "As senhas não podem estar em branco",
"People": "Pessoas",
"Permissions": "Permissões",
"Phone": "Telefone",
"placed a": "iniciou uma",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor verifique seu email e clique no link enviado. Quando finalizar este processo, clique para continuar.",
"Privacy warning": "Alerta sobre privacidade",
"Privileged Users": "Usuárias/os privilegiadas/os",
"Profile": "Perfil",
"Refer a friend to Riot:": "Indicar um amigo para participar",
"rejected": "recusou",
"rejected the invitation.": "rejeitou o convite.",
"Reject invitation": "Rejeitar convite",
"Remove Contact Information?": "Remover informação de contato?",
"removed their display name": "removeu seu nome",
"removed their profile picture": "removeu sua foto de perfil",
"Remove": "Remover",
"requested a VoIP conference": "requisitou uma conferência VoIP",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado.",
"restore": "restaurar",
"Return to app": "Retornar ao aplicativo",
"Return to login screen": "Retornar à tela de login",
"Room Colour": "Cores da sala",
@ -180,13 +135,10 @@
"Send Invites": "Enviar convites",
"Send Reset Email": "Enviar email para redefinição de senha",
"sent an image": "enviou uma imagem",
"sent an invitation to": "enviou um convite para",
"sent a video": "enviou um vídeo",
"Server may be unavailable or overloaded": "Servidor pode estar indisponível ou sobrecarregado",
"Server may be unavailable, overloaded, or you hit a bug.": "O servidor pode estar indisponível ou sobrecarregado, ou então você encontrou uma falha no sistema.",
"Session ID": "Identificador de sessão",
"set a profile picture": "colocou uma foto de perfil",
"set their display name to": "configurou seu nome para",
"Settings": "Configurações",
"Show panel": "Mostrar painel",
"Signed Out": "Deslogar",
@ -200,25 +152,14 @@
"Start a chat": "Começar uma conversa",
"Start Chat": "Começar conversa",
"Success": "Sucesso",
"tag as": "etiquetar como",
"tag direct chat": "definir como conversa pessoal",
"The default role for new room members is": "O papel padrão para novas/os integrantes da sala é",
"The email address linked to your account must be entered.": "O endereço de email relacionado a sua conta precisa ser informado.",
"their invitations": "seus convites",
"their invitation": "seu convite",
"These are experimental features that may break in unexpected ways. Use with caution": "Estes são recursos experimentais que podem não funcionar corretamente. Use com cuidado.",
"The visibility of existing history will be unchanged": "A visibilidade do histórico atual não será alterada",
"This doesn't appear to be a valid email address": "Este não aparenta ser um endereço de email válido",
"this invitation?": "este convite?",
"This is a preview of this room. Room interactions have been disabled": "Esta é uma pré visualização desta sala. As interações com a sala estão desabilitadas",
"This room is not accessible by remote Matrix servers": "Esta sala não é acessível para servidores Matrix remotos",
"This room's internal ID is": "O ID interno desta sala é",
"times": "vezes",
"to join the discussion": "para se juntar à conversa",
"To link to a room it must have": "Para fazer um link para uma sala, ela deve ter",
"To redact messages": "Para poder apagar mensagens",
"To reset your password, enter the email address linked to your account": "Para redefinir sua senha, entre com o email da sua conta",
"turned on end-to-end encryption (algorithm": "acionou a encriptação ponta-a-ponta (algoritmo",
"Unable to add email address": "Não foi possível adicionar endereço de email",
"Unable to remove contact information": "Não foi possível remover informação de contato",
"Unable to verify email address.": "Não foi possível verificar o endereço de email.",
@ -244,24 +185,17 @@
"VoIP conference finished.": "Conferência VoIP encerrada.",
"VoIP conference started.": "Conferência VoIP iniciada.",
"(warning: cannot be disabled again!)": "(atenção: esta operação não poderá ser desfeita depois!)",
"Warning": "Atenção!",
"was banned": "banida/o",
"was invited": "convidada/o",
"was kicked": "retirada/o da sala",
"was unbanned": "des-banida/o",
"was": "foi",
"were": "foram",
"Who can access this room?": "Quem pode acessar esta sala?",
"Who can read history?": "Quem pode ler o histórico da sala?",
"Who would you like to add to this room?": "Quais pessoas você gostaria de adicionar a esta sala?",
"Who would you like to communicate with?": "Com quem você gostaria de se comunicar?",
"withdrawn": "retirado",
"Would you like to": "Você gostaria de",
"You are trying to access": "Você está tentando acessar a sala",
"You do not have permission to post to this room": "Você não tem permissão de postar nesta sala",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Você foi desconectada/o de todos os dispositivos e portanto não receberá mais notificações no seu celular ou no computador. Para reativar as notificações, entre novamente em cada um dos dispositivos que costuma usar",
"You have no visible notifications": "Voce não possui notificações visíveis",
"you must be a": "você precisa ser",
"Your password has been reset": "Sua senha foi redefinida",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações em outros dispositivos até que você logue novamente por eles",
"You should not yet trust it to secure data": "Você não deve confiar nela ainda para preservar seus dados",
@ -290,7 +224,6 @@
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.",
"%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo",
"%(names)s and one other are typing": "%(names)s e uma outra pessoa estão escrevendo",
"%(names)s and %(count)s others are typing": "%(names)s e %(count)s outras pessoas estão escrevendo",
"%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.",
"Call Timeout": "Tempo esgotado. Chamada encerrada",
@ -329,7 +262,6 @@
"Missing user_id in request": "Faltou o id de usuário na requisição",
"Must be viewing a room": "Tem que estar visualizando uma sala",
"(not supported by this browser)": "(não é compatível com este navegador)",
"olm version": "versão olm",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.",
"Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.",
"Press <StartChatButton> to start a chat with someone": "Clique em <StartChatButton> para iniciar a conversa com alguém",
@ -353,12 +285,9 @@
"This room is not recognised.": "Esta sala não é reconhecida.",
"These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas",
"This phone number is already in use": "Este número de telefone já está sendo usado",
"to browse the directory": "para navegar na lista pública de salas",
"to demote": "para reduzir prioridade",
"to favourite": "para favoritar",
"to make a room or": "para criar uma sala ou",
"to restore": "para restaurar",
"to start a chat with someone": "para iniciar uma conversa com alguém",
"to tag direct chat": "para marcar a conversa como pessoal",
"To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).",
@ -369,8 +298,6 @@
"Usage": "Uso",
"Use with caution": "Use com cautela",
"VoIP is unsupported": "Chamada de voz não permitida",
"Sunday": "Domingo",
"Monday": "Segunda",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.",
"You are already in a call.": "Você já está em uma chamada.",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Você ainda não está em nenhuma sala! Clique em <CreateRoomButton> para criar uma sala ou em <RoomDirectoryButton> para navegar pela lista pública de salas",
@ -397,20 +324,10 @@
"Share message history with new users": "Compartilhar histórico de mensagens com novas/os usuárias/os",
"Encrypt room": "Criptografar esta sala",
"There are no visible files in this room": "Não há arquivos públicos nesta sala",
"Error changing language": "Erro ao mudar de idioma",
"Riot was unable to find the correct Data for the selected Language.": "Não foi possível encontrar os dados para o idioma selecionado.",
"Connectivity to the server has been lost.": "A conexão com o servidor foi perdida. Verifique sua conexão de internet.",
"Sent messages will be stored until your connection has returned.": "Imagens enviadas ficarão armazenadas até que sua conexão seja reestabelecida.",
"Resend all": "Reenviar todas as mensagens",
"cancel all": "cancelar todas",
"now. You can also select individual messages to resend or cancel.": "agora. Você também pode escolher mensagens individuais e definir se vai reenviar ou cancelar o envio.",
"Active call": "Chamada ativa",
"Failed to forget room %(errCode)s": "Falhou ao esquecer a sala %(errCode)s",
"Tuesday": "Terça",
"Wednesday": "Quarta",
"Thursday": "Quinta",
"Friday": "Sexta",
"Saturday": "Sábado",
"%(oneUser)schanged their avatar": "%(oneUser)salterou sua imagem pública",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Uma mensagem de texto foi enviada para +%(msisdn)s. Gentileza entrar com o código de verificação que contém",
"%(items)s and %(remaining)s others": "%(items)s e %(remaining)s outros",
@ -422,11 +339,6 @@
"Attachment": "Anexo",
"Autoplay GIFs and videos": "Reproduzir automaticamente GIFs e videos",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s de %(fullYear)s às %(time)s",
"fo": "Feroês",
"sx": "Sutu",
"sz": "Sami (Lappish)",
"ve": "Venda",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Não consigo conectar ao servidor padrão - favor checar sua conexão à internet e verificar se o certificado SSL do seu <a>servidor padrão</a> é confiável.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Não consigo conectar ao servidor padrão através de HTTP quando uma URL HTTPS está na barra de endereços do seu navegador. Use HTTPS ou então <a>habilite scripts não seguros no seu navegador</a>.",
"Change Password": "Alterar senha",
"Click to mute audio": "Clique para colocar o áudio no mudo",
@ -465,12 +377,10 @@
"Join Room": "Ingressar na sala",
"Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.",
"Kick": "Remover",
"Level": "Nível",
"Local addresses for this room:": "Endereço local desta sala:",
"Markdown is disabled": "A formatação 'Markdown' está desabilitada",
"Markdown is enabled": "A formatação 'Markdown' está habilitada",
"Message not sent due to unknown devices being present": "A mensagem não foi enviada por causa da presença de dispositivos desconhecidos",
"Never send encrypted messages to unverified devices in this room": "Nunca envie mensagens criptografadas para dispositivos não verificados nesta sala",
"New address (e.g. #foo:%(localDomain)s)": "Novo endereço (p.ex: #algo:%(localDomain)s)",
"not set": "não definido",
"not specified": "não especificado",
@ -502,7 +412,6 @@
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Você não poderá desfazer esta mudança, pois estará dando a este(a) usuário(a) o mesmo nível de permissões que você.",
"Make Moderator": "Tornar moderador(a)",
"Room": "Sala",
"(~%(searchCount)s results)": "(±%(searchCount)s resultados)",
"Cancel": "Cancelar",
"bold": "negrito",
"italic": "itálico",
@ -666,7 +575,6 @@
"Offline": "Offline",
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O arquivo exportado irá permitir a qualquer pessoa que o acesse a descriptografar qualquer uma das mensagens criptografadas que você veja, portanto seja bastante cuidadosa(o) em manter este arquivo seguro. Para deixar este arquivo mais protegido, recomendamos que você insira uma senha abaixo, que será usada para criptografar o arquivo. Só será possível importar os dados usando exatamente a mesma senha.",
"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.": "Este processo faz com que você possa importar as chaves de criptografia que tinha previamente exportado de outro cliente Matrix. Você poderá então descriptografar todas as mensagens que o outro cliente pôde criptografar.",
"You are about to be taken to a third-party site so you can authenticate your account for use with {integrationsUrl}. Do you wish to continue?": "",
"Start automatically after system login": "Iniciar automaticamente ao iniciar o sistema",
"Desktop specific": "Específico para o app de computadores desktop",
"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?": "Você será levado agora a um site de terceiros para poder autenticar a sua conta para uso com o serviço %(integrationsUrl)s. Você quer continuar?",
@ -675,7 +583,6 @@
"disabled": "desabilitado",
"enabled": "habilitado",
"Export": "Exportar",
"Failed to register as guest:": "Falha ao se registrar como visitante:",
"Guest access is disabled on this Home Server.": "O acesso para visitantes está desabilitado neste Servidor de Base.",
"Import": "Importar",
"Incorrect username and/or password.": "Nome de usuária(o) e/ou senha incorreto.",
@ -754,7 +661,6 @@
"Accept": "Aceitar",
"Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)",
"Admin Tools": "Ferramentas de administração",
"And %(count)s more...": "E mais %(count)s...",
"Alias (optional)": "Apelido (opcional)",
"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.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o <a>certificado SSL do Servidor de Base</a> é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.",
"<a>Click here</a> to join the discussion!": "<a>Clique aqui</a> para participar da conversa!",
@ -784,7 +690,6 @@
"%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento.",
"Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s",
"Send anyway": "Enviar de qualquer maneira",
"Set": "Definir",
"Show Text Formatting Toolbar": "Exibir barra de formatação de texto",
"Start authentication": "Iniciar autenticação",
"This invitation was sent to an email address which is not associated with this account:": "Este convite foi enviado para um endereço de e-mail que não é associado a esta conta:",

View file

@ -1,42 +1,27 @@
{
"accept": "принимать",
"accepted an invitation": "принял приглашение",
"accepted the invitation for": "принял приглашение на",
"Account": "Аккаунт",
"Add email address": "Добавить адрес email",
"Add phone number": "Добавить номер телефона",
"Admin": "Администратор",
"Advanced": "Дополнительно",
"Algorithm": "Алгоритм",
"an address": "адрес",
"and": "и",
"An email has been sent to": "Email был отправлен",
"A new password must be entered.": "Введите новый пароль.",
"answered the call.": "принятый звонок.",
"Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей",
"Anyone who knows the room's link, including guests": "Любой, кто знает ссылку комнаты, включая гостей",
"Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?",
"Are you sure you want to upload the following files?": "Вы уверены что вы хотите отправить следующие файлы?",
"banned": "banned",
"Banned users": "Заблокированные пользователи",
"Bans user with given id": "Блокирует пользователя с заданным ID",
"Blacklisted": "В черном списке",
"Bug Report": "Отчет об ошибке",
"Bulk Options": "Групповые параметры",
"Can't load user settings": "Невозможно загрузить пользовательские настройки",
"changed avatar": "изменен аватар",
"changed name": "измененное имя",
"changed their display name from": "changed their display name from",
"changed their profile picture": "changed their profile picture",
"changed the power level of": "changed the power level of",
"changed the room name to": "changed the room name to",
"changed the topic to": "changed the topic to",
"Changes to who can read history will only apply to future messages in this room": "Изменения того, кто может прочитать историю, будут применяться только к будущим сообщениям в этой комнате",
"Changes your display nickname": "Изменяет ваш псевдоним",
"Claimed Ed25519 fingerprint key": "Требуемый ключ цифрового отпечатка Ed25519",
"Clear Cache and Reload": "Очистить кэш и перезагрузить",
"Clear Cache": "Очистить кэш",
"Click here": "Нажать здесь",
"Click here to fix": "Щелкните здесь, чтобы исправить",
"Commands": "Команды",
"Confirm your new password": "Подтвердите новый пароль",
@ -48,10 +33,8 @@
"Curve25519 identity key": "Ключ идентификации Curve25519",
"Deactivate Account": "Деактивировать учетную запись",
"Deactivate my account": "Деактивировать мою учетную запись",
"decline": "отказаться",
"Decryption error": "Ошибка расшифровки",
"Default": "По умолчанию",
"demote": "понизить уровень авторизации",
"Deops user with given id": "Снимает полномочия оператора с пользователя с заданным ID",
"Device ID": "ID устройства",
"Devices will not yet be able to decrypt history from before they joined the room": "Устройства пока не могут дешифровать историю до их входа в комнату",
@ -59,33 +42,28 @@
"Display name": "Отображаемое имя",
"Displays action": "Отображение действий",
"Ed25519 fingerprint": "Ed25519 отпечаток",
"Email Address": "Email адрес",
"Email, name or matrix ID": "Email, имя или matrix ID",
"Emoji": "Смайлы",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Зашифрованные сообщения не будут видны в клиентах, которые еще не подключили шифрование",
"Encrypted room": "Зашифрованная комната",
"ended the call.": "ended the call.",
"End-to-end encryption information": "Сведения о сквозном шифровании",
"End-to-end encryption is in beta and may not be reliable": "Сквозное шифрование находится в бета-версии и может быть ненадежным",
"Error": "Ошибка",
"Event information": "Информация о событии",
"Export E2E room keys": "Экспорт ключей сквозного шифрования",
"Failed to change password. Is your password correct?": "Не удалось сменить пароль. Вы правильно ввели текущий пароль?",
"Failed to forget room": "Не удалось забыть комнату",
"Failed to leave room": "Не удалось выйти из комнаты",
"Failed to reject invitation": "Не удалось отклонить приглашение",
"Failed to send email": "Ошибка отправки email",
"Failed to unban": "Не удалось разблокировать",
"Failed to upload file": "Не удалось отправить файл",
"Favourite": "Избранное",
"favourite": "избранный",
"Favourites": "Избранные",
"Filter room members": "Фильтр участников комнаты",
"Forget room": "Забыть комнату",
"Forgot your password?": "Забыли пароль?",
"For security, this session has been signed out. Please sign in again.": "По соображениям безопасности, эта сессия была прекращена. Пожалуйста, войдите снова.",
"Found a bug?": "Нашли ошибку?",
"had": "был",
"Hangup": "Закончить",
"Historical": "Архив",
"Homeserver is": "Домашний сервер это",
@ -93,23 +71,14 @@
"I have verified my email address": "Я подтвердил свой адрес email",
"Import E2E room keys": "Импорт ключей сквозного шифрования",
"Invalid Email Address": "Недопустимый адрес email",
"invited": "invited",
"Invite new room members": "Пригласить новых участников в комнату",
"Invites": "Приглашает",
"Invites user with given id to current room": "Приглашает пользователя с заданным ID в текущую комнату",
"is a": "является",
"Sign in with": "Войти с помощью",
"joined and left": "вошел(ла) и вышел(ла)",
"joined": "вошел(ла)",
"joined the room": "joined the room",
"Joins room with given alias": "Входит в комнату с заданным псевдонимом",
"Kicks user with given id": "Выкидывает пользователя с заданным ID",
"Labs": "Лаборатория",
"Leave room": "Покинуть комнату",
"left and rejoined": "вышел(ла) и вернулся(ась)",
"left": "вышел",
"left the room": "left the room",
"Logged in as": "Зарегистрированный как",
"Login as guest": "Войти как гость",
"Logout": "Выйти",
"Low priority": "Низкий приоритет",
@ -125,37 +94,21 @@
"New passwords must match each other.": "Новые пароли должны совпадать.",
"none": "никто",
"Notifications": "Уведомления",
" (not supported by this browser)": " (not supported by this browser)",
"<not supported>": "<не поддерживается>",
"NOT verified": "НЕ проверено",
"No users have specific privileges in this room": "Ни один пользователь не имеет специальных полномочий в этой комнате",
"olm version": "olm версия",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "После включения шифрования в комнате, оно не может быть деактивировано (на данный момент)",
"or": "или",
"other": "другой",
"others": "другие",
"Password": "Пароль",
"People": "Люди",
"Permissions": "Разрешения",
"Phone": "Телефон",
"placed a": "placed a",
"rejected the invitation.": "rejected the invitation.",
"removed their display name": "removed their display name",
"removed their profile picture": "removed their profile picture",
"Remove": "Удалить",
"requested a VoIP conference": "requested a VoIP conference",
"Return to login screen": "Вернуться к экрану входа",
"Send Reset Email": "Отправить письмо со ссылкой для сброса пароля",
"sent an image": "отправил изображение",
"sent an invitation to": "sent an invitation to",
"set a profile picture": "set a profile picture",
"set their display name to": "set their display name to",
"Settings": "Настройки",
"Start a chat": "Начать чат",
"Start Chat": "Начать чат",
"tag as": "tag as",
"These are experimental features that may break in unexpected ways. Use with caution": "These are experimental features that may break in unexpected ways. Use with caution",
"turned on end-to-end encryption (algorithm": "turned on end-to-end encryption (algorithm",
"Unable to add email address": "Не удается добавить адрес email",
"Unable to remove contact information": "Не удалось удалить контактную информацию",
"Unable to verify email address.": "Не удалось проверить адрес email.",
@ -186,29 +139,21 @@
"was invited": "был приглашен",
"was kicked": "был выгнан",
"was unbanned": "был(а) разблокирован(а)",
"was": "был",
"were": "быть",
"Who can access this room?": "Кто может получить доступ к этой комнате?",
"Who can read history?": "Кто может читать историю?",
"Who would you like to add to this room?": "Кого бы вы хотели добавить в эту комнату?",
"Who would you like to communicate with?": "С кем бы вы хотели связаться?",
"withdrawn": "уходить",
"Would you like to": "Хотели бы Вы",
"You do not have permission to post to this room": "Вы не можете писать в эту комнату",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Вы вышли из всех устройств и больше не будете получать push-уведомления. Чтобы повторно активировать уведомления, войдите снова на каждом из устройств",
"You have no visible notifications": "Нет видимых уведомлений",
"you must be a": "уровень доступа",
"Your password has been reset": "Ваш пароль был сброшен",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Пароль успешно изменен. До повторной авторизации вы не будете получать push-уведомления на других устройствах",
"You should not yet trust it to secure data": "На сегодняшний день не следует полностью полагаться на то, что ваши данные будут надежно зашифрованы",
"%(targetName)s accepted an invitation.": "%(targetName)s принял приглашение.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s принял приглашение от %(displayName)s.",
"Resend all": "Переслать снова всем",
"cancel all": "отменить всем",
"Active call": "Активный вызов",
"%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s печатает",
"%(names)s and one other are typing": "%(names)s и другой печатают",
"%(names)s and %(count)s others are typing": "%(names)s и %(count)s другие печатают",
"%(senderName)s answered the call.": "%(senderName)s ответил на звонок.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s заблокировал(а) %(targetName)s.",
"Call Timeout": "Время ожидания вызова",
@ -247,9 +192,6 @@
"Missing user_id in request": "Отсутствует user_id в запросе",
"Must be viewing a room": "Необходимо посмотреть комнату",
"(not supported by this browser)": "(не поддерживается этим браузером)",
"now. You can also select individual messages to resend or cancel.": "теперь. Вы можете также выбрать отдельные сообщения, чтобы снова послать или отменить.",
"Error changing language": "Ошибка изменения языка",
"Riot was unable to find the correct Data for the selected Language.": "Riot был неспособен найти правельные данные для выбранного языка.",
"Connectivity to the server has been lost.": "Связь с сервером потеряна.",
"Sent messages will be stored until your connection has returned.": "Отправленные сообщения будут сохранены, пока соединение не восстановится.",
"There are no visible files in this room": "В этой комнате нет видимых файлов",
@ -268,20 +210,12 @@
"Make this room private": "Сделать эту комнату приватной",
"Share message history with new users": "Разрешить доступ к истории сообщений новым пользователям",
"Encrypt room": "Шифрование комнаты",
"Monday": "Понедельник",
"Tuesday": "Вторник",
"Wednesday": "Среда",
"Thursday": "Четверг",
"Friday": "Пятница",
"Saturday": "Суббота",
"Sunday": "Воскресенье",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Upload an avatar:": "Загрузите аватар:",
"You need to be logged in.": "Вы должны быть авторизованы.",
"You need to be able to invite users to do that.": "Для этого вы должны иметь возможность приглашать пользователей.",
"You cannot place VoIP calls in this browser.": "VoIP звонки не поддерживаются в этом браузере.",
"You are already in a call.": "Вы уже совершаете вызов.",
"You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать",
"You are trying to access %(roomName)s.": "Вы пытаетесь получить доступ к %(roomName)s.",
"You cannot place a call with yourself.": "Вы не можете сделать вызов самому себе.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отозвал %(targetName)s's приглашение.",
@ -306,7 +240,6 @@
"Fri": "Пт",
"Sat": "Сб",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес email, кажется, не связан с Matrix ID на этом домашнем сервере.",
"to start a chat with someone": "чтобы начать чат с кем-то",
"to tag direct chat": "отметить прямой чат",
"To use it, just wait for autocomplete results to load and tab through them.": "Для того, чтобы использовать эту функцию, просто подождите автозаполнения результатов, а затем используйте клавишу TAB для прокрутки.",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включено сквозное шифрование (algorithm %(algorithm)s).",
@ -322,7 +255,6 @@
"and %(count)s others...|one": "и ещё один...",
"Are you sure?": "Вы уверены?",
"Autoplay GIFs and videos": "Автовоспроизведение GIF и видео",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Невозможно соединиться с домашним сервером - проверьте своё соединение и убедитесь, что <a>SSL-сертификат вашего домашнего сервера</a> включён в доверяемые.",
"Click to mute audio": "Щелкните, чтобы выключить звук",
"Click to mute video": "Щелкните, чтобы выключить видео",
"Click to unmute video": "Щелкните, чтобы включить видео",
@ -374,12 +306,10 @@
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' недопустимый формат псевдонима",
"Join Room": "Войти в комнату",
"Kick": "Выгнать",
"Level": "Уровень",
"Local addresses for this room:": "Локальный адрес этой комнаты:",
"Markdown is disabled": "Markdown отключен",
"Markdown is enabled": "Markdown включен",
"matrix-react-sdk version:": "версия matrix-react-sdk:",
"Never send encrypted messages to unverified devices in this room": "Никогда не отправлять зашифрованные сообщения на непроверенные устройства в этой комнате",
"New address (e.g. #foo:%(localDomain)s)": "Новый адрес (например, #foo:%(localDomain)s)",
"New passwords don't match": "Новые пароли не совпадают",
"not set": "не задано",
@ -395,7 +325,6 @@
"Power level must be positive integer.": "Уровень авторизации должен быть положительным целым числом.",
"Profile": "Профиль",
"Reason": "Причина",
"rejected": "отклонено",
"%(targetName)s rejected the invitation.": "%(targetName)s отклонил приглашение.",
"Reject invitation": "Отклонить приглашение",
"Remove Contact Information?": "Удалить контактную информацию?",
@ -404,7 +333,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s хочет начать VoIP-конференцию.",
"Report it": "Сообщить об этом",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Сброс пароля на данный момент сбрасывает ключи шифрования на всех устройствах, делая зашифрованную историю чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи комнат и импортируйте их после сброса пароля. В будущем это будет исправлено.",
"restore": "восстановить",
"Return to app": "Вернуться в приложение",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot не имеет разрешение на отправку уведомлений, проверьте параметры своего браузера",
"Riot was not given permission to send notifications - please try again": "Riot не получил разрешение на отправку уведомлений, пожалуйста, попробуйте снова",
@ -434,10 +362,9 @@
"Someone": "Кто-то",
"Submit": "Отправить",
"Success": "Успех",
"tag direct chat": "Тег прямого чата",
"The default role for new room members is": "Роль по умолчанию для новых участников комнаты",
"The main address for this room is": "Основной адрес для этой комнаты",
"This email address is already in use": "Этот адрес электронной почты уже используется",
"This email address is already in use": "Этот адрес email уже используется",
"This email address was not found": "Этот адрес электронной почты не найден",
"The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.",
"The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'",
@ -449,7 +376,6 @@
"This is a preview of this room. Room interactions have been disabled": "Это предпросмотр комнаты. Взаимодействие с комнатой отключено",
"This phone number is already in use": "Этот номер телефона уже используется",
"This room's internal ID is": "Внутренний ID этой комнаты",
"times": "раз",
"to demote": "для понижения уровня доступа",
"to favourite": "для избранного",
"to restore": "восстановить",
@ -549,12 +475,11 @@
"device id: ": "ID устройства: ",
"Device key:": "Ключ устройства:",
"disabled": "отключено",
"Email address": "Адрес электронной почты",
"Email address (optional)": "Адрес электронной почты (необязательно)",
"Email address": "Адрес email",
"Email address (optional)": "Адрес email (необязательно)",
"enabled": "включено",
"Error decrypting attachment": "Ошибка при расшифровке вложения",
"Export": "Экспорт",
"Failed to register as guest:": "Не удалось зарегистрироваться в качестве гостя:",
"Failed to set avatar.": "Не удалось установить аватар.",
"Import": "Импорт",
"Incorrect username and/or password.": "Неверное имя пользователя и/или пароль.",
@ -592,12 +517,7 @@
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файл '%(fileName)s' превышает предельный размер, допустимый к отправке на этом домашнем сервере",
"This Home Server does not support login using email address.": "Этот домашний сервер не поддерживает авторизацию с использованием адреса электронной почты.",
"The visibility of existing history will be unchanged": "Видимость существующей истории не изменится",
"this invitation?": "это приглашение?",
"This room is not accessible by remote Matrix servers": "Это комната недоступна с удаленных серверов Matrix",
"to browse the directory": "для просмотра каталога",
"to join the discussion": "присоединиться к дискуссии",
"To link to a room it must have": "Для создания ссылки на комнату она должна иметь",
"to make a room or": "чтобы создать комнату или",
"To reset your password, enter the email address linked to your account": "Чтобы сбросить пароль, введите адрес электронной почты, связанный с вашей учетной записью",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Попытка загрузить выбранный интервал истории чата этой комнаты не удалась, так как у вас нет разрешений на просмотр.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Попытка загрузить выбранный интервал истории чата этой комнаты не удалась, так как запрошенный элемент не найден.",
@ -614,7 +534,6 @@
"You need to enter a user name.": "Необходимо ввести имя пользователя.",
"You seem to be in a call, are you sure you want to quit?": "Звонок не завершен, вы уверены, что хотите выйти?",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Вы не сможете отменить это изменение, так как этот пользователь получит уровень доступа, аналогичный вашему.",
"(~%(searchCount)s results)": "(~%(searchCount)s результатов)",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)s отозвали свои приглашения %(repeats)s раз",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)s отозвал свои приглашения %(repeats)s раз",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s отозвали свои приглашения",
@ -739,7 +658,6 @@
"Accept": "Принять",
"Active call (%(roomName)s)": "Активный вызов (%(roomName)s)",
"Admin Tools": "Инструменты администратора",
"And %(count)s more...": "И %(count)s больше...",
"Alias (optional)": "Псевдоним (опционально)",
"<a>Click here</a> to join the discussion!": "<a>Нажмите здесь</a>, чтобы присоединиться к обсуждению!",
"Close": "Закрыть",
@ -763,7 +681,6 @@
"Public Chat": "Публичный чат",
"Reason: %(reasonText)s": "Причина: %(reasonText)s",
"Rejoin": "Войти повторно",
"Set": "Установить",
"Start authentication": "Начать проверку подлинности",
"This room": "В этой комнате",
"(~%(count)s results)|other": "(~%(count)s результаты)",
@ -829,7 +746,6 @@
"Hide join/leave messages (invites/kicks/bans unaffected)": "Скрыть сообщения о входе/выходе (приглашениях/выкидываниях/банах)",
"Hide avatar and display name changes": "Скрыть сообщения об изменении аватаров и отображаемых имен",
"Integrations Error": "Ошибка интеграции",
"Matrix Apps": "Приложения Matrix",
"AM": "AM",
"PM": "PM",
"NOTE: Apps are not end-to-end encrypted": "ПРИМЕЧАНИЕ: приложения не защищены сквозным шифрованием",
@ -844,38 +760,102 @@
"You do not have permission to do that in this room.": "У вас нет разрешения на это в этой комнате.",
"Verifies a user, device, and pubkey tuple": "Проверка пользователя, устройства и открытого ключа",
"Autocomplete Delay (ms):": "Задержка автозаполнения (мс):",
"This Home server does not support groups": "Этот домашний сервер не поддерживает группы",
"Loading device info...": "Загрузка информации об устройстве...",
"Groups": "Группы",
"Create a new group": "Создать новую группу",
"Create Group": "Создать группу",
"Group Name": "Название группы",
"Example": "Пример",
"Create": "Создать",
"Group ID": "ID группы",
"+example:%(domain)s": "+пример:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Идентификаторы групп должны иметь вид +локальная часть:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "В настоящее время возможно создавать группы только на собственном домашнем сервере: используйте идентификатор группы, заканчивающийся на %(domain)s",
"Room creation failed": "Не удалось создать комнату",
"You are a member of these groups:": "Вы являетесь членом этих групп:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Создайте группу для представления своего сообщества! Определите набор комнат и собственную домашнюю страницу, чтобы выделить свое пространство во вселенной Matrix.",
"Join an existing group": "Присоединиться к существующей группе",
"To join an existing group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Чтобы присоединиться к группе, вам нужно знать ее идентификатор; он выглядит примерно так:<i>+example:matrix.org</i>.",
"Featured Rooms:": "Рекомендуемые комнаты:",
"Error whilst fetching joined groups": "Ошибка при извлечении объединенных групп",
"Featured Users:": "Избранные пользователи:",
"Edit Group": "Изменить группу",
"Automatically replace plain text Emoji": "Автоматически заменять обычный текст на Emoji",
"Failed to upload image": "Не удалось загрузить изображение",
"Failed to update group": "Не удалось обновить группу",
"Hide avatars in user and room mentions": "Скрыть аватары в упоминаниях пользователей и комнат",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s виджет, добавленный %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s виджет, удаленный %(senderName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Проверка робота в настоящее время недоступна на компьютере - пожалуйста, используйте <a>браузер</a>",
"Publish this room to the public in %(domain)s's room directory?": "Опубликовать эту комнату для пользователей в %(domain)s каталоге комнат?",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s виджет, измененный %(senderName)s",
"%(weekDayName)s, %(monthName)s %(day)s": "%(weekDayName)s, %(monthName)s %(day)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
"Copied!": "Скопировано!",
"Failed to copy": "Не удалось скопировать"
"Failed to copy": "Не удалось скопировать",
"Advanced options": "Дополнительные параметры",
"Block users on other matrix homeservers from joining this room": "Блокировать пользователей, входящих в эту комнату с других серверов matrix",
"This setting cannot be changed later!": "Этот параметр нельзя изменить позднее!",
"Ignored Users": "Игнорируемые пользователи",
"Ignore": "Игнорировать",
"Unignore": "Перестать игнорировать",
"User Options": "Параметры пользователя",
"You are now ignoring %(userId)s": "Теперь вы игнорируете %(userId)s",
"You are no longer ignoring %(userId)s": "Вы больше не игнорируете %(userId)s",
"Unignored user": "Неигнорируемый пользователь",
"Ignored user": "Игнорируемый пользователь",
"Stops ignoring a user, showing their messages going forward": "Прекращает игнорирование пользователя, показывая их будущие сообщения",
"Ignores a user, hiding their messages from you": "Игнорирует пользователя, скрывая сообщения от вас",
"Disable Emoji suggestions while typing": "Отключить предложения Emoji при наборе текста",
"Banned by %(displayName)s": "Запрещено %(displayName)s",
"Message removed by %(userId)s": "Сообщение удалено %(userId)s",
"To send messages, you must be a": "Для отправки сообщений необходимо быть",
"To invite users into the room, you must be a": "Чтобы пригласить пользователей в комнату, необходимо быть",
"To configure the room, you must be a": "Чтобы настроить комнату, необходимо быть",
"To kick users, you must be a": "Чтобы выкидывать пользователей, необходимо быть",
"To ban users, you must be a": "Чтобы банить пользователей, необходимо быть",
"To remove other users' messages, you must be a": "Чтобы удалять сообщения других пользователей, необходимо быть",
"To send events of type <eventType/>, you must be a": "Для отправки событий типа <eventType/>, необходимо быть",
"To change the room's avatar, you must be a": "Чтобы изменить аватар комнаты, необходимо быть",
"To change the room's name, you must be a": "Чтобы изменить имя комнаты, необходимо быть",
"To change the room's main address, you must be a": "Чтобы изменить основной адрес комнаты, необходимо быть",
"To change the room's history visibility, you must be a": "Чтобы изменить видимость истории комнаты, необходимо быть",
"To change the permissions in the room, you must be a": "Чтобы изменить разрешения в комнате, необходимо быть",
"To change the topic, you must be a": "Чтобы изменить тему, необходимо быть",
"To modify widgets in the room, you must be a": "Чтобы изменить виджеты в комнате, необходимо быть",
"Description": "Описание",
"Name or matrix ID": "Имя или matrix ID",
"Unable to accept invite": "Невозможно принять приглашение",
"Unable to leave room": "Невозможно покинуть комнату",
"Leave": "Покинуть",
"Failed to invite the following users to %(groupId)s:": "Не удалось пригласить следующих пользователей в %(groupId)s:",
"Failed to remove '%(roomName)s' from %(groupId)s": "Не удалось удалить '%(roomName)s' из %(groupId)s",
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Вы действительно хотите удалить '%(roomName)s' из %(groupId)s?",
"Invites sent": "Приглашение отправлено",
"Jump to read receipt": "Перейти к подтверждению о прочтении",
"Disable big emoji in chat": "Отключить большие emoji в чате",
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "Больше никого нет! Хотите <a>пригласить кого-нибудь</a> или <a>отключить уведомление о пустой комнате</a>?",
"Message Pinning": "Закрепление сообщений",
"Remove avatar": "Удалить аватар",
"Failed to invite users to %(groupId)s": "Не удалось пригласить пользователей в %(groupId)s",
"Unable to reject invite": "Невозможно отклонить приглашение",
"Leave %(groupName)s?": "Покинуть %(groupName)s?",
"Add a Room": "Добавить комнату",
"Add a User": "Добавить пользователя",
"Who would you like to add to this summary?": "Кого вы хотите добавить в эту сводку?",
"Add to summary": "Добавить в сводку",
"Failed to add the following users to the summary of %(groupId)s:": "Не удалось добавить следующих пользователей в сводку %(groupId)s:",
"Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?",
"Room name or alias": "Название комнаты или псевдоним",
"Pinned Messages": "Закрепленные сообщения",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s изменил закрепленные сообщения для этой комнаты.",
"Failed to add the following rooms to the summary of %(groupId)s:": "Не удалось добавить следующие комнаты в сводку %(groupId)s:",
"Failed to remove the room from the summary of %(groupId)s": "Не удалось удалить комнату из сводки %(groupId)s",
"The room '%(roomName)s' could not be removed from the summary.": "Комнату '%(roomName)s' не удалось удалить из сводки.",
"Failed to remove a user from the summary of %(groupId)s": "Не удалось удалить пользователя из сводки %(groupId)s",
"The user '%(displayName)s' could not be removed from the summary.": "Пользователя '%(displayName)s' не удалось удалить из сводки.",
"Light theme": "Светлая тема",
"Dark theme": "Темная тема",
"Unknown": "Неизвестно",
"Failed to add the following rooms to %(groupId)s:": "Не удалось добавить следующие комнаты в %(groupId)s:",
"Matrix ID": "Matrix ID",
"Matrix Room ID": "Matrix ID комнаты",
"email address": "адрес email",
"Try using one of the following valid address types: %(validTypesList)s.": "Попробуйте использовать один из следующих допустимых типов адресов: %(validTypesList)s.",
"You have entered an invalid address.": "Введен неправильный адрес.",
"Unpin Message": "Открепить сообщение",
"Jump to message": "Перейти к сообщению",
"No pinned messages.": "Нет прикрепленных сообщений.",
"Loading...": "Загрузка...",
"Unnamed room": "Комната без названия",
"World readable": "Доступно всем",
"Guests can join": "Гости могут присоединиться",
"No rooms to show": "Нет комнат для отображения",
"Community Member Settings": "Настройки участников сообщества",
"Publish this community on your profile": "Опубликовать это сообщество в вашем профиле",
"Long Description (HTML)": "Длинное описание (HTML)",
"Community Settings": "Настройки сообщества"
}

View file

@ -1,6 +1,5 @@
{
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ett SMS har skickats till +%(msisdn)s. Vänligen ange verifieringskoden ur meddelandet",
"accept": "acceptera",
"%(targetName)s accepted an invitation.": "%(targetName)s accepterade en inbjudan.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepterade inbjudan för %(displayName)s.",
"Account": "Konto",
@ -22,8 +21,6 @@
"Always show message timestamps": "Visa alltid tidsstämpel för meddelanden",
"Hide removed messages": "Göm raderade meddelanden",
"Authentication": "Autentisering",
"an address": "en address",
"and": "och",
"%(items)s and %(remaining)s others": "%(items)s och %(remaining)s andra",
"%(items)s and one other": "%(items)s och en annan",
"%(items)s and %(lastItem)s": "%(items)s och %(lastItem)s",
@ -31,7 +28,6 @@
"and %(count)s others...|one": "och en annan...",
"%(names)s and %(lastPerson)s are typing": "%(names)s och %(lastPerson)s skriver",
"%(names)s and one other are typing": "%(names)s och en annan skriver",
"%(names)s and %(count)s others are typing": "%(names)s och %(count)s andra skriver",
"An email has been sent to": "Ett epostmeddelande har sänts till",
"A new password must be entered.": "Ett nytt lösenord måste anges.",
"%(senderName)s answered the call.": "%(senderName)s svarade på samtalet.",
@ -53,7 +49,6 @@
"Ban": "Banna",
"Attachment": "Bilaga",
"Call Timeout": "Samtalstimeout",
"Can't connect to homeserver - please check your connectivity and ensure your <a>homeserver's SSL certificate</a> is trusted.": "Det gick inte att ansluta till hemservern - kontrollera anslutningen och att <a>hemserverns TLS-certifikat</a> är pålitat.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Det går inte att ansluta till en hemserver via HTTP då adressen i webbläsaren är HTTPS. Använd HTTPS, eller <a>sätt på osäkra skript</a>.",
"Can't load user settings": "Det gick inte att ladda användarinställningar",
"Change Password": "Byt lösenord",
@ -68,7 +63,6 @@
"Claimed Ed25519 fingerprint key": "Påstådd Ed25519-fingeravtrycksnyckel",
"Clear Cache and Reload": "Töm cache och ladda om",
"Clear Cache": "Töm cache",
"Click here": "Klicka här",
"Click here to fix": "Klicka här för att fixa",
"Click to mute audio": "Klicka för att dämpa ljud",
"Click to mute video": "Klicka för att stänga av video",
@ -94,11 +88,9 @@
"/ddg is not a command": "/ddg är inte ett kommando",
"Deactivate Account": "Deaktivera konto",
"Deactivate my account": "Deaktivera mitt konto",
"decline": "avböj",
"Decrypt %(text)s": "Dekryptera %(text)s",
"Decryption error": "Dekrypteringsfel",
"Delete": "Radera",
"demote": "degradera",
"Deops user with given id": "Degraderar användaren med givet id",
"Default": "Standard",
"Device already verified!": "Enheten är redan verifierad!",
@ -149,7 +141,6 @@
"Failed to load timeline position": "Det gick inte att hämta positionen på tidslinjen",
"Failed to lookup current room": "Det gick inte att hämta det nuvarande rummet",
"Failed to mute user": "Det gick inte att dämpa användaren",
"Failed to register as guest:": "Det gick inte att registrera som gästanvändare:",
"Failed to reject invite": "Det gick inte att avböja inbjudan",
"Failed to reject invitation": "Det gick inte att avböja inbjudan",
"Failed to save settings": "Det gick inte att spara inställningarna",
@ -163,14 +154,12 @@
"Failed to upload file": "Det gick inte att ladda upp filen",
"Failed to verify email address: make sure you clicked the link in the email": "Det gick inte att bekräfta epostadressen, klicka på länken i epostmeddelandet",
"Favourite": "Favorit",
"favourite": "favorit",
"a room": "ett rum",
"Accept": "Godkänn",
"Access Token:": "Åtkomsttoken:",
"Active call (%(roomName)s)": "Aktiv samtal (%(roomName)s)",
"Add": "Lägg till",
"Admin Tools": "Admin verktyg",
"And %(count)s more...": "Och %(count)s till...",
"Alias (optional)": "Alias (valfri)",
"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.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din <a>hemservers TLS-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade maktnivån av %(powerLevelDiffText)s.",
@ -204,7 +193,6 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s från %(fromPowerLevel)s till %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Gäståtkomst är inte aktiverat på den här hemservern.",
"Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.",
"had": "hade",
"Hangup": "Lägg på",
"Hide read receipts": "Göm kvitteringar",
"Hide Text Formatting Toolbar": "Göm textformatteringsverktygsfältet",
@ -236,8 +224,6 @@
"Sign in with": "Logga in med",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Gå med som <voiceText>röst</voiceText> eller <videoText>video</videoText>.",
"Join Room": "Gå med i rum",
"joined and left": "gick med och lämnade",
"joined": "gick med",
"%(targetName)s joined the room.": "%(targetName)s gick med i rummet.",
"Joins room with given alias": "Går med i rummet med givet alias",
"Jump to first unread message.": "Hoppa till första olästa meddelande.",
@ -247,8 +233,6 @@
"Labs": "Labb",
"Last seen": "Senast sedd",
"Leave room": "Lämna rummet",
"left and rejoined": "lämnade rummet och kom tillbaka",
"left": "lämnade",
"%(targetName)s left the room.": "%(targetName)s lämnade rummet.",
"Level:": "Nivå:",
"Local addresses for this room:": "Lokala adresser för rummet:",
@ -276,7 +260,6 @@
"%(serverName)s Matrix ID": "%(serverName)s Matrix-ID",
"Name": "Namn",
"Never send encrypted messages to unverified devices from this device": "Skicka aldrig krypterade meddelanden till overifierade enheter från den här enheten",
"Never send encrypted messages to unverified devices in this room": "Skicka aldrig krypterade meddelanden till overifierade enheter i det här rummet",
"Never send encrypted messages to unverified devices in this room from this device": "Skicka aldrig krypterade meddelanden till overifierade enheter i det här rummet från den här enheten",
"New address (e.g. #foo:%(localDomain)s)": "Ny address (t.ex. #foo:%(localDomain)s)",
"New password": "Nytt lösenord",
@ -321,7 +304,6 @@
"Revoke Moderator": "Degradera moderator",
"Refer a friend to Riot:": "Hänvisa en vän till Riot:",
"Register": "Registrera",
"rejected": "avvisade",
"%(targetName)s rejected the invitation.": "%(targetName)s avvisade inbjudan.",
"Reject invitation": "Avvisa inbjudan",
"Rejoin": "Gå med tillbaka",
@ -334,7 +316,6 @@
"%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.",
"Report it": "Rapportera det",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du återställer ditt lösenord kommer alla krypteringsnycklar på alla enheter att återställas, vilket gör krypterad meddelandehistorik oläsbar om du inte först exporterar dina rumsnycklar och sedan importerar dem igen. I framtiden kommer det här att förbättras.",
"restore": "återställ",
"Results from DuckDuckGo": "Resultat från DuckDuckGo",
"Return to app": "Tillbaka till appen",
"Return to login screen": "TIllbaka till login-skärmen",
@ -374,7 +355,6 @@
"Session ID": "Sessions-ID",
"%(senderName)s set a profile picture.": "%(senderName)s satte en profilbild.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s bytte sitt visningnamn till %(displayName)s.",
"Set": "Sätt",
"Settings": "Inställningar",
"Show panel": "Visa panel",
"Show Text Formatting Toolbar": "Visa textformatteringsverktygsfält",
@ -399,13 +379,6 @@
"Room directory": "Rumskatalog",
"Start chat": "Starta chatt",
"unknown error code": "okänd felkod",
"Sunday": "söndag",
"Monday": "måndag",
"Tuesday": "tisdag",
"Wednesday": "onsdag",
"Thursday": "torsdag",
"Friday": "fredag",
"Saturday": "lördag",
"Add a widget": "Lägg till en widget",
"Allow": "Tillåt",
"Cannot add any more widgets": "Det går inte att lägga till fler widgets",
@ -419,22 +392,18 @@
"Hide avatar and display name changes": "Dölj avatar och visningsnamns ändringar",
"Integrations Error": "Integrationsfel",
"Publish this room to the public in %(domain)s's room directory?": "Publicera rummet i den offentliga rumskatalogen på %(domain)s?",
"Matrix Apps": "Matrix-appar",
"AM": "a.m.",
"PM": "p.m.",
"NOTE: Apps are not end-to-end encrypted": "OBS: Apparna är inte end-to-end-krypterade",
"Revoke widget access": "Upphäv widget-åtkomst",
"Show Apps": "Visa appar",
"Submit": "Lämna",
"tag as %(tagName)s": "tagga som %(tagName)s",
"tag direct chat": "tagga som direkt-chatt",
"Tagged as: ": "Taggad som: ",
"The default role for new room members is": "Standardrollen för nya medlemmar är",
"The main address for this room is": "Huvudadressen för det här rummet är",
"The maximum permitted number of widgets have already been added to this room.": "Den största tillåtna mängden widgetar har redan tillsats till rummet.",
"The phone number entered looks invalid": "Telefonnumret ser felaktigt ut",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnyckeln du angav matchar signeringsnyckeln som mottogs från enheten %(deviceId)s som tillhör %(userId)s. Enheten är markerad som verifierad.",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Den här handlingen kan inte utföras av en gästanvändare. Registrera dig för att kunna göra det här.",
"This email address is already in use": "Den här epostadressen är redan i bruk",
"This email address was not found": "Den här epostadressen fanns inte",
"%(actionVerb)s this person?": "%(actionVerb)s den här personen?",

View file

@ -30,11 +30,7 @@
"You do not have permission to post to this room": "మీకు ఈ గదికి పోస్ట్ చేయడానికి అనుమతి లేదు",
"You have been invited to join this room by %(inviterName)s": "%(inviterName)s ఈ గదిలో చేరడానికి మీరు ఆహ్వానించబడ్డారు",
"Active call (%(roomName)s)": "క్రియాశీల కాల్ల్ (%(roomName)s)",
"And %(count)s more...": "మరియు %(count)s ఇంకా ...",
"and": "మరియు",
"and one other...": "మరియు మరొకటి ...",
"%(names)s and one other are typing": "%(names)s మరియు మరొకటి టైప్ చేస్తున్నారు",
"%(names)s and %(count)s others are typing": "%(names)s మరియు %(count)s ఇతరులు టైప్ చేస్తున్నారు",
"An email has been sent to": "ఒక ఇమెయిల్ పంపబడింది",
"A new password must be entered.": "కొత్త పాస్ వర్డ్ ను తప్పక నమోదు చేయాలి.",
"%(senderName)s answered the call.": "%(senderName)s కు సమాధానం ఇచ్చారు.",
@ -68,7 +64,6 @@
"You cannot place VoIP calls in this browser.": "మీరు ఈ బ్రౌజర్లో VoIP కాల్లను ఉంచలేరు.",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "మీరు అన్ని పరికరాల నుండి లాగ్ అవుట్ అయ్యారు మరియు ఇకపై పుష్ ఉండదు.\nప్రకటనలను నోటిఫికేషన్లను పునఃప్రారంభించడానికి, ప్రతి పరికరంలో మళ్లీ సైన్ ఇన్ చేయండి",
"You have no visible notifications": "మీకు కనిపించే నోటిఫికేషన్లు లేవు",
"you must be a": "మీరు తప్పక",
"You need to be able to invite users to do that.": "మీరు దీన్ని చేయడానికి వినియోగదారులను ఆహ్వానించగలరు.",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "పాస్ వర్డ్ మార్చడం వల్ల ప్రస్తుతం అన్ని పరికరాల్లో ఏదైనా ఎండ్-టు-ఎండ్ ఎన్క్రిప్షన్ కీలను రీసెట్ చేస్తుంది, ఎన్క్రిప్టెడ్ చాట్ చరిత్రను చదవటానికి వీలెకుండ చెస్తుంది, మీరు మొదట మీ గది కీలను ఎగుమతి చేసి, తర్వాత వాటిని తిరిగి దిగుమతి చేసుకోకపోతే. భవిష్యత్తులో ఇది మెరుగవుతుంది.",
"Claimed Ed25519 fingerprint key": "ఎడ్25519 వేలిముద్ర కీ ని పేర్కొన్నారు",
@ -108,7 +103,6 @@
"Decline": "డిక్లైన్",
"Decryption error": "గుప్తలేఖన లోపం",
"Delete": "తొలగించు",
"demote": "స్థానానికి తగ్గించు",
"Deops user with given id": "ఇచ్చిన ID తో వినియోగదారుని విడదీస్తుంది",
"Default": "డిఫాల్ట్",
"Device already verified!": "పరికరం ఇప్పటికే ధృవీకరించబడింది!",
@ -119,7 +113,6 @@
"Wed": "బుధవారం",
"Thu": "గురువారం",
"Fri": "శుక్రువారం",
"Friday": "శుక్రువారం",
"Sat": "శనివారం",
"Jan": "జనవరి",
"Feb": "ఫిబ్రవరి",
@ -169,12 +162,6 @@
"Sent messages will be stored until your connection has returned.": "మీ కనెక్షన్ తిరిగి వచ్చే వరకు పంపిన సందేశాలు నిల్వ చేయబడతాయి.",
"Cancel": "రద్దు",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>అన్నీ మళ్లీ పంపు</a>లేదా<a>అన్నింటినీ రద్దు చేయండి</a>ప్పుడు.వ్యక్తిగత సందేశాలను మీరు మళ్ళీ చేసుకోవచ్చు లేదా రద్దు చేసుకోవచ్చు.",
"Monday": "సోమవారం",
"Tuesday": "మంగళవారం",
"Wednesday": "బుధవారం",
"Thursday": "గురువారం",
"Saturday": "శనివారం",
"Sunday": "ఆదివారం",
"bold": "బోల్డ్",
"italic": "ఇటాలిక్",
"strike": "సమ్మె",
@ -190,7 +177,6 @@
"riot-web version:": "రయట్-వెబ్ సంస్కరణ:",
"Riot was not given permission to send notifications - please try again": "రయట్ కు ప్రకటనలను పంపడానికి అనుమతి లేదు - దయచేసి మళ్ళీ ప్రయత్నించండి",
"Return to app": "అనువర్తనానికి తిరిగి వెళ్ళు",
"restore": "పునరుద్దరించండి",
"to restore": "పునరుద్ధరించడానికి",
"Unable to restore session": "సెషన్ను పునరుద్ధరించడానికి సాధ్యపడలేదు",
"Report it": "దానిని నివేదించండి",

View file

@ -1,12 +1,10 @@
{
"accept": "ยอมรับ",
"Account": "บัญชี",
"Add phone number": "เพิ่มหมายเลขโทรศัพท์",
"Microphone": "ไมโครโฟน",
"No Microphones detected": "ไม่พบไมโครโฟน",
"Camera": "กล้อง",
"Advanced": "ขึ้นสูง",
"and": "และ",
"Ban": "แบน",
"Bug Report": "รายงานจุดบกพร่อง",
"Change Password": "เปลี่ยนรหัสผ่าน",
@ -27,7 +25,6 @@
"enabled": "เปิดใช้งานแล้ว",
"Error": "ข้อผิดพลาด",
"Found a bug?": "พบจุดบกพร่อง?",
"is a": "เป็น",
"%(displayName)s is typing": "%(displayName)s กำลังพิมพ์",
"Kick": "เตะ",
"Low priority": "ความสำคัญต่ำ",
@ -54,13 +51,6 @@
"Search": "ค้นหา",
"Settings": "การตั้งค่า",
"unknown error code": "รหัสข้อผิดพลาดที่ไม่รู้จัก",
"Sunday": "วันอาทิตย์",
"Monday": "วันจันทร์",
"Tuesday": "วันอังคาร",
"Wednesday": "วันพุธ",
"Thursday": "วันพฤหัสบดี",
"Friday": "วันศุกร์",
"Saturday": "วันเสาร์",
"olm version:": "เวอร์ชัน olm:",
"Report it": "รายงานเลย",
"Remove": "ลบ",
@ -79,7 +69,6 @@
"Algorithm": "อัลกอริทึม",
"Hide removed messages": "ซ่อนข้อความที่ถูกลบแล้ว",
"Authentication": "การยืนยันตัวตน",
"an address": "ที่อยู่",
"%(items)s and %(remaining)s others": "%(items)s และอีก %(remaining)s ผู้ใช้",
"%(items)s and one other": "%(items)s และอีกหนึ่งผู้ใช้",
"%(items)s and %(lastItem)s": "%(items)s และ %(lastItem)s",
@ -87,7 +76,6 @@
"and %(count)s others...|other": "และอีก %(count)s ผู้ใช้...",
"%(names)s and %(lastPerson)s are typing": "%(names)s และ %(lastPerson)s กำลังพิมพ์",
"%(names)s and one other are typing": "%(names)s และอีกหนึ่งคนกำลังพิมพ์",
"%(names)s and %(count)s others are typing": "%(names)s และอีก %(count)s คนกำลังพิมพ์",
"%(senderName)s answered the call.": "%(senderName)s รับสายแล้ว",
"An error has occurred.": "เกิดข้อผิดพลาด",
"Anyone": "ทุกคน",
@ -110,7 +98,6 @@
"Changes your display nickname": "เปลี่ยนชื่อเล่นที่แสดงของคุณ",
"Clear Cache and Reload": "ล้างแคชแล้วโหลดใหม่",
"Clear Cache": "ล้างแคช",
"Click here": "คลิกที่นี่",
"Click here to fix": "คลิกที่นี่เพื่อแก้ไข",
"Click to mute audio": "คลิกที่นี่เพื่อปิดเสียง",
"Click to mute video": "คลิกที่นี่เพื่อปิดกล้อง",
@ -132,9 +119,7 @@
"/ddg is not a command": "/ddg ไม่ใช่คำสั่ง",
"Deactivate Account": "ปิดการใช้งานบัญชี",
"Deactivate my account": "ปิดการใช้งานบัญชีของฉัน",
"decline": "ปฏิเสธ",
"Decryption error": "การถอดรหัสผิดพลาด",
"demote": "ลดขั้น",
"Device already verified!": "ยืนยันอุปกรณ์แล้ว!",
"Device key:": "Key อุปกรณ์:",
"Devices will not yet be able to decrypt history from before they joined the room": "อุปกรณ์จะยังไม่สามารถถอดรหัสประวัติแชทก่อนจะเข้าร่วมห้องได้",
@ -161,7 +146,6 @@
"Failed to kick": "การเตะล้มเหลว",
"Failed to leave room": "การออกจากห้องล้มเหลว",
"Failed to lookup current room": "การหาห้องปัจจุบันล้มเหลว",
"Failed to register as guest:": "การลงทะเบียนในฐานะแขกล้มเหลว:",
"Failed to reject invite": "การปฏิเสธคำเชิญล้มเหลว",
"Failed to reject invitation": "การปฏิเสธคำเชิญล้มเหลว",
"Failed to save settings": "การบันทึกการตั้งค่าล้มเหลว",
@ -173,13 +157,11 @@
"Failed to upload file": "การอัปโหลดไฟล์ล้มเหลว",
"Failed to verify email address: make sure you clicked the link in the email": "การยืนยันอีเมลล้มเหลว: กรุณาตรวจสอบว่าคุณคลิกลิงก์ในอีเมลแล้ว",
"Failure to create room": "การสร้างห้องล้มเหลว",
"favourite": "รายการโปรด",
"Favourites": "รายการโปรด",
"Filter room members": "กรองสมาชิกห้อง",
"Forget room": "ลืมห้อง",
"Forgot your password?": "ลิมรหัสผ่าน?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s จาก %(fromPowerLevel)s ไปเป็น %(toPowerLevel)s",
"had": "เคยมี",
"Hangup": "วางสาย",
"Historical": "ประวัติแชทเก่า",
"Homeserver is": "เซิร์ฟเวอร์บ้านคือ",
@ -202,15 +184,11 @@
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' ไม่ใช่รูปแบบที่ถูกต้องสำหรับนามแฝง",
"Sign in with": "เข้าสู่ระบบด้วย",
"Join Room": "เข้าร่วมห้อง",
"joined and left": "เข้าร่วมแล้วออกจากห้อง",
"joined": "เข้าร่วมแล้ว",
"%(targetName)s joined the room.": "%(targetName)s เข้าร่วมห้องแล้ว",
"Jump to first unread message.": "ข้ามไปยังข้อความแรกที่ยังไม่ได้อ่าน",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s เตะ %(targetName)s แล้ว",
"Labs": "ห้องทดลอง",
"Leave room": "ออกจากห้อง",
"left and rejoined": "ออกแล้วกลับเข้าร่วมอีกครั้ง",
"left": "ออกไปแล้ว",
"%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว",
"Logged in as:": "เข้าสู่ระบบในชื่อ:",
"Login as guest": "เข้าสู่ระบบในฐานะแขก",
@ -242,13 +220,11 @@
"Privileged Users": "ผู้ใช้ที่มีสิทธิพิเศษ",
"Revoke Moderator": "เพิกถอนผู้ช่วยดูแล",
"Refer a friend to Riot:": "แนะนำเพื่อนให้รู้จัก Riot:",
"rejected": "ปฏิเสธแล้ว",
"%(targetName)s rejected the invitation.": "%(targetName)s ปฏิเสธคำเชิญแล้ว",
"Reject invitation": "ปฏิเสธคำเชิญ",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ลบชื่อที่แสดงแล้ว (%(oldDisplayName)s)",
"%(senderName)s removed their profile picture.": "%(senderName)s ลบรูปโปรไฟล์ของเขาแล้ว",
"Remove %(threePid)s?": "ลบ %(threePid)s?",
"restore": "กู้คืน",
"Return to login screen": "กลับไปยังหน้าลงชื่อเข้าใช้",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot ไม่มีสิทธิ์ส่งการแจ้งเตือน - กรุณาตรวจสอบการตั้งค่าเบราว์เซอร์ของคุณ",
"Riot was not given permission to send notifications - please try again": "Riot ไม่ได้รับสิทธิ์ส่งการแจ้งเตือน - กรุณาลองใหม่อีกครั้ง",
@ -286,7 +262,6 @@
"Start Chat": "เริ่มแชท",
"Submit": "ส่ง",
"Success": "สำเร็จ",
"tag direct chat": "แท็กว่าแชทตรง",
"Tagged as: ": "แท็กไว้ว่า: ",
"The main address for this room is": "ที่อยู่หลักของห้องนี้คือ",
"This email address is already in use": "ที่อยู่อีเมลถูกใช้แล้ว",
@ -294,11 +269,9 @@
"%(actionVerb)s this person?": "%(actionVerb)s บุคคลนี้?",
"The file '%(fileName)s' failed to upload": "การอัปโหลดไฟล์ '%(fileName)s' ล้มเหลว",
"This Home Server does not support login using email address.": "เซิร์ฟเวอร์บ้านนี้ไม่รองรับการลงชื่อเข้าใช้ด้วยที่อยู่อีเมล",
"this invitation?": "คำเชิญนี้?",
"This is a preview of this room. Room interactions have been disabled": "นี่คือตัวอย่างของห้อง การตอบสนองภายในห้องถูกปิดใช้งาน",
"This phone number is already in use": "หมายเลขโทรศัพท์นี้ถูกใช้งานแล้ว",
"This room's internal ID is": "ID ภายในของห้องนี้คือ",
"times": "ครั้ง",
"%(oneUser)schanged their name": "%(oneUser)sเปลี่ยนชื่อของเขาแล้ว",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)sเปลี่ยนชื่อของพวกเขา %(repeats)s ครั้ง",
"%(oneUser)schanged their name %(repeats)s times": "%(oneUser)sเปลี่ยนชื่อของเขา %(repeats)s ครั้ง",
@ -322,7 +295,6 @@
"The phone number entered looks invalid": "ดูเหมือนว่าหมายเลขโทรศัพท์ที่กรอกรมาไม่ถูกต้อง",
"The email address linked to your account must be entered.": "กรุณากรอกที่อยู่อีเมลที่เชื่อมกับบัญชีของคุณ",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "ไฟล์ '%(fileName)s' มีขนาดใหญ่เกินจำกัดของเซิร์ฟเวอร์บ้าน",
"to start a chat with someone": "เพื่อเริ่มแชทกับผู้อื่น",
"to tag direct chat": "เพื่อแทกว่าแชทตรง",
"Turn Markdown off": "ปิด markdown",
"Turn Markdown on": "เปิด markdown",
@ -358,11 +330,9 @@
"Who can read history?": "ใครสามารถอ่านประวัติแชทได้?",
"Who would you like to add to this room?": "คุณต้องการเพิ่มใครเข้าห้องนี้?",
"Who would you like to communicate with?": "คุณต้องการคุยกับใคร?",
"You're not in any rooms yet! Press": "คุณยังไม่ได้อยู่ในห้องใดเลย! กด",
"You are trying to access %(roomName)s.": "คุณกำลังพยายามเข้าสู่ %(roomName)s",
"You have <a>disabled</a> URL previews by default.": "ค่าเริ่มต้นของคุณ<a>ปิดใช้งาน</a>ตัวอย่าง URL เอาไว้",
"You have <a>enabled</a> URL previews by default.": "ค่าเริ่มต้นของคุณ<a>เปิดใช้งาน</a>ตัวอย่าง URL เอาไว้",
"you must be a": "คุณต้องเป็น",
"You must <a>register</a> to use this functionality": "คุณต้อง<a>ลงทะเบียน</a>เพื่อใช้ฟังก์ชันนี้",
"You need to be logged in.": "คุณต้องเข้าสู่ระบบก่อน",
"You need to enter a user name.": "คุณต้องกรอกชื่อผู้ใช้ก่อน",
@ -395,15 +365,12 @@
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "รหัสผ่านสั้นเกินไป (ขึ้นต่ำ %(MIN_PASSWORD_LENGTH)s ตัวอักษร)",
"An unknown error occurred.": "เกิดข้อผิดพลาดที่ไม่รู้จัก",
"I already have an account": "ฉันมีบัญชีอยู่แล้ว",
"An error occured: %(error_string)s": "เกิดข้อผิดพลาด: %(error_string)s",
"Topic": "หัวข้อ",
"Make Moderator": "เลื่อนขั้นเป็นผู้ช่วยดูแล",
"Make this room private": "ทำให้ห้องนี้เป็นส่วนตัว",
"Share message history with new users": "แบ่งประวัติแชทให้ผู้ใช้ใหม่",
"Encrypt room": "เข้ารหัสห้อง",
"Room": "ห้อง",
"(~%(searchCount)s results)": "(~%(searchCount)s ผลลัพธ์)",
"or": "หรือ",
"bold": "หนา",
"italic": "เอียง",
"strike": "ขีดทับ",
@ -458,14 +425,11 @@
"Home": "เมนูหลัก",
"Last seen": "เห็นครั้งสุดท้าย",
"Rejoin": "กลับเข้าร่วม",
"Set": "ตั้ง",
"This room": "ห้องนี้",
"Unnamed Room": "ห้องที่ยังไม่ได้ตั้งชื่อ",
"%(user)s is a": "%(user)s เป็น",
"(~%(count)s results)|one": "(~%(count)s ผลลัพท์)",
"(~%(count)s results)|other": "(~%(count)s ผลลัพท์)",
"Admin tools": "เครื่องมือผู้ดูแล",
"And %(count)s more...": "เพิ่มอีก %(count)s ชิ้น...",
"Missing Media Permissions, click here to request.": "ไม่มีสิทธิ์เข้าถึงสื่อ, คลิกที่นี่เพื่อขอสิทธิ์",
"Alias (optional)": "นามแฝง (ไม่ใส่ก็ได้)",
"An email has been sent to": "ส่งอีเมลไปแล้วถึง",
@ -486,7 +450,6 @@
"Otherwise, <a>click here</a> to send a bug report.": "หรือ<a>คลิกที่นี่</a>เพื่อรายงานจุดบกพร่อง",
"Power level must be positive integer.": "ระดับอำนาจต้องเป็นจำนวนเต็มบวก",
"%(roomName)s does not exist.": "ไม่มีห้อง %(roomName)s อยู่จริง",
"to browse the directory": "เพื่อเรียกดูไดเรกทอรี",
"To link to a room it must have <a>an address</a>.": "ห้องต้องมี<a>ที่อยู่</a>ก่อน ถึงจะลิงก์ได้",
"Enter passphrase": "กรอกรหัสผ่าน",
"Seen by %(userName)s at %(dateTime)s": "%(userName)s เห็นแล้วเมื่อเวลา %(dateTime)s",

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