Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into kegan/hide-join-part

This commit is contained in:
Michael Telatynski 2017-06-15 20:10:32 +01:00
commit a097357baf
36 changed files with 1741 additions and 307 deletions

View file

@ -146,7 +146,6 @@ src/Roles.js
src/RoomListSorter.js src/RoomListSorter.js
src/RoomNotifs.js src/RoomNotifs.js
src/Rooms.js src/Rooms.js
src/RtsClient.js
src/ScalarAuthClient.js src/ScalarAuthClient.js
src/ScalarMessaging.js src/ScalarMessaging.js
src/SdkConfig.js src/SdkConfig.js

View file

@ -1,3 +1,177 @@
Changes in [0.9.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.4) (2017-06-14)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3...v0.9.4)
* Ask for email address after setting password for the first time
[\#1090](https://github.com/matrix-org/matrix-react-sdk/pull/1090)
* DM guessing: prefer oldest joined member
[\#1087](https://github.com/matrix-org/matrix-react-sdk/pull/1087)
* More translations
Changes in [0.9.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3) (2017-06-12)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3-rc.2...v0.9.3)
* Add more translations & fix some existing ones
Changes in [0.9.3-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3-rc.2) (2017-06-09)
=============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3-rc.1...v0.9.3-rc.2)
* Fix flux dependency
* Fix translations on conference call bar
Changes in [0.9.3-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.3-rc.1) (2017-06-09)
=============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.2...v0.9.3-rc.1)
* When ChatCreateOrReuseDialog is cancelled by a guest, go home
[\#1069](https://github.com/matrix-org/matrix-react-sdk/pull/1069)
* Update from Weblate.
[\#1065](https://github.com/matrix-org/matrix-react-sdk/pull/1065)
* Goto /home when forgetting the last room
[\#1067](https://github.com/matrix-org/matrix-react-sdk/pull/1067)
* Default to home page when settings is closed
[\#1066](https://github.com/matrix-org/matrix-react-sdk/pull/1066)
* Update from Weblate.
[\#1063](https://github.com/matrix-org/matrix-react-sdk/pull/1063)
* When joining, use a roomAlias if we have it
[\#1062](https://github.com/matrix-org/matrix-react-sdk/pull/1062)
* Control currently viewed event via RoomViewStore
[\#1058](https://github.com/matrix-org/matrix-react-sdk/pull/1058)
* Better error messages for login
[\#1060](https://github.com/matrix-org/matrix-react-sdk/pull/1060)
* Add remaining translations
[\#1056](https://github.com/matrix-org/matrix-react-sdk/pull/1056)
* Added button that copies code to clipboard
[\#1040](https://github.com/matrix-org/matrix-react-sdk/pull/1040)
* de-lint MegolmExportEncryption + test
[\#1059](https://github.com/matrix-org/matrix-react-sdk/pull/1059)
* Better RTL support
[\#1021](https://github.com/matrix-org/matrix-react-sdk/pull/1021)
* make mels emoji capable
[\#1057](https://github.com/matrix-org/matrix-react-sdk/pull/1057)
* Make travis check for lint on files which are clean to start with
[\#1055](https://github.com/matrix-org/matrix-react-sdk/pull/1055)
* Update from Weblate.
[\#1053](https://github.com/matrix-org/matrix-react-sdk/pull/1053)
* Add some logging around switching rooms
[\#1054](https://github.com/matrix-org/matrix-react-sdk/pull/1054)
* Update from Weblate.
[\#1052](https://github.com/matrix-org/matrix-react-sdk/pull/1052)
* Use user_directory endpoint to populate ChatInviteDialog
[\#1050](https://github.com/matrix-org/matrix-react-sdk/pull/1050)
* Various Analytics changes/fixes/improvements
[\#1046](https://github.com/matrix-org/matrix-react-sdk/pull/1046)
* Use an arrow function to allow `this`
[\#1051](https://github.com/matrix-org/matrix-react-sdk/pull/1051)
* New guest access
[\#937](https://github.com/matrix-org/matrix-react-sdk/pull/937)
* Translate src/components/structures
[\#1048](https://github.com/matrix-org/matrix-react-sdk/pull/1048)
* Cancel 'join room' action if 'log in' is clicked
[\#1049](https://github.com/matrix-org/matrix-react-sdk/pull/1049)
* fix copy and paste derp and rip out unused imports
[\#1015](https://github.com/matrix-org/matrix-react-sdk/pull/1015)
* Update from Weblate.
[\#1042](https://github.com/matrix-org/matrix-react-sdk/pull/1042)
* Reset 'first sync' flag / promise on log in
[\#1041](https://github.com/matrix-org/matrix-react-sdk/pull/1041)
* Remove DM-guessing code (again)
[\#1036](https://github.com/matrix-org/matrix-react-sdk/pull/1036)
* Cancel deferred actions
[\#1039](https://github.com/matrix-org/matrix-react-sdk/pull/1039)
* Merge develop, add i18n for SetMxIdDialog
[\#1034](https://github.com/matrix-org/matrix-react-sdk/pull/1034)
* Defer an intention for creating a room
[\#1038](https://github.com/matrix-org/matrix-react-sdk/pull/1038)
* Fix 'create room' button
[\#1037](https://github.com/matrix-org/matrix-react-sdk/pull/1037)
* Always show the spinner during the first sync
[\#1033](https://github.com/matrix-org/matrix-react-sdk/pull/1033)
* Only view welcome user if we are not looking at a room
[\#1032](https://github.com/matrix-org/matrix-react-sdk/pull/1032)
* Update from Weblate.
[\#1030](https://github.com/matrix-org/matrix-react-sdk/pull/1030)
* Keep deferred actions for view_user_settings and view_create_chat
[\#1031](https://github.com/matrix-org/matrix-react-sdk/pull/1031)
* Don't do a deferred start chat if user is welcome user
[\#1029](https://github.com/matrix-org/matrix-react-sdk/pull/1029)
* Introduce state `peekLoading` to avoid collision with `roomLoading`
[\#1028](https://github.com/matrix-org/matrix-react-sdk/pull/1028)
* Update from Weblate.
[\#1016](https://github.com/matrix-org/matrix-react-sdk/pull/1016)
* Fix accepting a 3pid invite
[\#1013](https://github.com/matrix-org/matrix-react-sdk/pull/1013)
* Propagate room join errors to the UI
[\#1007](https://github.com/matrix-org/matrix-react-sdk/pull/1007)
* Implement /user/@userid:domain?action=chat
[\#1006](https://github.com/matrix-org/matrix-react-sdk/pull/1006)
* Show People/Rooms emptySubListTip even when total rooms !== 0
[\#967](https://github.com/matrix-org/matrix-react-sdk/pull/967)
* Fix to show the correct room
[\#995](https://github.com/matrix-org/matrix-react-sdk/pull/995)
* Remove cachedPassword from localStorage on_logged_out
[\#977](https://github.com/matrix-org/matrix-react-sdk/pull/977)
* Add /start to show the setMxId above HomePage
[\#964](https://github.com/matrix-org/matrix-react-sdk/pull/964)
* Allow pressing Enter to submit setMxId
[\#961](https://github.com/matrix-org/matrix-react-sdk/pull/961)
* add login link to SetMxIdDialog
[\#954](https://github.com/matrix-org/matrix-react-sdk/pull/954)
* Block user settings with view_set_mxid
[\#936](https://github.com/matrix-org/matrix-react-sdk/pull/936)
* Show "Something went wrong!" when errcode undefined
[\#935](https://github.com/matrix-org/matrix-react-sdk/pull/935)
* Reset store state when logging out
[\#930](https://github.com/matrix-org/matrix-react-sdk/pull/930)
* Set the displayname to the mxid once PWLU
[\#933](https://github.com/matrix-org/matrix-react-sdk/pull/933)
* Fix view_next_room, view_previous_room and view_indexed_room
[\#929](https://github.com/matrix-org/matrix-react-sdk/pull/929)
* Use RVS to indicate "joining" when setting a mxid
[\#928](https://github.com/matrix-org/matrix-react-sdk/pull/928)
* Don't show notif nag bar if guest
[\#932](https://github.com/matrix-org/matrix-react-sdk/pull/932)
* Show "Password" instead of "New Password"
[\#927](https://github.com/matrix-org/matrix-react-sdk/pull/927)
* Remove warm-fuzzy after setting mxid
[\#926](https://github.com/matrix-org/matrix-react-sdk/pull/926)
* Allow teamServerConfig to be missing
[\#925](https://github.com/matrix-org/matrix-react-sdk/pull/925)
* Remove GuestWarningBar
[\#923](https://github.com/matrix-org/matrix-react-sdk/pull/923)
* Make left panel better for new users (mk III)
[\#924](https://github.com/matrix-org/matrix-react-sdk/pull/924)
* Implement default welcome page and allow custom URL /w config
[\#922](https://github.com/matrix-org/matrix-react-sdk/pull/922)
* Implement a store for RoomView
[\#921](https://github.com/matrix-org/matrix-react-sdk/pull/921)
* Add prop to toggle whether new password input is autoFocused
[\#915](https://github.com/matrix-org/matrix-react-sdk/pull/915)
* Implement warm-fuzzy success dialog for SetMxIdDialog
[\#905](https://github.com/matrix-org/matrix-react-sdk/pull/905)
* Write some tests for the RTS UI
[\#893](https://github.com/matrix-org/matrix-react-sdk/pull/893)
* Make confirmation optional on ChangePassword
[\#890](https://github.com/matrix-org/matrix-react-sdk/pull/890)
* Remove "Current Password" input if mx_pass exists
[\#881](https://github.com/matrix-org/matrix-react-sdk/pull/881)
* Replace NeedToRegisterDialog /w SetMxIdDialog
[\#889](https://github.com/matrix-org/matrix-react-sdk/pull/889)
* Invite the welcome user after registration if configured
[\#882](https://github.com/matrix-org/matrix-react-sdk/pull/882)
* Prevent ROUs from creating new chats/new rooms
[\#879](https://github.com/matrix-org/matrix-react-sdk/pull/879)
* Redesign mxID chooser, add availability checking
[\#877](https://github.com/matrix-org/matrix-react-sdk/pull/877)
* Show password nag bar when user is PWLU
[\#864](https://github.com/matrix-org/matrix-react-sdk/pull/864)
* fix typo
[\#858](https://github.com/matrix-org/matrix-react-sdk/pull/858)
* Initial implementation: SetDisplayName -> SetMxIdDialog
[\#849](https://github.com/matrix-org/matrix-react-sdk/pull/849)
Changes in [0.9.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.2) (2017-06-06) Changes in [0.9.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.2) (2017-06-06)
=================================================================================================== ===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.1...v0.9.2) [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.1...v0.9.2)

View file

@ -1,6 +1,6 @@
{ {
"name": "matrix-react-sdk", "name": "matrix-react-sdk",
"version": "0.9.2", "version": "0.9.4",
"description": "SDK for matrix.org using React", "description": "SDK for matrix.org using React",
"author": "matrix.org", "author": "matrix.org",
"repository": { "repository": {
@ -57,14 +57,14 @@
"emojione": "2.2.3", "emojione": "2.2.3",
"file-saver": "^1.3.3", "file-saver": "^1.3.3",
"filesize": "3.5.6", "filesize": "3.5.6",
"flux": "^2.0.3", "flux": "2.1.1",
"fuse.js": "^2.2.0", "fuse.js": "^2.2.0",
"glob": "^5.0.14", "glob": "^5.0.14",
"highlight.js": "^8.9.1", "highlight.js": "^8.9.1",
"isomorphic-fetch": "^2.2.1", "isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3", "linkifyjs": "^2.1.3",
"lodash": "^4.13.1", "lodash": "^4.13.1",
"matrix-js-sdk": "0.7.10", "matrix-js-sdk": "0.7.11",
"optimist": "^0.6.1", "optimist": "^0.6.1",
"prop-types": "^15.5.8", "prop-types": "^15.5.8",
"q": "^1.4.1", "q": "^1.4.1",

47
scripts/copy-i18n.py Executable file
View file

@ -0,0 +1,47 @@
#!/usr/bin/env python
import json
import sys
import os
if len(sys.argv) < 3:
print "Usage: %s <source> <dest>" % (sys.argv[0],)
print "eg. %s pt_BR.json pt.json" % (sys.argv[0],)
print
print "Adds any translations to <dest> that exist in <source> but not <dest>"
sys.exit(1)
srcpath = sys.argv[1]
dstpath = sys.argv[2]
tmppath = dstpath + ".tmp"
with open(srcpath) as f:
src = json.load(f)
with open(dstpath) as f:
dst = json.load(f)
toAdd = {}
for k,v in src.iteritems():
if k not in dst:
print "Adding %s" % (k,)
toAdd[k] = v
# don't just json.dumps as we'll probably re-order all the keys (and they're
# not in any given order so we can't just sort_keys). Append them to the end.
with open(dstpath) as ifp:
with open(tmppath, 'w') as ofp:
for line in ifp:
strippedline = line.strip()
if strippedline in ('{', '}'):
ofp.write(line)
elif strippedline.endswith(','):
ofp.write(line)
else:
ofp.write(' '+strippedline+',')
toAddStr = json.dumps(toAdd, indent=4, separators=(',', ': '), ensure_ascii=False, encoding="utf8").strip("{}\n")
ofp.write("\n")
ofp.write(toAddStr.encode('utf8'))
ofp.write("\n")
os.rename(tmppath, dstpath)

View file

@ -51,13 +51,14 @@ limitations under the License.
* } * }
*/ */
var MatrixClientPeg = require('./MatrixClientPeg'); import MatrixClientPeg from './MatrixClientPeg';
var PlatformPeg = require("./PlatformPeg"); import UserSettingsStore from './UserSettingsStore';
var Modal = require('./Modal'); import PlatformPeg from './PlatformPeg';
var sdk = require('./index'); import Modal from './Modal';
import sdk from './index';
import { _t } from './languageHandler'; import { _t } from './languageHandler';
var Matrix = require("matrix-js-sdk"); import Matrix from 'matrix-js-sdk';
var dis = require("./dispatcher"); import dis from './dispatcher';
global.mxCalls = { global.mxCalls = {
//room_id: MatrixCall //room_id: MatrixCall
@ -257,9 +258,9 @@ function _onAction(payload) {
} }
else if (members.length === 2) { else if (members.length === 2) {
console.log("Place %s call in %s", payload.type, payload.room_id); console.log("Place %s call in %s", payload.type, payload.room_id);
var call = Matrix.createNewMatrixCall( const call = Matrix.createNewMatrixCall(MatrixClientPeg.get(), payload.room_id, {
MatrixClientPeg.get(), payload.room_id forceTURN: UserSettingsStore.getLocalSetting('webRtcForceTURN', false),
); });
placeCall(call); placeCall(call);
} }
else { // > 2 else { // > 2

View file

@ -19,6 +19,7 @@ import q from 'q';
import Matrix from 'matrix-js-sdk'; import Matrix from 'matrix-js-sdk';
import MatrixClientPeg from './MatrixClientPeg'; import MatrixClientPeg from './MatrixClientPeg';
import createMatrixClient from './utils/createMatrixClient';
import Analytics from './Analytics'; import Analytics from './Analytics';
import Notifier from './Notifier'; import Notifier from './Notifier';
import UserActivity from './UserActivity'; import UserActivity from './UserActivity';
@ -34,9 +35,6 @@ import { _t } from './languageHandler';
* Called at startup, to attempt to build a logged-in Matrix session. It tries * Called at startup, to attempt to build a logged-in Matrix session. It tries
* a number of things: * a number of things:
* *
* 0. if it looks like we are in the middle of a registration process, it does
* nothing.
*
* 1. if we have a loginToken in the (real) query params, it uses that to log * 1. if we have a loginToken in the (real) query params, it uses that to log
* in. * in.
* *
@ -48,7 +46,7 @@ import { _t } from './languageHandler';
* *
* 4. it attempts to auto-register as a guest user. * 4. it attempts to auto-register as a guest user.
* *
* If any of steps 1-4 are successful, it will call {setLoggedIn}, which in * If any of steps 1-4 are successful, it will call {_doSetLoggedIn}, which in
* turn will raise on_logged_in and will_start_client events. * turn will raise on_logged_in and will_start_client events.
* *
* @param {object} opts * @param {object} opts
@ -79,14 +77,6 @@ export function loadSession(opts) {
const guestIsUrl = opts.guestIsUrl; const guestIsUrl = opts.guestIsUrl;
const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; const defaultDeviceDisplayName = opts.defaultDeviceDisplayName;
if (fragmentQueryParams.client_secret && fragmentQueryParams.sid) {
// this happens during email validation: the email contains a link to the
// IS, which in turn redirects back to vector. We let MatrixChat create a
// Registration component which completes the next stage of registration.
console.log("Not registering as guest: registration already in progress.");
return q();
}
if (!guestHsUrl) { if (!guestHsUrl) {
console.warn("Cannot enable guest access: can't determine HS URL to use"); console.warn("Cannot enable guest access: can't determine HS URL to use");
enableGuest = false; enableGuest = false;
@ -105,14 +95,13 @@ export function loadSession(opts) {
fragmentQueryParams.guest_access_token fragmentQueryParams.guest_access_token
) { ) {
console.log("Using guest access credentials"); console.log("Using guest access credentials");
setLoggedIn({ return _doSetLoggedIn({
userId: fragmentQueryParams.guest_user_id, userId: fragmentQueryParams.guest_user_id,
accessToken: fragmentQueryParams.guest_access_token, accessToken: fragmentQueryParams.guest_access_token,
homeserverUrl: guestHsUrl, homeserverUrl: guestHsUrl,
identityServerUrl: guestIsUrl, identityServerUrl: guestIsUrl,
guest: true, guest: true,
}); }, true);
return q();
} }
return _restoreFromLocalStorage().then((success) => { return _restoreFromLocalStorage().then((success) => {
@ -141,14 +130,14 @@ function _loginWithToken(queryParams, defaultDeviceDisplayName) {
}, },
).then(function(data) { ).then(function(data) {
console.log("Logged in with token"); console.log("Logged in with token");
setLoggedIn({ return _doSetLoggedIn({
userId: data.user_id, userId: data.user_id,
deviceId: data.device_id, deviceId: data.device_id,
accessToken: data.access_token, accessToken: data.access_token,
homeserverUrl: queryParams.homeserver, homeserverUrl: queryParams.homeserver,
identityServerUrl: queryParams.identityServer, identityServerUrl: queryParams.identityServer,
guest: false, guest: false,
}); }, true);
}, (err) => { }, (err) => {
console.error("Failed to log in with login token: " + err + " " + console.error("Failed to log in with login token: " + err + " " +
err.data); err.data);
@ -172,14 +161,14 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) {
}, },
}).then((creds) => { }).then((creds) => {
console.log("Registered as guest: %s", creds.user_id); console.log("Registered as guest: %s", creds.user_id);
setLoggedIn({ return _doSetLoggedIn({
userId: creds.user_id, userId: creds.user_id,
deviceId: creds.device_id, deviceId: creds.device_id,
accessToken: creds.access_token, accessToken: creds.access_token,
homeserverUrl: hsUrl, homeserverUrl: hsUrl,
identityServerUrl: isUrl, identityServerUrl: isUrl,
guest: true, guest: true,
}); }, true);
}, (err) => { }, (err) => {
console.error("Failed to register as guest: " + err + " " + err.data); console.error("Failed to register as guest: " + err + " " + err.data);
}); });
@ -216,15 +205,14 @@ function _restoreFromLocalStorage() {
if (accessToken && userId && hsUrl) { if (accessToken && userId && hsUrl) {
console.log("Restoring session for %s", userId); console.log("Restoring session for %s", userId);
try { try {
setLoggedIn({ return _doSetLoggedIn({
userId: userId, userId: userId,
deviceId: deviceId, deviceId: deviceId,
accessToken: accessToken, accessToken: accessToken,
homeserverUrl: hsUrl, homeserverUrl: hsUrl,
identityServerUrl: isUrl, identityServerUrl: isUrl,
guest: isGuest, guest: isGuest,
}); }, false).then(() => true);
return q(true);
} catch (e) { } catch (e) {
return _handleRestoreFailure(e); return _handleRestoreFailure(e);
} }
@ -245,7 +233,7 @@ function _handleRestoreFailure(e) {
+ ' This is a once off; sorry for the inconvenience.', + ' This is a once off; sorry for the inconvenience.',
); );
_clearLocalStorage(); _clearStorage();
return q.reject(new Error( return q.reject(new Error(
_t('Unable to restore previous session') + ': ' + msg, _t('Unable to restore previous session') + ': ' + msg,
@ -266,7 +254,7 @@ function _handleRestoreFailure(e) {
return def.promise.then((success) => { return def.promise.then((success) => {
if (success) { if (success) {
// user clicked continue. // user clicked continue.
_clearLocalStorage(); _clearStorage();
return false; return false;
} }
@ -277,17 +265,40 @@ function _handleRestoreFailure(e) {
let rtsClient = null; let rtsClient = null;
export function initRtsClient(url) { export function initRtsClient(url) {
if (url) {
rtsClient = new RtsClient(url); rtsClient = new RtsClient(url);
} else {
rtsClient = null;
}
} }
/** /**
* Transitions to a logged-in state using the given credentials * Transitions to a logged-in state using the given credentials.
*
* Starts the matrix client and all other react-sdk services that
* listen for events while a session is logged in.
*
* Also stops the old MatrixClient and clears old credentials/etc out of
* storage before starting the new client.
*
* @param {MatrixClientCreds} credentials The credentials to use * @param {MatrixClientCreds} credentials The credentials to use
*/ */
export function setLoggedIn(credentials) { export function setLoggedIn(credentials) {
credentials.guest = Boolean(credentials.guest); stopMatrixClient();
_doSetLoggedIn(credentials, true);
}
Analytics.setGuest(credentials.guest); /**
* fires on_logging_in, optionally clears localstorage, persists new credentials
* to localstorage, starts the new client.
*
* @param {MatrixClientCreds} credentials
* @param {Boolean} clearStorage
*
* returns a Promise which resolves once the client has been started
*/
async function _doSetLoggedIn(credentials, clearStorage) {
credentials.guest = Boolean(credentials.guest);
console.log( console.log(
"setLoggedIn: mxid:", credentials.userId, "setLoggedIn: mxid:", credentials.userId,
@ -295,12 +306,19 @@ export function setLoggedIn(credentials) {
"guest:", credentials.guest, "guest:", credentials.guest,
"hs:", credentials.homeserverUrl, "hs:", credentials.homeserverUrl,
); );
// This is dispatched to indicate that the user is still in the process of logging in // This is dispatched to indicate that the user is still in the process of logging in
// because `teamPromise` may take some time to resolve, breaking the assumption that // because `teamPromise` may take some time to resolve, breaking the assumption that
// `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms
// later than MatrixChat might assume. // later than MatrixChat might assume.
dis.dispatch({action: 'on_logging_in'}); dis.dispatch({action: 'on_logging_in'});
if (clearStorage) {
await _clearStorage();
}
Analytics.setGuest(credentials.guest);
// Resolves by default // Resolves by default
let teamPromise = Promise.resolve(null); let teamPromise = Promise.resolve(null);
@ -349,9 +367,6 @@ export function setLoggedIn(credentials) {
console.warn("No local storage available: can't persist session!"); console.warn("No local storage available: can't persist session!");
} }
// stop any running clients before we create a new one with these new credentials
stopMatrixClient();
MatrixClientPeg.replaceUsingCreds(credentials); MatrixClientPeg.replaceUsingCreds(credentials);
teamPromise.then((teamToken) => { teamPromise.then((teamToken) => {
@ -400,7 +415,7 @@ export function logout() {
* Starts the matrix client and all other react-sdk services that * Starts the matrix client and all other react-sdk services that
* listen for events while a session is logged in. * listen for events while a session is logged in.
*/ */
export function startMatrixClient() { function startMatrixClient() {
// dispatch this before starting the matrix client: it's used // dispatch this before starting the matrix client: it's used
// to add listeners for the 'sync' event so otherwise we'd have // to add listeners for the 'sync' event so otherwise we'd have
// a race condition (and we need to dispatch synchronously for this // a race condition (and we need to dispatch synchronously for this
@ -416,20 +431,22 @@ export function startMatrixClient() {
} }
/* /*
* Stops a running client and all related services, used after * Stops a running client and all related services, and clears persistent
* a session has been logged out / ended. * storage. Used after a session has been logged out.
*/ */
export function onLoggedOut() { export function onLoggedOut() {
_clearLocalStorage();
stopMatrixClient(); stopMatrixClient();
_clearStorage().done();
dis.dispatch({action: 'on_logged_out'}); dis.dispatch({action: 'on_logged_out'});
} }
function _clearLocalStorage() { /**
* @returns {Promise} promise which resolves once the stores have been cleared
*/
function _clearStorage() {
Analytics.logout(); Analytics.logout();
if (!window.localStorage) {
return; if (window.localStorage) {
}
const hsUrl = window.localStorage.getItem("mx_hs_url"); const hsUrl = window.localStorage.getItem("mx_hs_url");
const isUrl = window.localStorage.getItem("mx_is_url"); const isUrl = window.localStorage.getItem("mx_is_url");
window.localStorage.clear(); window.localStorage.clear();
@ -440,10 +457,18 @@ function _clearLocalStorage() {
// NB. We do clear the device ID (as well as all the settings) // NB. We do clear the device ID (as well as all the settings)
if (hsUrl) window.localStorage.setItem("mx_hs_url", hsUrl); if (hsUrl) window.localStorage.setItem("mx_hs_url", hsUrl);
if (isUrl) window.localStorage.setItem("mx_is_url", isUrl); if (isUrl) window.localStorage.setItem("mx_is_url", isUrl);
}
// create a temporary client to clear out the persistent stores.
const cli = createMatrixClient({
// we'll never make any requests, so can pass a bogus HS URL
baseUrl: "",
});
return cli.clearStores();
} }
/** /**
* Stop all the background processes related to the current client * Stop all the background processes related to the current client.
*/ */
export function stopMatrixClient() { export function stopMatrixClient() {
Notifier.stop(); Notifier.stop();
@ -454,7 +479,6 @@ export function stopMatrixClient() {
if (cli) { if (cli) {
cli.stopClient(); cli.stopClient();
cli.removeAllListeners(); cli.removeAllListeners();
cli.store.deleteAllData();
MatrixClientPeg.unset(); MatrixClientPeg.unset();
} }
} }

View file

@ -16,12 +16,10 @@ limitations under the License.
'use strict'; 'use strict';
import Matrix from 'matrix-js-sdk';
import utils from 'matrix-js-sdk/lib/utils'; import utils from 'matrix-js-sdk/lib/utils';
import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline'; import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline';
import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set'; import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set';
import createMatrixClient from './utils/createMatrixClient';
const localStorage = window.localStorage;
interface MatrixClientCreds { interface MatrixClientCreds {
homeserverUrl: string, homeserverUrl: string,
@ -129,22 +127,7 @@ class MatrixClientPeg {
timelineSupport: true, timelineSupport: true,
}; };
if (localStorage) { this.matrixClient = createMatrixClient(opts);
opts.sessionStore = new Matrix.WebStorageSessionStore(localStorage);
}
if (window.indexedDB && localStorage) {
// FIXME: bodge to remove old database. Remove this after a few weeks.
window.indexedDB.deleteDatabase("matrix-js-sdk:default");
opts.store = new Matrix.IndexedDBStore({
indexedDB: window.indexedDB,
dbName: "riot-web-sync",
localStorage: localStorage,
workerScript: this.indexedDbWorkerScript,
});
}
this.matrixClient = Matrix.createClient(opts);
// we're going to add eventlisteners for each matrix event tile, so the // we're going to add eventlisteners for each matrix event tile, so the
// potential number of event listeners is quite high. // potential number of event listeners is quite high.

View file

@ -64,7 +64,6 @@ const AsyncWrapper = React.createClass({
render: function() { render: function() {
const {loader, ...otherProps} = this.props; const {loader, ...otherProps} = this.props;
if (this.state.component) { if (this.state.component) {
const Component = this.state.component; const Component = this.state.component;
return <Component {...otherProps} />; return <Component {...otherProps} />;
@ -199,4 +198,7 @@ class ModalManager {
} }
} }
export default new ModalManager(); if (!global.singletonModalManager) {
global.singletonModalManager = new ModalManager();
}
export default global.singletonModalManager;

View file

@ -144,7 +144,18 @@ export function guessDMRoomTarget(room, me) {
let oldestTs; let oldestTs;
let oldestUser; let oldestUser;
// Pick the user who's been here longest (and isn't us) // Pick the joined user who's been here longest (and isn't us),
for (const user of room.getJoinedMembers()) {
if (user.userId == me.userId) continue;
if (oldestTs === undefined || user.events.member.getTs() < oldestTs) {
oldestUser = user;
oldestTs = user.events.member.getTs();
}
}
if (oldestUser) return oldestUser;
// if there are no joined members other than us, use the oldest member
for (const user of room.currentState.getMembers()) { for (const user of room.currentState.getMembers()) {
if (user.userId == me.userId) continue; if (user.userId == me.userId) continue;

View file

@ -1,5 +1,7 @@
import 'whatwg-fetch'; import 'whatwg-fetch';
let fetchFunction = fetch;
function checkStatus(response) { function checkStatus(response) {
if (!response.ok) { if (!response.ok) {
return response.text().then((text) => { return response.text().then((text) => {
@ -31,7 +33,7 @@ const request = (url, opts) => {
opts.body = JSON.stringify(opts.body); opts.body = JSON.stringify(opts.body);
opts.headers['Content-Type'] = 'application/json'; opts.headers['Content-Type'] = 'application/json';
} }
return fetch(url, opts) return fetchFunction(url, opts)
.then(checkStatus) .then(checkStatus)
.then(parseJson); .then(parseJson);
}; };
@ -64,7 +66,7 @@ export default class RtsClient {
client_secret: clientSecret, client_secret: clientSecret,
}, },
method: 'POST', method: 'POST',
} },
); );
} }
@ -74,7 +76,7 @@ export default class RtsClient {
qs: { qs: {
team_token: teamToken, team_token: teamToken,
}, },
} },
); );
} }
@ -91,7 +93,12 @@ export default class RtsClient {
qs: { qs: {
user_id: userId, user_id: userId,
}, },
} },
); );
} }
// allow fetch to be replaced, for testing.
static setFetch(fn) {
fetchFunction = fn;
}
} }

View file

@ -186,7 +186,7 @@ module.exports = React.createClass({
componentWillMount: function() { componentWillMount: function() {
SdkConfig.put(this.props.config); SdkConfig.put(this.props.config);
RoomViewStore.addListener(this._onRoomViewStoreUpdated); this._roomViewStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdated);
this._onRoomViewStoreUpdated(); this._onRoomViewStoreUpdated();
if (!UserSettingsStore.getLocalSetting('analyticsOptOut', false)) Analytics.enable(); if (!UserSettingsStore.getLocalSetting('analyticsOptOut', false)) Analytics.enable();
@ -263,10 +263,22 @@ module.exports = React.createClass({
window.addEventListener('resize', this.handleResize); window.addEventListener('resize', this.handleResize);
this.handleResize(); this.handleResize();
if (this.props.config.teamServerConfig && const teamServerConfig = this.props.config.teamServerConfig || {};
this.props.config.teamServerConfig.teamServerURL Lifecycle.initRtsClient(teamServerConfig.teamServerURL);
) {
Lifecycle.initRtsClient(this.props.config.teamServerConfig.teamServerURL); // if the user has followed a login or register link, don't reanimate
// the old creds, but rather go straight to the relevant page
const firstScreen = this.state.screenAfterLogin ?
this.state.screenAfterLogin.screen : null;
if (firstScreen === 'login' ||
firstScreen === 'register' ||
firstScreen === 'forgot_password') {
this.props.onLoadCompleted();
this.setState({loading: false});
this._showScreenAfterLogin();
return;
} }
// the extra q() ensures that synchronous exceptions hit the same codepath as // the extra q() ensures that synchronous exceptions hit the same codepath as
@ -295,6 +307,7 @@ module.exports = React.createClass({
UDEHandler.stopListening(); UDEHandler.stopListening();
window.removeEventListener("focus", this.onFocus); window.removeEventListener("focus", this.onFocus);
window.removeEventListener('resize', this.handleResize); window.removeEventListener('resize', this.handleResize);
this._roomViewStoreToken.remove();
}, },
componentDidUpdate: function() { componentDidUpdate: function() {
@ -839,14 +852,6 @@ module.exports = React.createClass({
_onLoadCompleted: function() { _onLoadCompleted: function() {
this.props.onLoadCompleted(); this.props.onLoadCompleted();
this.setState({loading: false}); this.setState({loading: false});
// Show screens (like 'register') that need to be shown without _onLoggedIn
// being called. 'register' needs to be routed here when the email confirmation
// link is clicked on.
if (this.state.screenAfterLogin &&
['register'].indexOf(this.state.screenAfterLogin.screen) !== -1) {
this._showScreenAfterLogin();
}
}, },
/** /**
@ -945,6 +950,7 @@ module.exports = React.createClass({
this.state.screenAfterLogin.screen, this.state.screenAfterLogin.screen,
this.state.screenAfterLogin.params, this.state.screenAfterLogin.params,
); );
// XXX: is this necessary? `showScreen` should do it for us.
this.notifyNewScreen(this.state.screenAfterLogin.screen); this.notifyNewScreen(this.state.screenAfterLogin.screen);
this.setState({screenAfterLogin: null}); this.setState({screenAfterLogin: null});
} else if (localStorage && localStorage.getItem('mx_last_room_id')) { } else if (localStorage && localStorage.getItem('mx_last_room_id')) {
@ -1228,6 +1234,8 @@ module.exports = React.createClass({
onReturnToGuestClick: function() { onReturnToGuestClick: function() {
// reanimate our guest login // reanimate our guest login
if (this.state.guestCreds) { if (this.state.guestCreds) {
// TODO: this is probably a bit broken - we don't want to be
// clearing storage when we reanimate the guest creds.
Lifecycle.setLoggedIn(this.state.guestCreds); Lifecycle.setLoggedIn(this.state.guestCreds);
this.setState({guestCreds: null}); this.setState({guestCreds: null});
} }

View file

@ -170,6 +170,25 @@ module.exports = React.createClass({
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(), isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
}; };
// Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307
console.log(
'RVS update:',
newState.roomId,
newState.roomAlias,
'loading?', newState.roomLoading,
'joining?', newState.joining,
);
// finished joining, start waiting for a room and show a spinner. See onRoom.
newState.waitingForRoom = this.state.joining && !newState.joining &&
!RoomViewStore.getJoinError();
// NB: This does assume that the roomID will not change for the lifetime of
// the RoomView instance
if (initial) {
newState.room = MatrixClientPeg.get().getRoom(newState.roomId);
}
// Clear the search results when clicking a search result (which changes the // Clear the search results when clicking a search result (which changes the
// currently scrolled to event, this.state.initialEventId). // currently scrolled to event, this.state.initialEventId).
if (this.state.initialEventId !== newState.initialEventId) { if (this.state.initialEventId !== newState.initialEventId) {
@ -185,8 +204,9 @@ module.exports = React.createClass({
this.setState(newState, () => { this.setState(newState, () => {
// At this point, this.state.roomId could be null (e.g. the alias might not // At this point, this.state.roomId could be null (e.g. the alias might not
// have been resolved yet) so anything called here must handle this case. // have been resolved yet) so anything called here must handle this case.
if (initial) {
this._onHaveRoom(); this._onHaveRoom();
this.onRoom(MatrixClientPeg.get().getRoom(this.state.roomId)); }
}); });
}, },
@ -202,25 +222,20 @@ module.exports = React.createClass({
// which must be by alias or invite wherever possible (peeking currently does // which must be by alias or invite wherever possible (peeking currently does
// not work over federation). // not work over federation).
// NB. We peek if we are not in the room, although if we try to peek into // NB. We peek if we have never seen the room before (i.e. js-sdk does not know
// a room in which we have a member event (ie. we've left) synapse will just // about it). We don't peek in the historical case where we were joined but are
// send us the same data as we get in the sync (ie. the last events we saw). // now not joined because the js-sdk peeking API will clobber our historical room,
const room = MatrixClientPeg.get().getRoom(this.state.roomId); // making it impossible to indicate a newly joined room.
let isUserJoined = null; const room = this.state.room;
if (room) { if (room) {
isUserJoined = room.hasMembershipState(
MatrixClientPeg.get().credentials.userId, 'join',
);
this._updateAutoComplete(room); this._updateAutoComplete(room);
this.tabComplete.loadEntries(room); this.tabComplete.loadEntries(room);
} }
if (!isUserJoined && !this.state.joining && this.state.roomId) { if (!this.state.joining && this.state.roomId) {
if (this.props.autoJoin) { if (this.props.autoJoin) {
this.onJoinButtonClicked(); this.onJoinButtonClicked();
} else if (this.state.roomId) { } else if (!room) {
console.log("Attempting to peek into room %s", this.state.roomId); console.log("Attempting to peek into room %s", this.state.roomId);
this.setState({ this.setState({
peekLoading: true, peekLoading: true,
}); });
@ -244,7 +259,8 @@ module.exports = React.createClass({
} }
}).done(); }).done();
} }
} else if (isUserJoined) { } else if (room) {
// Stop peeking because we have joined this room previously
MatrixClientPeg.get().stopPeeking(); MatrixClientPeg.get().stopPeeking();
this.setState({ this.setState({
unsentMessageError: this._getUnsentMessageError(room), unsentMessageError: this._getUnsentMessageError(room),
@ -607,6 +623,7 @@ module.exports = React.createClass({
} }
this.setState({ this.setState({
room: room, room: room,
waitingForRoom: false,
}, () => { }, () => {
this._onRoomLoaded(room); this._onRoomLoaded(room);
}); });
@ -662,8 +679,15 @@ module.exports = React.createClass({
onRoomMemberMembership: function(ev, member, oldMembership) { onRoomMemberMembership: function(ev, member, oldMembership) {
if (member.userId == MatrixClientPeg.get().credentials.userId) { if (member.userId == MatrixClientPeg.get().credentials.userId) {
if (member.membership === 'join') {
this.setState({
waitingForRoom: false,
});
} else {
this.forceUpdate(); this.forceUpdate();
} }
}
}, },
// rate limited because a power level change will emit an event for every // rate limited because a power level change will emit an event for every
@ -1416,6 +1440,10 @@ module.exports = React.createClass({
const Loader = sdk.getComponent("elements.Spinner"); const Loader = sdk.getComponent("elements.Spinner");
const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); const TimelinePanel = sdk.getComponent("structures.TimelinePanel");
// Whether the preview bar spinner should be shown. We do this when joining or
// when waiting for a room to be returned by js-sdk when joining
const previewBarSpinner = this.state.joining || this.state.waitingForRoom;
if (!this.state.room) { if (!this.state.room) {
if (this.state.roomLoading || this.state.peekLoading) { if (this.state.roomLoading || this.state.peekLoading) {
return ( return (
@ -1449,7 +1477,7 @@ module.exports = React.createClass({
onRejectClick={ this.onRejectThreepidInviteButtonClicked } onRejectClick={ this.onRejectThreepidInviteButtonClicked }
canPreview={ false } error={ this.state.roomLoadError } canPreview={ false } error={ this.state.roomLoadError }
roomAlias={room_alias} roomAlias={room_alias}
spinner={this.state.joining} spinner={previewBarSpinner}
inviterName={inviterName} inviterName={inviterName}
invitedEmail={invitedEmail} invitedEmail={invitedEmail}
room={this.state.room} room={this.state.room}
@ -1492,7 +1520,7 @@ module.exports = React.createClass({
onRejectClick={ this.onRejectButtonClicked } onRejectClick={ this.onRejectButtonClicked }
inviterName={ inviterName } inviterName={ inviterName }
canPreview={ false } canPreview={ false }
spinner={this.state.joining} spinner={previewBarSpinner}
room={this.state.room} room={this.state.room}
/> />
</div> </div>
@ -1568,7 +1596,7 @@ module.exports = React.createClass({
<RoomPreviewBar onJoinClick={this.onJoinButtonClicked} <RoomPreviewBar onJoinClick={this.onJoinButtonClicked}
onForgetClick={ this.onForgetClick } onForgetClick={ this.onForgetClick }
onRejectClick={this.onRejectThreepidInviteButtonClicked} onRejectClick={this.onRejectThreepidInviteButtonClicked}
spinner={this.state.joining} spinner={previewBarSpinner}
inviterName={inviterName} inviterName={inviterName}
invitedEmail={invitedEmail} invitedEmail={invitedEmail}
canPreview={this.state.canPeek} canPreview={this.state.canPeek}

View file

@ -352,13 +352,14 @@ module.exports = React.createClass({
const tile = tiles[backwards ? i : tiles.length - 1 - i]; const tile = tiles[backwards ? i : tiles.length - 1 - i];
// Subtract height of tile as if it were unpaginated // Subtract height of tile as if it were unpaginated
excessHeight -= tile.clientHeight; excessHeight -= tile.clientHeight;
//If removing the tile would lead to future pagination, break before setting scroll token
if (tile.clientHeight > excessHeight) {
break;
}
// The tile may not have a scroll token, so guard it // The tile may not have a scroll token, so guard it
if (tile.dataset.scrollTokens) { if (tile.dataset.scrollTokens) {
markerScrollToken = tile.dataset.scrollTokens.split(',')[0]; markerScrollToken = tile.dataset.scrollTokens.split(',')[0];
} }
if (tile.clientHeight > excessHeight) {
break;
}
} }
if (markerScrollToken) { if (markerScrollToken) {

View file

@ -114,6 +114,13 @@ const ANALYTICS_SETTINGS_LABELS = [
}, },
]; ];
const WEBRTC_SETTINGS_LABELS = [
{
id: 'webRtcForceTURN',
label: 'Disable Peer-to-Peer for 1:1 calls',
},
];
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json, // Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
// since they will be translated when rendered. // since they will be translated when rendered.
const CRYPTO_SETTINGS_LABELS = [ const CRYPTO_SETTINGS_LABELS = [
@ -949,16 +956,13 @@ module.exports = React.createClass({
} }
}, },
_renderWebRtcSettings: function() { _renderWebRtcDeviceSettings: function() {
if (this.state.mediaDevices === false) { if (this.state.mediaDevices === false) {
return <div> return (
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
<p className="mx_UserSettings_link" onClick={this._requestMediaPermissions}> <p className="mx_UserSettings_link" onClick={this._requestMediaPermissions}>
{_t('Missing Media Permissions, click here to request.')} {_t('Missing Media Permissions, click here to request.')}
</p> </p>
</div> );
</div>;
} else if (!this.state.mediaDevices) return; } else if (!this.state.mediaDevices) return;
const Dropdown = sdk.getComponent('elements.Dropdown'); const Dropdown = sdk.getComponent('elements.Dropdown');
@ -1012,10 +1016,17 @@ module.exports = React.createClass({
} }
return <div> return <div>
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
{microphoneDropdown} {microphoneDropdown}
{webcamDropdown} {webcamDropdown}
</div>;
},
_renderWebRtcSettings: function() {
return <div>
<h3>{_t('VoIP')}</h3>
<div className="mx_UserSettings_section">
{ WEBRTC_SETTINGS_LABELS.map(this._renderLocalSetting) }
{ this._renderWebRtcDeviceSettings() }
</div> </div>
</div>; </div>;
}, },

View file

@ -24,6 +24,7 @@ import DMRoomMap from '../../../utils/DMRoomMap';
import Modal from '../../../Modal'; import Modal from '../../../Modal';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import q from 'q'; import q from 'q';
import dis from '../../../dispatcher';
const TRUNCATE_QUERY_LIST = 40; const TRUNCATE_QUERY_LIST = 40;
const QUERY_USER_DIRECTORY_DEBOUNCE_MS = 200; const QUERY_USER_DIRECTORY_DEBOUNCE_MS = 200;
@ -102,7 +103,7 @@ module.exports = React.createClass({
const ChatCreateOrReuseDialog = sdk.getComponent( const ChatCreateOrReuseDialog = sdk.getComponent(
"views.dialogs.ChatCreateOrReuseDialog", "views.dialogs.ChatCreateOrReuseDialog",
); );
Modal.createDialog(ChatCreateOrReuseDialog, { const close = Modal.createDialog(ChatCreateOrReuseDialog, {
userId: userId, userId: userId,
onFinished: (success) => { onFinished: (success) => {
this.props.onFinished(success); this.props.onFinished(success);
@ -112,14 +113,16 @@ module.exports = React.createClass({
action: 'start_chat', action: 'start_chat',
user_id: userId, user_id: userId,
}); });
close(true);
}, },
onExistingRoomSelected: (roomId) => { onExistingRoomSelected: (roomId) => {
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
user_id: roomId, room_id: roomId,
}); });
close(true);
}, },
}); }).close;
} else { } else {
this._startChat(inviteList); this._startChat(inviteList);
} }
@ -238,6 +241,11 @@ module.exports = React.createClass({
MatrixClientPeg.get().searchUserDirectory({ MatrixClientPeg.get().searchUserDirectory({
term: query, term: query,
}).then((resp) => { }).then((resp) => {
// The query might have changed since we sent the request, so ignore
// responses for anything other than the latest query.
if (this.state.query !== query) {
return;
}
this._processResults(resp.results, query); this._processResults(resp.results, query);
}).catch((err) => { }).catch((err) => {
console.error('Error whilst searching user directory: ', err); console.error('Error whilst searching user directory: ', err);

View file

@ -0,0 +1,164 @@
/*
Copyright 2017 Vector Creations 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 sdk from '../../../index';
import Email from '../../../email';
import AddThreepid from '../../../AddThreepid';
import { _t } from '../../../languageHandler';
import Modal from '../../../Modal';
/**
* Prompt the user to set an email address.
*
* On success, `onFinished(true)` is called.
*/
export default React.createClass({
displayName: 'SetEmailDialog',
propTypes: {
onFinished: React.PropTypes.func.isRequired,
},
getInitialState: function() {
return {
emailAddress: null,
emailBusy: false,
};
},
componentDidMount: function() {
},
onEmailAddressChanged: function(value) {
this.setState({
emailAddress: value,
});
},
onSubmit: function() {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
const emailAddress = this.state.emailAddress;
if (!Email.looksValid(emailAddress)) {
Modal.createDialog(ErrorDialog, {
title: _t("Invalid Email Address"),
description: _t("This doesn't appear to be a valid email address"),
});
return;
}
this._addThreepid = new AddThreepid();
// we always bind emails when registering, so let's do the
// same here.
this._addThreepid.addEmailAddress(emailAddress, true).done(() => {
Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"),
description: _t(
"Please check your email and click on the link it contains. Once this " +
"is done, click continue.",
),
button: _t('Continue'),
onFinished: this.onEmailDialogFinished,
});
}, (err) => {
this.setState({emailBusy: false});
console.error("Unable to add email address " + emailAddress + " " + err);
Modal.createDialog(ErrorDialog, {
title: _t("Unable to add email address"),
description: ((err && err.message) ? err.message : _t("Operation failed")),
});
});
this.setState({emailBusy: true});
},
onCancelled: function() {
this.props.onFinished(false);
},
onEmailDialogFinished: function(ok) {
if (ok) {
this.verifyEmailAddress();
} else {
this.setState({emailBusy: false});
}
},
verifyEmailAddress: function() {
this._addThreepid.checkEmailLinkClicked().done(() => {
this.props.onFinished(true);
}, (err) => {
this.setState({emailBusy: false});
if (err.errcode == 'M_THREEPID_AUTH_FAILED') {
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
const message = _t("Unable to verify email address.") + " " +
_t("Please check your email and click on the link it contains. Once this is done, click continue.");
Modal.createDialog(QuestionDialog, {
title: _t("Verification Pending"),
description: message,
button: _t('Continue'),
onFinished: this.onEmailDialogFinished,
});
} else {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Unable to verify email address: " + err);
Modal.createDialog(ErrorDialog, {
title: _t("Unable to verify email address."),
description: ((err && err.message) ? err.message : _t("Operation failed")),
});
}
});
},
render: function() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
const Spinner = sdk.getComponent('elements.Spinner');
const EditableText = sdk.getComponent('elements.EditableText');
const emailInput = this.state.emailBusy ? <Spinner /> : <EditableText
className="mx_SetEmailDialog_email_input"
placeholder={ _t("Email address") }
placeholderClassName="mx_SetEmailDialog_email_input_placeholder"
blurToCancel={ false }
onValueChanged={ this.onEmailAddressChanged } />;
return (
<BaseDialog className="mx_SetEmailDialog"
onFinished={this.onCancelled}
title={this.props.title}
>
<div className="mx_Dialog_content">
<p>
{ _t('This will allow you to reset your password and receive notifications.') }
</p>
{ emailInput }
</div>
<div className="mx_Dialog_buttons">
<input className="mx_Dialog_primary"
type="submit"
value={_t("Continue")}
onClick={this.onSubmit}
/>
<input
type="submit"
value={_t("Cancel")}
onClick={this.onCancelled}
/>
</div>
</BaseDialog>
);
},
});

View file

@ -62,8 +62,8 @@ module.exports = React.createClass({
var url = ContentRepo.getHttpUriForMxc( var url = ContentRepo.getHttpUriForMxc(
MatrixClientPeg.get().getHomeserverUrl(), MatrixClientPeg.get().getHomeserverUrl(),
ev.getContent().url, ev.getContent().url,
14 * window.devicePixelRatio, Math.ceil(14 * window.devicePixelRatio),
14 * window.devicePixelRatio, Math.ceil(14 * window.devicePixelRatio),
'crop' 'crop'
); );

View file

@ -89,12 +89,13 @@ module.exports = React.createClass({
var conferenceCallNotification = null; var conferenceCallNotification = null;
if (this.props.displayConfCallNotification) { if (this.props.displayConfCallNotification) {
var supportedText, joinText; let supportedText = '';
let joinNode;
if (!MatrixClientPeg.get().supportsVoip()) { if (!MatrixClientPeg.get().supportsVoip()) {
supportedText = _t(" (unsupported)"); supportedText = _t(" (unsupported)");
} }
else { else {
joinText = (<span> joinNode = (<span>
{_tJsx( {_tJsx(
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
[/<voiceText>(.*?)<\/voiceText>/, /<videoText>(.*?)<\/videoText>/], [/<voiceText>(.*?)<\/voiceText>/, /<videoText>(.*?)<\/videoText>/],
@ -106,9 +107,13 @@ module.exports = React.createClass({
</span>); </span>);
} }
// XXX: the translation here isn't great: appending ' (unsupported)' is likely to not make sense in many languages,
// but there are translations for this in the languages we do have so I'm leaving it for now.
conferenceCallNotification = ( conferenceCallNotification = (
<div className="mx_RoomView_ongoingConfCallNotification"> <div className="mx_RoomView_ongoingConfCallNotification">
{_t("Ongoing conference call%(supportedText)s. %(joinText)s", {supportedText: supportedText, joinText: joinText})} {_t("Ongoing conference call%(supportedText)s.", {supportedText: supportedText})}
&nbsp;
{joinNode}
</div> </div>
); );
} }

View file

@ -594,7 +594,7 @@ module.exports = React.createClass({
<div> <div>
<label> <label>
{ isEncrypted { isEncrypted
? <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-verified.svg" width="10" height="12" /> ? <img className="mx_RoomSettings_e2eIcon" src="img/e2e-verified.svg" width="10" height="12" />
: <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-unencrypted.svg" width="12" height="12" /> : <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-unencrypted.svg" width="12" height="12" />
} }
{ isEncrypted ? _t("Encryption is enabled in this room") : _t("Encryption is not enabled in this room") }. { isEncrypted ? _t("Encryption is enabled in this room") : _t("Encryption is not enabled in this room") }.

View file

@ -20,6 +20,8 @@ var React = require('react');
var MatrixClientPeg = require("../../../MatrixClientPeg"); var MatrixClientPeg = require("../../../MatrixClientPeg");
var Modal = require("../../../Modal"); var Modal = require("../../../Modal");
var sdk = require("../../../index"); var sdk = require("../../../index");
import q from 'q';
import AccessibleButton from '../elements/AccessibleButton'; import AccessibleButton from '../elements/AccessibleButton';
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
@ -140,7 +142,15 @@ module.exports = React.createClass({
}); });
cli.setPassword(authDict, newPassword).then(() => { cli.setPassword(authDict, newPassword).then(() => {
if (this.props.shouldAskForEmail) {
return this._optionallySetEmail().then((confirmed) => {
this.props.onFinished({
didSetEmail: confirmed,
});
});
} else {
this.props.onFinished(); this.props.onFinished();
}
}, (err) => { }, (err) => {
this.props.onError(err); this.props.onError(err);
}).finally(() => { }).finally(() => {
@ -150,6 +160,20 @@ module.exports = React.createClass({
}).done(); }).done();
}, },
_optionallySetEmail: function() {
const deferred = q.defer();
// Ask for an email otherwise the user has no way to reset their password
const SetEmailDialog = sdk.getComponent("dialogs.SetEmailDialog");
Modal.createDialog(SetEmailDialog, {
title: _t('Do you want to set an email address?'),
onFinished: (confirmed) => {
// ignore confirmed, setting an email is optional
deferred.resolve(confirmed);
},
});
return deferred.promise;
},
_onExportE2eKeysClicked: function() { _onExportE2eKeysClicked: function() {
Modal.createDialogAsync( Modal.createDialogAsync(
(cb) => { (cb) => {
@ -199,7 +223,7 @@ module.exports = React.createClass({
const passwordLabel = this.state.cachedPassword ? const passwordLabel = this.state.cachedPassword ?
_t('Password') : _t('New Password'); _t('Password') : _t('New Password');
return ( return (
<div className={this.props.className}> <form className={this.props.className} onSubmit={this.onClickChange}>
{ currentPassword } { currentPassword }
<div className={rowClassName}> <div className={rowClassName}>
<div className={rowLabelClassName}> <div className={rowLabelClassName}>
@ -222,7 +246,7 @@ module.exports = React.createClass({
element="button"> element="button">
{ _t('Change Password') } { _t('Change Password') }
</AccessibleButton> </AccessibleButton>
</div> </form>
); );
case this.Phases.Uploading: case this.Phases.Uploading:
var Loader = sdk.getComponent("elements.Spinner"); var Loader = sdk.getComponent("elements.Spinner");

View file

@ -41,9 +41,6 @@ class MatrixDispatcher extends flux.Dispatcher {
} }
} }
// XXX this is a big anti-pattern, and makes testing hard. Because dispatches
// happen asynchronously, it is possible for actions dispatched in one thread
// to arrive in another, with *hilarious* consequences.
if (global.mxDispatcher === undefined) { if (global.mxDispatcher === undefined) {
global.mxDispatcher = new MatrixDispatcher(); global.mxDispatcher = new MatrixDispatcher();
} }

View file

@ -9,7 +9,7 @@
"Historical": "Archiv", "Historical": "Archiv",
"New passwords must match each other.": "Die neuen Passwörter müssen identisch sein.", "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.", "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 Email-Adresse eingeben werden, welche zum Account gehört.", "The email address linked to your account must be entered.": "Es muss die mit dem Benutzerkonto verbundene Email-Adresse eingegeben werden.",
"Failed to send email: ": "Email konnte nicht versendet werden: ", "Failed to send email: ": "Email konnte nicht versendet werden: ",
"unknown device": "Unbekanntes Gerät", "unknown device": "Unbekanntes Gerät",
"NOT verified": "NICHT verifiziert", "NOT verified": "NICHT verifiziert",
@ -31,7 +31,7 @@
"Event information": "Ereignis-Informationen", "Event information": "Ereignis-Informationen",
"Sender device information": "Absender Geräte Informationen", "Sender device information": "Absender Geräte Informationen",
"Displays action": "Zeigt Aktionen an", "Displays action": "Zeigt Aktionen an",
"Bans user with given id": "Sperrt Benutzer mit der angegebenen ID", "Bans user with given id": "Schließt den Benutzer mit der angegebenen ID aus dem Raum aus",
"Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID", "Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID",
"Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", "Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein",
"Joins room with given alias": "Betrete Raum mit angegebenen Alias", "Joins room with given alias": "Betrete Raum mit angegebenen Alias",
@ -63,7 +63,7 @@
"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, apart from guests": "Alle, denen der Raum-Link bekannt ist, ausgenommen Gäste",
"Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste", "Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - 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 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 die die Einladung ablehnen 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?", "Are you sure you want to upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen möchtest?",
"banned": "gebannt", "banned": "gebannt",
"Banned users": "Gebannte Nutzer", "Banned users": "Gebannte Nutzer",
@ -81,8 +81,8 @@
"Create an account": "Erstelle einen Account", "Create an account": "Erstelle einen Account",
"Create Room": "Raum erstellen", "Create Room": "Raum erstellen",
"Cryptography": "Verschlüsselung", "Cryptography": "Verschlüsselung",
"Deactivate Account": "Account deaktivieren", "Deactivate Account": "Benutzerkonto deaktivieren",
"Deactivate my account": "Meinen Account deaktivieren", "Deactivate my account": "Mein Benutzerkonto deaktivieren",
"decline": "Ablehnen", "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 Chatverlauf vor dem Betreten des Raumes zu entschlüsseln", "Devices will not yet be able to decrypt history from before they joined the room": "Geräte werden nicht in der Lage sein, den Chatverlauf vor dem Betreten des Raumes zu entschlüsseln",
"Display name": "Anzeigename", "Display name": "Anzeigename",
@ -211,7 +211,7 @@
"Start Chat": "Chat beginnen", "Start Chat": "Chat beginnen",
"Success": "Erfolg", "Success": "Erfolg",
"tag direct chat": "Zum kennzeichnen als direkten Chat", "tag direct chat": "Zum kennzeichnen als direkten Chat",
"The default role for new room members is": "Die Standard-Rolle für neue Raum-Mitglieder ist", "The default role for new room members is": "Das Standard-Berechtigungslevel für neue Raum-Mitglieder ist",
"their invitations": "ihre Einladungen", "their invitations": "ihre Einladungen",
"their invitation": "ihre Einladung", "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", "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",
@ -232,12 +232,12 @@
"Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren", "Disable inline URL previews by default": "URL-Vorschau im Chat standardmäßig deaktivieren",
"Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.", "Guests can't use labs features. Please register.": "Gäste können keine Labor-Funktionen nutzen. Bitte registrieren.",
"Labs": "Labor", "Labs": "Labor",
"Show panel": "Zeige Panel", "Show panel": "Panel anzeigen",
"To redact messages": "Zum Nachrichten verbergen", "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) ", "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", "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", "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",
"To send messages": "Zum Nachrichten senden", "To send messages": "Um Nachrichten zu senden",
"turned on end-to-end encryption (algorithm": "aktivierte Ende-zu-Ende-Verschlüsselung (Algorithmus", "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 add email address": "E-Mail-Adresse konnte nicht hinzugefügt werden",
"Unable to remove contact information": "Unfähig die Kontakt-Informationen zu löschen", "Unable to remove contact information": "Unfähig die Kontakt-Informationen zu löschen",
@ -289,8 +289,8 @@
"Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast", "Failed to verify email address: make sure you clicked the link in the email": "Verifizierung der E-Mail-Adresse fehlgeschlagen: Bitte stelle sicher, dass du den Link in der E-Mail angeklickt hast",
"Failure to create room": "Raumerstellung fehlgeschlagen", "Failure to create room": "Raumerstellung fehlgeschlagen",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Gastnutzer können keine neuen Räume erstellen. Bitte registriere dich um Räume zu erstellen und Chats zu starten.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Gastnutzer können keine neuen Räume erstellen. Bitte registriere dich um Räume zu erstellen und Chats zu starten.",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung Benachrichtigungen zu senden - bitte prüfe deine Browser-Einstellungen", "Riot does not have permission to send you notifications - please check your browser settings": "Riot hat keine Berechtigung, um Benachrichtigungen zu senden - bitte Browser-Einstellungen überprüfen",
"Riot was not given permission to send notifications - please try again": "Riot hat das Recht nicht bekommen Benachrichtigungen zu senden. Bitte erneut probieren", "Riot was not given permission to send notifications - please try again": "Riot hat keine Berechtigung für das Senden von Benachrichtigungen erhalten - bitte erneut versuchen",
"This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet", "This email address is already in use": "Diese E-Mail-Adresse wird bereits verwendet",
"This email address was not found": "Diese E-Mail-Adresse konnte nicht gefunden werden", "This email address was not found": "Diese E-Mail-Adresse konnte nicht gefunden werden",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Homeserver", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Die Datei '%(fileName)s' überschreitet das Größen-Limit für Uploads auf diesem Homeserver",
@ -304,7 +304,7 @@
"VoIP is unsupported": "VoIP wird nicht unterstützt", "VoIP is unsupported": "VoIP wird nicht unterstützt",
"You are already in a call.": "Du bist bereits in einem Gespräch.", "You are already in a call.": "Du bist bereits in einem Gespräch.",
"You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.", "You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser.": "Du kannst keine VoIP-Gespräche in diesem Browser starten.", "You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.",
"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.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.", "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.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.",
"Sun": "So", "Sun": "So",
@ -316,7 +316,7 @@
"Sat": "Sa", "Sat": "Sa",
"Jan": "Jan", "Jan": "Jan",
"Feb": "Feb", "Feb": "Feb",
"Mar": "März", "Mar": "Mrz",
"Apr": "April", "Apr": "April",
"May": "Mai", "May": "Mai",
"Jun": "Juni", "Jun": "Juni",
@ -559,7 +559,7 @@
"Attachment": "Anhang", "Attachment": "Anhang",
"Ban": "Verbannen", "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 - 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>.": "Kann nicht zum Heimserver via HTTP verbinden, wenn eine HTTPS-Url in deiner Adresszeile steht. Nutzer HTTPS oder <a>aktiviere unsichere Skripte</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>.": "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>.",
"changing room on a RoomView is not supported": "Das Ändern eines Raumes in einer RaumAnsicht wird nicht unterstützt", "changing room on a RoomView is not supported": "Das Ändern eines Raumes in einer RaumAnsicht wird nicht unterstützt",
"Click to mute audio": "Klicke um den Ton stumm zu stellen", "Click to mute audio": "Klicke um den Ton stumm zu stellen",
"Click to mute video": "Klicken, um das Video stummzuschalten", "Click to mute video": "Klicken, um das Video stummzuschalten",
@ -601,7 +601,7 @@
"No more results": "Keine weiteren Ergebnisse", "No more results": "Keine weiteren Ergebnisse",
"No results": "Keine Ergebnisse", "No results": "Keine Ergebnisse",
"OK": "OK", "OK": "OK",
"Revoke Moderator": "Moderator zurückziehen", "Revoke Moderator": "Moderator-Status zurückziehen",
"Search": "Suchen", "Search": "Suchen",
"Search failed": "Suche ist fehlgeschlagen", "Search failed": "Suche ist fehlgeschlagen",
"Server error": "Server-Fehler", "Server error": "Server-Fehler",
@ -615,8 +615,8 @@
"%(actionVerb)s this person?": "Diese Person %(actionVerb)s?", "%(actionVerb)s this person?": "Diese Person %(actionVerb)s?",
"This room has no local addresses": "Dieser Raum hat keine lokale Adresse", "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", "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.": "Versuchte einen spezifischen Punkt in der Raum-Chronik zu laden, aber du hast keine Berechtigung die angeforderte Nachricht anzuzeigen.", "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.": "Der Versuch, einen spezifischen Punkt im Chatverlauf zu laden, ist fehlgeschlagen. Der Punkt konnte nicht gefunden werden.", "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 off": "Markdown deaktiveren",
"Turn Markdown on": "Markdown einschalten", "Turn Markdown on": "Markdown einschalten",
"Unable to load device list": "Geräteliste konnte nicht geladen werden", "Unable to load device list": "Geräteliste konnte nicht geladen werden",
@ -656,9 +656,9 @@
"%(severalUsers)sjoined": "%(severalUsers)shaben den Raum betreten", "%(severalUsers)sjoined": "%(severalUsers)shaben den Raum betreten",
"%(oneUser)sjoined": "%(oneUser)shat den Raum betreten", "%(oneUser)sjoined": "%(oneUser)shat den Raum betreten",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)shaben %(repeats)s mal den Raum verlassen", "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)shaben %(repeats)s mal den Raum verlassen",
"%(oneUser)sleft %(repeats)s times": "%(oneUser)sging %(repeats)s mal", "%(oneUser)sleft %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal verlassen",
"%(severalUsers)sleft": "%(severalUsers)shaben den Raum verlassen", "%(severalUsers)sleft": "%(severalUsers)shaben den Raum verlassen",
"%(oneUser)sleft": "%(oneUser)sging", "%(oneUser)sleft": "%(oneUser)shat den Raum verlassen",
"%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)shaben den Raum %(repeats)s mal betreten und wieder verlassen", "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)shaben den Raum %(repeats)s mal betreten und wieder verlassen",
"%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten und wieder verlassen", "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten und wieder verlassen",
"%(severalUsers)sjoined and left": "%(severalUsers)shaben den Raum betreten und wieder verlassen", "%(severalUsers)sjoined and left": "%(severalUsers)shaben den Raum betreten und wieder verlassen",
@ -751,7 +751,7 @@
"Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen", "Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen",
"Continue anyway": "Trotzdem fortfahren", "Continue anyway": "Trotzdem fortfahren",
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Dein Anzeigename ist der Name, der anderen Nutzern angezeigt wird, wenn du in Räumen kommunizierst. Welchen Anzeigenamen möchtest du wählen?", "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Dein Anzeigename ist der Name, der anderen Nutzern angezeigt wird, wenn du in Räumen kommunizierst. Welchen Anzeigenamen möchtest du wählen?",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Do blockst aktuell unverifizierte Geräte. Um Nachrichten an diese Geräte zu senden musst du sie verifizieren.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Nicht verifizierte Geräte werden aktuell blockiert und auf die Sperrliste gesetzt. Um Nachrichten an diese Geräte senden zu können, müssen diese zunächst verifiziert werden.",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" enthält Geräte, die du bislang noch nicht gesehen hast.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" enthält Geräte, die du bislang noch nicht gesehen hast.",
"Unknown devices": "Unbekannte Geräte", "Unknown devices": "Unbekannte Geräte",
"Unknown Address": "Unbekannte Adresse", "Unknown Address": "Unbekannte Adresse",
@ -812,7 +812,7 @@
"Drop file here to upload": "Datei hier loslassen zum hochladen", "Drop file here to upload": "Datei hier loslassen zum hochladen",
"Idle": "Untätig", "Idle": "Untätig",
"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.": "Wir empfehlen dir für jedes Gerät durch den Verifizierungsprozess zu gehen um zu bestätigen, dass sie ihrem legitimierten Besitzer gehören, aber du kannst die Nachrichten ohne Verifizierung erneut senden, wenn du es vorziehst.", "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.": "Wir empfehlen dir für jedes Gerät durch den Verifizierungsprozess zu gehen um zu bestätigen, dass sie ihrem legitimierten Besitzer gehören, aber du kannst die Nachrichten ohne Verifizierung erneut senden, wenn du es vorziehst.",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Laufendes Konferenzgespräch%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)s.",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Konto für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Konto für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?",
"Disable URL previews for this room (affects only you)": "URL-Vorschau für diesen Raum deaktivieren (betrifft nur dich)", "Disable URL previews for this room (affects only you)": "URL-Vorschau für diesen Raum deaktivieren (betrifft nur dich)",
"Start automatically after system login": "Starte automatisch nach System-Login", "Start automatically after system login": "Starte automatisch nach System-Login",
@ -858,6 +858,7 @@
"Password:": "Passwort:", "Password:": "Passwort:",
"Register": "Registrieren", "Register": "Registrieren",
"Save": "Speichern", "Save": "Speichern",
"Setting a user name will create a fresh account": "Die Eingabe eines Benutzernamens wird ein neues Konto erzeugen",
"Tagged as: ": "Markiert als: ", "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.", "This Home Server does not support login using email address.": "Dieser Heimserver unterstützt den Login mittels E-Mail-Adresse nicht.",
"There was a problem logging in.": "Es gab ein Problem beim anmelden.", "There was a problem logging in.": "Es gab ein Problem beim anmelden.",
@ -884,8 +885,6 @@
"Failed to fetch avatar URL": "Abrufen der Avatar-URL fehlgeschlagen", "Failed to fetch avatar URL": "Abrufen der Avatar-URL fehlgeschlagen",
"The phone number entered looks invalid": "Die eingegebene Telefonnummer scheint ungültig zu sein", "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.", "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.",
"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.",
"Uploading %(filename)s and %(count)s others.zero": "%(filename)s wird hochgeladen", "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.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", "Uploading %(filename)s and %(count)s others.other": "%(filename)s und %(count)s weitere Dateien werden hochgeladen",
@ -932,7 +931,7 @@
"Last seen": "Zuletzt gesehen", "Last seen": "Zuletzt gesehen",
"Level:": "Level:", "Level:": "Level:",
"No display name": "Kein Anzeigename", "No display name": "Kein Anzeigename",
"Otherwise, <a>click here</a> to send a bug report.": "Ansonsten <a>klicke hier</a> um einen Fehlerbericht zu senden.", "Otherwise, <a>click here</a> to send a bug report.": "Alternativ <a>hier klicken</a>, um einen Fehlerbericht zu senden.",
"Private Chat": "Privater Chat", "Private Chat": "Privater Chat",
"Public Chat": "Öffentlicher Chat", "Public Chat": "Öffentlicher Chat",
"Reason: %(reasonText)s": "Grund: %(reasonText)s", "Reason: %(reasonText)s": "Grund: %(reasonText)s",
@ -944,7 +943,7 @@
"Seen by %(userName)s at %(dateTime)s": "Gesehen von %(userName)s um %(dateTime)s", "Seen by %(userName)s at %(dateTime)s": "Gesehen von %(userName)s um %(dateTime)s",
"Send anyway": "Trotzdem senden", "Send anyway": "Trotzdem senden",
"Set": "Setze", "Set": "Setze",
"Start authentication": "Starte Authentifizierung", "Start authentication": "Authentifizierung beginnen",
"Show Text Formatting Toolbar": "Zeige text-formatierende Werkzeugleiste", "Show Text Formatting Toolbar": "Zeige text-formatierende Werkzeugleiste",
"This invitation was sent to an email address which is not associated with this account:": "Diese Einledung wurde an eine E-Mail-Adresse gesendet, die nicht mit diesem Konto verknüpft ist:", "This invitation was sent to an email address which is not associated with this account:": "Diese Einledung wurde an eine E-Mail-Adresse gesendet, die nicht mit diesem Konto verknüpft ist:",
"This room": "Dieser Raum", "This room": "Dieser Raum",
@ -966,5 +965,12 @@
"Your home server does not support device management.": "Dein Heimserver unterstützt kein Geräte-Management.", "Your home server does not support device management.": "Dein Heimserver unterstützt kein Geräte-Management.",
"(~%(count)s results).one": "(~%(count)s Ergebnis)", "(~%(count)s results).one": "(~%(count)s Ergebnis)",
"(~%(count)s results).other": "(~%(count)s Ergebnis)", "(~%(count)s results).other": "(~%(count)s Ergebnis)",
"Device Name": "Geräte-Name" "Device Name": "Geräte-Name",
"(could not connect media)": "(Medienverbindung nicht herstellbar)",
"(no answer)": "(keine Antwort)",
"(unknown failure: %(reason)s)": "(Unbekannter Fehler: %(reason)s)",
"Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Kryptografie-Erweiterungen nicht",
"Not a valid Riot keyfile": "Keine gültige Riot-Schlüsseldatei",
"Authentication check failed: incorrect password?": "Authentifizierung fehlgeschlagen: Falsches Passwort?",
"Disable Peer-to-Peer for 1:1 calls": "Peer-to-Peer-Verbindung für 1-zu-1-Anrufe deaktivieren"
} }

View file

@ -32,34 +32,34 @@
"%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.", "%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.",
"Account": "Λογαριασμός", "Account": "Λογαριασμός",
"Add a topic": "Πρόσθεσε μια περιγραφή", "Add a topic": "Προσθήκη θέματος",
"Add email address": "Πρόσθεσε ένα email", "Add email address": "Προσθήκη διεύθυνσης ηλ. αλληλογραφίας",
"Add phone number": "Πρόσθεσε έναν αριθμό τηλεφώνου", "Add phone number": "Προσθήκη αριθμού",
"Admin": "Διαχειριστής", "Admin": "Διαχειριστής",
"VoIP": "VoIP", "VoIP": "VoIP",
"No Microphones detected": "Δεν εντοπίστηκε μικρόφωνο", "No Microphones detected": "Δεν εντοπίστηκε μικρόφωνο",
"No Webcams detected": "Δεν εντοπίστηκε κάμερα", "No Webcams detected": "Δεν εντοπίστηκε κάμερα",
"Default Device": "Προεπιλεγμένη Συσκευή", "Default Device": "Προεπιλεγμένη συσκευή",
"Microphone": "Μικρόφωνο", "Microphone": "Μικρόφωνο",
"Camera": "Κάμερα", "Camera": "Κάμερα",
"Advanced": "Προχωρημένα", "Advanced": "Προχωρημένα",
"Algorithm": "Αλγόριθμος", "Algorithm": "Αλγόριθμος",
"Hide removed messages": "Κρύψε διαγραμμένα μηνύματα", "Hide removed messages": "Απόκρυψη διαγραμμένων μηνυμάτων",
"Authentication": "Πιστοποίηση", "Authentication": "Πιστοποίηση",
"and": "και", "and": "και",
"An email has been sent to": "Ένα email στάλθηκε σε", "An email has been sent to": "Ένα email στάλθηκε σε",
"A new password must be entered.": "Ο νέος κωδικός πρέπει να εισαχθεί.", "A new password must be entered.": "Ο νέος κωδικός πρόσβασης πρέπει να εισαχθεί.",
"%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε.", "%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε την κλήση.",
"An error has occurred.": "Ένα σφάλμα προέκυψε", "An error has occurred.": "Παρουσιάστηκε ένα σφάλμα.",
"Anyone": "Oποιοσδήποτε", "Anyone": "Oποιοσδήποτε",
"Are you sure?": "Είσαι σίγουρος;", "Are you sure?": "Είστε σίγουροι;",
"Are you sure you want to leave the room '%(roomName)s'?": "Είσαι σίγουρος οτι θές να φύγεις από το δωμάτιο '%(roomName)s';", "Are you sure you want to leave the room '%(roomName)s'?": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από το δωμάτιο '%(roomName)s';",
"Are you sure you want to reject the invitation?": "Είσαι σίγουρος οτι θες να απορρίψεις την πρόσκληση;", "Are you sure you want to reject the invitation?": "Είστε σίγουροι ότι θέλετε να απορρίψετε την πρόσκληση;",
"Are you sure you want to upload the following files?": "Είσαι σίγουρος οτι θές να ανεβάσεις τα ακόλουθα αρχεία;", "Are you sure you want to upload the following files?": "Είστε σίγουροι ότι θέλετε να αποστείλετε τα ακόλουθα αρχεία;",
"Attachment": "Επισύναψη", "Attachment": "Επισύναψη",
"%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο", "Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο",
"Bug Report": "Αναφορά Σφάλματος", "Bug Report": "Αναφορά σφάλματος",
"anyone": "οποιοσδήποτε", "anyone": "οποιοσδήποτε",
"Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε", "Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε",
"all room members, from the point they joined": "όλα τα μέλη του δωματίου, από τη στιγμή που συνδέθηκαν", "all room members, from the point they joined": "όλα τα μέλη του δωματίου, από τη στιγμή που συνδέθηκαν",
@ -106,7 +106,7 @@
"es-uy": "Ισπανικά (Ουρουγουάη)", "es-uy": "Ισπανικά (Ουρουγουάη)",
"es-ve": "Ισπανικά (Βενεζουέλα)", "es-ve": "Ισπανικά (Βενεζουέλα)",
"et": "Εσθονικά", "et": "Εσθονικά",
"eu": "Βασκική (βασκική)", "eu": "Βασκική (Βασκική)",
"fa": "Φάρσι", "fa": "Φάρσι",
"fi": "Φινλανδικά", "fi": "Φινλανδικά",
"fo": "Φαρόε", "fo": "Φαρόε",
@ -159,7 +159,7 @@
"ur": "Ουρντού", "ur": "Ουρντού",
"ve": "Venda", "ve": "Venda",
"vi": "Βιετναμέζικα", "vi": "Βιετναμέζικα",
"xh": "Xhosa", "xh": "Ξόσα",
"zh-cn": "Κινέζικα (ΛΔΚ)", "zh-cn": "Κινέζικα (ΛΔΚ)",
"zh-hk": "Κινέζικα (ΕΔΠ Χονγκ Κονγκ)", "zh-hk": "Κινέζικα (ΕΔΠ Χονγκ Κονγκ)",
"zh-sg": "Κινέζικα (Σιγκαπούρη)", "zh-sg": "Κινέζικα (Σιγκαπούρη)",
@ -168,8 +168,8 @@
"id": "Ινδονησιακά", "id": "Ινδονησιακά",
"lv": "Λετονικά", "lv": "Λετονικά",
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ένα μήνυμα στάλθηκε στο +%(msisdn)s. Παρακαλώ γράψε τον κωδικό επαλήθευσης που περιέχει",
"Access Token:": "Κωδικός Πρόσβασης:", "Access Token:": "Κωδικός πρόσβασης:",
"Always show message timestamps": "Δείχνε πάντα ένδειξη ώρας στα μηνύματα", "Always show message timestamps": "Εμφάνιση πάντα της ένδειξης ώρας στα μηνύματα",
"all room members": "όλα τα μέλη του δωματίου", "all room members": "όλα τα μέλη του δωματίου",
"all room members, from the point they are invited": "όλα τα μέλη του δωματίου, από τη στιγμή που προσκλήθηκαν", "all room members, from the point they are invited": "όλα τα μέλη του δωματίου, από τη στιγμή που προσκλήθηκαν",
"an address": "μία διεύθηνση", "an address": "μία διεύθηνση",
@ -180,68 +180,68 @@
"%(names)s and %(lastPerson)s are typing": "%(names)s και %(lastPerson)s γράφουν", "%(names)s and %(lastPerson)s are typing": "%(names)s και %(lastPerson)s γράφουν",
"%(names)s and one other are typing": "%(names)s και ένας ακόμα γράφουν", "%(names)s and one other are typing": "%(names)s και ένας ακόμα γράφουν",
"%(names)s and %(count)s others are typing": "%(names)s και %(count)s άλλοι γράφουν", "%(names)s and %(count)s others are typing": "%(names)s και %(count)s άλλοι γράφουν",
"Anyone who knows the room's link, including guests": "Οποιοσδήποτε γνωρίζει τον σύνδεδμο του δωματίου, συμπεριλαμβάνωντας τους επισκέπτες", "Anyone who knows the room's link, including guests": "Οποιοσδήποτε γνωρίζει τον σύνδεσμο του δωματίου, συμπεριλαμβανομένων των επισκεπτών",
"Blacklisted": "Στη μαύρη λίστα", "Blacklisted": "Στη μαύρη λίστα",
"Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη", "Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη",
"Change Password": "Αλλαγή Κωδικού", "Change Password": "Αλλαγή κωδικού πρόσβασης",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "ο χρήστης %(senderName)s άλλαξε το όνομά του από %(oldDisplayName)s σε %(displayName)s.", "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "Ο %(senderName)s άλλαξε το όνομά του από %(oldDisplayName)s σε %(displayName)s.",
"%(senderName)s changed their profile picture.": "ο χρήστης %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.", "%(senderName)s changed their profile picture.": "Ο %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο χρήστης %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)s.",
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο χρήστης %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".",
"Clear Cache and Reload": "Καθάρισε την μνήμη και Ανανέωσε", "Clear Cache and Reload": "Εκκαθάριση μνήμης και ανανέωση",
"Clear Cache": "Καθάρισε την μνήμη", "Clear Cache": "Εκκαθάριση μνήμης",
"Bans user with given id": "Διώχνει τον χρήστη με το συγκεκριμένο id", "Bans user with given id": "Αποκλεισμός χρήστη με το συγκεκριμένο αναγνωριστικό",
"%(senderDisplayName)s removed the room name.": "Ο χρήστης %(senderDisplayName)s διέγραψε το όνομα του δωματίου.", "%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.",
"Changes your display nickname": "Αλλάζει το όνομα χρήστη", "Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη",
"Click here": "Κάνε κλικ εδώ", "Click here": "Κάνε κλικ εδώ",
"Drop here %(toAction)s": "Απόθεση εδώ %(toAction)s", "Drop here %(toAction)s": "Απόθεση εδώ %(toAction)s",
"Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.", "Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.",
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix", "powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
"Confirm password": "Επιβεβαίωση κωδικού", "Confirm password": "Επιβεβαίωση κωδικού πρόσβασης",
"Confirm your new password": "Επιβεβαίωση του νέου κωδικού", "Confirm your new password": "Επιβεβαίωση του νέου κωδικού πρόσβασης",
"Continue": "Συνέχεια", "Continue": "Συνέχεια",
"Create an account": "Δημιουργία λογαριασμού", "Create an account": "Δημιουργία λογαριασμού",
"Create Room": "Δημιουργία Δωματίου", "Create Room": "Δημιουργία δωματίου",
"Cryptography": "Κρυπτογραφία", "Cryptography": "Κρυπτογραφία",
"Current password": "Τωρινός κωδικός", "Current password": "Τωρινός κωδικός πρόσβασης",
"Curve25519 identity key": "Κλειδί ταυτότητας Curve25519", "Curve25519 identity key": "Κλειδί ταυτότητας Curve25519",
"Custom level": "Προσαρμοσμένο επίπεδο", "Custom level": "Προσαρμοσμένο επίπεδο",
"/ddg is not a command": "/ddg δεν αναγνωρίζεται ως εντολή", "/ddg is not a command": "/ddg δεν αναγνωρίζεται ως εντολή",
"Deactivate Account": "Απενεργοποίηση Λογαριασμού", "Deactivate Account": "Απενεργοποίηση λογαριασμού",
"Deactivate my account": "Απενεργοποίηση του λογαριασμού μου", "Deactivate my account": "Απενεργοποίηση του λογαριασμού μου",
"decline": "απόρριψη", "decline": "απόρριψη",
"Decrypt %(text)s": "Αποκρυπτογράφησε %(text)s", "Decrypt %(text)s": "Αποκρυπτογράφηση %(text)s",
"Decryption error": "Σφάλμα αποκρυπτογράφησης", "Decryption error": "Σφάλμα αποκρυπτογράφησης",
"Delete": "Διαγραφή", "Delete": "Διαγραφή",
"Default": "Προεπιλογή", "Default": "Προεπιλογή",
"Device already verified!": "Η συσκευή έχει ήδη επαληθευτεί!", "Device already verified!": "Η συσκευή έχει ήδη επαληθευτεί!",
"Device ID": "ID Συσκευής", "Device ID": "Αναγνωριστικό συσκευής",
"Device ID:": "ID Συσκευής:", "Device ID:": "Αναγνωριστικό συσκευής:",
"device id: ": "id συσκευής: ", "device id: ": "αναγνωριστικό συσκευής: ",
"Device key:": "Κλειδί Συσκευής:", "Device key:": "Κλειδί συσκευής:",
"Devices": "Συσκευές", "Devices": "Συσκευές",
"Direct Chat": "Απευθείας συνομιλία", "Direct Chat": "Απευθείας συνομιλία",
"Direct chats": "Απευθείας συνομιλίες", "Direct chats": "Απευθείας συνομιλίες",
"disabled": "ανενεργό", "disabled": "ανενεργό",
"Disinvite": "Ανακάλεσε πρόσκληση", "Disinvite": "Ανάκληση πρόσκλησης",
"Display name": "Όνομα χρήστη", "Display name": "Όνομα χρήστη",
"Download %(text)s": "Κατέβασε %(text)s", "Download %(text)s": "Λήψη %(text)s",
"Ed25519 fingerprint": "Αποτύπωμα Ed25519", "Ed25519 fingerprint": "Αποτύπωμα Ed25519",
"Email": "Ηλ. Αλληλογραφία", "Email": "Ηλεκτρονική διεύθυνση",
"Email address": "Διεύθυνση email", "Email address": "Ηλεκτρονική διεύθυνση",
"Email address (optional)": "Διεύθυνση email (προαιρετικό)", "Email address (optional)": "Ηλεκτρονική διεύθυνση (προαιρετικό)",
"Email, name or matrix ID": "Email, όνομα ή matrix ID", "Email, name or matrix ID": "Ηλεκτρονική διεύθυνση, όνομα ή matrix ID",
"Emoji": "Εικονίδια", "Emoji": "Εικονίδια",
"enabled": "ενεργό", "enabled": "ενεργή",
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Τα κρυπτογραφημένα μηνύματα δεν θα είναι ορατά σε εφαρμογές που δεν παρέχουν τη δυνατότητα κρυπτογράφησης", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Τα κρυπτογραφημένα μηνύματα δεν θα είναι ορατά σε εφαρμογές που δεν παρέχουν τη δυνατότητα κρυπτογράφησης",
"Encrypted room": "Κρυπτογραφημένο δωμάτιο", "Encrypted room": "Κρυπτογραφημένο δωμάτιο",
"%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.", "%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.",
"End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)", "End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)",
"Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης", "Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης",
"Event information": "Πληροφορίες μηνύματος", "Event information": "Πληροφορίες συμβάντος",
"Existing Call": "Υπάρχουσα Κλήση", "Existing Call": "Υπάρχουσα κλήση",
"Export": "Εξαγωγή", "Export": "Εξαγωγή",
"Export E2E room keys": "Εξαγωγή κλειδιών κρυπτογραφίας για το δωμάτιο", "Export E2E room keys": "Εξαγωγή κλειδιών κρυπτογράφησης για το δωμάτιο",
"Failed to change password. Is your password correct?": "Δεν ήταν δυνατή η αλλαγή του κωδικού πρόσβασης. Είναι σωστός ο κωδικός πρόσβασης;", "Failed to change password. Is your password correct?": "Δεν ήταν δυνατή η αλλαγή του κωδικού πρόσβασης. Είναι σωστός ο κωδικός πρόσβασης;",
"Failed to delete device": "Δεν ήταν δυνατή η διαγραφή της συσκευής", "Failed to delete device": "Δεν ήταν δυνατή η διαγραφή της συσκευής",
"Failed to join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο", "Failed to join room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
@ -251,58 +251,58 @@
"Failed to reject invite": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης", "Failed to reject invite": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης", "Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης",
"Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων", "Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων",
"Failed to send email": "Δεν ήταν δυνατή η απστολή email", "Failed to send email": "Δεν ήταν δυνατή η αποστολή ηλ. αλληλογραφίας",
"Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επαλήθευση του email: βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε", "Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επαλήθευση του email: βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε",
"Favourite": "Αγαπημένο", "Favourite": "Αγαπημένο",
"favourite": "αγαπημένο", "favourite": "αγαπημένο",
"Favourites": "Αγαπημένα", "Favourites": "Αγαπημένα",
"Fill screen": "Γέμισε την οθόνη", "Fill screen": "Γέμισε την οθόνη",
"Filter room members": ίλτραρε τα μέλη", "Filter room members": ιλτράρισμα μελών",
"Forget room": "Διέγραψε το δωμάτιο", "Forget room": "Αγνόηση δωματίου",
"Forgot your password?": έχασες τον κωδικό σου;", "Forgot your password?": εχάσατε τoν κωδικό πρόσβασης σας;",
"For security, this session has been signed out. Please sign in again.": "Για λόγους ασφαλείας, αυτή η συνεδρία έχει τερματιστεί. Παρακαλώ συνδεθείτε ξανά.", "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.": "Για λόγους ασφαλείας, τα κλειδιά κρυπτογράφησης θα διαγράφονται από τον φυλλομετρητή κατά την αποσύνδεση σας. Εάν επιθυμείτε να αποκρυπτογραφήσετε τις συνομιλίες σας στο μέλλον, εξάγετε τα κλειδιά σας και κρατήστε τα ασφαλή.", "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?": "Βρήκατε κάποιο πρόβλημα;", "Found a bug?": "Βρήκατε κάποιο πρόβλημα;",
"Guest users can't upload files. Please register to upload.": "Οι επισκέπτες δεν μπορούν να ανεβάσουν αρχεία. Παρακαλώ εγγραφείτε πρώτα.", "Guest users can't upload files. Please register to upload.": "Οι επισκέπτες δεν μπορούν να ανεβάσουν αρχεία. Παρακαλώ εγγραφείτε πρώτα.",
"had": "είχε", "had": "είχε",
"Hangup": "Κλείσε", "Hangup": "Κλείσιμο",
"Historical": "Ιστορικό", "Historical": "Ιστορικό",
"Homeserver is": "Ο διακομιστής είναι", "Homeserver is": "Ο διακομιστής είναι",
"Identity Server is": "Διακομιστής Ταυτοποίησης", "Identity Server is": "Ο διακομιστής ταυτοποίησης είναι",
"I have verified my email address": "Έχω επαληθεύσει το email μου", "I have verified my email address": "Έχω επαληθεύσει την διεύθυνση ηλ. αλληλογραφίας",
"Import": "Εισαγωγή", "Import": "Εισαγωγή",
"Import E2E room keys": "Εισαγωγή κλειδιών κρυπτογράφησης", "Import E2E room keys": "Εισαγωγή κλειδιών E2E",
"Incorrect username and/or password.": "Λανθασμένο όνομα χρήστη και/ή κωδικός.", "Incorrect username and/or password.": "Λανθασμένο όνομα χρήστη και/ή κωδικός.",
"Incorrect verification code": "Λανθασμένος κωδικός επαλήθευσης", "Incorrect verification code": "Λανθασμένος κωδικός επαλήθευσης",
"Interface Language": "Γλώσσα Διεπαφής", "Interface Language": "Γλώσσα διεπαφής",
"Invalid Email Address": "Μη έγκυρο email", "Invalid Email Address": "Μη έγκυρη διεύθυνση ηλεκτρονικής αλληλογραφίας",
"Invite new room members": "Προσκάλεσε νέα μέλη", "Invite new room members": "Προσκαλέστε νέα μέλη",
"Invited": "Προσκλήθηκε", "Invited": "Προσκλήθηκε",
"Invites": "Προσκλήσεις", "Invites": "Προσκλήσεις",
"is a": "είναι ένα", "is a": "είναι ένα",
"%(displayName)s is typing": "ο χρήστης %(displayName)s γράφει", "%(displayName)s is typing": "Ο χρήστης %(displayName)s γράφει",
"Sign in with": "Συνδέσου με", "Sign in with": "Συνδεθείτε με",
"joined and left": "μπήκε και βγήκε", "joined and left": "συνδέθηκε και έφυγε",
"joined": "μπήκε", "joined": "συνδέθηκε",
"%(targetName)s joined the room.": "ο χρήστης %(targetName)s συνδέθηκε στο δωμάτιο.", "%(targetName)s joined the room.": "ο %(targetName)s συνδέθηκε στο δωμάτιο.",
"Jump to first unread message.": ήγαινε στο πρώτο μη αναγνωσμένο μήνυμα.", "Jump to first unread message.": ηγαίνετε στο πρώτο μη αναγνωσμένο μήνυμα.",
"%(senderName)s kicked %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "Ο %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Kick": "Διώξε", "Kick": "Διώξε",
"Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id", "Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id",
"Labs": "Πειραματικά", "Labs": "Πειραματικά",
"Leave room": "Φύγε από το δωμάτιο", "Leave room": "Αποχώρηση από το δωμάτιο",
"left and rejoined": "έφυγε και ξανασυνδέθηκε", "left and rejoined": "έφυγε και ξανασυνδέθηκε",
"left": "έφυγε", "left": "έφυγε",
"%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.", "%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.",
"Level": "Επίπεδο", "Level": "Επίπεδο",
"List this room in %(domain)s's room directory?": "Να εμφανίζεται το δωμάτιο στο γενικό ευρετήριο του διακομιστή %(domain)s;", "List this room in %(domain)s's room directory?": "Να εμφανίζεται το δωμάτιο στο γενικό ευρετήριο του διακομιστή %(domain)s;",
"Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:",
"Logged in as:": "Συνδέθηκες ως:", "Logged in as:": "Συνδεθήκατε ως:",
"Login as guest": υνδέσου ως επισκέπτης", "Login as guest": ύνδεση ως επισκέπτης",
"Logout": "Αποσύνδεση", "Logout": "Αποσύνδεση",
"Low priority": "Χαμηλής προτεραιότητας", "Low priority": "Χαμηλής προτεραιότητας",
"matrix-react-sdk version:": "έκδοση matrix-react-sdk:", "matrix-react-sdk version:": "Έκδοση matrix-react-sdk:",
"Members only": "Μέλη μόνο", "Members only": "Μόνο μέλη",
"Message not sent due to unknown devices being present": "Το μήνυμα δεν στάλθηκε γιατί υπάρχουν άγνωστες συσκευές", "Message not sent due to unknown devices being present": "Το μήνυμα δεν στάλθηκε γιατί υπάρχουν άγνωστες συσκευές",
"Mobile phone number": "Αριθμός κινητού τηλεφώνου", "Mobile phone number": "Αριθμός κινητού τηλεφώνου",
"Click here to fix": "Κάνε κλικ εδώ για διόρθωση", "Click here to fix": "Κάνε κλικ εδώ για διόρθωση",
@ -311,51 +311,51 @@
"Conference calls are not supported in encrypted rooms": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται σε κρυπτογραφημένα δωμάτια", "Conference calls are not supported in encrypted rooms": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται σε κρυπτογραφημένα δωμάτια",
"Conference calls are not supported in this client": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται από την εφαρμογή", "Conference calls are not supported in this client": "Οι κλήσεις συνδιάσκεψης δεν είναι υποστηρίζονται από την εφαρμογή",
"Enable encryption": "Ενεργοποίηση κρυπτογραφίας", "Enable encryption": "Ενεργοποίηση κρυπτογραφίας",
"Enter Code": "Κωδικός", "Enter Code": "Εισαγωγή κωδικού πρόσβασης",
"Failed to send request.": "Δεν ήταν δυνατή η αποστολή αιτήματος.", "Failed to send request.": "Δεν ήταν δυνατή η αποστολή αιτήματος.",
"Failed to upload file": "Δεν ήταν δυνατό το ανέβασμα αρχείου", "Failed to upload file": "Δεν ήταν δυνατή η αποστολή του αρχείου",
"Failure to create room": "Δεν ήταν δυνατή η δημιουργία δωματίου", "Failure to create room": "Δεν ήταν δυνατή η δημιουργία δωματίου",
"Join Room": "Συνδέσου", "Join Room": "Είσοδος σε δωμάτιο",
"Moderator": "Συντονιστής", "Moderator": "Συντονιστής",
"my Matrix ID": "το Matrix ID μου", "my Matrix ID": "το Matrix ID μου",
"Name": "Όνομα", "Name": "Όνομα",
"New address (e.g. #foo:%(localDomain)s)": "Νέα διεύθυνση (e.g. #όνομα:%(localDomain)s)", "New address (e.g. #foo:%(localDomain)s)": "Νέα διεύθυνση (e.g. #όνομα:%(localDomain)s)",
"New password": "Νέος κωδικός", "New password": "Νέος κωδικός πρόσβασης",
"New passwords don't match": "Οι νέοι κωδικοί είναι διαφορετικοί", "New passwords don't match": "Οι νέοι κωδικοί πρόσβασης είναι διαφορετικοί",
"New passwords must match each other.": "Οι νέοι κωδικόι πρέπει να ταιριάζουν.", "New passwords must match each other.": "Οι νέοι κωδικοί πρόσβασης πρέπει να ταιριάζουν.",
"none": "κανένα", "none": "κανένα",
"(not supported by this browser)": "(δεν υποστηρίζεται από τον browser)", "(not supported by this browser)": "(δεν υποστηρίζεται από τον περιηγητή)",
"<not supported>": "<δεν υποστηρίζεται>", "<not supported>": "<δεν υποστηρίζεται>",
"No more results": "Δεν υπάρχουν άλλα αποτελέσματα", "No more results": "Δεν υπάρχουν αποτελέσματα",
"No results": "Κανένα αποτέλεσμα", "No results": "Κανένα αποτέλεσμα",
"OK": "Εντάξει", "OK": "Εντάξει",
"olm version:": "έκδοση olm:", "olm version:": "Έκδοση olm:",
"Password": "Κωδικός", "Password": "Κωδικός πρόσβασης",
"Password:": "Κωδικός:", "Password:": "Κωδικός πρόσβασης:",
"Passwords can't be empty": "", "Passwords can't be empty": "Οι κωδικοί πρόσβασης δεν γίνετε να είναι κενοί",
"People": "Άτομα", "People": "Άτομα",
"Phone": "Τηλέφωνο", "Phone": "Τηλέφωνο",
"Register": "Εγγραφή", "Register": "Εγγραφή",
"riot-web version:": "έκδοση riot-web:", "riot-web version:": "Έκδοση riot-web:",
"Room Colour": "Χρώμα Δωματίου", "Room Colour": "Χρώμα δωματίου",
"Room name (optional)": "Όνομα Δωματίου (προαιρετικό)", "Room name (optional)": "Όνομα δωματίου (προαιρετικό)",
"Rooms": "Δωμάτια", "Rooms": "Δωμάτια",
"Save": "Αποθήκευση", "Save": "Αποθήκευση",
"Search failed": "Η αναζήτηση απέτυχε", "Search failed": "Η αναζήτηση απέτυχε",
"Send an encrypted message": "Στείλε ένα κρυπτογραφημένο μήνυμα", "Send an encrypted message": "Στείλτε ένα κρυπτογραφημένο μήνυμα",
"Send a message (unencrypted)": "Στείλε ένα μήνυμα (απλό)", "Send a message (unencrypted)": "Στείλτε ένα μήνυμα (μη κρυπτογραφημένο)",
"sent an image": "έστειλε μια εικόνα", "sent an image": "έστειλε μια εικόνα",
"sent a video": "έστειλε ένα βίντεο", "sent a video": "έστειλε ένα βίντεο",
"Server error": "Σφάλμα διακομιστή", "Server error": "Σφάλμα διακομιστή",
"Signed Out": "Αποσυνδέθηκες", "Signed Out": "Αποσυνδέθηκε",
"Sign in": "Συνδέση", "Sign in": "Συνδέση",
"Sign out": "Αποσύνδεση", "Sign out": "Αποσύνδεση",
"since they joined": "από τη στιγμή που συνδέθηκαν", "since they joined": "από τη στιγμή που συνδέθηκαν",
"since they were invited": "από τη στιγμή που προσκλήθηκαν", "since they were invited": "από τη στιγμή που προσκλήθηκαν",
"Someone": "Κάποιος", "Someone": "Κάποιος",
"Start a chat": "Ξεκίνα μια συνομιλία", "Start a chat": "Έναρξη συνομιλίας",
"This email address is already in use": "Το email χρησιμοποιείται", "This email address is already in use": "Η διεύθυνση ηλ. αλληλογραφίας χρησιμοποιείται ήδη",
"This email address was not found": "Η διεύθηνση email δεν βρέθηκε", "This email address was not found": "Δεν βρέθηκε η διεύθυνση ηλ. αλληλογραφίας",
"Success": "Επιτυχία", "Success": "Επιτυχία",
"Start Chat": "Συνομιλία", "Start Chat": "Συνομιλία",
"Cancel": "Ακύρωση", "Cancel": "Ακύρωση",
@ -373,7 +373,7 @@
"italic": "πλάγια", "italic": "πλάγια",
"underline": "υπογράμμιση", "underline": "υπογράμμιση",
"code": "κώδικας", "code": "κώδικας",
"quote": "αναφορά", "quote": "παράθεση",
"%(oneUser)sleft %(repeats)s times": "%(oneUser)s έφυγε %(repeats)s φορές", "%(oneUser)sleft %(repeats)s times": "%(oneUser)s έφυγε %(repeats)s φορές",
"%(severalUsers)sleft": "%(severalUsers)s έφυγαν", "%(severalUsers)sleft": "%(severalUsers)s έφυγαν",
"%(oneUser)sleft": "%(oneUser)s έφυγε", "%(oneUser)sleft": "%(oneUser)s έφυγε",
@ -385,5 +385,496 @@
"Create new room": "Δημιουργία νέου δωματίου", "Create new room": "Δημιουργία νέου δωματίου",
"Room directory": "Ευρετήριο", "Room directory": "Ευρετήριο",
"Start chat": "Έναρξη συνομιλίας", "Start chat": "Έναρξη συνομιλίας",
"Welcome page": "Αρχική σελίδα" "Welcome page": "Αρχική σελίδα",
"a room": "ένα δωμάτιο",
"Accept": "Αποδοχή",
"Active call (%(roomName)s)": "Ενεργή κλήση (%(roomName)s)",
"Add": "Προσθήκη",
"Admin tools": "Εργαλεία διαχειριστή",
"And %(count)s more...": "Και %(count)s περισσότερα...",
"No media permissions": "Χωρίς δικαιώματα πολυμέσων",
"Alias (optional)": "Ψευδώνυμο (προαιρετικό)",
"Ban": "Αποκλεισμός",
"Banned users": "Αποκλεισμένοι χρήστες",
"Bulk Options": "Μαζικές επιλογές",
"Call Timeout": "Λήξη χρόνου κλήσης",
"<a>Click here</a> to join the discussion!": "<a>Κλικ εδώ</a> για να συμμετάσχετε στην συζήτηση!",
"Click to mute audio": "Κάντε κλικ για σίγαση του ήχου",
"Click to mute video": "Κάντε κλικ για σίγαση του βίντεο",
"click to reveal": "κάντε κλικ για εμφάνιση",
"Click to unmute video": "Κάντε κλικ για άρση σίγασης του βίντεο",
"Click to unmute audio": "Κάντε κλικ για άρση σίγασης του ήχου",
"%(count)s new messages.one": "%(count)s νέο μήνυμα",
"%(count)s new messages.other": "%(count)s νέα μηνύματα",
"Custom": "Προσαρμοσμένο",
"Decline": "Απόρριψη",
"Disable Notifications": "Απενεργοποίηση ειδοποιήσεων",
"Disable markdown formatting": "Απενεργοποίηση μορφοποίησης markdown",
"Drop File Here": "Αποθέστε εδώ το αρχείο",
"Enable Notifications": "Ενεργοποίηση ειδοποιήσεων",
"Encryption is enabled in this room": "Η κρυπτογράφηση είναι ενεργοποιημένη σε αυτό το δωμάτιο",
"Encryption is not enabled in this room": "Η κρυπτογράφηση είναι απενεργοποιημένη σε αυτό το δωμάτιο",
"Enter passphrase": "Εισαγωγή συνθηματικού",
"Failed to set avatar.": "Δεν ήταν δυνατό ο ορισμός της προσωπικής εικόνας.",
"Failed to set display name": "Δεν ήταν δυνατό ο ορισμός του ονόματος εμφάνισης",
"Failed to set up conference call": "Δεν ήταν δυνατή η ρύθμιση κλήσης συνδιάσκεψης",
"Failed to toggle moderator status": "Δεν ήταν δυνατή η εναλλαγή κατάστασης του συντονιστή",
"Failed to upload profile picture!": "Δεν ήταν δυνατή η αποστολή της εικόνας προφίλ!",
"Hide read receipts": "Απόκρυψη αποδείξεων ανάγνωσης",
"Home": "Αρχική",
"Last seen": "Τελευταία εμφάνιση",
"Level:": "Επίπεδο:",
"Manage Integrations": "Διαχείριση ενσωματώσεων",
"Markdown is disabled": "Το Markdown είναι απενεργοποιημένο",
"Markdown is enabled": "Το Markdown είναι ενεργοποιημένο",
"Missing room_id in request": "Λείπει το room_id στο αίτημα",
"Permissions": "Δικαιώματα",
"Power level must be positive integer.": "Το επίπεδο δύναμης πρέπει να είναι ένας θετικός ακέραιος.",
"Privacy warning": "Προειδοποίηση ιδιωτικότητας",
"Private Chat": "Προσωπική συνομιλία",
"Privileged Users": "Προνομιούχοι χρήστες",
"Profile": "Προφίλ",
"Public Chat": "Δημόσια συνομιλία",
"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": "Επιστροφή στην οθόνη σύνδεσης",
"Room %(roomId)s not visible": "Το δωμάτιο %(roomId)s δεν είναι ορατό",
"%(roomName)s does not exist.": "Το %(roomName)s δεν υπάρχει.",
"Searches DuckDuckGo for results": "Γίνεται αναζήτηση στο DuckDuckGo για αποτελέσματα",
"Searching known users": "Αναζήτηση γνωστών χρηστών",
"Seen by %(userName)s at %(dateTime)s": "Διαβάστηκε από %(userName)s στις %(dateTime)s",
"Send anyway": "Αποστολή ούτως ή άλλως",
"Send Invites": "Αποστολή προσκλήσεων",
"Send Reset Email": "Αποστολή μηνύματος επαναφοράς",
"%(senderDisplayName)s sent an image.": "Ο %(senderDisplayName)s έστειλε μια φωτογραφία.",
"Server may be unavailable or overloaded": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος ή υπερφορτωμένος",
"Session ID": "Αναγνωριστικό συνεδρίας",
"%(senderName)s set a profile picture.": "Ο %(senderName)s όρισε τη φωτογραφία του προφίλ του.",
"Set": "Ορισμός",
"Start authentication": "Έναρξη πιστοποίησης",
"Submit": "Υποβολή",
"Tagged as: ": "Με ετικέτα:",
"The default role for new room members is": "Ο προεπιλεγμένος ρόλος για νέα μέλη είναι",
"The main address for this room is": "Η κύρια διεύθυνση για το δωμάτιο είναι",
"%(actionVerb)s this person?": "%(actionVerb)s αυτού του ατόμου;",
"The file '%(fileName)s' failed to upload": "Απέτυχε η αποστολή του αρχείου '%(fileName)s'",
"There was a problem logging in.": "Υπήρξε ένα πρόβλημα κατά την σύνδεση.",
"This room has no local addresses": "Αυτό το δωμάτιο δεν έχει τοπικές διευθύνσεις",
"This doesn't appear to be a valid email address": "Δεν μοιάζει με μια έγκυρη διεύθυνση ηλεκτρονικής αλληλογραφίας",
"This phone number is already in use": "Αυτός ο αριθμός τηλεφώνου είναι ήδη σε χρήση",
"This room": "Αυτό το δωμάτιο",
"This room's internal ID is": "Το εσωτερικό αναγνωριστικό του δωματίου είναι",
"times": "φορές",
"To ban users": "Για αποκλεισμό χρηστών",
"to browse the directory": "για περιήγηση στο ευρετήριο",
"To configure the room": "Για ρύθμιση του δωματίου",
"To invite users into the room": "Για πρόσκληση χρηστών στο δωμάτιο",
"To remove other users' messages": "Για αφαίρεση μηνυμάτων άλλων χρηστών",
"to restore": "για επαναφορά",
"To send events of type": "Για αποστολή συμβάντων τύπου",
"To send messages": "Για αποστολή μηνυμάτων",
"Turn Markdown off": "Απενεργοποίηση Markdown",
"Turn Markdown on": "Ενεργοποίηση Markdown",
"Unable to add email address": "Αδυναμία προσθήκης διεύθυνσης ηλ. αλληλογραφίας",
"Unable to remove contact information": "Αδυναμία αφαίρεσης πληροφοριών επαφής",
"Unable to restore previous session": "Αδυναμία επαναφοράς της προηγούμενης συνεδρίας",
"Unable to verify email address.": "Αδυναμία επιβεβαίωσης διεύθυνσης ηλ. αλληλογραφίας.",
"Unban": "Άρση αποκλεισμού",
"%(senderName)s unbanned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.",
"Unable to enable Notifications": "Αδυναμία ενεργοποίησης των ειδοποιήσεων",
"Unable to load device list": "Αδυναμία φόρτωσης της λίστας συσκευών",
"Unencrypted room": "Μη κρυπτογραφημένο δωμάτιο",
"unencrypted": "μη κρυπτογραφημένο",
"Unencrypted message": "Μη κρυπτογραφημένο μήνυμα",
"unknown caller": "άγνωστος καλών",
"Unknown command": "Άγνωστη εντολή",
"unknown device": "άγνωστη συσκευή",
"Unknown room %(roomId)s": "Άγνωστο δωμάτιο %(roomId)s",
"unknown": "άγνωστο",
"Unmute": "Άρση σίγασης",
"Unnamed Room": "Ανώνυμο δωμάτιο",
"Unrecognised command:": "Μη αναγνωρίσιμη εντολή:",
"Unrecognised room alias:": "Μη αναγνωρίσιμο ψευδώνυμο:",
"Unverified": "Ανεπιβεβαίωτο",
"Upload avatar": "Αποστολή προσωπικής εικόνας",
"Upload Failed": "Απέτυχε η αποστολή",
"Upload Files": "Αποστολή αρχείων",
"Upload file": "Αποστολή αρχείου",
"Upload new:": "Αποστολή νέου:",
"Usage": "Χρήση",
"Use with caution": "Χρησιμοποιήστε τα με προσοχή",
"User ID": "Αναγνωριστικό χρήστη",
"User Interface": "Διεπαφή χρήστη",
"%(user)s is a": "Ο %(user)s είναι",
"User name": "Όνομα χρήστη",
"Username invalid: %(errMessage)s": "Μη έγκυρο όνομα χρήστη: %(errMessage)s",
"Users": "Χρήστες",
"User": "Χρήστης",
"Video call": "Βιντεοκλήση",
"Voice call": "Φωνητική κλήση",
"Warning!": "Προειδοποίηση!",
"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.": "Πρέπει να εισάγετε ένα όνομα χρήστη.",
"Your password has been reset": "Ο κωδικός πρόσβασης σας έχει επαναφερθεί",
"Sun": "Κυρ",
"Mon": "Δευ",
"Tue": "Τρί",
"Wed": "Τετ",
"Thu": "Πέμ",
"Fri": "Παρ",
"Sat": "Σάβ",
"Jan": "Ιαν",
"Feb": "Φεβ",
"Mar": "Μάρ",
"Apr": "Απρ",
"May": "Μάι",
"Jun": "Ιούν",
"Jul": "Ιούλ",
"Aug": "Αύγ",
"Sep": "Σεπ",
"Oct": "Οκτ",
"Nov": "Νοέ",
"Dec": "Δεκ",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "Ορισμός ονόματος εμφάνισης:",
"Set a Display Name": "Ορισμός ονόματος εμφάνισης",
"Upload an avatar:": "Αποστολή προσωπικής εικόνας:",
"This server does not support authentication with a phone number.": "Αυτός ο διακομιστής δεν υποστηρίζει πιστοποίηση με αριθμό τηλεφώνου.",
"Missing password.": "Λείπει ο κωδικός πρόσβασης.",
"Passwords don't match.": "Δεν ταιριάζουν οι κωδικοί πρόσβασης.",
"This doesn't look like a valid email address.": "Δεν μοιάζει με μια έγκυρη διεύθυνση ηλ. αλληλογραφίας.",
"An unknown error occurred.": "Προέκυψε ένα άγνωστο σφάλμα.",
"I already have an account": "Έχω ήδη λογαριασμό",
"An error occurred: %(error_string)s": "Προέκυψε ένα σφάλμα: %(error_string)s",
"Topic": "Θέμα",
"Make Moderator": "Ορισμός συντονιστή",
"Encrypt room": "Κρυπτογράφηση δωματίου",
"Room": "Δωμάτιο",
"Auto-complete": "Αυτόματη συμπλήρωση",
"(~%(count)s results).one": "(~%(count)s αποτέλεσμα)",
"(~%(count)s results).other": "(~%(count)s αποτελέσματα)",
"Active call": "Ενεργή κλήση",
"strike": "επιγράμμιση",
"bullet": "κουκκίδα",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s συνδέθηκαν %(repeats)s φορές",
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)s συνδέθηκε %(repeats)s φορές",
"%(severalUsers)sjoined": "%(severalUsers)s συνδέθηκαν",
"%(oneUser)sjoined": "%(oneUser)s συνδέθηκε",
"were invited": "προσκλήθηκαν",
"was invited": "προσκλήθηκε",
"were banned": "αποκλείστηκαν",
"was banned": "αποκλείστηκε",
"were kicked": "διώχτηκαν",
"was kicked": "διώχτηκε",
"New Password": "Νέος κωδικός πρόσβασης",
"Start automatically after system login": "Αυτόματη έναρξη μετά τη σύνδεση",
"Options": "Επιλογές",
"Passphrases must match": "Δεν ταιριάζουν τα συνθηματικά",
"Passphrase must not be empty": "Το συνθηματικό δεν πρέπει να είναι κενό",
"Export room keys": "Εξαγωγή κλειδιών δωματίου",
"Confirm passphrase": "Επιβεβαίωση συνθηματικού",
"Import room keys": "Εισαγωγή κλειδιών δωματίου",
"File to import": "Αρχείο για εισαγωγή",
"Start new chat": "Έναρξη νέας συνομιλίας",
"Guest users can't invite users. Please register.": "Οι επισκέπτες δεν έχουν τη δυνατότητα να προσκαλέσουν άλλους χρήστες. Παρακαλούμε εγγραφείτε πρώτα.",
"Confirm Removal": "Επιβεβαίωση αφαίρεσης",
"Unknown error": "Άγνωστο σφάλμα",
"Incorrect password": "Λανθασμένος κωδικός πρόσβασης",
"To continue, please enter your password.": "Για να συνεχίσετε, παρακαλούμε πληκτρολογήστε τον κωδικό πρόσβασής σας.",
"Device name": "Όνομα συσκευής",
"Device Name": "Όνομα συσκευής",
"Device key": "Κλειδί συσκευής",
"Verify device": "Επιβεβαίωση συσκευής",
"Unable to restore session": "Αδυναμία επαναφοράς συνεδρίας",
"Continue anyway": "Συνέχεια οπωσδήποτε",
"Unknown devices": "Άγνωστες συσκευές",
"Unknown Address": "Άγνωστη διεύθυνση",
"Blacklist": "Μαύρη λίστα",
"Verify...": "Επαλήθευση...",
"ex. @bob:example.com": "π.χ @bob:example.com",
"Add User": "Προσθήκη χρήστη",
"Sign in with CAS": "Σύνδεση με CAS",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Μπορείτε να χρησιμοποιήσετε τις προσαρμοσμένες ρυθμίσεις για να εισέλθετε σε άλλους διακομιστές Matrix επιλέγοντας μια διαφορετική διεύθυνση για το διακομιστή.",
"Token incorrect": "Εσφαλμένο διακριτικό",
"A text message has been sent to": "Ένα μήνυμα στάλθηκε στο",
"Please enter the code it contains:": "Παρακαλούμε εισάγετε τον κωδικό που περιέχει:",
"Default server": "Προεπιλεγμένος διακομιστής",
"Custom server": "Προσαρμοσμένος διακομιστής",
"Home server URL": "Διεύθυνση διακομιστή",
"Identity server URL": "Διεύθυνση διακομιστή ταυτοποίησης",
"What does this mean?": "Τι σημαίνει αυτό;",
"Error decrypting audio": "Σφάλμα κατά την αποκρυπτογράφηση του ήχου",
"Error decrypting image": "Σφάλμα κατά την αποκρυπτογράφηση της εικόνας",
"Image '%(Body)s' cannot be displayed.": "Η εικόνα '%(Body)s' δεν μπορεί να εμφανιστεί.",
"This image cannot be displayed.": "Αυτή η εικόνα δεν μπορεί να εμφανιστεί.",
"Error decrypting video": "Σφάλμα κατά την αποκρυπτογράφηση του βίντεο",
"Add an Integration": "Προσθήκη ενσωμάτωσης",
"URL Previews": "Προεπισκόπηση συνδέσμων",
"Enable URL previews for this room (affects only you)": "Ενεργοποίηση της προεπισκόπησης συνδέσμων για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)",
"Drop file here to upload": "Αποθέστε εδώ για αποστολή",
"for %(amount)ss": "για %(amount)ss",
"for %(amount)sm": "για %(amount)sm",
"for %(amount)sh": "για %(amount)sh",
"for %(amount)sd": "για %(amount)sd",
"Online": "Σε σύνδεση",
"Idle": "Αδρανής",
"Offline": "Εκτός σύνδεσης",
"Start chatting": "Έναρξη συνομιλίας",
"Start Chatting": "Έναρξη συνομιλίας",
"Click on the button below to start chatting!": "Κάντε κλικ στο κουμπί παρακάτω για να ξεκινήσετε μια συνομιλία!",
"%(senderDisplayName)s removed the room avatar.": "Ο %(senderDisplayName)s διέγραψε την προσωπική εικόνα του δωματίου.",
"%(senderDisplayName)s changed the avatar for %(roomName)s": "Ο %(senderDisplayName)s άλλαξε την προσωπική εικόνα του %(roomName)s",
"Username available": "Διαθέσιμο όνομα χρήστη",
"Username not available": "Μη διαθέσιμο όνομα χρήστη",
"Something went wrong!": "Κάτι πήγε στραβά!",
"Could not connect to the integration server": "Αδυναμία σύνδεσης στον διακομιστή ενσωμάτωσης",
"Create a new chat or reuse an existing one": "Δημιουργία νέας συνομιλίας ή επαναχρησιμοποίηση μιας υπάρχουσας",
"Don't send typing notifications": "Να μη γίνετε αποστολή ειδοποιήσεων πληκτρολόγησης",
"Encrypted by a verified device": "Κρυπτογραφημένο από μια επιβεβαιωμένη συσκευή",
"Encrypted by an unverified device": "Κρυπτογραφημένο από μια ανεπιβεβαίωτη συσκευή",
"Error: Problem communicating with the given homeserver.": "Σφάλμα: πρόβλημα κατά την επικοινωνία με τον ορισμένο διακομιστή.",
"Failed to ban user": "Δεν ήταν δυνατό ο αποκλεισμός του χρήστη",
"Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης",
"Failed to fetch avatar URL": "Δεν ήταν δυνατή η ανάκτηση της διεύθυνσης εικόνας",
"Failed to lookup current room": "Δεν ήταν δυνατή η εύρεση του τρέχοντος δωματίου",
"Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Έχει απενεργοποιηθεί η πρόσβαση στους επισκέπτες σε αυτόν τον διακομιστή.",
"Guests can't set avatars. Please register.": "Οι επισκέπτες δεν μπορούν να ορίσουν προσωπικές εικόνες. Παρακαλούμε εγγραφείτε.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Οι επισκέπτες δεν μπορούν να δημιουργήσουν νέα δωμάτια. Παρακαλούμε εγγραφείτε για να δημιουργήσετε ένα δωμάτιο και να ξεκινήσετε μια συνομιλία.",
"Guests can't use labs features. Please register.": "Οι επισκέπτες δεν μπορούν να χρησιμοποιήσουν τα πειραματικά χαρακτηριστικά. Παρακαλούμε εγγραφείτε.",
"Guests cannot join this room even if explicitly invited.": "Οι επισκέπτες δεν μπορούν να συνδεθούν στο δωμάτιο ακόμη και αν έχουν καλεστεί.",
"Hide Text Formatting Toolbar": "Απόκρυψη εργαλειοθήκης μορφοποίησης κειμένου",
"Incoming call from %(name)s": "Εισερχόμενη κλήση από %(name)s",
"Incoming video call from %(name)s": "Εισερχόμενη βιντεοκλήση από %(name)s",
"Incoming voice call from %(name)s": "Εισερχόμενη φωνητική κλήση από %(name)s",
"Invalid alias format": "Μη έγκυρη μορφή ψευδώνυμου",
"Invalid address format": "Μη έγκυρη μορφή διεύθυνσης",
"Invalid file%(extra)s": "Μη έγκυρο αρχείο %(extra)s",
"%(senderName)s invited %(targetName)s.": "Ο %(senderName)s προσκάλεσε τον %(targetName)s.",
"Invites user with given id to current room": "Προσκαλεί τον χρήστη με το δοσμένο αναγνωριστικό στο τρέχον δωμάτιο",
"'%(alias)s' is not a valid format for an address": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή διεύθυνσης",
"'%(alias)s' is not a valid format for an alias": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή ψευδώνυμου",
"%(senderName)s made future room history visible to": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο",
"Missing user_id in request": "Λείπει το user_id στο αίτημα",
"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": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές, σε αυτό το δωμάτιο, από αυτή τη συσκευή",
"New Composer & Autocomplete": "Νέος επεξεργαστής κειμένου και αυτόματη συμπλήρωση",
"not set": "δεν έχει οριστεί",
"not specified": "μη καθορισμένο",
"NOT verified": "ΧΩΡΙΣ επαλήθευση",
"No devices with registered encryption keys": "Καθόλου συσκευές με εγγεγραμένα κλειδιά κρυπτογράφησης",
"No display name": "Χωρίς όνομα",
"No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)",
"Once you&#39;ve followed the link it contains, click below": "Μόλις ακολουθήσετε τον σύνδεσμο που περιέχει, κάντε κλικ παρακάτω",
"Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί",
"Otherwise, <a>click here</a> to send a bug report.": "Διαφορετικά, κάντε <a>κλικ εδώ</a> για να αποστείλετε μια αναφορά σφάλματος.",
"%(senderName)s placed a %(callType)s call.": "Ο %(senderName)s πραγματοποίησε μια %(callType)s κλήση.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.",
"Press": "Πατήστε",
"Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:",
"Rejoin": "Επανασύνδεση",
"%(senderName)s removed their profile picture.": "Ο %(senderName)s αφαίρεσε τη φωτογραφία του προφίλ του.",
"%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.",
"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 να αποστείλει ειδοποιήσεις - παρακαλούμε προσπαθήστε ξανά",
"Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές",
"%(roomName)s is not accessible at this time.": "Το %(roomName)s δεν είναι προσβάσιμο αυτή τη στιγμή.",
"Scroll to bottom of page": "Μετάβαση στο τέλος της σελίδας",
"Scroll to unread messages": "Μεταβείτε στα μη αναγνωσμένα μηνύματα",
"Sender device information": "Πληροφορίες συσκευής αποστολέα",
"Server may be unavailable, overloaded, or search timed out :(": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή να έχει λήξει η αναζήτηση :(",
"Server may be unavailable, overloaded, or the file too big": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή το αρχείο να είναι πολύ μεγάλο",
"Server may be unavailable, overloaded, or you hit a bug.": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή να πέσατε σε ένα σφάλμα.",
"Server unavailable, overloaded, or something else went wrong.": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή κάτι άλλο να πήγε στραβά.",
"Show panel": "Εμφάνιση καρτέλας",
"Show Text Formatting Toolbar": "Εμφάνιση της εργαλειοθήκης μορφοποίησης κειμένου",
"Some of your messages have not been sent.": "Μερικά από τα μηνύματα σας δεν έχουν αποσταλεί.",
"This room is not recognised.": "Αυτό το δωμάτιο δεν αναγνωρίζεται.",
"to favourite": "στα αγαπημένα",
"To kick users": "Για να διώξετε χρήστες",
"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",
"Uploading %(filename)s and %(count)s others.other": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπων",
"uploaded a file": "ανέβασε ένα αρχείο",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (δύναμη %(powerLevelNumber)s)",
"Verification Pending": "Εκκρεμεί επιβεβαίωση",
"Verification": "Επιβεβαίωση",
"verified": "επαληθεύτηκε",
"Verified": "Επαληθεύτηκε",
"Verified key": "Επιβεβαιωμένο κλειδί",
"VoIP conference finished.": "Ολοκληρώθηκε η συνδιάσκεψη VoIP.",
"VoIP conference started.": "Ξεκίνησησε η συνδιάσκεψη VoIP.",
"VoIP is unsupported": "Δεν υποστηρίζεται το VoIP",
"(warning: cannot be disabled again!)": "(προειδοποίηση: δεν μπορεί να απενεργοποιηθεί ξανά)",
"WARNING: Device already verified, but keys do NOT MATCH!": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η συσκευή έχει επαληθευτεί, αλλά τα κλειδιά ΔΕΝ ΤΑΙΡΙΑΖΟΥΝ!",
"Who can access this room?": "Ποιος μπορεί να προσπελάσει αυτό το δωμάτιο;",
"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": "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτό το δωμάτιο",
"You have been banned from %(roomName)s by %(userName)s.": "Έχετε αποκλειστεί από το δωμάτιο %(roomName)s από τον %(userName)s.",
"You have been invited to join this room by %(inviterName)s": "Έχετε προσκληθεί να συνδεθείτε στο δωμάτιο από τον %(inviterName)s",
"You seem to be in a call, are you sure you want to quit?": "Φαίνεται ότι είστε σε μια κλήση, είστε βέβαιοι ότι θέλετε να αποχωρήσετε;",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
"This doesn't look like a valid phone number.": "Δεν μοιάζει με έναν έγκυρο αριθμό τηλεφώνου.",
"Make this room private": "Κάντε το δωμάτιο ιδιωτικό",
"There are no visible files in this room": "Δεν υπάρχουν ορατά αρχεία σε αυτό το δωμάτιο",
"Connectivity to the server has been lost.": "Χάθηκε η συνδεσιμότητα στον διακομιστή.",
"%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s έφυγαν %(repeats)s φορές",
"%(severalUsers)srejected their invitations %(repeats)s times": "Οι %(severalUsers)s απέρριψαν τις προσκλήσεις τους %(repeats)s φορές",
"%(oneUser)srejected their invitation %(repeats)s times": "Ο %(oneUser)s απέρριψε την πρόσκληση του %(repeats)s φορές",
"%(severalUsers)srejected their invitations": "Οι %(severalUsers)s απέρριψαν τις προσκλήσεις τους",
"%(oneUser)srejected their invitation": "Ο %(oneUser)s απέρριψε την πρόσκληση",
"were invited %(repeats)s times": "προσκλήθηκαν %(repeats)s φορές",
"was invited %(repeats)s times": "προσκλήθηκε %(repeats)s φορές",
"were banned %(repeats)s times": "αποκλείστηκαν %(repeats)s φορές",
"was banned %(repeats)s times": "αποκλείστηκε %(repeats)s φορές",
"were kicked %(repeats)s times": "διώχθηκαν %(repeats)s φορές",
"was kicked %(repeats)s times": "διώχθηκε %(repeats)s φορές",
"%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s άλλαξαν το όνομα τους %(repeats)s φορές",
"%(oneUser)schanged their name %(repeats)s times": "Ο %(oneUser)s άλλαξε το όνομα του %(repeats)s φορές",
"%(severalUsers)schanged their name": "Οι %(severalUsers)s άλλαξαν το όνομα τους",
"%(oneUser)schanged their name": "Ο %(oneUser)s άλλαξε το όνομα του",
"%(severalUsers)schanged their avatar %(repeats)s times": "Οι %(severalUsers)s άλλαξαν την προσωπική τους φωτογραφία %(repeats)s φορές",
"%(oneUser)schanged their avatar %(repeats)s times": "Ο %(oneUser)s άλλαξε την προσωπική του εικόνα %(repeats)s φορές",
"%(severalUsers)schanged their avatar": "Οι %(severalUsers)s άλλαξαν την προσωπική τους εικόνα",
"%(oneUser)schanged their avatar": "Ο %(oneUser)s άλλαξε την προσωπική του εικόνα",
"Please select the destination room for this message": "Παρακαλούμε επιλέξτε ένα δωμάτιο προορισμού για αυτό το μήνυμα",
"Desktop specific": "Μόνο για επιφάνεια εργασίας",
"Analytics": "Αναλυτικά στοιχεία",
"Opt out of analytics": "Αποκλείστε τα αναλυτικά στοιχεία",
"Riot collects anonymous analytics to allow us to improve the application.": "Το Riot συλλέγει ανώνυμα δεδομένα επιτρέποντας μας να βελτιώσουμε την εφαρμογή.",
"Failed to invite": "Δεν ήταν δυνατή η πρόσκληση",
"Failed to invite user": "Δεν ήταν δυνατή η πρόσκληση του χρήστη",
"This action is irreversible.": "Αυτή η ενέργεια είναι μη αναστρέψιμη.",
"In future this verification process will be more sophisticated.": "Στο μέλλον η διαδικασία επαλήθευσης θα είναι πιο εξελιγμένη.",
"I verify that the keys match": "Επιβεβαιώνω πως ταιριάζουν τα κλειδιά",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "Το \"%(RoomName)s\" περιέχει συσκευές που δεν έχετε ξαναδεί.",
"This Home Server would like to make sure you are not a robot": "Ο διακομιστής θέλει να σιγουρευτεί ότι δεν είσαστε ρομπότ",
"Please check your email to continue registration.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία για να συνεχίσετε με την εγγραφή.",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Αν δεν ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας, δεν θα θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σας. Είστε σίγουροι;",
"You are registering with %(SelectedTeamName)s": "Εγγραφείτε με %(SelectedTeamName)s",
"Removed or unknown message type": "Αφαιρέθηκε ή άγνωστος τύπος μηνύματος",
"Disable URL previews by default for participants in this room": "Απενεργοποίηση της προεπισκόπησης συνδέσμων για όλους τους συμμετέχοντες στο δωμάτιο",
"Disable URL previews for this room (affects only you)": "Απενεργοποίηση της προεπισκόπησης συνδέσμων για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)",
" (unsupported)": " (μη υποστηριζόμενο)",
"$senderDisplayName changed the room avatar to <img/>": "Ο $senderDisplayName άλλαξε την εικόνα του δωματίου σε <img/>",
"Missing Media Permissions, click here to request.": "Λείπουν τα δικαιώματα πολύμεσων, κάντε κλικ για να ζητήσετε.",
"You may need to manually permit Riot to access your microphone/webcam": "Μπορεί να χρειαστεί να ορίσετε χειροκίνητα την πρόσβαση του Riot στο μικρόφωνο/κάμερα",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή - παρακαλούμε ελέγξτε την συνδεσιμότητα, βεβαιωθείτε ότι το <a>πιστοποιητικό SSL</a> του διακομιστή είναι έμπιστο και ότι κάποιο πρόσθετο περιηγητή δεν αποτρέπει τα αιτήματα.",
"Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή μέσω HTTP όταν μια διεύθυνση HTTPS βρίσκεται στην μπάρα του περιηγητή. Είτε χρησιμοποιήστε HTTPS ή <a>ενεργοποιήστε τα μη ασφαλή σενάρια εντολών</a>.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Ο %(senderName)s άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.",
"Changes to who can read history will only apply to future messages in this room": "Οι αλλαγές που αφορούν την ορατότητα του ιστορικού θα εφαρμοστούν μόνο στα μελλοντικά μηνύματα του δωματίου",
"Conference calling is in development and may not be reliable.": "Η κλήση συνδιάσκεψης είναι υπό ανάπτυξη και μπορεί να μην είναι αξιόπιστη.",
"Devices will not yet be able to decrypt history from before they joined the room": "Οι συσκευές δεν θα είναι σε θέση να αποκρυπτογραφήσουν το ιστορικό πριν από την είσοδο τους στο δωμάτιο",
"End-to-end encryption is in beta and may not be reliable": "Η κρυπτογράφηση από άκρο σε άκρο είναι σε δοκιμαστικό στάδιο και μπορεί να μην είναι αξιόπιστη",
"%(senderName)s removed their display name (%(oldDisplayName)s).": "Ο %(senderName)s αφαίρεσε το όνομα εμφάνισης του (%(oldDisplayName)s).",
"%(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 as %(tagName)s": "ετικέτα ως %(tagName)s",
"tag direct chat": "προσθήκη ετικέτας στην απευθείας συνομιλία",
"The phone number entered looks invalid": "Ο αριθμός που καταχωρίσατε δεν είναι έγκυρος",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Αυτή η ενέργεια δεν μπορεί να εκτελεστεί από έναν επισκέπτη. Παρακαλούμε εγγραφείτε για να μπορέσετε να το κάνετε.",
"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' υπερβαίνει το όριο μεγέθους του διακομιστή για αποστολές",
"The remote side failed to pick up": "Η απομακρυσμένη πλευρά απέτυχε να συλλέξει",
"This Home Server does not support login using email address.": "Ο διακομιστής δεν υποστηρίζει σύνδεση με διευθύνσεις ηλ. αλληλογραφίας.",
"This invitation was sent to an email address which is not associated with this account:": "Η πρόσκληση στάλθηκε σε μια διεύθυνση που δεν έχει συσχετιστεί με αυτόν τον λογαριασμό:",
"These are experimental features that may break in unexpected ways": "Αυτά είναι πειραματικά χαρακτηριστικά και μπορεί να καταρρεύσουν με απροσδόκητους τρόπους",
"The visibility of existing history will be unchanged": "Η ορατότητα του υπάρχοντος ιστορικού θα παραμείνει αμετάβλητη",
"This is a preview of this room. Room interactions have been disabled": "Αυτή είναι μια προεπισκόπηση του δωματίου. Οι αλληλεπιδράσεις δωματίου έχουν απενεργοποιηθεί",
"This room is not accessible by remote Matrix servers": "Αυτό το δωμάτιο δεν είναι προσβάσιμο από απομακρυσμένους διακομιστές Matrix",
"to demote": "για υποβίβαση",
"To reset your password, enter the email address linked to your account": "Για να επαναφέρετε τον κωδικό πρόσβασης σας, πληκτρολογήστε τη διεύθυνση ηλ. αλληλογραφίας όπου είναι συνδεδεμένη με τον λογαριασμό σας",
"to tag as %(tagName)s": "για να οριστεί ετικέτα ως %(tagName)s",
"to tag direct chat": "για να οριστεί ετικέτα σε απευθείας συνομιλία",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο %(senderName)s ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).",
"Undecryptable": "Μη αποκρυπτογραφημένο",
"Uploading %(filename)s and %(count)s others.one": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπα",
"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 trying to access %(roomName)s.": "Προσπαθείτε να έχετε πρόσβαση στο %(roomName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "Έχετε διωχθεί από το δωμάτιο %(roomName)s από τον %(userName)s.",
"You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Έχετε αποσυνδεθεί από όλες τις συσκευές και δεν θα λαμβάνετε πλέον ειδοποιήσεις push. Για να ενεργοποιήσετε τις ειδοποιήσεις, συνδεθείτε ξανά σε κάθε συσκευή",
"You have <a>disabled</a> URL previews by default.": "Έχετε <a>απενεργοποιημένη</a> από προεπιλογή την προεπισκόπηση συνδέσμων.",
"You have <a>enabled</a> URL previews by default.": "Έχετε <a>ενεργοποιημένη</a> από προεπιλογή την προεπισκόπηση συνδέσμων.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Έχετε πληκτρολογήσει μια άκυρη επαφή. Χρησιμοποιήστε το Matrix ID ή την ηλεκτρονική διεύθυνση αλληλογραφίας τους.",
"You may wish to login with a different account, or add this email to this account.": "Μπορεί να θέλετε να συνδεθείτε με διαφορετικό λογαριασμό, ή να προσθέσετε αυτή τη διεύθυνση ηλεκτρονικής αλληλογραφίας σε αυτόν τον λογαριασμό.",
"You need to be able to invite users to do that.": "Για να το κάνετε αυτό πρέπει να έχετε τη δυνατότητα να προσκαλέσετε χρήστες.",
"You seem to be uploading files, are you sure you want to quit?": "Φαίνεται ότι αποστέλετε αρχεία, είστε βέβαιοι ότι θέλετε να αποχωρήσετε;",
"You should not yet trust it to secure data": "Δεν πρέπει να το εμπιστεύεστε για να ασφαλίσετε δεδομένα",
"Your home server does not support device management.": "Ο διακομιστής δεν υποστηρίζει διαχείριση συσκευών.",
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Ο κωδικός πρόσβασης είναι πολύ μικρός (ελ. %(MIN_PASSWORD_LENGTH)s).",
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Τα ονόματα μπορεί να περιέχουν μόνο γράμματα, αριθμούς, τελείες, πάνω και κάτω παύλα.",
"Share message history with new users": "Διαμοιρασμός ιστορικού μηνυμάτων με τους νέους χρήστες",
"numbullet": "απαρίθμηση",
"%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν %(repeats)s φορές",
"%(oneUser)sleft and rejoined %(repeats)s times": "%(severalUsers)s έφυγε και ξανασυνδέθηκε %(repeats)s φορές",
"%(severalUsers)sleft and rejoined": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν",
"%(oneUser)sleft and rejoined": "%(severalUsers)s έφυγε και ξανασυνδέθηκε",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους %(repeats)s φορές",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "Ο %(severalUsers)s απέσυρε την πρόσκληση του %(repeats)s φορές",
"%(severalUsers)shad their invitations withdrawn": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους",
"%(oneUser)shad their invitation withdrawn": "Ο %(severalUsers)s απέσυρε την πρόσκληση του",
"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:",
"changing room on a RoomView is not supported": "Δεν υποστηρίζεται η αλλαγή δωματίου σε RoomView",
"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. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.",
"To link to a room it must have <a>an address</a>.": "Για να συνδεθείτε σε ένα δωμάτιο πρέπει να έχετε <a>μια διεύθυνση</a>.",
"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.": "Η διεύθυνση ηλεκτρονικής αλληλογραφίας σας δεν φαίνεται να συσχετίζεται με Matrix ID σε αυτόν τον διακομιστή.",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς. Δεν θα λάβετε ειδοποιήσεις push σε άλλες συσκευές μέχρι να συνδεθείτε ξανά σε αυτές",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Δεν θα μπορέσετε να αναιρέσετε αυτήν την αλλαγή καθώς προωθείτε τον χρήστη να έχει το ίδιο επίπεδο δύναμης με τον εαυτό σας.",
"Sent messages will be stored until your connection has returned.": "Τα απεσταλμένα μηνύματα θα αποθηκευτούν μέχρι να αακτηθεί η σύνδεσή σας.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Αποστολή ξανά όλων</a> ή <a>ακύρωση όλων</a> τώρα. Μπορείτε επίσης να επιλέξετε μεμονωμένα μηνύματα για να τα στείλετε ξανά ή να ακυρώσετε.",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Είστε βέβαιοι ότι θέλετε να καταργήσετε (διαγράψετε) αυτό το συμβάν; Σημειώστε ότι αν διαγράψετε το όνομα δωματίου ή αλλάξετε το θέμα, θα μπορούσε να αναιρέσει την αλλαγή.",
"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": "Δεν ήταν δυνατή η φόρτωση της θέσης του χρονολόγιου",
"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.": "Προσπαθήσατε να φορτώσετε ένα συγκεκριμένο σημείο στο χρονολόγιο του δωματίου, αλλά δεν καταφέρατε να το βρείτε."
} }

View file

@ -887,7 +887,7 @@
"Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)", "Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)",
"Drop file here to upload": "Drop file here to upload", "Drop file here to upload": "Drop file here to upload",
" (unsupported)": " (unsupported)", " (unsupported)": " (unsupported)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Ongoing conference call%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.",
"for %(amount)ss": "for %(amount)ss", "for %(amount)ss": "for %(amount)ss",
"for %(amount)sm": "for %(amount)sm", "for %(amount)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh", "for %(amount)sh": "for %(amount)sh",
@ -908,5 +908,8 @@
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.", "If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.",
"Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
"Not a valid Riot keyfile": "Not a valid Riot keyfile", "Not a valid Riot keyfile": "Not a valid Riot keyfile",
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?" "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
"Do you want to set an email address?": "Do you want to set an email address?",
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications."
} }

View file

@ -812,7 +812,7 @@
"Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)", "Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)",
"Drop file here to upload": "Drop file here to upload", "Drop file here to upload": "Drop file here to upload",
" (unsupported)": " (unsupported)", " (unsupported)": " (unsupported)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Ongoing conference call%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.",
"for %(amount)ss": "for %(amount)ss", "for %(amount)ss": "for %(amount)ss",
"for %(amount)sm": "for %(amount)sm", "for %(amount)sm": "for %(amount)sm",
"for %(amount)sh": "for %(amount)sh", "for %(amount)sh": "for %(amount)sh",
@ -840,5 +840,78 @@
"Decline": "Decline", "Decline": "Decline",
"Disable markdown formatting": "Disable markdown formatting", "Disable markdown formatting": "Disable markdown formatting",
"Disable Notifications": "Disable Notifications", "Disable Notifications": "Disable Notifications",
"Enable Notifications": "Enable Notifications" "Enable Notifications": "Enable Notifications",
"Create new room": "Create new room",
"Room directory": "Room directory",
"Start chat": "Start chat",
"Welcome page": "Welcome page",
"Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
"Drop File Here": "Drop File Here",
"Encrypted by a verified device": "Encrypted by a verified device",
"Encrypted by an unverified device": "Encrypted by an unverified device",
"Encryption is enabled in this room": "Encryption is enabled in this room",
"Encryption is not enabled in this room": "Encryption is not enabled in this room",
"Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
"Failed to fetch avatar URL": "Failed to fetch avatar URL",
"Failed to upload profile picture!": "Failed to upload profile picture!",
"Home": "Home",
"Incoming call from %(name)s": "Incoming call from %(name)s",
"Incoming video call from %(name)s": "Incoming video call from %(name)s",
"Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.",
"Last seen": "Last seen",
"Level:": "Level:",
"No display name": "No display name",
"Otherwise, <a>click here</a> to send a bug report.": "Otherwise, <a>click here</a> to send a bug report.",
"Private Chat": "Private Chat",
"Public Chat": "Public Chat",
"Reason: %(reasonText)s": "Reason: %(reasonText)s",
"Rejoin": "Rejoin",
"Room contains unknown devices": "Room contains unknown devices",
"%(roomName)s does not exist.": "%(roomName)s does not exist.",
"%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
"Searching known users": "Searching known users",
"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",
"This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
"This room": "This room",
"To link to a room it must have <a>an address</a>.": "To link to a room it must have <a>an address</a>.",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
"Undecryptable": "Undecryptable",
"Unencrypted message": "Unencrypted message",
"unknown caller": "unknown caller",
"Unnamed Room": "Unnamed Room",
"Unverified": "Unverified",
"Uploading %(filename)s and %(count)s others.zero": "Uploading %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "Uploading %(filename)s and %(count)s other",
"Uploading %(filename)s and %(count)s others.other": "Uploading %(filename)s and %(count)s others",
"Upload new:": "Upload new:",
"%(user)s is a": "%(user)s is a",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
"Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
"Verified": "Verified",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?",
"You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
"You have been banned from %(roomName)s by %(userName)s.": "You have been banned from %(roomName)s by %(userName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "You have been kicked from %(roomName)s by %(userName)s.",
"You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
"You must <a>register</a> to use this functionality": "You must <a>register</a> to use this functionality",
"Your home server does not support device management.": "Your home server does not support device management.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.",
"(~%(count)s results).one": "(~%(count)s result)",
"(~%(count)s results).other": "(~%(count)s results)",
"New Password": "New Password",
"Device Name": "Device Name",
"Start chatting": "Start chatting",
"Start Chatting": "Start Chatting",
"Click on the button below to start chatting!": "Click on the button below to start chatting!",
"Username available": "Username available",
"Username not available": "Username not available",
"Something went wrong!": "Something went wrong!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead."
} }

View file

@ -129,7 +129,7 @@
"Don't send typing notifications": "Ne pas envoyer les notifications de saisie", "Don't send typing notifications": "Ne pas envoyer les notifications de saisie",
"Download %(text)s": "Télécharger %(text)s", "Download %(text)s": "Télécharger %(text)s",
"Drop here %(toAction)s": "Déposer ici %(toAction)s", "Drop here %(toAction)s": "Déposer ici %(toAction)s",
"Drop here to tag %(section)s": "Déposer ici pour marque comme %(section)s", "Drop here to tag %(section)s": "Déposer ici pour marquer comme %(section)s",
"Ed25519 fingerprint": "Empreinte Ed25519", "Ed25519 fingerprint": "Empreinte Ed25519",
"Email Address": "Adresse e-mail", "Email Address": "Adresse e-mail",
"Email, name or matrix ID": "E-mail, nom ou identifiant Matrix", "Email, name or matrix ID": "E-mail, nom ou identifiant Matrix",
@ -281,7 +281,7 @@
"Email": "E-mail", "Email": "E-mail",
"Failed to unban": "Échec de l'amnistie", "Failed to unban": "Échec de l'amnistie",
"Failed to upload file": "Échec du téléchargement", "Failed to upload file": "Échec du téléchargement",
"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", "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", "Failure to create room": "Échec de la création du salon",
"favourite": "favoris", "favourite": "favoris",
"Favourites": "Favoris", "Favourites": "Favoris",
@ -289,7 +289,7 @@
"Filter room members": "Filtrer les membres par nom", "Filter room members": "Filtrer les membres par nom",
"Forget room": "Oublier le salon", "Forget room": "Oublier le salon",
"Forgot your password?": "Mot de passe perdu ?", "Forgot your password?": "Mot de passe perdu ?",
"For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau.", "For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifier à nouveau.",
"Found a bug?": "Trouvé un problème ?", "Found a bug?": "Trouvé un problème ?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion.", "Guest users can't create new rooms. Please register to create room and start a chat.": "Les visiteurs ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion.",
@ -297,7 +297,7 @@
"had": "avait", "had": "avait",
"Hangup": "Raccrocher", "Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de réception", "Hide read receipts": "Cacher les accusés de réception",
"Hide Text Formatting Toolbar": "Cacher la barre de formattage de texte", "Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte",
"Historical": "Historique", "Historical": "Historique",
"Homeserver is": "Le homeserver est", "Homeserver is": "Le homeserver est",
"Identity Server is": "Le serveur d'identité est", "Identity Server is": "Le serveur d'identité est",
@ -324,8 +324,8 @@
"%(targetName)s joined the room.": "%(targetName)s a joint le salon.", "%(targetName)s joined the room.": "%(targetName)s a joint le salon.",
"Joins room with given alias": "Joint le salon avec l'alias défini", "Joins room with given alias": "Joint le salon avec l'alias défini",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s a expulsé %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s a expulsé %(targetName)s.",
"Kick": "Expluser", "Kick": "Expulser",
"Kicks user with given id": "Expulse l'utilisateur and l'ID donné", "Kicks user with given id": "Expulse l'utilisateur avec l'ID donné",
"Labs": "Laboratoire", "Labs": "Laboratoire",
"Leave room": "Quitter le salon", "Leave room": "Quitter le salon",
"left and rejoined": "a quitté et rejoint", "left and rejoined": "a quitté et rejoint",
@ -451,7 +451,7 @@
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher lheure au format am/pm (par ex. 2:30pm)", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher lheure au format am/pm (par ex. 2:30pm)",
"Signed Out": "Déconnecté", "Signed Out": "Déconnecté",
"Sign in": "S'identifier", "Sign in": "S'identifier",
"Sign out": "Se Déconnecter", "Sign out": "Se déconnecter",
"since the point in time of selecting this option": "depuis le moment où cette option a été sélectionnée", "since the point in time of selecting this option": "depuis le moment où cette option a été sélectionnée",
"since they joined": "depuis quils ont rejoint le salon", "since they joined": "depuis quils ont rejoint le salon",
"since they were invited": "depuis quils ont été invités", "since they were invited": "depuis quils ont été invités",
@ -496,7 +496,7 @@
"To link to a room it must have": "Pour avoir un lien vers un salon, il doit avoir", "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 make a room or": "pour créer un salon ou",
"To remove other users' messages": "Pour supprimer les messages des autres utilisateurs", "To remove other users' messages": "Pour supprimer les messages des autres utilisateurs",
"To reset your password, enter the email address linked to your account": "Pour réinitialiser votre mot de passe, merci dentrer ladresse email liée à votre compte", "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 restore": "pour restaurer",
"To send events of type": "Pour envoyer des évènements du type", "To send events of type": "Pour envoyer des évènements du type",
"To send messages": "Pour envoyer des messages", "To send messages": "Pour envoyer des messages",
@ -525,7 +525,7 @@
"Unknown room %(roomId)s": "Salon inconnu %(roomId)s", "Unknown room %(roomId)s": "Salon inconnu %(roomId)s",
"unknown": "inconnu", "unknown": "inconnu",
"Unmute": "Activer le son", "Unmute": "Activer le son",
"uploaded a file": "télécharger un fichier", "uploaded a file": "téléchargé un fichier",
"Upload avatar": "Télécharger une photo de profil", "Upload avatar": "Télécharger une photo de profil",
"Upload Failed": "Erreur lors du téléchargement", "Upload Failed": "Erreur lors du téléchargement",
"Upload Files": "Télécharger les fichiers", "Upload Files": "Télécharger les fichiers",
@ -545,7 +545,7 @@
"VoIP conference finished.": "Conférence audio terminée.", "VoIP conference finished.": "Conférence audio terminée.",
"VoIP conference started.": "Conférence audio démarrée.", "VoIP conference started.": "Conférence audio démarrée.",
"VoIP is unsupported": "Appels voix non supportés", "VoIP is unsupported": "Appels voix non supportés",
"(warning: cannot be disabled again!)": "(attention: ne peut être désactivé !)", "(warning: cannot be disabled again!)": "(attention : ne peut être désactivé !)",
"Warning!": "Attention !", "Warning!": "Attention !",
"Who can access this room?": "Qui peut accéder au salon ?", "Who can access this room?": "Qui peut accéder au salon ?",
"Who can read history?": "Qui peut lire l'historique ?", "Who can read history?": "Qui peut lire l'historique ?",
@ -560,13 +560,13 @@
"You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.", "You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.",
"You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon", "You do not have permission to post to this room": "Vous navez pas la permission de poster dans ce salon",
"You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)s", "You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre 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 notificationsm identifiez vous à nouveau sur tous les appareils", "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, identifiez vous à nouveau sur tous les appareils",
"You have no visible notifications": "Vous n'avez pas de notifications visibles", "You have no visible notifications": "Vous n'avez pas de notifications visibles",
"you must be a": "vous devez être un", "you must be a": "vous devez être un",
"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 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 connecté.", "You need to be logged in.": "Vous devez être connecté.",
"You need to enter a user name.": "Vous devez entrer un nom dutilisateur.", "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 dencryption 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.", "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 dencryption 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 associée à un identifiant Matrix sur ce homeserver.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.",
"Your password has been reset": "Votre mot de passe a été réinitialisé", "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 appareils jusquà ce que vous vous identifiez à nouveau", "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 appareils jusquà ce que vous vous identifiez à nouveau",
@ -645,7 +645,7 @@
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sa quitté et à nouveau joint le salon %(repeats)s fois", "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sa quitté et à nouveau joint le salon %(repeats)s fois",
"%(severalUsers)sleft and rejoined": "%(severalUsers)sont quitté et à nouveau joint le salon", "%(severalUsers)sleft and rejoined": "%(severalUsers)sont quitté et à nouveau joint le salon",
"%(oneUser)sleft and rejoined": "%(oneUser)sa quitté et à nouveau joint le salon", "%(oneUser)sleft and rejoined": "%(oneUser)sa quitté et à nouveau joint le salon",
"%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)sotn rejeté leurs invitations %(repeats)s fois", "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)sont rejeté leurs invitations %(repeats)s fois",
"%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)sa rejeté son invitation %(repeats)s fois", "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)sa rejeté son invitation %(repeats)s fois",
"%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leurs invitations", "%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leurs invitations",
"%(oneUser)srejected their invitation": "%(oneUser)sa rejeté son invitation", "%(oneUser)srejected their invitation": "%(oneUser)sa rejeté son invitation",
@ -697,7 +697,7 @@
"Failed to invite user": "Echec lors de l'invitation de l'utilisateur", "Failed to invite user": "Echec lors de l'invitation de l'utilisateur",
"Failed to invite the following users to the %(roomName)s room:": "Echec lors de linvitation des utilisateurs suivants dans le salon %(roomName)s :", "Failed to invite the following users to the %(roomName)s room:": "Echec lors de linvitation des utilisateurs suivants dans le salon %(roomName)s :",
"Confirm Removal": "Confirmer la suppression", "Confirm Removal": "Confirmer la suppression",
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Êtes vous sûr de vouloir supprimer cet événement ? Notez que si vous supprimez le changement de nom dun salon ou la mise a jour du sujet dun salon, il est possible que le changement soit annulé.", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Êtes vous sûr de vouloir supprimer cet événement ? Notez que si vous supprimez le changement de nom dun salon ou la mise à jour du sujet dun salon, il est possible que le changement soit annulé.",
"Unknown error": "Erreur inconnue", "Unknown error": "Erreur inconnue",
"Incorrect password": "Mot de passe incorrect", "Incorrect password": "Mot de passe incorrect",
"This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ceci rendra votre compte inutilisable de manière permanente. Vous ne pourrez pas enregistrer à nouveau le même identifiant utilisateur.", "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ceci rendra votre compte inutilisable de manière permanente. Vous ne pourrez pas enregistrer à nouveau le même identifiant utilisateur.",
@ -757,7 +757,7 @@
"Enable URL previews for this room (affects only you)": "Activer les aperçus d'URL pour ce salon (n'affecte que vous)", "Enable URL previews for this room (affects only you)": "Activer les aperçus d'URL pour ce salon (n'affecte que vous)",
"Drop file here to upload": "Déposer le fichier ici pour le télécharger", "Drop file here to upload": "Déposer le fichier ici pour le télécharger",
" (unsupported)": " (non supporté)", " (unsupported)": " (non supporté)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Appel conférence en cours%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Appel conférence en cours%(supportedText)s.",
"Online": "En ligne", "Online": "En ligne",
"Offline": "Déconnecté", "Offline": "Déconnecté",
"Disable URL previews for this room (affects only you)": "Désactiver les aperçus d'URL pour ce salon (n'affecte que vous)", "Disable URL previews for this room (affects only you)": "Désactiver les aperçus d'URL pour ce salon (n'affecte que vous)",
@ -827,7 +827,7 @@
"%(count)s new messages.one": "%(count)s nouveau message", "%(count)s new messages.one": "%(count)s nouveau message",
"%(count)s new messages.other": "%(count)s nouveaux messages", "%(count)s new messages.other": "%(count)s nouveaux messages",
"Disable markdown formatting": "Désactiver le formattage markdown", "Disable markdown formatting": "Désactiver le formattage markdown",
"Error: Problem communicating with the given homeserver.": "Erreur: Problème de communication avec le homeserveur.", "Error: Problem communicating with the given homeserver.": "Erreur : Problème de communication avec le homeserveur.",
"Failed to fetch avatar URL": "Échec lors de la récupération de lURL de lavatar", "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", "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.", "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.",
@ -850,5 +850,77 @@
"Username not available": "Nom d'utilisateur indisponible", "Username not available": "Nom d'utilisateur indisponible",
"Something went wrong!": "Quelque chose sest mal passé !", "Something went wrong!": "Quelque chose sest mal passé !",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Cela sera le nom de votre compte sur le serveur <span></span>, ou vous pouvez sélectionner un <a>autre serveur</a>.", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Cela sera le nom de votre compte sur le serveur <span></span>, ou vous pouvez sélectionner un <a>autre serveur</a>.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Si vous avez déjà un compte Matrix vous pouvez vous <a>identifier</a> à la place." "If you already have a Matrix account you can <a>log in</a> instead.": "Si vous avez déjà un compte Matrix vous pouvez vous <a>identifier</a> à la place.",
"a room": "un salon",
"Accept": "Accepter",
"Active call (%(roomName)s)": "Appel en cours (%(roomName)s)",
"Admin tools": "Outils d'administration",
"Alias (optional)": "Alias (optionnel)",
"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 homeserver - veuillez vérifier votre connexion, assurez vous que vous faites confiance au <a>certificat SSL de votre homeserver</a>, et qu'aucune extension de navigateur ne bloque les requêtes.",
"<a>Click here</a> to join the discussion!": "<a>Cliquer ici</a> pour joindre la discussion !",
"Close": "Fermer",
"Custom": "Personnaliser",
"Decline": "Décliner",
"Disable Notifications": "Désactiver les Notifications",
"Drop File Here": "Déposer le Fichier Ici",
"Enable Notifications": "Activer les Notifications",
"Failed to upload profile picture!": "Échec du téléchargement de la photo de profil !",
"Incoming call from %(name)s": "Appel entrant de %(name)s",
"Incoming video call from %(name)s": "Appel vidéo entrant de %(name)s",
"Incoming voice call from %(name)s": "Appel audio entrant de %(name)s",
"No display name": "Pas de nom d'affichage",
"Otherwise, <a>click here</a> to send a bug report.": "Sinon, <a>cliquer ici</a> pour envoyer un rapport d'erreur.",
"Private Chat": "Conversation Privée",
"Public Chat": "Conversation Publique",
"Reason: %(reasonText)s": "Raison: %(reasonText)s",
"Rejoin": "Rejoindre",
"Room contains unknown devices": "Le salon contient des appareils inconnus",
"%(roomName)s does not exist.": "%(roomName)s n'existe pas.",
"%(roomName)s is not accessible at this time.": "%(roomName)s n'est pas accessible pour le moment.",
"Seen by %(userName)s at %(dateTime)s": "Vu par %(userName)s à %(dateTime)s",
"Send anyway": "Envoyer quand même",
"Show Text Formatting Toolbar": "Afficher la barre de formatage de texte",
"Start authentication": "Démarrer une authentification",
"This invitation was sent to an email address which is not associated with this account:": "Cette invitation a été envoyée à une adresse e-mail qui n'est pas associée avec ce compte :",
"This room": "Ce salon",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossible de vérifier que l'adresse à qui cette invitation a été envoyée correspond à celle associée à votre compte.",
"Undecryptable": "Indécryptable",
"Unencrypted message": "Message non-encrypté",
"unknown caller": "appelant inconnu",
"Unnamed Room": "Salon sans nom",
"Unverified": "Non verifié",
"%(user)s is a": "%(user)s est un(e)",
"Username invalid: %(errMessage)s": "Nom d'utilisateur invalide : %(errMessage)s",
"Verified": "Verifié",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Souhaitez-vous <acceptText>accepter</acceptText> ou <declineText>refuser</declineText> cette invitation ?",
"You have been banned from %(roomName)s by %(userName)s.": "Vous avez été bannis de %(roomName)s par %(userName)s.",
"You have been kicked from %(roomName)s by %(userName)s.": "Vous avez été expulsé de %(roomName)s by %(userName)s.",
"You may wish to login with a different account, or add this email to this account.": "Vous souhaiteriez peut-être vous identifier avec un autre compte, ou ajouter cette e-mail à votre compte.",
"Your home server does not support device management.": "Votre home server ne supporte pas la gestion d'appareils.",
"(~%(count)s results).one": "(~%(count)s résultat)",
"(~%(count)s results).other": "(~%(count)s résultats)",
"Device Name": "Nom de l'appareil",
"Encrypted by a verified device": "Encrypté par un appareil verifié",
"Encrypted by an unverified device": "Encrypté par un appareil non verifié",
"Encryption is enabled in this room": "L'encryption est activée sur ce salon",
"Encryption is not enabled in this room": "L'encryption n'est pas activée sur ce salon",
"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:": "Télécharger un nouveau :",
"And %(count)s more...": "Et %(count)s autres...",
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Joindre avec <voiceText>audio</voiceText> ou <videoText>vidéo</videoText>.",
"Last seen": "Vu pour la dernière fois",
"Level:": "Niveau :",
"Searching known users": "Recherche d'utilisateurs connus",
"Set": "Défini",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (pouvoir %(powerLevelNumber)s)",
"(could not connect media)": "(impossible de se connecter au média)",
"(no answer)": "(pas de réponse)",
"(unknown failure: %(reason)s)": "(erreur inconnue: %(reason)s)",
"Your browser does not support the required cryptography extensions": "Votre navigateur ne supporte pas les extensions cryptographiques nécessaires",
"Not a valid Riot keyfile": "Fichier de clé Riot non valide",
"Authentication check failed: incorrect password?": "Erreur didentification: mot de passe incorrect ?",
"Disable Peer-to-Peer for 1:1 calls": "Désactiver les appels 1:1 pair-à-pair",
"Do you want to set an email address?": "Souhaitez-vous configurer une adresse e-mail ?",
"This will allow you to reset your password and receive notifications.": "Ceci va vous permettre de réinitialiser votre mot de passe et de recevoir des notifications."
} }

View file

@ -1,7 +1,7 @@
{ {
"af": "Afrikaans", "af": "Afrikaans",
"ar-ae": "Arabisch (U.A.E.)", "ar-ae": "Arabisch (U.A.E.)",
"Direct Chat": "Privé gesprek", "Direct Chat": "Privégesprek",
"ar-bh": "Arabisch (Bahrain)", "ar-bh": "Arabisch (Bahrain)",
"ar-dz": "Arabisch (Algerije)", "ar-dz": "Arabisch (Algerije)",
"ar-eg": "Arabisch (Egypte)", "ar-eg": "Arabisch (Egypte)",
@ -60,7 +60,7 @@
"es-ve": "Spaans (Venezuela)", "es-ve": "Spaans (Venezuela)",
"et": "Estlands", "et": "Estlands",
"eu": "Baskisch (Bask)", "eu": "Baskisch (Bask)",
"fa": "Farsi", "fa": "Perzisch (Farsi)",
"fi": "Fins", "fi": "Fins",
"fo": "Faeroesisch", "fo": "Faeroesisch",
"fr-be": "Frans (België)", "fr-be": "Frans (België)",
@ -198,5 +198,134 @@
"Confirm your new password": "Bevestig je nieuwe wachtwoord", "Confirm your new password": "Bevestig je nieuwe wachtwoord",
"Continue": "Doorgaan", "Continue": "Doorgaan",
"Could not connect to the integration server": "Mislukt om te verbinden met de integratie server", "Could not connect to the integration server": "Mislukt om te verbinden met de integratie server",
"Cancel": "Annuleer" "Cancel": "Annuleren",
"a room": "een ruimte",
"Accept": "Accepteren",
"Active call (%(roomName)s)": "Actief gesprek (%(roomName)s)",
"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",
"No Webcams detected": "Geen webcams gevonden",
"No media permissions": "Geen mediatoestemmingen",
"You may need to manually permit Riot to access your microphone/webcam": "U moet Riot wellicht handmatig toestemming geven om uw microfoon/webcam te gebruiken",
"Default Device": "Standaardapparaat",
"Microphone": "Microfoon",
"Camera": "Camera",
"Hide removed messages": "Verwijderde berichten verbergen",
"Alias (optional)": "Alias (optioneel)",
"Anyone": "Iedereen",
"Are you sure you want to leave the room '%(roomName)s'?": "Weet u zeker dat u de ruimte '%(roomName)s' wil verlaten?",
"Are you sure you want to upload the following files?": "Weet u zeker dat u de volgende bestanden wil uploaden?",
"<a>Click here</a> to join the discussion!": "<a>Klik hier</a> om mee te doen aan de discussie!",
"Close": "Sluiten",
"%(count)s new messages.one": "%(count)s nieuw bericht",
"Create new room": "Een nieuwe kamer maken",
"Custom Server Options": "Aangepaste serverinstellingen",
"Dismiss": "Afwijzen",
"Drop here %(toAction)s": "%(toAction)s hier naartoe verplaatsen",
"Error": "Fout",
"Failed to forget room %(errCode)s": "Kamer vergeten mislukt %(errCode)s",
"Failed to join the room": "Kamer binnengaan mislukt",
"Favourite": "Favoriet",
"Mute": "Dempen",
"Notifications": "Meldingen",
"Operation failed": "Actie mislukt",
"Please Register": "Registreer alstublieft",
"powered by Matrix": "mogelijk gemaakt door Matrix",
"Remove": "Verwijderen",
"Room directory": "Kamerlijst",
"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",
"Welcome page": "Welkomstpagina",
"Search": "Zoeken",
"OK": "OK",
"Failed to change password. Is your password correct?": "Wachtwoord wijzigen mislukt. Is uw wachtwoord juist?",
"disabled": "uitgeschakeld",
"Moderator": "Moderator",
"Must be viewing a room": "Moet een ruimte weergeven",
"my Matrix ID": "mijn Matrix-ID",
"Name": "Naam",
"New password": "Nieuw wachtwoord",
"none": "geen",
"not set": "niet ingesteld",
"not specified": "niet opgegeven",
"(not supported by this browser)": "(niet ondersteund door deze browser)",
"<not supported>": "<niet ondersteund>",
"NOT verified": "NIET geverifieerd",
"No devices with registered encryption keys": "Geen apparaten met geregistreerde sleutels",
"No display name": "Geen weergavenaam",
"No more results": "Geen resultaten meer",
"No results": "Geen resultaten",
"No users have specific privileges in this room": "Geen gebruikers me specifieke privileges in deze kamer",
"olm version:": "olm-versie:",
"Password": "Wachtwoord",
"Password:": "Wachtwoord:",
"Passwords can't be empty": "Wachtwoorden kunnen niet leeg zijn",
"People": "Mensen",
"Permissions": "Toestemmingen",
"Phone": "Telefoonnummer",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s heeft een %(callType)s-gesprek gestart.",
"Press": "Druk",
"Privacy warning": "Privacywaarschuwing",
"Private Chat": "Direct chatten",
"Privileged Users": "Gebruikers met rechten",
"Profile": "Profiel",
"Public Chat": "Publiek gesprek",
"Reason": "Reden",
"Reason: %(reasonText)s": "Reden: %(reasonText)s",
"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 lid wordne",
"Remote addresses for this room:": "Adres op afstand voor deze ruimte:",
"Remove Contact Information?": "Contactinformatie verwijderen?",
"Send Invites": "Uitnodigingen versturen",
"Start a chat": "Gesprek starten",
"Start authentication": "Authenticatie starten",
"Start Chat": "Gesprek starten",
"Submit": "Bevestigen",
"Success": "Gereed",
"tag as %(tagName)s": "Met %(tagName)s labelen",
"tag direct chat": "Privéchat labelen",
"Tagged as: ": "Gelabeld als: ",
"Sun": "Zon",
"Mon": "Maa",
"Tue": "Din",
"Wed": "Woe",
"Thu": "Don",
"Fri": "Vrij",
"Sat": "Zat",
"Jan": "Jan",
"Feb": "Feb",
"Mar": "Maa",
"Apr": "Apr",
"May": "Mei",
"Jun": "Juni",
"Jul": "Juli",
"Aug": "Aug",
"Sep": "Sep",
"Oct": "Okt",
"Nov": "Nov",
"Dec": "Dec",
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s",
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
"Set a display name:": "Weergavenaam instellen:",
"Set a Display Name": "Weergavenaam instellen",
"Upload an avatar:": "Een avatar uploaden:"
} }

View file

@ -806,7 +806,7 @@
"Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)", "Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)",
"Drop file here to upload": "Arraste um arquivo aqui para enviar", "Drop file here to upload": "Arraste um arquivo aqui para enviar",
" (unsupported)": " (não suportado)", " (unsupported)": " (não suportado)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Conferência%(supportedText)s em andamento. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.",
"Online": "Online", "Online": "Online",
"Idle": "Ocioso", "Idle": "Ocioso",
"Offline": "Offline", "Offline": "Offline",
@ -871,5 +871,94 @@
"Tagged as: ": "Marcado como: ", "Tagged as: ": "Marcado como: ",
"You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.", "You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.",
"You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.", "You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.",
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando." "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.",
"You have been banned from %(roomName)s by %(userName)s.": "Você foi expulso(a) da sala %(roomName)s por %(userName)s.",
"Send anyway": "Enviar de qualquer maneira",
"This room": "Esta sala",
"Create new room": "Criar nova sala",
"Click on the button below to start chatting!": "Clique no botão abaixo para começar a conversar!",
"Disable markdown formatting": "Desabilitar formatação MarkDown",
"No display name": "Sem nome público de usuária(o)",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Este será seu nome de conta no Servidor de Base <span></span>, ou então você pode escolher um <a>servidor diferente</a>.",
"Uploading %(filename)s and %(count)s others.one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos",
"Hide removed messages": "Ocultar mensagens removidas",
"You may wish to login with a different account, or add this email to this account.": "Você pode querer fazer login com uma conta diferente, ou adicionar este e-mail a esta conta.",
"Welcome page": "Página de boas vindas",
"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",
"Room contains unknown devices": "Esta sala contém dispositivos desconhecidos",
"Admin tools": "Ferramentas de administração",
"You have been kicked from %(roomName)s by %(userName)s.": "Você foi removido(a) da sala %(roomName)s por %(userName)s.",
"Undecryptable": "Não é possível descriptografar",
"Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida",
"Otherwise, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.",
"To link to a room it must have <a>an address</a>.": "Para produzir um link para uma sala, ela necessita ter <a>um endereço</a>.",
"a room": "uma sala",
"Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.",
"Searching known users": "Buscando pessoas conhecidas",
"Alias (optional)": "Apelido (opcional)",
"Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Não foi possível garantir que o endereço para o qual este convite foi enviado bate com alqum que está associado com sua conta.",
"Error: Problem communicating with the given homeserver.": "Erro: problema de comunicação com o Servidor de Base fornecido.",
"Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!",
"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:",
"Show Text Formatting Toolbar": "Exibir barra de formatação de texto",
"Room directory": "Lista pública de salas",
"Failed to fetch avatar URL": "Falha ao obter a URL da imagem de perfil",
"Incoming call from %(name)s": "Chamada de %(name)s recebida",
"Last seen": "Último uso",
"Drop File Here": "Arraste o arquivo aqui",
"Start Chatting": "Iniciar a conversa",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Você gostaria de <acceptText>aceitar</acceptText> ou <declineText>recusar</declineText> este convite?",
"Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s",
"Verified": "Verificado",
"%(roomName)s does not exist.": "%(roomName)s não existe.",
"Enable Notifications": "Habilitar notificações",
"Username not available": "Nome de usuária(o) indisponível",
"Encrypted by a verified device": "Criptografado por um dispositivo verificado",
"(~%(count)s results).other": "(~%(count)s resultados)",
"unknown caller": "a pessoa que está chamando é desconhecida",
"Start authentication": "Iniciar autenticação",
"(~%(count)s results).one": "(~%(count)s resultado)",
"New Password": "Nova senha",
"Username invalid: %(errMessage)s": "Nome de usuária(o) inválido: %(errMessage)s",
"Disable Notifications": "Desabilitar notificações",
"%(count)s new messages.one": "%(count)s nova mensagem",
"Device Name": "Nome do dispositivo",
"Incoming voice call from %(name)s": "Chamada de voz de %(name)s recebida",
"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",
"Username available": "Nome de usuária(o) disponível",
"Close": "Fechar",
"Level:": "Nível:",
"%(count)s new messages.other": "%(count)s novas mensagens",
"Unverified": "Não verificado",
"<a>Click here</a> to join the discussion!": "<a>Clique aqui</a> para participar da conversa!",
"Decline": "Recusar",
"Custom": "Personalizado",
"Add": "Adicionar",
"%(user)s is a": "%(user)s é um(a)",
"Unnamed Room": "Sala sem nome",
"The phone number entered looks invalid": "O número de telefone inserido parece ser inválido",
"Rejoin": "Voltar a participar da sala",
"Create a new chat or reuse an existing one": "Criar uma nova conversa ou reutilizar alguma já existente",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Reenviar todas</a> ou <a>cancelar todas</a> agora. Você também pode selecionar mensagens individuais que queira reenviar ou cancelar.",
"Reason: %(reasonText)s": "Justificativa: %(reasonText)s",
"Home": "Início",
"Something went wrong!": "Algo deu errado!",
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nível de permissão %(powerLevelNumber)s)",
"Start chat": "Iniciar conversa pessoal",
"You already have existing direct chats with this user:": "Você já tem conversas pessoais com esta pessoa:",
"Accept": "Aceitar",
"%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento."
} }

View file

@ -806,7 +806,7 @@
"Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)", "Enable URL previews for this room (affects only you)": "Habilitar pré-visualizações de links para esta sala (afeta somente a você)",
"Drop file here to upload": "Arraste um arquivo aqui para enviar", "Drop file here to upload": "Arraste um arquivo aqui para enviar",
" (unsupported)": " (não suportado)", " (unsupported)": " (não suportado)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Conferência%(supportedText)s em andamento. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Conferência%(supportedText)s em andamento.",
"Online": "Online", "Online": "Online",
"Idle": "Ocioso", "Idle": "Ocioso",
"Offline": "Offline", "Offline": "Offline",

View file

@ -189,7 +189,7 @@
"Video call": "Видио вызов", "Video call": "Видио вызов",
"Voice call": "Голосовой вызов", "Voice call": "Голосовой вызов",
"VoIP conference finished.": "VoIP конференция закончилась.", "VoIP conference finished.": "VoIP конференция закончилась.",
"VoIP conference started.": "VoIP Конференция началась.", "VoIP conference started.": "VoIP конференция началась.",
"(warning: cannot be disabled again!)": "(предупреждение: не может быть отключено!)", "(warning: cannot be disabled again!)": "(предупреждение: не может быть отключено!)",
"Warning!": "Предупреждение!", "Warning!": "Предупреждение!",
"was banned": "запрещен", "was banned": "запрещен",
@ -227,7 +227,7 @@
"%(senderName)s answered the call.": "%(senderName)s ответил на звонок.", "%(senderName)s answered the call.": "%(senderName)s ответил на звонок.",
"%(senderName)s banned %(targetName)s.": "%(senderName)s запрещенный %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s запрещенный %(targetName)s.",
"Call Timeout": "Время ожидания вызова", "Call Timeout": "Время ожидания вызова",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s их имя измененное с %(oldDisplayName)s на %(displayName)s.", "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s изменено с %(oldDisplayName)s на %(displayName)s.",
"%(senderName)s changed their profile picture.": "%(senderName)s изменил фото профиля.", "%(senderName)s changed their profile picture.": "%(senderName)s изменил фото профиля.",
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s.",
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты изменено на %(roomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты изменено на %(roomName)s.",
@ -362,7 +362,7 @@
"You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.", "You cannot place VoIP calls in this browser.": "Вы не можете сделать вызовы VoIP с этим браузером.",
"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.": "Вы пытаетесь получить доступ %(roomName)s.", "You are trying to access %(roomName)s.": "Вы пытаетесь получить доступ к %(roomName)s.",
"You cannot place a call with yourself.": "Вы не можете позвонить самим себе.", "You cannot place a call with yourself.": "Вы не можете позвонить самим себе.",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отменил %(targetName)s's приглашение.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отменил %(targetName)s's приглашение.",
"Sep": "Сен.", "Sep": "Сен.",
@ -849,7 +849,7 @@
"Enable URL previews for this room (affects only you)": "Включить предпросмотр URL в этой комнате (только для вас)", "Enable URL previews for this room (affects only you)": "Включить предпросмотр URL в этой комнате (только для вас)",
"Drop file here to upload": "Перетащите файл сюда для загрузки", "Drop file here to upload": "Перетащите файл сюда для загрузки",
" (unsupported)": " (не поддерживается)", " (unsupported)": " (не поддерживается)",
"Ongoing conference call%(supportedText)s. %(joinText)s": "Идет конференц-звонок%(supportedText)s. %(joinText)s", "Ongoing conference call%(supportedText)s.": "Идет конференц-звонок%(supportedText)s.",
"for %(amount)ss": "уже %(amount)sс", "for %(amount)ss": "уже %(amount)sс",
"for %(amount)sm": "уже %(amount)sм", "for %(amount)sm": "уже %(amount)sм",
"for %(amount)sh": "уже %(amount)sч", "for %(amount)sh": "уже %(amount)sч",
@ -949,5 +949,10 @@
"You have been banned from %(roomName)s by %(userName)s.": "%(userName) забанил Вас в % (roomName).", "You have been banned from %(roomName)s by %(userName)s.": "%(userName) забанил Вас в % (roomName).",
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName) выгнал Вас из %(roomName).", "You have been kicked from %(roomName)s by %(userName)s.": "%(userName) выгнал Вас из %(roomName).",
"You may wish to login with a different account, or add this email to this account.": "Вы можете войти в систему с другой учетной записью или добавить этот адрес email в эту учетную запись.", "You may wish to login with a different account, or add this email to this account.": "Вы можете войти в систему с другой учетной записью или добавить этот адрес email в эту учетную запись.",
"Your home server does not support device management.": "Ваш домашний сервер не поддерживает управление устройствами." "Your home server does not support device management.": "Ваш домашний сервер не поддерживает управление устройствами.",
"(could not connect media)": "(не удается подключиться к медиа)",
"(no answer)": "(нет ответа)",
"(unknown failure: %(reason)s)": "(неизвестная ошибка: %(reason)s",
"Disable Peer-to-Peer for 1:1 calls": "Отключить Peer-to-Peer для 1:1 звонков",
"Not a valid Riot keyfile": "Не действительный Riot-файл ключа"
} }

View file

@ -289,5 +289,12 @@
"Failed to upload file": "Det gick inte att ladda upp filen", "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", "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",
"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) till..."
} }

View file

@ -352,7 +352,7 @@
"This image cannot be displayed.": "這張圖片無法顯示", "This image cannot be displayed.": "這張圖片無法顯示",
"Error decrypting video": "解密影片出錯", "Error decrypting video": "解密影片出錯",
"Add an Integration": "新增整合器", "Add an Integration": "新增整合器",
"Ongoing conference call%(supportedText)s. %(joinText)s": "%(supportedText)s. %(joinText)s 正在進行電話會議", "Ongoing conference call%(supportedText)s.": "%(supportedText)s. 正在進行電話會議",
" (unsupported)": " (不支持)", " (unsupported)": " (不支持)",
"URL Previews": "網址預覽", "URL Previews": "網址預覽",
"Enable URL previews for this room (affects only you)": "啟用此房間的網址預覽(僅影響您)", "Enable URL previews for this room (affects only you)": "啟用此房間的網址預覽(僅影響您)",

View file

@ -15,6 +15,7 @@ limitations under the License.
*/ */
import Skinner from './Skinner'; import Skinner from './Skinner';
import RtsClient from './RtsClient';
module.exports.loadSkin = function(skinObject) { module.exports.loadSkin = function(skinObject) {
Skinner.load(skinObject); Skinner.load(skinObject);
@ -27,3 +28,7 @@ module.exports.resetSkin = function() {
module.exports.getComponent = function(componentName) { module.exports.getComponent = function(componentName) {
return Skinner.getComponent(componentName); return Skinner.getComponent(componentName);
}; };
module.exports.setFetch = function(fetchFunction) {
RtsClient.setFetch(fetchFunction);
};

View file

@ -18,6 +18,7 @@ limitations under the License.
import request from 'browser-request'; import request from 'browser-request';
import counterpart from 'counterpart'; import counterpart from 'counterpart';
import q from 'q'; import q from 'q';
import React from 'react';
import UserSettingsStore from './UserSettingsStore'; import UserSettingsStore from './UserSettingsStore';
@ -78,7 +79,7 @@ export function _t(...args) {
* with multiple args, each arg representing a captured group of the matching regexp. * with multiple args, each arg representing a captured group of the matching regexp.
* This function must return a JSX node. * This function must return a JSX node.
* *
* @return A list of strings/JSX nodes. * @return a React <span> component containing the generated text
*/ */
export function _tJsx(jsxText, patterns, subs) { export function _tJsx(jsxText, patterns, subs) {
// convert everything to arrays // convert everything to arrays
@ -121,7 +122,10 @@ export function _tJsx(jsxText, patterns, subs) {
output.push(inputText.substr(match.index + match[0].length)); output.push(inputText.substr(match.index + match[0].length));
} }
return output; // this is a bit of a fudge to avoid the 'Each child in an array or iterator
// should have a unique "key" prop' error: we explicitly pass the generated
// nodes into React.createElement as children of a <span>.
return React.createElement('span', null, ...output);
} }
// Allow overriding the text displayed when no translation exists // Allow overriding the text displayed when no translation exists

View file

@ -123,6 +123,7 @@ class RoomViewStore extends Store {
if (payload.room_id) { if (payload.room_id) {
const newState = { const newState = {
roomId: payload.room_id, roomId: payload.room_id,
roomAlias: payload.room_alias,
initialEventId: payload.event_id, initialEventId: payload.event_id,
initialEventPixelOffset: undefined, initialEventPixelOffset: undefined,
isInitialEventHighlighted: payload.highlighted, isInitialEventHighlighted: payload.highlighted,

View file

@ -0,0 +1,55 @@
/*
Copyright 2017 Vector Creations 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 Matrix from 'matrix-js-sdk';
const localStorage = window.localStorage;
/**
* Create a new matrix client, with the persistent stores set up appropriately
* (using localstorage/indexeddb, etc)
*
* @param {Object} opts options to pass to Matrix.createClient. This will be
* extended with `sessionStore` and `store` members.
*
* @param {string} indexedDbWorkerScript Optional URL for a web worker script
* for IndexedDB store operations. If not given, indexeddb ops are done on
* the main thread.
*
* @returns {MatrixClient} the newly-created MatrixClient
*/
export default function createMatrixClient(opts, indexedDbWorkerScript) {
const storeOpts = {};
if (localStorage) {
storeOpts.sessionStore = new Matrix.WebStorageSessionStore(localStorage);
}
if (window.indexedDB && localStorage) {
// FIXME: bodge to remove old database. Remove this after a few weeks.
window.indexedDB.deleteDatabase("matrix-js-sdk:default");
storeOpts.store = new Matrix.IndexedDBStore({
indexedDB: window.indexedDB,
dbName: "riot-web-sync",
localStorage: localStorage,
workerScript: indexedDbWorkerScript,
});
}
opts = Object.assign(storeOpts, opts);
return Matrix.createClient(opts);
}