Merge branch 'develop' into luke/feature-sticky-date-separators

This commit is contained in:
Luke Barnard 2017-08-30 14:06:06 +01:00
commit a29e7da06b
45 changed files with 735 additions and 249 deletions

View file

@ -6,7 +6,6 @@ src/autocomplete/Autocompleter.js
src/autocomplete/Components.js
src/autocomplete/DuckDuckGoProvider.js
src/autocomplete/EmojiProvider.js
src/autocomplete/RoomProvider.js
src/autocomplete/UserProvider.js
src/CallHandler.js
src/component-index.js
@ -35,7 +34,6 @@ src/components/views/create_room/RoomAlias.js
src/components/views/dialogs/ChatCreateOrReuseDialog.js
src/components/views/dialogs/DeactivateAccountDialog.js
src/components/views/dialogs/InteractiveAuthDialog.js
src/components/views/dialogs/SetMxIdDialog.js
src/components/views/dialogs/UnknownDeviceDialog.js
src/components/views/elements/AccessibleButton.js
src/components/views/elements/ActionButton.js
@ -89,7 +87,6 @@ src/components/views/rooms/MemberList.js
src/components/views/rooms/MemberTile.js
src/components/views/rooms/MessageComposer.js
src/components/views/rooms/MessageComposerInput.js
src/components/views/rooms/MessageComposerInputOld.js
src/components/views/rooms/PresenceLabel.js
src/components/views/rooms/ReadReceiptMarker.js
src/components/views/rooms/RoomList.js
@ -100,7 +97,6 @@ src/components/views/rooms/RoomTile.js
src/components/views/rooms/RoomTopicEditor.js
src/components/views/rooms/SearchableEntityList.js
src/components/views/rooms/SearchResultTile.js
src/components/views/rooms/TabCompleteBar.js
src/components/views/rooms/TopUnreadMessagesBar.js
src/components/views/rooms/UserTile.js
src/components/views/settings/AddPhoneNumber.js
@ -128,8 +124,6 @@ src/Roles.js
src/Rooms.js
src/ScalarAuthClient.js
src/ScalarMessaging.js
src/TabComplete.js
src/TabCompleteEntries.js
src/TextForEvent.js
src/Tinter.js
src/UiEffects.js
@ -142,7 +136,7 @@ src/utils/Receipt.js
src/Velociraptor.js
src/VelocityBounce.js
src/WhoIsTyping.js
src/wrappers/WithMatrixClient.js
src/wrappers/withMatrixClient.js
test/all-tests.js
test/components/structures/login/Registration-test.js
test/components/structures/MessagePanel-test.js

View file

@ -1,3 +1,76 @@
Changes in [0.10.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.2) (2017-08-24)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.1...v0.10.2)
* Force update on timelinepanel when event decrypted
[\#1334](https://github.com/matrix-org/matrix-react-sdk/pull/1334)
* Dispatch incoming_call synchronously
[\#1337](https://github.com/matrix-org/matrix-react-sdk/pull/1337)
* Fix React crying on machines without internet due to return undefined
[\#1335](https://github.com/matrix-org/matrix-react-sdk/pull/1335)
* Catch the promise rejection if scalar fails
[\#1333](https://github.com/matrix-org/matrix-react-sdk/pull/1333)
* Update from Weblate.
[\#1329](https://github.com/matrix-org/matrix-react-sdk/pull/1329)
Changes in [0.10.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.1) (2017-08-23)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.1-rc.1...v0.10.1)
* [No changes]
Changes in [0.10.1-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.10.1-rc.1) (2017-08-22)
===============================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.10.0-rc.2...v0.10.1-rc.1)
* Matthew/multiple widgets
[\#1327](https://github.com/matrix-org/matrix-react-sdk/pull/1327)
* Fix proptypes on UserPickerDialog
[\#1326](https://github.com/matrix-org/matrix-react-sdk/pull/1326)
* AppsDrawer: Remove unnecessary bind
[\#1325](https://github.com/matrix-org/matrix-react-sdk/pull/1325)
* Position add app widget link
[\#1322](https://github.com/matrix-org/matrix-react-sdk/pull/1322)
* Remove app tile beta tag.
[\#1323](https://github.com/matrix-org/matrix-react-sdk/pull/1323)
* Add missing translation.
[\#1324](https://github.com/matrix-org/matrix-react-sdk/pull/1324)
* Note that apps are not E2EE
[\#1319](https://github.com/matrix-org/matrix-react-sdk/pull/1319)
* Only render appTile body (including warnings) if drawer shown.
[\#1321](https://github.com/matrix-org/matrix-react-sdk/pull/1321)
* Timeline improvements
[\#1320](https://github.com/matrix-org/matrix-react-sdk/pull/1320)
* Add a space between widget name and "widget" in widget event tiles
[\#1318](https://github.com/matrix-org/matrix-react-sdk/pull/1318)
* Move manage integrations button from settings page to room header as a
stand-alone component
[\#1286](https://github.com/matrix-org/matrix-react-sdk/pull/1286)
* Don't apply case logic to app names
[\#1316](https://github.com/matrix-org/matrix-react-sdk/pull/1316)
* Stop integ manager opening on every room switch
[\#1315](https://github.com/matrix-org/matrix-react-sdk/pull/1315)
* Add behaviour to toggle app draw on app tile header click
[\#1313](https://github.com/matrix-org/matrix-react-sdk/pull/1313)
* Change OOO so that MELS generation will continue over hidden events
[\#1308](https://github.com/matrix-org/matrix-react-sdk/pull/1308)
* Implement TextualEvent tiles for im.vector.modular.widgets
[\#1312](https://github.com/matrix-org/matrix-react-sdk/pull/1312)
* Don't show widget security warning to the person that added it to the room
[\#1314](https://github.com/matrix-org/matrix-react-sdk/pull/1314)
* remove unused strings introduced by string change
[\#1311](https://github.com/matrix-org/matrix-react-sdk/pull/1311)
* hotfix bad fn signature regression
[\#1310](https://github.com/matrix-org/matrix-react-sdk/pull/1310)
* Show a dialog if the maximum number of widgets allowed has been reached.
[\#1291](https://github.com/matrix-org/matrix-react-sdk/pull/1291)
* Fix Robot translation
[\#1309](https://github.com/matrix-org/matrix-react-sdk/pull/1309)
* Refactor ChatInviteDialog to be UserPickerDialog
[\#1300](https://github.com/matrix-org/matrix-react-sdk/pull/1300)
* Update Link to Translation status
[\#1302](https://github.com/matrix-org/matrix-react-sdk/pull/1302)
Changes in [0.9.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.7) (2017-06-22)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.6...v0.9.7)

View file

@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
"version": "0.9.7",
"version": "0.10.2",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@ -66,7 +66,7 @@
"isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3",
"lodash": "^4.13.1",
"matrix-js-sdk": "matrix-org/matrix-js-sdk#develop",
"matrix-js-sdk": "0.8.2",
"optimist": "^0.6.1",
"prop-types": "^15.5.8",
"react": "^15.4.0",

View file

@ -1,6 +1,7 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -33,9 +34,16 @@ import Modal from './Modal';
* }
*/
const MAX_PENDING_ENCRYPTED = 20;
const Notifier = {
notifsByRoom: {},
// A list of event IDs that we've received but need to wait until
// they're decrypted until we decide whether to notify for them
// or not
pendingEncryptedEventIds: [],
notificationMessageForEvent: function(ev) {
return TextForEvent.textForEvent(ev);
},
@ -89,17 +97,18 @@ const Notifier = {
_playAudioNotification: function(ev, room) {
const e = document.getElementById("messageAudio");
if (e) {
e.load();
e.play();
}
},
start: function() {
this.boundOnRoomTimeline = this.onRoomTimeline.bind(this);
this.boundOnEvent = this.onEvent.bind(this);
this.boundOnSyncStateChange = this.onSyncStateChange.bind(this);
this.boundOnRoomReceipt = this.onRoomReceipt.bind(this);
MatrixClientPeg.get().on('Room.timeline', this.boundOnRoomTimeline);
this.boundOnEventDecrypted = this.onEventDecrypted.bind(this);
MatrixClientPeg.get().on('event', this.boundOnEvent);
MatrixClientPeg.get().on('Room.receipt', this.boundOnRoomReceipt);
MatrixClientPeg.get().on('Event.decrypted', this.boundOnEventDecrypted);
MatrixClientPeg.get().on("sync", this.boundOnSyncStateChange);
this.toolbarHidden = false;
this.isSyncing = false;
@ -107,8 +116,9 @@ const Notifier = {
stop: function() {
if (MatrixClientPeg.get() && this.boundOnRoomTimeline) {
MatrixClientPeg.get().removeListener('Room.timeline', this.boundOnRoomTimeline);
MatrixClientPeg.get().removeListener('Event', this.boundOnEvent);
MatrixClientPeg.get().removeListener('Room.receipt', this.boundOnRoomReceipt);
MatrixClientPeg.get().removeListener('Event.decrypted', this.boundOnEventDecrypted);
MatrixClientPeg.get().removeListener('sync', this.boundOnSyncStateChange);
}
this.isSyncing = false;
@ -237,23 +247,30 @@ const Notifier = {
}
},
onRoomTimeline: function(ev, room, toStartOfTimeline, removed, data) {
if (toStartOfTimeline) return;
if (!room) return;
onEvent: function(ev) {
if (!this.isSyncing) return; // don't alert for any messages initially
if (ev.sender && ev.sender.userId === MatrixClientPeg.get().credentials.userId) return;
if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;
const actions = MatrixClientPeg.get().getPushActionsForEvent(ev);
if (actions && actions.notify) {
if (this.isEnabled()) {
this._displayPopupNotification(ev, room);
}
if (actions.tweaks.sound && this.isAudioEnabled()) {
PlatformPeg.get().loudNotification(ev, room);
this._playAudioNotification(ev, room);
// If it's an encrypted event and the type is still 'm.room.encrypted',
// it hasn't yet been decrypted, so wait until it is.
if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) {
this.pendingEncryptedEventIds.push(ev.getId());
// don't let the list fill up indefinitely
while (this.pendingEncryptedEventIds.length > MAX_PENDING_ENCRYPTED) {
this.pendingEncryptedEventIds.shift();
}
return;
}
this._evaluateEvent(ev);
},
onEventDecrypted: function(ev) {
const idx = this.pendingEncryptedEventIds.indexOf(ev.getId());
if (idx === -1) return;
this.pendingEncryptedEventIds.splice(idx, 1);
this._evaluateEvent(ev);
},
onRoomReceipt: function(ev, room) {
@ -273,6 +290,20 @@ const Notifier = {
delete this.notifsByRoom[room.roomId];
}
},
_evaluateEvent: function(ev) {
const room = MatrixClientPeg.get().getRoom(ev.getRoomId());
const actions = MatrixClientPeg.get().getPushActionsForEvent(ev);
if (actions && actions.notify) {
if (this.isEnabled()) {
this._displayPopupNotification(ev, room);
}
if (actions.tweaks.sound && this.isAudioEnabled()) {
PlatformPeg.get().loudNotification(ev, room);
this._playAudioNotification(ev, room);
}
}
}
};
if (!global.mxNotifier) {

View file

@ -76,10 +76,13 @@ class ScalarAuthClient {
return defer.promise;
}
getScalarInterfaceUrlForRoom(roomId, screen) {
getScalarInterfaceUrlForRoom(roomId, screen, id) {
var url = SdkConfig.get().integrations_ui_url;
url += "?scalar_token=" + encodeURIComponent(this.scalarToken);
url += "&room_id=" + encodeURIComponent(roomId);
if (id) {
url += '&integ_id=' + encodeURIComponent(id);
}
if (screen) {
url += '&screen=' + encodeURIComponent(screen);
}

View file

@ -244,26 +244,36 @@ function textForPowerEvent(event) {
}
return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', {
senderName: senderName,
powerLevelDiffText: diff.join(", ")
powerLevelDiffText: diff.join(", "),
});
}
function textForWidgetEvent(event) {
const senderName = event.sender ? event.sender.name : event.getSender();
const previousContent = event.getPrevContent() || {};
const senderName = event.getSender();
const {name: prevName, type: prevType, url: prevUrl} = event.getPrevContent();
const {name, type, url} = event.getContent() || {};
let widgetName = widgetName || name || type || previousContent.type;
widgetName = widgetName ? widgetName + ' ' : '';
let widgetName = name || prevName || type || prevType || '';
// Apply sentence case to widget name
if (widgetName && widgetName.length > 0) {
widgetName = widgetName[0].toUpperCase() + widgetName.slice(1) + ' ';
}
// If the widget was removed, its content should be {}, but this is sufficiently
// equivalent to that condition.
if (url) {
return _t('%(senderName)s added a %(widgetName)swidget', {
senderName, widgetName,
});
if (prevUrl) {
return _t('%(widgetName)s widget modified by %(senderName)s', {
widgetName, senderName,
});
} else {
return _t('%(widgetName)s widget added by %(senderName)s', {
widgetName, senderName,
});
}
} else {
return _t('%(senderName)s removed a %(widgetName)swidget', {
senderName, widgetName,
return _t('%(widgetName)s widget removed by %(senderName)s', {
widgetName, senderName,
});
}
}

View file

@ -1068,10 +1068,13 @@ module.exports = React.createClass({
self.setState({ready: true});
});
cli.on('Call.incoming', function(call) {
// we dispatch this synchronously to make sure that the event
// handlers on the call are set up immediately (so that if
// we get an immediate hangup, we don't get a stuck call)
dis.dispatch({
action: 'incoming_call',
call: call,
});
}, true);
});
cli.on('Session.logged_out', function(call) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");

View file

@ -62,7 +62,7 @@ module.exports = React.createClass({
ourUserId: React.PropTypes.string,
// whether to show read receipts
manageReadReceipts: React.PropTypes.bool,
showReadReceipts: React.PropTypes.bool,
// true if updates to the event list should cause the scroll panel to
// scroll down when we are at the bottom of the window. See ScrollPanel
@ -488,7 +488,7 @@ module.exports = React.createClass({
var scrollToken = mxEv.status ? undefined : eventId;
var readReceipts;
if (this.props.manageReadReceipts) {
if (this.props.showReadReceipts) {
readReceipts = this._getReadReceiptsForEvent(mxEv);
}
ret.push(

View file

@ -20,6 +20,8 @@ limitations under the License.
// - Drag and drop
// - File uploading - uploadFile()
import shouldHideEvent from "../../shouldHideEvent";
var React = require("react");
var ReactDOM = require("react-dom");
import Promise from 'bluebird';
@ -143,6 +145,8 @@ module.exports = React.createClass({
MatrixClientPeg.get().on("RoomMember.membership", this.onRoomMemberMembership);
MatrixClientPeg.get().on("accountData", this.onAccountData);
this._syncedSettings = UserSettingsStore.getSyncedSettings();
// Start listening for RoomViewStore updates
this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate);
this._onRoomViewStoreUpdate(true);
@ -497,8 +501,7 @@ module.exports = React.createClass({
// update unread count when scrolled up
if (!this.state.searchResults && this.state.atEndOfLiveTimeline) {
// no change
}
else {
} else if (!shouldHideEvent(ev, this._syncedSettings)) {
this.setState((state, props) => {
return {numUnreadMessages: state.numUnreadMessages + 1};
});
@ -1716,7 +1719,8 @@ module.exports = React.createClass({
var messagePanel = (
<TimelinePanel ref={this._gatherTimelinePanelRef}
timelineSet={this.state.room.getUnfilteredTimelineSet()}
manageReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)}
showReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)}
manageReadReceipts={true}
manageReadMarkers={true}
hidden={hideMessagePanel}
highlightedEventId={highlightedEventId}

View file

@ -59,6 +59,7 @@ var TimelinePanel = React.createClass({
// that room.
timelineSet: React.PropTypes.object.isRequired,
showReadReceipts: React.PropTypes.bool,
// Enable managing RRs and RMs. These require the timelineSet to have a room.
manageReadReceipts: React.PropTypes.bool,
manageReadMarkers: React.PropTypes.bool,
@ -197,6 +198,7 @@ var TimelinePanel = React.createClass({
MatrixClientPeg.get().on("Room.receipt", this.onRoomReceipt);
MatrixClientPeg.get().on("Room.localEchoUpdated", this.onLocalEchoUpdated);
MatrixClientPeg.get().on("Room.accountData", this.onAccountData);
MatrixClientPeg.get().on("Event.decrypted", this.onEventDecrypted);
MatrixClientPeg.get().on("sync", this.onSync);
this._initTimeline(this.props);
@ -266,6 +268,7 @@ var TimelinePanel = React.createClass({
client.removeListener("Room.receipt", this.onRoomReceipt);
client.removeListener("Room.localEchoUpdated", this.onLocalEchoUpdated);
client.removeListener("Room.accountData", this.onAccountData);
client.removeListener("Event.decrypted", this.onEventDecrypted);
client.removeListener("sync", this.onSync);
}
},
@ -503,6 +506,18 @@ var TimelinePanel = React.createClass({
}, this.props.onReadMarkerUpdated);
},
onEventDecrypted: function(ev) {
// Need to update as we don't display event tiles for events that
// haven't yet been decrypted. The event will have just been updated
// in place so we just need to re-render.
// TODO: We should restrict this to only events in our timeline,
// but possibly the event tile itself should just update when this
// happens to save us re-rendering the whole timeline.
if (ev.getRoomId() === this.props.timelineSet.room.roomId) {
this.forceUpdate();
}
},
onSync: function(state, prevState, data) {
this.setState({clientSyncState: state});
},
@ -1125,8 +1140,8 @@ var TimelinePanel = React.createClass({
highlightedEventId={ this.props.highlightedEventId }
readMarkerEventId={ this.state.readMarkerEventId }
readMarkerVisible={ this.state.readMarkerVisible }
showUrlPreview = { this.props.showUrlPreview }
manageReadReceipts = { this.props.manageReadReceipts }
showUrlPreview={ this.props.showUrlPreview }
showReadReceipts={ this.props.showReadReceipts }
ourUserId={ MatrixClientPeg.get().credentials.userId }
stickyBottom={ stickyBottom }
onScroll={ this.onMessageListScroll }

View file

@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -136,16 +137,15 @@ module.exports = React.createClass({
});
},
onHsUrlChanged: function(newHsUrl) {
this.setState({
enteredHomeserverUrl: newHsUrl
});
},
onIsUrlChanged: function(newIsUrl) {
this.setState({
enteredIdentityServerUrl: newIsUrl
});
onServerConfigChange: function(config) {
const newState = {};
if (config.hsUrl !== undefined) {
newState.enteredHomeserverUrl = config.hsUrl;
}
if (config.isUrl !== undefined) {
newState.enteredIdentityServerUrl = config.isUrl;
}
this.setState(newState);
},
showErrorDialog: function(body, title) {
@ -170,7 +170,7 @@ module.exports = React.createClass({
else if (this.state.progress === "sent_email") {
resetPasswordJsx = (
<div>
{ _t('An email has been sent to') } {this.state.email}. { _t('Once you&#39;ve followed the link it contains, click below') }.
{ _t('An email has been sent to') } {this.state.email}. { _t("Once you've followed the link it contains, click below") }.
<br />
<input className="mx_Login_submit" type="button" onClick={this.onVerify}
value={ _t('I have verified my email address') } />
@ -221,8 +221,7 @@ module.exports = React.createClass({
defaultIsUrl={this.props.defaultIsUrl}
customHsUrl={this.props.customHsUrl}
customIsUrl={this.props.customIsUrl}
onHsUrlChanged={this.onHsUrlChanged}
onIsUrlChanged={this.onIsUrlChanged}
onServerConfigChange={this.onServerConfigChange}
delayTimeMs={0}/>
<div className="mx_Login_error">
</div>

View file

@ -38,7 +38,7 @@ module.exports = React.createClass({
roomId: PropTypes.string,
button: PropTypes.string,
focus: PropTypes.bool,
validAddressTypes: PropTypes.arrayOf(PropTypes.oneOfType(addressTypes)),
validAddressTypes: PropTypes.arrayOf(PropTypes.oneOf(addressTypes)),
onFinished: PropTypes.func.isRequired,
},

View file

@ -47,13 +47,19 @@ export default class AppPermission extends React.Component {
}
render() {
let e2eWarningText;
if (this.props.isRoomEncrypted) {
e2eWarningText =
<span className='mx_AppPermissionWarningTextLabel'>{_t('NOTE: Apps are not end-to-end encrypted')}</span>;
}
return (
<div className='mx_AppPermissionWarning'>
<div className='mx_AppPermissionWarningImage'>
<img src='img/warning.svg' alt={_t('Warning!')}/>
</div>
<div className='mx_AppPermissionWarningText'>
<span className='mx_AppPermissionWarningTextLabel'>Do you want to load widget from URL:</span> <span className='mx_AppPermissionWarningTextURL'>{this.state.curlBase}</span>
<span className='mx_AppPermissionWarningTextLabel'>{_t('Do you want to load widget from URL:')}</span> <span className='mx_AppPermissionWarningTextURL'>{this.state.curlBase}</span>
{e2eWarningText}
</div>
<input
className='mx_AppPermissionButton'
@ -67,9 +73,11 @@ export default class AppPermission extends React.Component {
}
AppPermission.propTypes = {
isRoomEncrypted: PropTypes.bool,
url: PropTypes.string.isRequired,
onPermissionGranted: PropTypes.func.isRequired,
};
AppPermission.defaultProps = {
isRoomEncrypted: false,
onPermissionGranted: function() {},
};

View file

@ -31,7 +31,6 @@ import WidgetUtils from '../../../WidgetUtils';
import dis from '../../../dispatcher';
const ALLOWED_APP_URL_SCHEMES = ['https:', 'http:'];
const betaHelpMsg = 'This feature is currently experimental and is intended for beta testing only';
export default React.createClass({
displayName: 'AppTile',
@ -73,8 +72,17 @@ export default React.createClass({
// Returns true if props.url is a scalar URL, typically https://scalar.vector.im/api
isScalarUrl: function() {
const scalarUrl = SdkConfig.get().integrations_rest_url;
return scalarUrl && this.props.url.startsWith(scalarUrl);
let scalarUrls = SdkConfig.get().integrations_widgets_urls;
if (!scalarUrls || scalarUrls.length == 0) {
scalarUrls = [SdkConfig.get().integrations_rest_url];
}
for (let i = 0; i < scalarUrls.length; i++) {
if (this.props.url.startsWith(scalarUrls[i])) {
return true;
}
}
return false;
},
isMixedContent: function() {
@ -128,7 +136,8 @@ export default React.createClass({
_onEditClick: function(e) {
console.log("Edit widget ID ", this.props.id);
const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
const src = this._scalarClient.getScalarInterfaceUrlForRoom(this.props.room.roomId, 'type_' + this.props.type);
const src = this._scalarClient.getScalarInterfaceUrlForRoom(
this.props.room.roomId, 'type_' + this.props.type, this.props.id);
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
src: src,
}, "mx_IntegrationsManager");
@ -223,42 +232,46 @@ export default React.createClass({
safeWidgetUrl = url.format(parsedWidgetUrl);
}
if (this.state.loading) {
appTileBody = (
<div className='mx_AppTileBody mx_AppLoading'>
<MessageSpinner msg='Loading...'/>
</div>
);
} else if (this.state.hasPermissionToLoad == true) {
if (this.isMixedContent()) {
if (this.props.show) {
if (this.state.loading) {
appTileBody = (
<div className='mx_AppTileBody mx_AppLoading'>
<MessageSpinner msg='Loading...'/>
</div>
);
} else if (this.state.hasPermissionToLoad == true) {
if (this.isMixedContent()) {
appTileBody = (
<div className="mx_AppTileBody">
<AppWarning
errorMsg="Error - Mixed content"
/>
</div>
);
} else {
appTileBody = (
<div className="mx_AppTileBody">
<iframe
ref="appFrame"
src={safeWidgetUrl}
allowFullScreen="true"
sandbox={sandboxFlags}
></iframe>
</div>
);
}
} else {
const isRoomEncrypted = MatrixClientPeg.get().isRoomEncrypted(this.props.room.roomId);
appTileBody = (
<div className="mx_AppTileBody">
<AppWarning
errorMsg="Error - Mixed content"
<AppPermission
isRoomEncrypted={isRoomEncrypted}
url={this.state.widgetUrl}
onPermissionGranted={this._grantWidgetPermission}
/>
</div>
);
} else if (this.props.show) {
appTileBody = (
<div className="mx_AppTileBody">
<iframe
ref="appFrame"
src={safeWidgetUrl}
allowFullScreen="true"
sandbox={sandboxFlags}
></iframe>
</div>
);
}
} else {
appTileBody = (
<div className="mx_AppTileBody">
<AppPermission
url={this.state.widgetUrl}
onPermissionGranted={this._grantWidgetPermission}
/>
</div>
);
}
// editing is done in scalar
@ -276,7 +289,6 @@ export default React.createClass({
<div ref="menu_bar" className="mx_AppTileMenuBar" onClick={this.onClickMenuBar}>
{this.formatAppTileName()}
<span className="mx_AppTileMenuBarWidgets">
<span className="mx_Beta" alt={betaHelpMsg} title={betaHelpMsg}>&#946;</span>
{/* Edit widget */}
{showEditButton && <img
src="img/edit.svg"

View file

@ -75,7 +75,7 @@ export default class ManageIntegsButton extends React.Component {
}
render() {
let integrationsButton;
let integrationsButton = <div />;
let integrationsError;
if (this.scalarClient !== null) {
if (this.state.showIntegrationsError && this.state.scalarError) {

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict';
import React from 'react';
import ReactDOM from 'react-dom';
import { _t, _tJsx } from '../../../languageHandler';
var DIV_ID = 'mx_recaptcha';
@ -66,11 +67,10 @@ module.exports = React.createClass({
// * jumping straight to a hosted captcha page (but we don't support that yet)
// * embedding the captcha in an iframe (if that works)
// * using a better captcha lib
warning.innerHTML = _tJsx(
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>",
/<a>(.*?)<\/a>/,
(sub) => { return "<a href='https://riot.im/app'>{ sub }</a>"; }
);
ReactDOM.render(_tJsx(
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>",
/<a>(.*?)<\/a>/,
(sub) => { return <a href='https://riot.im/app'>{ sub }</a>; }), warning);
this.refs.recaptchaContainer.appendChild(warning);
}
else {

View file

@ -53,18 +53,18 @@ module.exports = React.createClass({
this.scalarClient = null;
if (SdkConfig.get().integrations_ui_url && SdkConfig.get().integrations_rest_url) {
this.scalarClient = new ScalarAuthClient();
this.scalarClient.connect().done(() => {
this.scalarClient.connect().then(() => {
this.forceUpdate();
// TODO -- Handle Scalar errors
// },
// (err) => {
// this.setState({
// scalar_error: err,
// });
}).catch((e) => {
console.log("Failed to connect to integrations server");
// TODO -- Handle Scalar errors
// this.setState({
// scalar_error: err,
// });
});
}
this.dispatcherRef = dis.register(this.onAction.bind(this));
this.dispatcherRef = dis.register(this.onAction);
},
componentWillUnmount: function() {
@ -226,7 +226,10 @@ module.exports = React.createClass({
onClick={this.onClickAddWidget}
role="button"
tabIndex="0"
className="mx_AddWidget_button"
className={this.state.apps.length<2 ?
"mx_AddWidget_button mx_AddWidget_button_full_width" :
"mx_AddWidget_button"
}
title={_t('Add a widget')}>
[+] {_t('Add a widget')}
</div>;

View file

@ -143,7 +143,6 @@ export default class Autocomplete extends React.Component {
return null;
}
this.setSelection(selectionOffset);
return selectionOffset === COMPOSER_SELECTED ? null : this.state.completionList[selectionOffset - 1];
}
// called from MessageComposerInput
@ -155,7 +154,6 @@ export default class Autocomplete extends React.Component {
return null;
}
this.setSelection(selectionOffset);
return selectionOffset === COMPOSER_SELECTED ? null : this.state.completionList[selectionOffset - 1];
}
onEscape(e): boolean {
@ -201,6 +199,9 @@ export default class Autocomplete extends React.Component {
setSelection(selectionOffset: number) {
this.setState({selectionOffset, hide: false});
if (this.props.onSelectionChange) {
this.props.onSelectionChange(this.state.completionList[selectionOffset - 1]);
}
}
componentDidUpdate() {

View file

@ -139,7 +139,7 @@ module.exports = React.createClass({
}
return (
<div className={ appsDrawer ? "mx_RoomView_auxPanel mx_RoomView_auxPanel_apps" : "mx_RoomView_auxPanel" } style={{maxHeight: this.props.maxHeight}} >
<div className="mx_RoomView_auxPanel" style={{maxHeight: this.props.maxHeight}} >
{ appsDrawer }
{ fileDropTarget }
{ callView }

View file

@ -949,8 +949,7 @@ export default class MessageComposerInput extends React.Component {
};
moveAutocompleteSelection = (up) => {
const completion = up ? this.autocomplete.onUpArrow() : this.autocomplete.onDownArrow();
return this.setDisplayedCompletion(completion);
up ? this.autocomplete.onUpArrow() : this.autocomplete.onDownArrow();
};
onEscape = async (e) => {
@ -1133,6 +1132,7 @@ export default class MessageComposerInput extends React.Component {
<Autocomplete
ref={(e) => this.autocomplete = e}
onConfirm={this.setDisplayedCompletion}
onSelectionChange={this.setDisplayedCompletion}
query={this.getAutocompleteQuery(content)}
selection={selection}/>
</div>

View file

@ -123,7 +123,19 @@ module.exports = React.createClass({
}
var newElement = ReactDOM.findDOMNode(this);
var startTopOffset = oldTop - newElement.offsetParent.getBoundingClientRect().top;
let startTopOffset;
if (!newElement.offsetParent) {
// this seems to happen sometimes for reasons I don't understand
// the docs for `offsetParent` say it may be null if `display` is
// `none`, but I can't see why that would happen.
console.warn(
`ReadReceiptMarker for ${this.props.member.userId} in ` +
`${this.props.member.roomId} has no offsetParent`,
);
startTopOffset = 0;
} else {
startTopOffset = oldTop - newElement.offsetParent.getBoundingClientRect().top;
}
var startStyles = [];
var enterTransitionOpts = [];
@ -131,13 +143,12 @@ module.exports = React.createClass({
if (oldInfo && oldInfo.left) {
// start at the old height and in the old h pos
var leftOffset = oldInfo.left;
startStyles.push({ top: startTopOffset+"px",
left: oldInfo.left+"px" });
var reorderTransitionOpts = {
duration: 100,
easing: 'easeOut'
easing: 'easeOut',
};
enterTransitionOpts.push(reorderTransitionOpts);
@ -175,7 +186,7 @@ module.exports = React.createClass({
if (this.props.timestamp) {
title = _t(
"Seen by %(userName)s at %(dateTime)s",
{userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp), this.props.showTwelveHour)}
{userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp), this.props.showTwelveHour)},
);
}

View file

@ -555,6 +555,7 @@ module.exports = React.createClass({
label={ _t('Invites') }
editable={ false }
order="recent"
isInvite={true}
selectedRoom={ self.props.selectedRoom }
incomingCall={ self.state.incomingCall }
collapsed={ self.props.collapsed }

55
src/i18n/strings/cs.json Normal file
View file

@ -0,0 +1,55 @@
{
"Close": "Zavřít",
"Favourites": "Oblíbené",
"Filter room members": "Filtrovat členy místnosti",
"Historical": "Historické",
"Home": "Úvod",
"%(displayName)s is typing": "%(displayName)s právě píše",
"Jump to first unread message.": "Přeskočit na první nepřečtenou zprávu.",
"Logout": "Odhlásit se",
"Low priority": "Nízká priorita",
"Notifications": "Upozornění",
"People": "Lidé",
"Rooms": "Místnosti",
"Scroll to unread messages": "Přejít k nepřečteným zprávám",
"Search": "Hledání",
"Send a message (unencrypted)": "Poslat zprávu (nezašifrovaně)",
"Settings": "Nastavení",
"Start Chat": "Začít chat",
"This room": "Tato místnost",
"Unencrypted room": "Nezašifrovaná místnost",
"Failed to upload file": "Nahrát soubor",
"Video call": "Videohovor",
"Voice call": "Telefonát",
"Sun": "Ne",
"Mon": "Po",
"Tue": "Út",
"Wed": "St",
"Thu": "Čt",
"Fri": "Pá",
"Sat": "So",
"Jan": "Led",
"Feb": "Úno",
"Mar": "Bře",
"Apr": "Dub",
"May": "Kvě",
"Jun": "Čvn",
"Jul": "Čvc",
"Aug": "Srp",
"Sep": "Zář",
"Oct": "Říj",
"Nov": "Lis",
"Dec": "Pro",
"There are no visible files in this room": "V této místnosti nejsou žádné viditelné soubory",
"Create new room": "Založit novou místnost",
"Room directory": "Adresář místností",
"Start chat": "Začít chat",
"Options": "Možnosti",
"Register": "Zaregistrovat",
"Cancel": "Storno",
"Direct Chat": "Přímý chat",
"Error": "Chyba",
"Failed to join the room": "Nepodařilo se vstoupit do místnosti",
"Favourite": "V oblíbených",
"Mute": "Ztišit"
}

View file

@ -179,7 +179,7 @@
"Profile": "Profil",
"Refer a friend to Riot:": "Freunde zu Riot einladen:",
"rejected": "abgelehnt",
"Once you&#39;ve followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten",
"Once you've followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten",
"rejected the invitation.": "lehnte die Einladung ab.",
"Reject invitation": "Einladung ablehnen",
"Remove Contact Information?": "Kontakt-Informationen entfernen?",
@ -651,7 +651,7 @@
"%(items)s and %(remaining)s others": "%(items)s und %(remaining)s weitere",
"%(items)s and one other": "%(items)s und ein(e) weitere(r)",
"%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s sind dem Raum %(repeats)s mal beigetreten",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)ssind dem Raum %(repeats)s mal beigetreten",
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)shat den Raum %(repeats)s mal betreten",
"%(severalUsers)sjoined": "%(severalUsers)shaben den Raum betreten",
"%(oneUser)sjoined": "%(oneUser)shat den Raum betreten",
@ -905,7 +905,7 @@
"Something went wrong!": "Etwas ging schief!",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Dies wird dein zukünftiger Benutzername auf dem <span></span> Heimserver. Alternativ kannst du auch einen <a>anderen Server</a> auswählen.",
"If you already have a Matrix account you can <a>log in</a> instead.": "Wenn du bereits ein Matrix-Benutzerkonto hast, kannst du dich stattdessen auch direkt <a>anmelden</a>.",
"Home": "Start",
"Home": "Startseite",
"Username invalid: %(errMessage)s": "Ungültiger Benutzername: %(errMessage)s",
"a room": "einen Raum",
"Accept": "Akzeptieren",
@ -986,5 +986,53 @@
"Encryption key request": "Verschlüsselungs-Schlüssel-Anfrage",
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Dein nicht verifiziertes Gerät '%(displayName)s' fordert Verschlüsselungs-Schlüssel an.",
"Updates": "Updates",
"Check for update": "Suche nach Updates"
"Check for update": "Suche nach Updates",
"Add a widget": "Widget hinzufügen",
"Allow": "Erlauben",
"Changes colour scheme of current room": "Ändere Farbschema des aktuellen Raumes",
"Delete widget": "Widget entfernen",
"Define the power level of a user": "Setze das Berechtigungslevel eines Benutzers",
"Edit": "Bearbeiten",
"Enable automatic language detection for syntax highlighting": "Aktiviere automatische Spracherkennung zum Syntax-Hervorheben",
"Hide Apps": "Apps verbergen",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Verberge Beitritt-/Verlassen-Meldungen (nicht Einladungen/Kicks/Bannungen)",
"Hide avatar and display name changes": "Verberge Avatar- und Anzeigenamen-Änderungen",
"Matrix Apps": "Matrix Apps",
"Revoke widget access": "Ziehe Widget-Zugriff zurück",
"Sets the room topic": "Setzt das Raum-Thema",
"Show Apps": "Zeige Apps",
"To get started, please pick a username!": "Um zu starten, wähle bitte einen Nutzernamen!",
"Unable to create widget.": "Widget kann nicht erstellt werden.",
"Unbans user with given id": "Entbanne Nutzer mit angegebener ID",
"You are not in this room.": "Du bist nicht in diesem Raum.",
"You do not have permission to do that in this room.": "Du hast keine Berechtigung, dies in diesem Raum zu tun.",
"Verifies a user, device, and pubkey tuple": "Verifiziert ein Tupel aus Nutzer, Gerät und öffentlichem Schlüssel",
"Autocomplete Delay (ms):": "Verzögerung zur Autovervollständigung (ms):",
"This Home server does not support groups": "Dieser Heimserver unterstützt keine Gruppen",
"Loading device info...": "Lädt Geräte-Info...",
"Groups": "Gruppen",
"Create a new group": "Erstelle eine neue Gruppe",
"Create Group": "Erstelle Gruppe",
"Group Name": "Gruppenname",
"Example": "Beispiel",
"Create": "Erstelle",
"Group ID": "Gruppen-ID",
"+example:%(domain)s": "+beispiel:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Gruppen-IDs müssen von der Form '+lokalteil:%(domain)s' sein",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Es ist aktuell nur möglich, Gruppen auf deinem eigenen Heimserver zu erstellen. Nutze eine Gruppen-ID, die mit %(domain)s endet",
"Room creation failed": "Raum-Erstellung fehlgeschlagen",
"You are a member of these groups:": "Du bist Mitglied in folgenden Gruppen:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Gruppe um deine Community darzustellen! Definiere eine Menge von Räumen und deine eigene angepasste Startseite um deinen Bereich im Matrix-Universum zu markieren.",
"Join an existing group": "Trete eine existierenden Gruppe bei",
"To join an exisitng group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Um einer existierenden Gruppe beizutreten, musst du ihre Gruppen-Kennung wissen. Diese sieht z.B. aus wie '<i>+example:matrix.org</i>'.",
"Featured Rooms:": "Hervorgehobene Räume:",
"Error whilst fetching joined groups": "Fehler beim Laden beigetretener Gruppen",
"Featured Users:": "Hervorgehobene Nutzer:",
"Edit Group": "Gruppe bearbeiten",
"Automatically replace plain text Emoji": "Automatisch Klarzeichen-Emoji ersetzen",
"Failed to upload image": "Bild-Hochladen fehlgeschlagen",
"Failed to update group": "Aktualisieren der Gruppe fehlgeschlagen",
"Hide avatars in user and room mentions": "Verberge Profilbilder in Benutzer- und Raum-Erwähnungen",
"AM": "am",
"PM": "pm"
}

View file

@ -688,7 +688,7 @@
"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": "Μόλις ακολουθήσετε τον σύνδεσμο που περιέχει, κάντε κλικ παρακάτω",
"Once you'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 κλήση.",

View file

@ -264,6 +264,7 @@
"Disinvite": "Disinvite",
"Display name": "Display name",
"Displays action": "Displays action",
"Do you want to load widget from URL:": "Do you want to load widget from URL:",
"Don't send typing notifications": "Don't send typing notifications",
"Download %(text)s": "Download %(text)s",
"Drop File Here": "Drop File Here",
@ -362,6 +363,7 @@
"Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
"Incorrect username and/or password.": "Incorrect username and/or password.",
"Incorrect verification code": "Incorrect verification code",
"Integrations Error": "Integrations Error",
"Interface Language": "Interface Language",
"Invalid alias format": "Invalid alias format",
"Invalid address format": "Invalid address format",
@ -433,6 +435,7 @@
"AM": "AM",
"PM": "PM",
"NOT verified": "NOT verified",
"NOTE: Apps are not end-to-end encrypted": "NOTE: Apps are not end-to-end encrypted",
"No devices with registered encryption keys": "No devices with registered encryption keys",
"No display name": "No display name",
"No more results": "No more results",
@ -441,7 +444,7 @@
"OK": "OK",
"olm version:": "olm version:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "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": "Once you&#39;ve followed the link it contains, click below",
"Once you've followed the link it contains, click below": "Once you've followed the link it contains, click below",
"Only people who have been invited": "Only people who have been invited",
"Operation failed": "Operation failed",
"Otherwise, <a>click here</a> to send a bug report.": "Otherwise, <a>click here</a> to send a bug report.",
@ -972,7 +975,8 @@
"Failed to upload image": "Failed to upload image",
"Failed to update group": "Failed to update group",
"Hide avatars in user and room mentions": "Hide avatars in user and room mentions",
"%(senderName)s added a %(widgetName)swidget": "%(senderName)s added a %(widgetName)swidget",
"%(senderName)s removed a %(widgetName)swidget": "%(senderName)s removed a %(widgetName)swidget",
"%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s",
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s",
"%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s",
"Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot check is currently unavailable on desktop - please use a <a>web browser</a>"
}

View file

@ -404,7 +404,7 @@
"OK": "OK",
"olm version:": "olm version:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "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": "Once you&#39;ve followed the link it contains, click below",
"Once you've followed the link it contains, click below": "Once you've followed the link it contains, click below",
"Only people who have been invited": "Only people who have been invited",
"Operation failed": "Operation failed",
"Password": "Password",

View file

@ -308,7 +308,7 @@
"is a": "es un",
"'%(alias)s' is not a valid format for an address": "'%(alias)s' no es un formato válido para una dirección",
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' no es un formato válido para un alias",
"%(displayName)s is typing": "%(displayName)s esta escribiendo",
"%(displayName)s is typing": "%(displayName)s está escribiendo",
"Sign in with": "Quiero iniciar sesión con",
"Join Room": "Unirte a la sala",
"joined and left": "unido y dejado",
@ -648,5 +648,93 @@
"To send messages": "Para enviar mensajes",
"to start a chat with someone": "para empezar a charlar con alguien",
"to tag as %(tagName)s": "para etiquetar como %(tagName)s",
"to tag direct chat": "para etiquetar como charla directa"
"to tag direct chat": "para etiquetar como charla directa",
"Add a widget": "Añadir widget",
"Allow": "Permitir",
"Changes colour scheme of current room": "Cambia el esquema de colores de esta sala",
"Delete widget": "Eliminar widget",
"Define the power level of a user": "Definir el nivel de poder de los usuarios",
"Edit": "Editar",
"Enable automatic language detection for syntax highlighting": "Activar la detección automática del lenguaje para resaltar la sintaxis",
"Hide Apps": "Ocultar aplicaciones",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensajes de entrada/salida (no afecta invitaciones/kicks/bans)",
"Hide avatar and display name changes": "Ocultar cambios de avatar y nombre visible",
"Matrix Apps": "Aplicaciones Matrix",
"Once you've followed the link it contains, click below": "Cuando haya seguido el enlace que contiene, haga click debajo",
"Sets the room topic": "Configura el tema de la sala",
"Show Apps": "Mostrar aplicaciones",
"To get started, please pick a username!": "Para empezar, ¡por favor elija un nombre de usuario!",
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no tiene permiso para ver el mensaje solicitado.",
"Tried to load a specific point in this room's timeline, but was unable to find it.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no se ha podido encontrarlo.",
"Turn Markdown off": "Desactivar markdown",
"Turn Markdown on": "Activar markdown",
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activado el cifrado de extremo-a-extremo (algorithm %(algorithm)s).",
"Unable to add email address": "No se ha podido añadir la dirección de correo electrónico",
"Unable to create widget.": "No se ha podido crear el widget.",
"Unable to remove contact information": "No se ha podido eliminar la información de contacto",
"Unable to restore previous session": "No se ha podido restablecer la sesión anterior",
"Unable to verify email address.": "No se ha podido verificar la dirección de correo electrónico.",
"Unban": "Revocar bloqueo",
"Unbans user with given id": "Revoca el bloqueo del usuario con la identificación dada",
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "No se ha podido asegurar que la dirección a la que se envió esta invitación, coincide con una asociada a su cuenta.",
"Unable to capture screen": "No se ha podido capturar la pantalla",
"Unable to enable Notifications": "No se ha podido activar las notificaciones",
"Unable to load device list": "No se ha podido cargar la lista de dispositivos",
"Undecryptable": "No se puede descifrar",
"Unencrypted room": "Sala sin cifrado",
"Unencrypted message": "Mensaje no cifrado",
"unknown caller": "Persona que llama desconocida",
"unknown device": "dispositivo desconocido",
"Unknown room %(roomId)s": "Sala desconocida %(roomId)s",
"Unknown (user, device) pair:": "Pareja desconocida (usuario, dispositivo):",
"unknown": "desconocido",
"Unnamed Room": "Sala sin nombre",
"Unverified": "Sin verificar",
"Uploading %(filename)s and %(count)s others.zero": "Subiendo %(filename)s",
"Uploading %(filename)s and %(count)s others.one": "Subiendo %(filename)s y %(count)s otros",
"Uploading %(filename)s and %(count)s others.other": "Subiendo %(filename)s y %(count)s otros",
"Upload avatar": "Subir avatar",
"Upload Failed": "Error al subir",
"Upload Files": "Subir archivos",
"Upload file": "Subir archivo",
"Upload new:": "Subir nuevo:",
"Usage": "Uso",
"Use compact timeline layout": "Usar diseño de cronología compacto",
"Use with caution": "Usar con precaución",
"User ID": "Identificación de usuario",
"User Interface": "Interfaz de usuario",
"%(user)s is a": "%(user)s es un",
"User name": "Nombre de usuario",
"Username invalid: %(errMessage)s": "Nombre de usuario no válido: %(errMessage)s",
"Users": "Usuarios",
"User": "Usuario",
"Verification Pending": "Verificación pendiente",
"Verification": "Verificación",
"verified": "verificado",
"Verified": "Verificado",
"Verified key": "Clave verificada",
"Video call": "Llamada de vídeo",
"Voice call": "Llamada de voz",
"VoIP conference finished.": "Conferencia VoIP terminada.",
"VoIP conference started.": "Conferencia de VoIP iniciada.",
"VoIP is unsupported": "No hay soporte para VoIP",
"(could not connect media)": "(no se ha podido conectar medio)",
"(no answer)": "(sin respuesta)",
"(unknown failure: %(reason)s)": "(error desconocido: %(reason)s)",
"(warning: cannot be disabled again!)": "(aviso: ¡no se puede volver a desactivar!)",
"Warning!": "¡Advertencia!",
"WARNING: Device already verified, but keys do NOT MATCH!": "AVISO: Dispositivo ya verificado, ¡pero las claves NO COINCIDEN!",
"Who can access this room?": "¿Quién puede acceder a esta sala?",
"Who can read history?": "¿Quién puede leer el historial?",
"Who would you like to add to this room?": "¿A quién quiere añadir a esta sala?",
"Who would you like to communicate with?": "¿Con quién quiere comunicar?",
"%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirado la invitación de %(targetName)s.",
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "¿Quiere <acceptText>aceptar</acceptText> o <declineText>rechazar</declineText> esta invitación?",
"You already have existing direct chats with this user:": "Ya tiene chats directos con este usuario:",
"You are already in a call.": "Ya está participando en una llamada.",
"You are not in this room.": "Usted no está en esta sala.",
"You do not have permission to do that in this room.": "No tiene permiso para hacer esto en esta sala.",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "¡Todavía no participa en ninguna sala! Pulsa <CreateRoomButton> para crear una sala o <RoomDirectoryButton> para explorar el directorio",
"You are trying to access %(roomName)s.": "Está tratando de acceder a %(roomName)s.",
"You cannot place a call with yourself.": "No puede iniciar una llamada con usted mismo."
}

View file

@ -495,7 +495,7 @@
"No users have specific privileges in this room": "Ez dago gela honetan baimen zehatzik duen erabiltzailerik",
"olm version:": "olm bertsioa:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Behin gela batean zifratzea gaituta ezin da gero desgaitu (oraingoz)",
"Once you&#39;ve followed the link it contains, click below": "Behin dakarren esteka jarraitu duzula, egin klik azpian",
"Once you've followed the link it contains, click below": "Behin dakarren esteka jarraitu duzula, egin klik azpian",
"Otherwise, <a>click here</a> to send a bug report.": "Bestela, <a>bidali arazte-txosten bat</a>.",
"Server may be unavailable, overloaded, or you hit a bug.": "Agian zerbitzaria ez dago eskuragarri, edo gainezka dago, edo akats bat aurkitu duzu.",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen. Etorkizunean hau hobetuko da.",

View file

@ -1 +1 @@
{}
{}

View file

@ -120,7 +120,7 @@
"zh-tw": "Chinese (Taiwan)",
"zu": "Zulu",
"anyone": "n'importe qui",
"Direct Chat": "Discussion Directe",
"Direct Chat": "Discussion directe",
"Direct chats": "Conversations directes",
"Disable inline URL previews by default": "Désactiver laperçu des URLs",
"Disinvite": "Désinviter",
@ -150,7 +150,7 @@
"Failed to change power level": "Échec du changement de niveau d'autorité",
"Failed to delete device": "Échec de la suppression de l'appareil",
"Failed to forget room %(errCode)s": "Échec lors de l'oubli du salon %(errCode)s",
"Please Register": "Veuillez vous enregistrer",
"Please Register": "Veuillez vous inscrire",
"Remove": "Supprimer",
"was banned": "a été banni(e)",
"was invited": "a été invité(e)",
@ -182,7 +182,7 @@
"Algorithm": "Algorithme",
"all room members": "tous les membres du salon",
"all room members, from the point they are invited": "tous les membres du salon, depuis le moment où ils ont été invités",
"all room members, from the point they joined": "tous les membres du salon, depuis le moment où ils ont joint",
"all room members, from the point they joined": "tous les membres du salon, depuis le moment où ils ont rejoint",
"an address": "une adresse",
"and": "et",
"%(items)s and %(remaining)s others": "%(items)s et %(remaining)s autres",
@ -273,7 +273,7 @@
"Failed to send request.": "Erreur lors de l'envoi de la requête.",
"Failed to set display name": "Échec lors de l'enregistrement du nom d'affichage",
"Failed to set up conference call": "Échec lors de létablissement de lappel",
"Failed to toggle moderator status": "Échec lors de létablissement du statut de modérateur",
"Failed to toggle moderator status": "Échec lors de lactivation du statut de modérateur",
"%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté linvitation de %(displayName)s.",
"Access Token:": "Jeton daccès :",
"Always show message timestamps": "Toujours afficher l'heure des messages",
@ -288,17 +288,17 @@
"favourite": "favoris",
"Favourites": "Favoris",
"Fill screen": "Plein écran",
"Filter room members": "Filtrer les membres par nom",
"Filter room members": "Filtrer les membres du salon",
"Forget room": "Oublier le salon",
"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 authentifier à nouveau.",
"Found a bug?": "Trouvé un problème ?",
"%(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 upload files. Please register to upload.": "Les visiteurs ne peuvent pas télécharger de fichier. Veuillez vous enregistrer pour télécharger.",
"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 inscrire pour commencer une discussion.",
"Guest users can't upload files. Please register to upload.": "Les visiteurs ne peuvent pas télécharger de fichier. Veuillez vous inscrire pour télécharger.",
"had": "avait",
"Hangup": "Raccrocher",
"Hide read receipts": "Cacher les accusés de réception",
"Hide read receipts": "Cacher les accusés de lecture",
"Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte",
"Historical": "Historique",
"Homeserver is": "Le homeserver est",
@ -321,10 +321,10 @@
"%(displayName)s is typing": "%(displayName)s est en train d'écrire",
"Sign in with": "Je veux m'identifier avec",
"Join Room": "Rejoindre le salon",
"joined and left": "a joint et quitté",
"joined": "a joint",
"%(targetName)s joined the room.": "%(targetName)s a joint le salon.",
"Joins room with given alias": "Joint le salon avec l'alias défini",
"joined and left": "a rejoint et quitté",
"joined": "a rejoint",
"%(targetName)s joined the room.": "%(targetName)s a rejoint le salon.",
"Joins room with given alias": "Rejoint le salon avec l'alias défini",
"%(senderName)s kicked %(targetName)s.": "%(senderName)s a expulsé %(targetName)s.",
"Kick": "Expulser",
"Kicks user with given id": "Expulse l'utilisateur avec l'ID donné",
@ -357,14 +357,14 @@
"Never send encrypted messages to unverified devices in this room": "Ne jamais envoyer de message chiffré aux appareils non-vérifiés dans ce salon",
"Never send encrypted messages to unverified devices in this room from this device": "Ne jamais envoyer de message chiffré aux appareils non-vérifiés dans ce salon depuis cet appareil",
"New address (e.g. #foo:%(localDomain)s)": "Nouvelle adresse (par ex. #foo:%(localDomain)s)",
"New Composer & Autocomplete": "Nouveau compositeur & Autocomplétion",
"New Composer & Autocomplete": "Nouveau compositeur et autocomplétion",
"New password": "Nouveau mot de passe",
"New passwords don't match": "Les mots de passe ne correspondent pas",
"New passwords must match each other.": "Les nouveaux mots de passe doivent être identiques.",
"none": "aucun",
"not set": "non défini",
"not specified": "non spécifié",
"(not supported by this browser)": "(non supporté par cet explorateur)",
"(not supported by this browser)": "(non supporté par ce navigateur)",
"<not supported>": "<non supporté>",
"NOT verified": "NON vérifié",
"No devices with registered encryption keys": "Pas dappareil avec des clés de chiffrement enregistrées",
@ -383,28 +383,28 @@
"Operation failed": "L'opération a échoué",
"Bulk Options": "Options de masse",
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Changer le mot de passe réinitialise actuellement les clés de chiffrement sur tous les appareils, rendant lhistorique chiffré illisible, à moins dexporter les clés du salon en avance de phase puis de les ré-importer. Ceci sera amélioré prochainement.",
"Default": "Défaut",
"Default": "Par défaut",
"Email address": "Adresse e-mail",
"Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe",
"Failed to set avatar.": "Erreur lors de la définition de la photo de profil.",
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Par sécurité une déconnexion supprimera toutes les clés de chiffrement de ce navigateur. Si vous voulez être capable de déchiffrer lhistorique de votre conversation lors de sessions futures de Riot, merci dexporter les clés pour le salon.",
"Guests can't set avatars. Please register.": "Les visiteurs ne peuvent définir de photo de profil. Merci de vous enregistrer.",
"Guests can't use labs features. Please register.": "Les visiteurs ne peuvent utiliser les fonctionalités du laboratoire. Merci de vous enregistrer.",
"Guests can't set avatars. Please register.": "Les visiteurs ne peuvent définir de photo de profil. Merci de vous inscrire.",
"Guests can't use labs features. Please register.": "Les visiteurs ne peuvent utiliser les fonctionalités du laboratoire. Merci de vous inscrire.",
"Guests cannot join this room even if explicitly invited.": "Les visiteurs ne peuvent rejoindre ce salon, même si explicitement invités.",
"Invalid file%(extra)s": "Fichier %(extra)s invalide",
"Mute": "Couper le son",
"No users have specific privileges in this room": "Aucun utilisateur na de privilège spécifique dans ce salon",
"olm version:": "version de olm :",
"Once you&#39;ve followed the link it contains, click below": "Une fois que vous aurez suivi le lien quil contient, cliquez ci-dessous",
"Once you've followed the link it contains, click below": "Une fois que vous aurez suivi le lien quil contient, cliquez ci-dessous",
"%(senderName)s placed a %(callType)s call.": "%(senderName)s a placé un appel %(callType)s.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Veuillez vérifier vos e-mails et cliquer sur le lien que vous avez reçu. Puis cliquez sur continuer.",
"Power level must be positive integer.": "Le niveau d'autorité doit être un entier positif.",
"Press": "Cliquer",
"Privacy warning": "Alerte de confidentialité",
"Privileged Users": "Utilisateur Privilégié",
"Privileged Users": "Utilisateur privilégié",
"Profile": "Profil",
"Reason": "Raison",
"Revoke Moderator": "Révoquer le Modérateur",
"Revoke Moderator": "Révoquer le modérateur",
"Refer a friend to Riot:": "Recommander Riot à un ami :",
"rejected": "rejeté",
"%(targetName)s rejected the invitation.": "%(targetName)s a rejeté linvitation.",
@ -414,17 +414,17 @@
"%(senderName)s removed their profile picture.": "%(senderName)s a supprimé sa photo de profil.",
"Remove %(threePid)s?": "Supprimer %(threePid)s ?",
"%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une conférence audio.",
"Report it": "Le rapporter",
"Report it": "Le signaler",
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant lhistorique chiffré illisible, à moins que vous ayez exporté les clés du salon en avance de phase puis que vous les ré-importiez. Cela sera amélioré prochainement.",
"restore": "restorer",
"restore": "restaurer",
"Return to app": "Retourner à lapplication",
"Return to login screen": "Retourner à lécran didentification",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot na pas la permission de vous envoyer des notifications - Merci de vérifier les paramètres de votre explorateur",
"Riot was not given permission to send notifications - please try again": "Riot na pas reçu la permission de vous envoyer des notifications - Merci dessayer à nouveau",
"Riot does not have permission to send you notifications - please check your browser settings": "Riot na pas la permission de vous envoyer des notifications - merci de vérifier les paramètres de votre navigateur",
"Riot was not given permission to send notifications - please try again": "Riot na pas reçu la permission de vous envoyer des notifications - merci dessayer à nouveau",
"riot-web version:": "Version de riot-web :",
"Room %(roomId)s not visible": "Le salon %(roomId)s n'est pas visible",
"Room Colour": "Couleur du salon",
"Room name (optional)": "Nom du salon (optionnel)",
"Room name (optional)": "Nom du salon (facultatif)",
"Rooms": "Salons",
"Scroll to bottom of page": "Aller en bas de la page",
"Scroll to unread messages": "Aller aux messages non-lus",
@ -433,7 +433,7 @@
"Searches DuckDuckGo for results": "Recherche des résultats dans DuckDuckGo",
"Send a message (unencrypted)": "Envoyer un message (non chiffré)",
"Send an encrypted message": "Envoyer un message chiffré",
"Sender device information": "Information de l'appareil de l'expéditeur",
"Sender device information": "Informations de l'appareil de l'expéditeur",
"Send Invites": "Envoyer les invitations",
"Send Reset Email": "Envoyer l'e-mail de réinitialisation",
"sent an image": "a envoyé une image",
@ -443,7 +443,7 @@
"Server error": "Erreur du serveur",
"Server may be unavailable or overloaded": "Le serveur semble être inaccessible ou surchargé",
"Server may be unavailable, overloaded, or search timed out :(": "Le serveur semble être inaccessible, surchargé ou la recherche a expiré :(",
"Server may be unavailable, overloaded, or the file too big": "Le serveur semble être inaccessible, surchargé ou le fichier trop important",
"Server may be unavailable, overloaded, or the file too big": "Le serveur semble être inaccessible, surchargé ou le fichier est trop volumineux",
"Server may be unavailable, overloaded, or you hit a bug.": "Le serveur semble être indisponible, surchargé, ou vous avez rencontré un problème.",
"Server unavailable, overloaded, or something else went wrong.": "Le serveur semble être inaccessible, surchargé ou quelque chose s'est mal passé.",
"Session ID": "Identifiant de session",
@ -460,15 +460,15 @@
"Some of your messages have not been sent.": "Certains de vos messages nont pas été envoyés.",
"Someone": "Quelqu'un",
"Sorry, this homeserver is using a login which is not recognised ": "Désolé, ce homeserver utilise un identifiant qui nest pas reconnu ",
"Start a chat": "Démarrer une conversation",
"Start Chat": "Démarrer une conversation",
"Start a chat": "Démarrer une discussion",
"Start Chat": "Démarrer une discussion",
"Submit": "Soumettre",
"Success": "Succès",
"tag as %(tagName)s": "marquer comme %(tagName)s",
"tag direct chat": "marquer comme conversation directe",
"tag direct chat": "marquer comme discussion directe",
"The default role for new room members is": "Le rôle par défaut des nouveaux membres est",
"The main address for this room is": "L'adresse principale pour ce salon est",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Cette action ne peut être effectuée par un visiteur. Merci de vous enregistrer afin de pouvoir effectuer cette action.",
"This action cannot be performed by a guest user. Please register to be able to do this.": "Cette action ne peut être effectuée par un visiteur. Merci de vous inscrire afin de pouvoir effectuer cette action.",
"This email address is already in use": "Cette adresse e-mail est déjà utilisée",
"This email address was not found": "Cette adresse e-mail na pas été trouvée",
"%(actionVerb)s this person?": "%(actionVerb)s cette personne ?",
@ -502,7 +502,7 @@
"to restore": "pour restaurer",
"To send events of type": "Pour envoyer des évènements du type",
"To send messages": "Pour envoyer des messages",
"to start a chat with someone": "pour démarrer une conversation avec quelquun",
"to start a chat with someone": "pour démarrer une discussion avec quelquun",
"to tag as %(tagName)s": "pour marquer comme %(tagName)s",
"to tag direct chat": "pour marquer comme conversation directe",
"To use it, just wait for autocomplete results to load and tab through them.": "Pour lutiliser, attendez simplement que les résultats de lauto-complétion saffichent et défilez avec la touche Tab.",
@ -565,7 +565,7 @@
"You have no visible notifications": "Vous n'avez pas de notifications visibles",
"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 logged in.": "Vous devez être connecté.",
"You need to be logged in.": "Vous devez être identifié.",
"You need to enter a user name.": "Vous devez entrer un nom dutilisateur.",
"You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Vous devez vous connecter à nouveau pour générer les clés de chiffrement pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas ; veuillez nous excuser pour la gêne occasionnée.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.",
@ -575,7 +575,7 @@
"You seem to be uploading files, are you sure you want to quit?": "Vous semblez être en train de télécharger des fichiers, êtes-vous sûr(e) de vouloir quitter ?",
"You should not yet trust it to secure data": "Vous ne pouvez pas encore lui faire confiance pour sécuriser vos données",
"changing room on a RoomView is not supported": "changer de salon sur un RoomView n'est pas supporté",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Vous ne pourrez pas défaire ce changement car vous promouvez lutilisateur aux mêmes pouvoirs que vous.",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Vous ne pourrez pas annuler ce changement car vous promouvez lutilisateur au même niveau d'autorité que le vôtre.",
"Sun": "Dim",
"Mon": "Lun",
"Tue": "Mar",
@ -648,11 +648,11 @@
"%(oneUser)sleft and rejoined": "%(oneUser)sa quitté et à nouveau joint le salon",
"%(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",
"%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leurs invitations",
"%(severalUsers)srejected their invitations": "%(severalUsers)sont rejeté leur invitation",
"%(oneUser)srejected their invitation": "%(oneUser)sa rejeté son invitation",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)sont vu leurs invitations rétractées %(repeats)s fois",
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)sont vu leur invitation rétractée %(repeats)s fois",
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)sa vu son invitation rétractée %(repeats)s fois",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)sont vu leurs invitations rétractées",
"%(severalUsers)shad their invitations withdrawn": "%(severalUsers)sont vu leur invitation rétractée",
"%(oneUser)shad their invitation withdrawn": "%(oneUser)sa vu son invitation rétractée",
"were invited %(repeats)s times": "ont été invité(e)s %(repeats)s fois",
"was invited %(repeats)s times": "a été invité(e) %(repeats)s fois",
@ -692,8 +692,8 @@
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Le fichier exporté est protégé par une phrase secrète. Vous devez entrer cette phrase secrète ici pour déchiffrer le fichier.",
"You must join the room to see its files": "Vous devez joindre le salon pour voir ses fichiers",
"Reject all %(invitedRooms)s invites": "Rejeter la totalité des %(invitedRooms)s invitations",
"Start new chat": "Démarrer une nouvelle conversation",
"Guest users can't invite users. Please register.": "Les visiteurs ne peuvent inviter dautres utilisateurs. Merci de vous enregistrer.",
"Start new chat": "Démarrer une nouvelle discussion",
"Guest users can't invite users. Please register.": "Les visiteurs ne peuvent inviter dautres utilisateurs. Merci de vous inscrire.",
"Failed to invite": "Echec de l'invitation",
"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 :",
@ -702,7 +702,7 @@
"Unknown error": "Erreur inconnue",
"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 action is irreversible.": "Cette action est irreversible.",
"This action is irreversible.": "Cette action est irréversible.",
"To continue, please enter your password.": "Pour continuer, merci d'entrer votre mot de passe.",
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Pour vérifier que vous pouvez faire confiance à cet appareil, merci de contacter son propriétaire par un autre moyen (par ex. en personne ou par téléphone) et demandez lui si la clé quil/elle voit dans ses Paramètres Utilisateur pour cet appareil correspond à la clé ci-dessous :",
"Device name": "Nom de l'appareil",
@ -717,7 +717,7 @@
"Continue anyway": "Continuer quand même",
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Votre nom daffichage est la manière dont vous allez apparaître pour les autres quand vous parlerez dans les salons. Que voulez-vous quil soit ?",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vous êtes en train dajouter à la liste noire des appareils non-vérifiés ; pour envoyer des messages à ces appareils vous devez les vérifier.",
"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.": "Nous vous recommandons deffectuer le process de vérification pour tous les appareils afin de confirmer quils appartiennent à leurs propriétaires légitimes, mais vous pouvez renvoyer le(s) message(s) sans vérifier si vous préférez.",
"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.": "Nous vous recommandons deffectuer le processus de vérification pour tous les appareils afin de confirmer quils appartiennent à leurs propriétaires légitimes, mais vous pouvez renvoyer le(s) message(s) sans vérifier si vous préférez.",
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contient des appareils que vous n'avez encore jamais vus.",
"Unknown devices": "Appareils inconnus",
"Unknown Address": "Adresse inconnue",
@ -782,7 +782,7 @@
"Device already verified!": "Appareil déjà vérifié !",
"Export": "Exporter",
"Failed to register as guest:": "Échec de linscription en tant que visiteur :",
"Guest access is disabled on this Home Server.": "Laccès en tant que visiteur est désactivé sur ce serveur.",
"Guest access is disabled on this Home Server.": "Laccès en tant que visiteur est désactivé sur ce homeserver.",
"Import": "Importer",
"Incorrect username and/or password.": "Nom dutilisateur et/ou mot de passe incorrect.",
"Results from DuckDuckGo": "Résultats de DuckDuckGo",
@ -794,7 +794,7 @@
"Unrecognised room alias:": "Alias de salon non-reconnu :",
"Use compact timeline layout": "Utiliser l'affichage compact",
"Verified key": "Clé vérifiée",
"WARNING: Device already verified, but keys do NOT MATCH!": "ATTENTION : Appareil déjà vérifié mais les clés NE CORRESPONDENT PAS !",
"WARNING: Device already verified, but keys do NOT MATCH!": "ATTENTION : appareil déjà vérifié mais les clés NE CORRESPONDENT PAS !",
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATTENTION : ERREUR DE VÉRIFICATION DES CLÉS ! La clé de signature pour %(userId)s et l'appareil %(deviceId)s est “%(fprint)s” et ne correspond pas à la clé “%(fingerprint)s” qui a été fournie. Cela peut signifier que vos communications sont interceptées !",
"VoIP": "Voix sur IP",
"Missing Media Permissions, click here to request.": "Manque de permissions pour les médias, cliquer ici pour les demander.",
@ -810,7 +810,7 @@
"Are you sure you want to leave the room '%(roomName)s'?": "Êtes-vous sûr de vouloir quitter le salon '%(roomName)s' ?",
"Custom level": "Niveau personnalisé",
"Device ID:": "Identifiant de l'appareil :",
"device id: ": "Identifiant appareil : ",
"device id: ": "identifiant appareil : ",
"Device key:": "Clé de lappareil :",
"Email address (optional)": "Adresse e-mail (facultatif)",
"Mobile phone number (optional)": "Numéro de téléphone (facultatif)",
@ -827,7 +827,7 @@
"%(count)s new messages.one": "%(count)s nouveau message",
"%(count)s new messages.other": "%(count)s nouveaux messages",
"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 homeserver.",
"Failed to fetch avatar URL": "Échec lors de la récupération de lURL de lavatar",
"The phone number entered looks invalid": "Le numéro de téléphone entré semble être invalide",
"This room is private or inaccessible to guests. You may be able to join if you register.": "Ce salon est privé ou interdits aux visiteurs. Vous pourrez peut-être le joindre si vous vous enregistrez.",
@ -835,7 +835,7 @@
"Uploading %(filename)s and %(count)s others.one": "Téléchargement de %(filename)s et %(count)s autre",
"Uploading %(filename)s and %(count)s others.other": "Téléchargement de %(filename)s et %(count)s autres",
"You must <a>register</a> to use this functionality": "Vous devez vous <a>inscrire</a> pour utiliser cette fonctionnalité",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Tout renvoyer</a> or <a>tout annuler</a> maintenant. Vous pouvez aussi sélectionner des messages individuels à envoyer ou annuler.",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Tout renvoyer</a> ou <a>tout annuler</a> maintenant. Vous pouvez aussi sélectionner des messages individuels à envoyer ou annuler.",
"Create new room": "Créer un nouveau salon",
"Welcome page": "Page d'accueil",
"Room directory": "Répertoire des salons",
@ -855,23 +855,23 @@
"Accept": "Accepter",
"Active call (%(roomName)s)": "Appel en cours (%(roomName)s)",
"Admin tools": "Outils d'administration",
"Alias (optional)": "Alias (optionnel)",
"Alias (optional)": "Alias (facultatif)",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Impossible de se connecter au 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",
"Decline": "Refuser",
"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 vocal 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",
"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",
@ -896,7 +896,7 @@
"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.",
"Your home server does not support device management.": "Votre homeserver 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",
@ -916,7 +916,7 @@
"%(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)",
"(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 ?",
@ -924,7 +924,7 @@
"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.",
"Press <StartChatButton> to start a chat with someone": "Cliquez sur <StartChatButton> pour entamer une discussion avec quelqu'un",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Vous n'avez pas encore rejoint de salle ! Cliquez sur <CreateRoomButton> pour créer une salle ou sur <RoomDirectoryButton> pour explorer l'annuaire",
"You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Vous n'avez pas encore rejoint de salon ! Cliquez sur <CreateRoomButton> pour créer un salon ou sur <RoomDirectoryButton> pour explorer le répertoire",
"To return to your account in future you need to set a password": "Pour pouvoir accéder à votre compte dans le futur, vous devez enregistrer un mot de passe",
"Skip": "Passer",
"Start verification": "Commencer la vérification",
@ -934,5 +934,50 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Votre appareil non vérifié '%(displayName)s' demande des clés de chiffrement.",
"Encryption key request": "Requête de clé de chiffrement",
"Updates": "Mises à jour",
"Check for update": "Rechercher une mise à jour"
"Check for update": "Rechercher une mise à jour",
"Add a widget": "Ajouter un widget",
"Allow": "Autoriser",
"Changes colour scheme of current room": "Change le jeu de couleur du salon",
"Delete widget": "Supprimer le widget",
"Define the power level of a user": "Définir le niveau de privilèges d'un utilisateur",
"Edit": "Modifier",
"Enable automatic language detection for syntax highlighting": "Activer la détection automatique de langue pour la correction orthographique",
"Hide Apps": "Masquer les applications",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Masquer les messages d'arrivée/départ (n'affecte pas les invitations/exclusions/bannissements)",
"Hide avatar and display name changes": "Masquer les changements d'avatar et de nom",
"Matrix Apps": "Matrix Apps",
"Revoke widget access": "Désactiver les accès du widget",
"Sets the room topic": "Configure le sujet du salon",
"Show Apps": "Afficher les applications",
"To get started, please pick a username!": "Pour débuter, choisissez un nom d'utilisateur !",
"Unable to create widget.": "Impossible de créer le widget.",
"Unbans user with given id": "Amnistie l'utilisateur à partir de son identifiant",
"You are not in this room.": "Vous n'êtes pas dans ce salon.",
"You do not have permission to do that in this room.": "Vous n'avez pas la permission d'effectuer cette action dans ce salon.",
"Autocomplete Delay (ms):": "Délai pour l'autocomplétion (ms) :",
"This Home server does not support groups": "Ce homeserver ne supporte pas les groupes",
"Loading device info...": "Chargement des informations sur l'appareil...",
"Groups": "Groupes",
"Create a new group": "Créer un nouveau groupe",
"Create Group": "Créer le groupe",
"Group Name": "Nom du groupe",
"Example": "Exemple",
"Create": "Créer",
"Group ID": "Identifiant du groupe",
"+example:%(domain)s": "+exemple:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "Les identifiants de groupe doivent être au format +localpart:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Il n'est pas encore possible de créer des groupes sur votre propre homeserver : utilisez un identifiant de groupe terminant par %(domain)s",
"Room creation failed": "Impossible de créer le salon",
"You are a member of these groups:": "Vous êtes membre des groupes suivants :",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Créez un groupe pour représenter votre communauté ! Définissez un jeu de salons et votre propre page d'accueil pour marquer votre espace dans l'univers Matrix.",
"Join an existing group": "Rejoindre un groupe existant",
"To join an exisitng group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Pour rejoindre un groupe existant, vous devez connaître son identifiant de groupe ; il ressemble à <i>+exemple:matrix.org</i>.",
"Featured Rooms:": "Salons mis en avant :",
"Error whilst fetching joined groups": "Erreur en récupérant la liste des groupes",
"Featured Users:": "Utilisateurs mis en avant :",
"Edit Group": "Modifier le groupe",
"Automatically replace plain text Emoji": "Remplacer automatiquement le texte par des Emoji",
"Failed to upload image": "Impossible de télécharger l'image",
"Failed to update group": "Impossible de modifier le groupe",
"Hide avatars in user and room mentions": "Masquer les avatars dans les mentions d'utilisateur et de salon"
}

View file

@ -190,10 +190,8 @@
"%(items)s and %(remaining)s others": "%(items)s és még: %(remaining)s",
"%(items)s and one other": "%(items)s és még egy",
"%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s",
"and %(count)s others...": {
"other": "és még: %(count)s ...",
"one": "és még egy..."
},
"and %(count)s others....other": "és még: %(count)s ...",
"and %(count)s others....one": "és még egy...",
"%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak",
"%(names)s and one other are typing": "%(names)s és még valaki ír",
"%(names)s and %(count)s others are typing": "%(names)s és %(count)s ember ír",
@ -219,8 +217,8 @@
"Bug Report": "Hiba jelentés",
"Bulk Options": "Tömeges beállítások",
"Call Timeout": "Hívás időtúllépés",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni az egyedi szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>egyedi szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
"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>.": "Nem lehet csatlakozni az egyedi szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</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.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>saját szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
"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>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.",
"Can't load user settings": "A felhasználói beállítások nem tölthetők be",
"Change Password": "Jelszó megváltoztatása",
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s megváltoztatta a nevét erről: %(oldDisplayName)s erre: %(displayName)s.",
@ -311,7 +309,7 @@
"Enter Code": "Kód megadása",
"Enter passphrase": "Jelmondat megadása",
"Error decrypting attachment": "Csatolmány visszafejtése sikertelen",
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van az egyedi szerverrel való kommunikációval.",
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van az saját szerverrel való kommunikációval.",
"Event information": "Esemény információ",
"Existing Call": "Hívás folyamatban",
"Export": "Mentés",
@ -351,7 +349,7 @@
"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.": "A biztonság érdekében a kilépéskor a ponttól pontig való (E2E) titkosításhoz szükséges kulcsok törlésre kerülnek a böngészőből. Ha a régi üzeneteket továbbra is el szeretnéd olvasni, kérlek mentsed ki a szobákhoz tartozó kulcsot.",
"Found a bug?": "Hibát találtál?",
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s",
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van az Otthoni szerveren.",
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Saját szerveren.",
"Guests can't set avatars. Please register.": "A vendégek nem tudnak avatar képet beállítani. Kérlek regisztrálj.",
"Guest users can't create new rooms. Please register to create room and start a chat.": "Vendégek nem készíthetnek szobákat. Kérlek regisztrálj, hogy szobát tudják nyitni és el tudj kezdeni csevegni.",
"Guest users can't upload files. Please register to upload.": "Vendégek nem tölthetnek fel fájlokat. A feltöltéshez kérlek regisztrálj.",
@ -363,7 +361,7 @@
"Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése",
"Historical": "Archív",
"Home": "Kezdőlap",
"Homeserver is": "Egyedi szerver:",
"Homeserver is": "Saját szerver:",
"Identity Server is": "Azonosítási szerver:",
"I have verified my email address": "Ellenőriztem az e-mail címemet",
"Import": "Betöltés",
@ -445,7 +443,7 @@
"No users have specific privileges in this room": "Egy felhasználónak sincsenek specifikus jogosultságai ebben a szobában",
"olm version:": "olm verzió:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Ha egyszer bekapcsolod a titkosítást a szobába utána nem lehet kikapcsolni (egyenlőre)",
"Once you&#39;ve followed the link it contains, click below": "Miután a linket követted, kattints alulra",
"Once you've followed the link it contains, click below": "Miután a linket követted, kattints alulra",
"Only people who have been invited": "Csak akiket meghívtak",
"Otherwise, <a>click here</a> to send a bug report.": "Különben hiba jelentés küldéséhez <a>kattints ide</a>.",
"Password": "Jelszó",
@ -530,7 +528,7 @@
"since they were invited": "onnantól, hogy meg lett hívva",
"Some of your messages have not been sent.": "Néhány üzeneted nem lett elküldve.",
"Someone": "Valaki",
"Sorry, this homeserver is using a login which is not recognised ": "Bocs, ez az egyedi szerver olyan beléptetést használ ami nem ismert ",
"Sorry, this homeserver is using a login which is not recognised ": "Bocs, ez a saját szerver olyan beléptetést használ ami nem ismert ",
"Start a chat": "Csevegés indítása",
"Start authentication": "Azonosítás indítása",
"Start Chat": "Csevegés indítása",
@ -550,10 +548,10 @@
"The email address linked to your account must be entered.": "A fiókodhoz kötött e-mail címet add meg.",
"Press <StartChatButton> to start a chat with someone": "Nyomd meg a <StartChatButton> gombot ha szeretnél csevegni valakivel",
"Privacy warning": "Magánéleti figyelmeztetés",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte az Otthoni szerverben beállított feltöltési méret határt",
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte a Saját szerverben beállított feltöltési méret határt",
"The file '%(fileName)s' failed to upload": "'%(fileName)s' fájl feltöltése sikertelen",
"The remote side failed to pick up": "A hívott fél nem vette fel",
"This Home Server does not support login using email address.": "Az Otthoni szerver nem támogatja a belépést e-mail címmel.",
"This Home Server does not support login using email address.": "A Saját szerver nem támogatja a belépést e-mail címmel.",
"This invitation was sent to an email address which is not associated with this account:": "A meghívó olyan e-mail címre lett küldve ami nincs összekötve ezzel a fiókkal:",
"There was a problem logging in.": "Hiba történt a bejelentkezésnél.",
"This room has no local addresses": "Ennek a szobának nincs helyi címe",
@ -675,7 +673,7 @@
"You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.",
"You need to be logged in.": "Be kell jelentkezz.",
"You need to enter a user name.": "Be kell írnod a felhasználói nevet.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen az egyedi szerveren.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a saját szerveren.",
"Your password has been reset": "A jelszavad visszaállítottuk",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel",
"to demote": "a hozzáférési szint csökkentéséhez",
@ -684,7 +682,7 @@
"You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?",
"You should not yet trust it to secure data": "Még ne bízz meg a titkosításban",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.",
"Your home server does not support device management.": "Az Otthoni szervered nem támogatja az eszközök kezelését.",
"Your home server does not support device management.": "A Saját szervered nem támogatja az eszközök kezelését.",
"Sun": "Vas",
"Mon": "Hé",
"Tue": "K",
@ -743,7 +741,7 @@
"quote": "idézet",
"bullet": "lista",
"numbullet": "számozott lista",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal léptek be",
"%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s%(repeats)s alkalommal léptek be",
"%(oneUser)sjoined %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal lépett be",
"%(severalUsers)sjoined": "%(severalUsers)s csatlakozott",
"%(oneUser)sjoined": "%(oneUser)s csatlakozott",
@ -836,7 +834,7 @@
"Verify...": "Ellenőrzés...",
"ex. @bob:example.com": "pl.: @bob:example.com",
"Add User": "Felhasználó hozzáadás",
"This Home Server would like to make sure you are not a robot": "Az Otthoni szerver meg szeretne győződni arról, hogy nem vagy robot",
"This Home Server would like to make sure you are not a robot": "A Saját szerver meg szeretne győződni arról, hogy nem vagy robot",
"Sign in with CAS": "Belépés CAS-sal",
"Please check your email to continue registration.": "Ellenőrizd az e-mailedet a regisztráció folytatásához.",
"Token incorrect": "Helytelen token",
@ -845,7 +843,7 @@
"You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s névvel regisztrálsz",
"Default server": "Alapértelmezett szerver",
"Custom server": "Egyedi szerver",
"Home server URL": "Otthoni szerver URL",
"Home server URL": "Saját szerver URL",
"Identity server URL": "Azonosítási szerver URL",
"What does this mean?": "Ez mit jelent?",
"Error decrypting audio": "Hiba a hang visszafejtésénél",
@ -898,13 +896,13 @@
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "A megjelenítési neved az ahogy a többiek látják amikor a szobában csevegsz. Mit szeretnél mi legyen?",
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.",
"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.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Használhatod az Otthoni szerver opciót hogy más Matrix szerverre csatlakozz Otthoni szerver URL megadásával.",
"This allows you to use this app with an existing Matrix account on a different home server.": "Ezzel használhatod ezt az alkalmazást a meglévő Matrix fiókoddal és másik Otthoni szerveren.",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Használhatod az Otthoni szerver opciót, hogy más Matrix szerverre csatlakozz Saját szerver URL megadásával.",
"This allows you to use this app with an existing Matrix account on a different home server.": "Ezzel használhatod ezt az alkalmazást a meglévő Matrix fiókoddal és másik Saját szerveren.",
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Beállíthatsz egy egyedi azonosító szervert is de ez tulajdonképpen meggátolja az együttműködést e-mail címmel azonosított felhasználókkal.",
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ha nem állítasz be e-mail címet nem fogod tudni a jelszavadat alaphelyzetbe állítani. Biztos vagy benne?",
"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?": "Azonosítás céljából egy harmadik félhez leszel irányítva (%(integrationsUrl)s). Folytatod?",
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL előnézet alapból %(globalDisableUrlPreview)s van a szoba résztvevői számára.",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Ez lesz a felhasználói neved az <span></span> egyedi szerveren, vagy választhatsz egy <a>másik szervert</a>.",
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Ez lesz a felhasználói neved a <span></span> saját szerveren, vagy választhatsz egy <a>másik szervert</a>.",
"Disable Peer-to-Peer for 1:1 calls": "Közvetlen kapcsolat tiltása az 1:1 hívásoknál",
"To return to your account in future you need to set a password": "Ahhoz hogy később visszatérj a fiókodba be kell állítanod egy jelszót",
"Skip": "Kihagy",
@ -915,5 +913,53 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Az ellenőrizetlen eszközöd '%(displayName)s' titkosítási kulcsokat kér.",
"Encryption key request": "Titkosítási kulcs kérés",
"Updates": "Frissítések",
"Check for update": "Frissítések keresése"
"Check for update": "Frissítések keresése",
"Add a widget": "Kisalkalmazás hozzáadása",
"Allow": "Engedélyez",
"Changes colour scheme of current room": "Az aktuális szoba színének megváltoztatása",
"Delete widget": "Kisalkalmazás törlése",
"Define the power level of a user": "A felhasználó szintjének meghatározása",
"Edit": "Szerkeszt",
"Enable automatic language detection for syntax highlighting": "Nyelv automatikus felismerése szintaxis kiemeléshez",
"Hide Apps": "Alkalmazások elrejtése",
"Hide join/leave messages (invites/kicks/bans unaffected)": "Belép/kilép üzenetek elrejtése (meghívók, kirúgások, kitiltások nem érintettek)",
"Hide avatar and display name changes": "Profilkép és megjelenítési név változás üzenetek elrejtése",
"Matrix Apps": "Mátrix alkalmazások",
"AM": "de",
"PM": "du",
"Revoke widget access": "Kisalkalmazás hozzáférésének visszavonása",
"Sets the room topic": "Szoba téma beállítás",
"Show Apps": "Alkalmazások megmutatása",
"To get started, please pick a username!": "Az induláshoz válassz egy felhasználói nevet!",
"Unable to create widget.": "Nem lehet kisalkalmazást létrehozni.",
"Unbans user with given id": "Visszaengedi a megadott azonosítójú felhasználót",
"You are not in this room.": "Nem vagy ebben a szobában.",
"You do not have permission to do that in this room.": "Nincs jogod ezt tenni ebben a szobában.",
"Verifies a user, device, and pubkey tuple": "A felhasználó, eszköz és publikus kulcs hármas ellenőrzése",
"Autocomplete Delay (ms):": "Várakozás automatikus kiegészítés előtt (ms):",
"This Home server does not support groups": "Ez a saját szerver nem támogatja a csoportokat",
"Loading device info...": "Eszköz információk betöltése...",
"Groups": "Csoportok",
"Create a new group": "Új csoport létrehozása",
"Create Group": "Csoport létrehozása",
"Group Name": "Csoport neve",
"Example": "Példa",
"Create": "Létrehoz",
"Group ID": "Csoport azonosító",
"+example:%(domain)s": "+példa:%(domain)s",
"Group IDs must be of the form +localpart:%(domain)s": "A csoport azonosítónak az alábbi formában kell lennie: +helyirész:%(domain)s",
"It is currently only possible to create groups on your own home server: use a group ID ending with %(domain)s": "Egyenlőre csoportokat csak a saját szerveren lehet létrehozni: használd a csoport azonosítót a %(domain)s végződéssel",
"Room creation failed": "Szoba létrehozás sikertelen",
"You are a member of these groups:": "Ezeknek a csoportoknak vagy a tagja:",
"Create a group to represent your community! Define a set of rooms and your own custom homepage to mark out your space in the Matrix universe.": "Hozz létre csoportot a közösség meghatározásához! Jelölj ki szobákat és saját kezdőoldalt amivel meghatározhatod a territóriumodat a Matrix univerzumában.",
"Join an existing group": "Csatlakozz meglévő csoporthoz",
"To join an exisitng group you'll have to know its group identifier; this will look something like <i>+example:matrix.org</i>.": "Ahhoz, hogy meglévő csoporthoz csatlakozhass tudnod kell a csoport azonosítóját ami valahogy így nézhet ki: <i>+példa:matrix.org</i>.",
"Featured Rooms:": "Kiemelt szobák:",
"Error whilst fetching joined groups": "Hiba a csatlakozott csoportok betöltésénél",
"Featured Users:": "Kiemelt felhasználók:",
"Edit Group": "Csoport szerkesztése",
"Automatically replace plain text Emoji": "Egyszerű szöveg automatikus cseréje Emoji-ra",
"Failed to upload image": "Kép feltöltése sikertelen",
"Failed to update group": "Csoport frissítése sikertelen",
"Hide avatars in user and room mentions": "Profilképek elrejtése felhasználó és szoba említésekben"
}

View file

@ -452,7 +452,7 @@
"People": "사람들",
"Phone": "전화",
"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": "포함된 주소를 따라가서, 아래를 누르세요",
"Once you'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 전화를 걸었어요.",

View file

@ -427,7 +427,7 @@
"OK": "LABI",
"olm version:": "olm versija:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Tiklīdz istabai tiks iespējota šifrēšana, tā vairs nebūs atslēdzama (pašlaik)",
"Once you&#39;ve followed the link it contains, click below": "Tiklīdz sekoji saturā esošajai saitei, noklikšķini zemāk",
"Once you've followed the link it contains, click below": "Tiklīdz sekoji saturā esošajai saitei, noklikšķini zemāk",
"Only people who have been invited": "Vienīgi personas, kuras ir tikušas uzaicinātas",
"Operation failed": "Darbība neizdevās",
"Otherwise, <a>click here</a> to send a bug report.": "pretējā gadījumā, <a>klikšķini šeit</a>, lai nosūtītu paziņojumu par kļūdu.",

View file

@ -1 +1 @@
{}
{}

View file

@ -504,7 +504,7 @@
"New passwords don't match": "Nieuwe wachtwoorden komen niet overeen",
"New passwords must match each other.": "Nieuwe wachtwoorden moeten overeenkomen.",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Zodra versleuteling in een kamer is ingeschakeld kan het niet meer worden uitgeschakeld (voor nu)",
"Once you&#39;ve followed the link it contains, click below": "Zodra je de link dat het bevat hebt gevolgd, klik hieronder",
"Once you've followed the link it contains, click below": "Zodra je de link dat het bevat hebt gevolgd, klik hieronder",
"Only people who have been invited": "Alleen personen die zijn uitgenodigd",
"Otherwise, <a>click here</a> to send a bug report.": "Klik anders <a>hier</a> om een foutmelding te versturen.",
"Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.",

View file

@ -149,7 +149,7 @@
"No users have specific privileges in this room": "Nenhum/a usuário/a possui privilégios específicos nesta sala",
"olm version: ": "Versão do olm: ",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Assim que a criptografia é ativada para uma sala, ela não poderá ser desativada novamente (ainda)",
"Once you&#39;ve followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Once you've followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Only people who have been invited": "Apenas pessoas que tenham sido convidadas",
"or": "ou",
"other": "outro",

View file

@ -149,7 +149,7 @@
"No users have specific privileges in this room": "Nenhum/a usuário/a possui privilégios específicos nesta sala",
"olm version: ": "Versão do olm: ",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Assim que a criptografia é ativada para uma sala, ela não poderá ser desativada novamente (ainda)",
"Once you&#39;ve followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Once you've followed the link it contains, click below": "Quando você tiver clicado no link que está no email, clique o botão abaixo",
"Only people who have been invited": "Apenas pessoas que tenham sido convidadas",
"or": "ou",
"other": "outro",

View file

@ -704,7 +704,7 @@
"Jump to first unread message.": "Перейти к первому непрочитанному сообщению.",
"Message not sent due to unknown devices being present": "Сообщение не отправлено из-за присутствия неизвестных устройств",
"Mobile phone number (optional)": "Номер мобильного телефона (не обязательно)",
"Once you&#39;ve followed the link it contains, click below": "После перехода по ссылке, нажмите на кнопку ниже",
"Once you've followed the link it contains, click below": "После перехода по ссылке, нажмите на кнопку ниже",
"Password:": "Пароль:",
"Privacy warning": "Предупреждение о конфиденциальности",
"Privileged Users": "Привилегированные пользователи",
@ -969,5 +969,14 @@
"Your unverified device '%(displayName)s' is requesting encryption keys.": "Ваше непроверенное устройство '%(displayName)s' запрашивает ключи шифрования.",
"Encryption key request": "Запрос ключа шифрования",
"Updates": "Обновления",
"Check for update": "Проверить наличие обновлений"
"Check for update": "Проверить наличие обновлений",
"Add a widget": "Добавить виджет",
"Allow": "Принять",
"Cannot add any more widgets": "Невозможно добавить больше виджетов",
"Changes colour scheme of current room": "Изменяет цветовую схему текущей комнаты",
"Delete widget": "Удалить виджет",
"Define the power level of a user": "Определить уровень доступа пользователя",
"Do you want to load widget from URL:": "Загрузить виджет из URL-адреса:",
"Edit": "Изменить",
"Enable automatic language detection for syntax highlighting": "Включить автоматическое определение языка для подсветки синтаксиса"
}

View file

@ -429,7 +429,7 @@
"OK": "OK",
"olm version:": "olm-version:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "När kryptering aktiveras i ett rum kan det inte deaktiveras (tills vidare)",
"Once you&#39;ve followed the link it contains, click below": "När du har följt länken i meddelandet, klicka här",
"Once you've followed the link it contains, click below": "När du har följt länken i meddelandet, klicka här",
"Only people who have been invited": "Endast inbjudna",
"Operation failed": "Handlingen misslyckades",
"Otherwise, <a>click here</a> to send a bug report.": "Annars kan du <a>klicka här</a> för att skicka en buggrapport.",

View file

@ -251,7 +251,7 @@
"NOT verified": "ยังไม่ได้ยืนยัน",
"No more results": "ไม่มีผลลัพธ์อื่น",
"No results": "ไม่มีผลลัพธ์",
"Once you&#39;ve followed the link it contains, click below": "หลังจากคุณเปิดลิงก์ข้างในแล้ว คลิกข้างล่าง",
"Once you've followed the link it contains, click below": "หลังจากคุณเปิดลิงก์ข้างในแล้ว คลิกข้างล่าง",
"Passwords can't be empty": "รหัสผ่านต้องไม่ว่าง",
"People": "บุคคล",
"Permissions": "สิทธิ์",

View file

@ -424,7 +424,7 @@
"OK": "Tamam",
"olm version:": "olm versiyon:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Bu oda için şifreleme etkinleştirildikten sonra tekrar kapatılamaz (şimdilik)",
"Once you&#39;ve followed the link it contains, click below": "Bir kere &#39; içerdiği bağlantıyı takip ettikten sonra , aşağıya tıklayın",
"Once you've followed the link it contains, click below": "Bir kere ' içerdiği bağlantıyı takip ettikten sonra , aşağıya tıklayın",
"Only people who have been invited": "Sadece davet edilmiş insanlar",
"Operation failed": "Operasyon başarısız oldu",
"Otherwise, <a>click here</a> to send a bug report.": "Aksi taktirde , bir hata raporu göndermek için <a> buraya tıklayın </a>.",

View file

@ -173,5 +173,32 @@
"No Webcams detected": "Веб-камеру не виявлено",
"Favourites": "Вибрані",
"favourite": "вибране",
"Fill screen": "На весь екран"
"Fill screen": "На весь екран",
"No media permissions": "Нема дозволів на відео/аудіо",
"You may need to manually permit Riot to access your microphone/webcam": "Можливо, вам треба дозволити Riot використання мікрофону/камери вручну",
"Default Device": "Уставний пристрій",
"Microphone": "Мікрофон",
"Camera": "Камера",
"Advanced": "Додаткові",
"Algorithm": "Алгоритм",
"Hide removed messages": "Приховати видалені повідомлення",
"Always show message timestamps": "Завжди показувати часові позначки повідомлень",
"Authentication": "Впізнавання",
"Alias (optional)": "Псевдонім (необов'язково)",
"all room members": "усі члени кімнати",
"all room members, from the point they are invited": "усі члени кімнати з моменту запрошення",
"all room members, from the point they joined": "усі члени кімнати з моменту приєднання",
"and": "та",
"%(items)s and %(remaining)s others": "%(items)s та інші %(remaining)s",
"%(items)s and one other": "%(items)s і ще один інший",
"%(items)s and %(lastItem)s": "%(items)s та %(lastItem)s",
"and %(count)s others...": {
"other": "та %(count)s інші...",
"one": "і інше..."
},
"%(names)s and %(lastPerson)s are typing": "%(names)s та %(lastPerson)s пишуть",
"%(names)s and one other are typing": "%(names)s та інші пишуть",
"%(names)s and %(count)s others are typing": "%(names)s та %(count)s інших пишуть",
"An email has been sent to": "Лист було надіслано",
"A new password must be entered.": "Має бути введений новий пароль."
}

View file

@ -556,7 +556,7 @@
"No users have specific privileges in this room": "此房間中沒有使用者有指定的權限",
"olm version:": "olm 版本:",
"Once encryption is enabled for a room it cannot be turned off again (for now)": "這個房間只要啟用加密就不能再關掉了(從現在開始)",
"Once you&#39;ve followed the link it contains, click below": "一旦您跟著它所包含的連結,點選下方",
"Once you'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>來傳送錯誤報告。",
"Password": "密碼",

View file

@ -231,35 +231,31 @@ export function getCurrentLanguage() {
}
function getLangsJson() {
const deferred = Promise.defer();
request(
{ method: "GET", url: i18nFolder + 'languages.json' },
(err, response, body) => {
if (err || response.status < 200 || response.status >= 300) {
deferred.reject({err: err, response: response});
return;
return new Promise((resolve, reject) => {
request(
{ method: "GET", url: i18nFolder + 'languages.json' },
(err, response, body) => {
if (err || response.status < 200 || response.status >= 300) {
reject({err: err, response: response});
return;
}
resolve(JSON.parse(body));
}
deferred.resolve(JSON.parse(body));
}
);
return deferred.promise;
);
});
}
function getLanguage(langPath) {
const deferred = Promise.defer();
let response_return = {};
request(
{ method: "GET", url: langPath },
(err, response, body) => {
if (err || response.status < 200 || response.status >= 300) {
deferred.reject({err: err, response: response});
return;
return new Promise((resolve, reject) => {
request(
{ method: "GET", url: langPath },
(err, response, body) => {
if (err || response.status < 200 || response.status >= 300) {
reject({err: err, response: response});
return;
}
resolve(JSON.parse(body));
}
deferred.resolve(JSON.parse(body));
}
);
return deferred.promise;
);
});
}