Merge branch 'feat-user-roles' into develop

This commit is contained in:
Håvar Aambø Fosstveit
2020-03-26 21:31:57 +01:00
31 changed files with 1244 additions and 669 deletions
+195 -15
View File
@@ -417,7 +417,7 @@ export default class RoomClient
login()
{
const url = `/auth/login?id=${this._peerId}`;
const url = `/auth/login?peerId=${this._peerId}&roomId=${this._roomId}`;
window.open(url, 'loginWindow');
}
@@ -433,16 +433,8 @@ export default class RoomClient
const { displayName, picture } = data;
if (store.getState().room.state === 'connected')
{
this.changeDisplayName(displayName);
this.changePicture(picture);
}
else
{
store.dispatch(settingsActions.setDisplayName(displayName));
store.dispatch(meActions.setPicture(picture));
}
store.dispatch(settingsActions.setDisplayName(displayName));
store.dispatch(meActions.setPicture(picture));
store.dispatch(meActions.loggedIn(true));
@@ -1155,6 +1147,86 @@ export default class RoomClient
lobbyPeerActions.setLobbyPeerPromotionInProgress(peerId, false));
}
async kickPeer(peerId)
{
logger.debug('kickPeer() [peerId:"%s"]', peerId);
store.dispatch(
peerActions.setPeerKickInProgress(peerId, true));
try
{
await this.sendRequest('moderator:kickPeer', { peerId });
}
catch (error)
{
logger.error('kickPeer() failed: %o', error);
}
store.dispatch(
peerActions.setPeerKickInProgress(peerId, false));
}
async muteAllPeers()
{
logger.debug('muteAllPeers()');
store.dispatch(
roomActions.setMuteAllInProgress(true));
try
{
await this.sendRequest('moderator:muteAll');
}
catch (error)
{
logger.error('muteAllPeers() failed: %o', error);
}
store.dispatch(
roomActions.setMuteAllInProgress(false));
}
async stopAllPeerVideo()
{
logger.debug('stopAllPeerVideo()');
store.dispatch(
roomActions.setStopAllVideoInProgress(true));
try
{
await this.sendRequest('moderator:stopAllVideo');
}
catch (error)
{
logger.error('stopAllPeerVideo() failed: %o', error);
}
store.dispatch(
roomActions.setStopAllVideoInProgress(false));
}
async closeMeeting()
{
logger.debug('closeMeeting()');
store.dispatch(
roomActions.setCloseMeetingInProgress(true));
try
{
await this.sendRequest('moderator:closeMeeting');
}
catch (error)
{
logger.error('closeMeeting() failed: %o', error);
}
store.dispatch(
roomActions.setCloseMeetingInProgress(false));
}
// type: mic/webcam/screen
// mute: true/false
async modifyPeerConsumer(peerId, type, mute)
@@ -1914,10 +1986,10 @@ export default class RoomClient
case 'newPeer':
{
const { id, displayName, picture } = notification.data;
const { id, displayName, picture, roles } = notification.data;
store.dispatch(
peerActions.addPeer({ id, displayName, picture, consumers: [] }));
peerActions.addPeer({ id, displayName, picture, roles, consumers: [] }));
store.dispatch(requestActions.notify(
{
@@ -2016,6 +2088,96 @@ export default class RoomClient
break;
}
case 'moderator:mute':
{
// const { peerId } = notification.data;
if (this._micProducer && !this._micProducer.paused)
{
this.muteMic();
store.dispatch(requestActions.notify(
{
text : intl.formatMessage({
id : 'moderator.mute',
defaultMessage : 'Moderator muted your microphone'
})
}));
}
break;
}
case 'moderator:stopVideo':
{
// const { peerId } = notification.data;
this.disableWebcam();
this.disableScreenSharing();
store.dispatch(requestActions.notify(
{
text : intl.formatMessage({
id : 'moderator.mute',
defaultMessage : 'Moderator stopped your video'
})
}));
break;
}
case 'moderator:kick':
{
// Need some feedback
this.close();
break;
}
case 'gotRole':
{
const { peerId, role } = notification.data;
if (peerId === this._peerId)
{
store.dispatch(meActions.addRole(role));
store.dispatch(requestActions.notify(
{
text : intl.formatMessage({
id : 'roles.gotRole',
defaultMessage : `You got the role: ${role}`
})
}));
}
else
store.dispatch(peerActions.addPeerRole(peerId, role));
break;
}
case 'lostRole':
{
const { peerId, role } = notification.data;
if (peerId === this._peerId)
{
store.dispatch(meActions.removeRole(role));
store.dispatch(requestActions.notify(
{
text : intl.formatMessage({
id : 'roles.lostRole',
defaultMessage : `You lost the role: ${role}`
})
}));
}
else
store.dispatch(peerActions.removePeerRole(peerId, role));
break;
}
default:
{
@@ -2195,7 +2357,7 @@ export default class RoomClient
canShareFiles : this._torrentSupport
}));
const { peers } = await this.sendRequest(
const { roles, peers } = await this.sendRequest(
'join',
{
displayName : displayName,
@@ -2203,7 +2365,25 @@ export default class RoomClient
rtpCapabilities : this._mediasoupDevice.rtpCapabilities
});
logger.debug('_joinRoom() joined, got peers [peers:"%o"]', peers);
logger.debug('_joinRoom() joined [peers:"%o", roles:"%o"]', peers, roles);
const myRoles = store.getState().me.roles;
for (const role of roles)
{
if (!myRoles.includes(role))
{
store.dispatch(meActions.addRole(role));
store.dispatch(requestActions.notify(
{
text : intl.formatMessage({
id : 'roles.gotRole',
defaultMessage : `You got the role: ${role}`
})
}));
}
}
for (const peer of peers)
{
+12
View File
@@ -15,6 +15,18 @@ export const loggedIn = (flag) =>
payload : { flag }
});
export const addRole = (role) =>
({
type : 'ADD_ROLE',
payload : { role }
});
export const removeRole = (role) =>
({
type : 'REMOVE_ROLE',
payload : { role }
});
export const setPicture = (picture) =>
({
type : 'SET_PICTURE',
+19
View File
@@ -45,3 +45,22 @@ export const setPeerPicture = (peerId, picture) =>
type : 'SET_PEER_PICTURE',
payload : { peerId, picture }
});
export const addPeerRole = (peerId, role) =>
({
type : 'ADD_PEER_ROLE',
payload : { peerId, role }
});
export const removePeerRole = (peerId, role) =>
({
type : 'REMOVE_PEER_ROLE',
payload : { peerId, role }
});
export const setPeerKickInProgress = (peerId, flag) =>
({
type : 'SET_PEER_KICK_IN_PROGRESS',
payload : { peerId, flag }
});
+18
View File
@@ -109,4 +109,22 @@ export const toggleConsumerFullscreen = (consumerId) =>
({
type : 'TOGGLE_FULLSCREEN_CONSUMER',
payload : { consumerId }
});
export const setMuteAllInProgress = (flag) =>
({
type : 'MUTE_ALL_IN_PROGRESS',
payload : { flag }
});
export const setStopAllVideoInProgress = (flag) =>
({
type : 'STOP_ALL_VIDEO_IN_PROGRESS',
payload : { flag }
});
export const setCloseMeetingInProgress = (flag) =>
({
type : 'CLOSE_MEETING_IN_PROGRESS',
payload : { flag }
});
+5 -98
View File
@@ -1,21 +1,15 @@
import React, { useState, useEffect } from 'react';
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { withStyles } from '@material-ui/core/styles';
import { withRoomContext } from '../RoomContext';
import isElectron from 'is-electron';
import PropTypes from 'prop-types';
import { useIntl, FormattedMessage } from 'react-intl';
import randomString from 'random-string';
import Dialog from '@material-ui/core/Dialog';
import DialogContentText from '@material-ui/core/DialogContentText';
import IconButton from '@material-ui/core/IconButton';
import AccountCircle from '@material-ui/icons/AccountCircle';
import Avatar from '@material-ui/core/Avatar';
import Typography from '@material-ui/core/Typography';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Tooltip from '@material-ui/core/Tooltip';
import CookieConsent from 'react-cookie-consent';
import MuiDialogTitle from '@material-ui/core/DialogTitle';
import MuiDialogContent from '@material-ui/core/DialogContent';
@@ -88,63 +82,12 @@ const styles = (theme) =>
const DialogTitle = withStyles(styles)((props) =>
{
const [ open, setOpen ] = useState(false);
const intl = useIntl();
useEffect(() =>
{
const openTimer = setTimeout(() => setOpen(true), 1000);
const closeTimer = setTimeout(() => setOpen(false), 4000);
return () =>
{
clearTimeout(openTimer);
clearTimeout(closeTimer);
};
}, []);
const { children, classes, myPicture, onLogin, ...other } = props;
const handleTooltipClose = () =>
{
setOpen(false);
};
const handleTooltipOpen = () =>
{
setOpen(true);
};
const { children, classes, ...other } = props;
return (
<MuiDialogTitle disableTypography className={classes.dialogTitle} {...other}>
{ window.config && window.config.logo && <img alt='Logo' className={classes.logo} src={window.config.logo} /> }
<Typography variant='h5'>{children}</Typography>
{ window.config && window.config.loginEnabled &&
<Tooltip
onClose={handleTooltipClose}
onOpen={handleTooltipOpen}
open={open}
title={intl.formatMessage({
id : 'tooltip.login',
defaultMessage : 'Click to log in'
})}
placement='left'
>
<IconButton
aria-label='Account'
className={classes.loginButton}
color='inherit'
onClick={onLogin}
>
{ myPicture ?
<Avatar src={myPicture} className={classes.largeAvatar} />
:
<AccountCircle className={classes.largeIcon} />
}
</IconButton>
</Tooltip>
}
</MuiDialogTitle>
);
});
@@ -165,9 +108,6 @@ const DialogActions = withStyles((theme) => ({
}))(MuiDialogActions);
const ChooseRoom = ({
roomClient,
loggedIn,
myPicture,
classes
}) =>
{
@@ -184,13 +124,7 @@ const ChooseRoom = ({
paper : classes.dialogPaper
}}
>
<DialogTitle
myPicture={myPicture}
onLogin={() =>
{
loggedIn ? roomClient.logout() : roomClient.login();
}}
>
<DialogTitle>
{ window.config && window.config.title ? window.config.title : 'Multiparty meeting' }
<hr />
</DialogTitle>
@@ -258,34 +192,7 @@ const ChooseRoom = ({
ChooseRoom.propTypes =
{
roomClient : PropTypes.any.isRequired,
loginEnabled : PropTypes.bool.isRequired,
loggedIn : PropTypes.bool.isRequired,
myPicture : PropTypes.string,
classes : PropTypes.object.isRequired
classes : PropTypes.object.isRequired
};
const mapStateToProps = (state) =>
{
return {
loginEnabled : state.me.loginEnabled,
loggedIn : state.me.loggedIn,
myPicture : state.me.picture
};
};
export default withRoomContext(connect(
mapStateToProps,
null,
null,
{
areStatesEqual : (next, prev) =>
{
return (
prev.me.loginEnabled === next.me.loginEnabled &&
prev.me.loggedIn === next.me.loggedIn &&
prev.me.picture === next.me.picture
);
}
}
)(withStyles(styles)(ChooseRoom)));
export default withStyles(styles)(ChooseRoom);
@@ -0,0 +1,118 @@
import React from 'react';
import { connect } from 'react-redux';
import { withStyles } from '@material-ui/core/styles';
import PropTypes from 'prop-types';
import { withRoomContext } from '../../../RoomContext';
import { useIntl, FormattedMessage } from 'react-intl';
import Button from '@material-ui/core/Button';
const styles = (theme) =>
({
root :
{
padding : theme.spacing(1),
width : '100%',
overflow : 'hidden',
cursor : 'auto',
display : 'flex'
},
actionButtons :
{
display : 'flex'
},
divider :
{
marginLeft : theme.spacing(2)
}
});
const ListModerator = (props) =>
{
const intl = useIntl();
const {
roomClient,
room,
classes
} = props;
return (
<div className={classes.root}>
<Button
aria-label={intl.formatMessage({
id : 'room.muteAll',
defaultMessage : 'Mute all'
})}
className={classes.actionButton}
variant='contained'
color='secondary'
disabled={room.muteAllInProgress}
onClick={() => roomClient.muteAllPeers()}
>
<FormattedMessage
id='room.muteAll'
defaultMessage='Mute all'
/>
</Button>
<div className={classes.divider} />
<Button
aria-label={intl.formatMessage({
id : 'room.stopAllVideo',
defaultMessage : 'Stop all video'
})}
className={classes.actionButton}
variant='contained'
color='secondary'
disabled={room.stopAllVideoInProgress}
onClick={() => roomClient.stopAllPeerVideo()}
>
<FormattedMessage
id='room.stopAllVideo'
defaultMessage='Stop all video'
/>
</Button>
<div className={classes.divider} />
<Button
aria-label={intl.formatMessage({
id : 'room.closeMeeting',
defaultMessage : 'Close meeting'
})}
className={classes.actionButton}
variant='contained'
color='secondary'
disabled={room.closeMeetingInProgress}
onClick={() => roomClient.closeMeeting()}
>
<FormattedMessage
id='room.closeMeeting'
defaultMessage='Close meeting'
/>
</Button>
</div>
);
};
ListModerator.propTypes =
{
roomClient : PropTypes.any.isRequired,
room : PropTypes.object.isRequired,
classes : PropTypes.object.isRequired
};
const mapStateToProps = (state) => ({
room : state.room
});
export default withRoomContext(connect(
mapStateToProps,
null,
null,
{
areStatesEqual : (next, prev) =>
{
return (
prev.room === next.room
);
}
}
)(withStyles(styles)(ListModerator)));
@@ -12,6 +12,7 @@ import MicIcon from '@material-ui/icons/Mic';
import MicOffIcon from '@material-ui/icons/MicOff';
import ScreenIcon from '@material-ui/icons/ScreenShare';
import ScreenOffIcon from '@material-ui/icons/StopScreenShare';
import ExitIcon from '@material-ui/icons/ExitToApp';
import EmptyAvatar from '../../../images/avatar-empty.jpeg';
import HandIcon from '../../../images/icon-hand-white.svg';
@@ -91,40 +92,6 @@ const styles = (theme) =>
flexDirection : 'row',
justifyContent : 'flex-start',
alignItems : 'center'
},
button :
{
flex : '0 0 auto',
margin : '0.3rem',
borderRadius : 2,
backgroundColor : 'rgba(0, 0, 0, 0.5)',
cursor : 'pointer',
transitionProperty : 'opacity, background-color',
transitionDuration : '0.15s',
width : 'var(--media-control-button-size)',
height : 'var(--media-control-button-size)',
opacity : 0.85,
'&:hover' :
{
opacity : 1
},
'&.unsupported' :
{
pointerEvents : 'none'
},
'&.disabled' :
{
pointerEvents : 'none',
backgroundColor : 'var(--media-control-botton-disabled)'
},
'&.on' :
{
backgroundColor : 'var(--media-control-botton-on)'
},
'&.off' :
{
backgroundColor : 'var(--media-control-botton-off)'
}
}
});
@@ -134,6 +101,7 @@ const ListPeer = (props) =>
const {
roomClient,
isModerator,
peer,
micConsumer,
screenConsumer,
@@ -185,9 +153,8 @@ const ListPeer = (props) =>
})}
color={ screenVisible ? 'primary' : 'secondary'}
disabled={ peer.peerScreenInProgress }
onClick={(e) =>
onClick={() =>
{
e.stopPropagation();
screenVisible ?
roomClient.modifyPeerConsumer(peer.id, 'screen', true) :
roomClient.modifyPeerConsumer(peer.id, 'screen', false);
@@ -207,9 +174,8 @@ const ListPeer = (props) =>
})}
color={ micEnabled ? 'primary' : 'secondary'}
disabled={ peer.peerAudioInProgress }
onClick={(e) =>
onClick={() =>
{
e.stopPropagation();
micEnabled ?
roomClient.modifyPeerConsumer(peer.id, 'mic', true) :
roomClient.modifyPeerConsumer(peer.id, 'mic', false);
@@ -221,6 +187,21 @@ const ListPeer = (props) =>
<MicOffIcon />
}
</IconButton>
{ isModerator &&
<IconButton
aria-label={intl.formatMessage({
id : 'tooltip.kickParticipant',
defaultMessage : 'Kick out participant'
})}
disabled={ peer.peerKickInProgress }
onClick={() =>
{
roomClient.kickPeer(peer.id);
}}
>
<ExitIcon />
</IconButton>
}
</div>
</div>
);
@@ -230,6 +211,7 @@ ListPeer.propTypes =
{
roomClient : PropTypes.any.isRequired,
advancedMode : PropTypes.bool,
isModerator : PropTypes.bool,
peer : appPropTypes.Peer.isRequired,
micConsumer : appPropTypes.Consumer,
webcamConsumer : appPropTypes.Consumer,
@@ -11,7 +11,9 @@ import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import ListPeer from './ListPeer';
import ListMe from './ListMe';
import ListModerator from './ListModerator';
import Volume from '../../Containers/Volume';
import * as userRoles from '../../../reducers/userRoles';
const styles = (theme) =>
({
@@ -76,6 +78,7 @@ class ParticipantList extends React.PureComponent
const {
roomClient,
advancedMode,
isModerator,
passivePeers,
selectedPeerId,
spotlightPeers,
@@ -84,6 +87,17 @@ class ParticipantList extends React.PureComponent
return (
<div className={classes.root} ref={(node) => { this.node = node; }}>
{ isModerator &&
<ul className={classes.list}>
<li className={classes.listheader}>
<FormattedMessage
id='room.moderatoractions'
defaultMessage='Moderator actions'
/>
</li>
<ListModerator />
</ul>
}
<ul className={classes.list}>
<li className={classes.listheader}>
<FormattedMessage
@@ -108,7 +122,7 @@ class ParticipantList extends React.PureComponent
})}
onClick={() => roomClient.setSelectedPeer(peerId)}
>
<ListPeer id={peerId} advancedMode={advancedMode}>
<ListPeer id={peerId} advancedMode={advancedMode} isModerator={isModerator}>
<Volume small id={peerId} />
</ListPeer>
</li>
@@ -129,7 +143,11 @@ class ParticipantList extends React.PureComponent
})}
onClick={() => roomClient.setSelectedPeer(peerId)}
>
<ListPeer id={peerId} advancedMode={advancedMode} />
<ListPeer
id={peerId}
advancedMode={advancedMode}
isModerator={isModerator}
/>
</li>
))}
</ul>
@@ -142,6 +160,7 @@ ParticipantList.propTypes =
{
roomClient : PropTypes.any.isRequired,
advancedMode : PropTypes.bool,
isModerator : PropTypes.bool,
passivePeers : PropTypes.array,
selectedPeerId : PropTypes.string,
spotlightPeers : PropTypes.array,
@@ -151,6 +170,8 @@ ParticipantList.propTypes =
const mapStateToProps = (state) =>
{
return {
isModerator : state.me.roles.includes(userRoles.MODERATOR) ||
state.me.roles.includes(userRoles.ADMIN),
passivePeers : passivePeersSelector(state),
selectedPeerId : state.room.selectedPeerId,
spotlightPeers : spotlightPeersSelector(state)
@@ -165,6 +186,7 @@ const ParticipantListContainer = withRoomContext(connect(
areStatesEqual : (next, prev) =>
{
return (
prev.me.roles === next.me.roles &&
prev.peers === next.peers &&
prev.room.spotlights === next.room.spotlights &&
prev.room.selectedPeerId === next.room.selectedPeerId
+21
View File
@@ -1,8 +1,11 @@
import * as userRoles from './userRoles';
const initialState =
{
id : null,
picture : null,
isMobile : false,
roles : [ userRoles.ALL ],
canSendMic : false,
canSendWebcam : false,
canShareScreen : false,
@@ -49,6 +52,24 @@ const me = (state = initialState, action) =>
return { ...state, loggedIn: flag };
}
case 'ADD_ROLE':
{
if (state.roles.includes(action.payload.role))
return state;
const roles = [ ...state.roles, action.payload.role ];
return { ...state, roles };
}
case 'REMOVE_ROLE':
{
const roles = state.roles.filter((role) =>
role !== action.payload.role);
return { ...state, roles };
}
case 'SET_PICTURE':
return { ...state, picture: action.payload.picture };
+21
View File
@@ -16,6 +16,9 @@ const peer = (state = {}, action) =>
case 'SET_PEER_SCREEN_IN_PROGRESS':
return { ...state, peerScreenInProgress: action.payload.flag };
case 'SET_PEER_KICK_IN_PROGRESS':
return { ...state, peerKickInProgress: action.payload.flag };
case 'SET_PEER_RAISE_HAND_STATE':
return { ...state, raiseHandState: action.payload.raiseHandState };
@@ -40,6 +43,21 @@ const peer = (state = {}, action) =>
return { ...state, picture: action.payload.picture };
}
case 'ADD_PEER_ROLE':
{
const roles = [ ...state.roles, action.payload.role ];
return { ...state, roles };
}
case 'REMOVE_PEER_ROLE':
{
const roles = state.roles.filter((role) =>
role !== action.payload.role);
return { ...state, roles };
}
default:
return state;
}
@@ -71,6 +89,8 @@ const peers = (state = {}, action) =>
case 'SET_PEER_RAISE_HAND_STATE':
case 'SET_PEER_PICTURE':
case 'ADD_CONSUMER':
case 'ADD_PEER_ROLE':
case 'REMOVE_PEER_ROLE':
{
const oldPeer = state[action.payload.peerId];
@@ -82,6 +102,7 @@ const peers = (state = {}, action) =>
return { ...state, [oldPeer.id]: peer(oldPeer, action) };
}
case 'SET_PEER_KICK_IN_PROGRESS':
case 'REMOVE_CONSUMER':
{
const oldPeer = state[action.payload.peerId];
+32 -20
View File
@@ -1,24 +1,27 @@
const initialState =
{
name : '',
state : 'new', // new/connecting/connected/disconnected/closed,
locked : false,
inLobby : false,
signInRequired : false,
accessCode : '', // access code to the room if locked and joinByAccessCode == true
joinByAccessCode : true, // if true: accessCode is a possibility to open the room
activeSpeakerId : null,
torrentSupport : false,
showSettings : false,
fullScreenConsumer : null, // ConsumerID
windowConsumer : null, // ConsumerID
toolbarsVisible : true,
mode : 'democratic',
selectedPeerId : null,
spotlights : [],
settingsOpen : false,
lockDialogOpen : false,
joined : false
name : '',
state : 'new', // new/connecting/connected/disconnected/closed,
locked : false,
inLobby : false,
signInRequired : false,
accessCode : '', // access code to the room if locked and joinByAccessCode == true
joinByAccessCode : true, // if true: accessCode is a possibility to open the room
activeSpeakerId : null,
torrentSupport : false,
showSettings : false,
fullScreenConsumer : null, // ConsumerID
windowConsumer : null, // ConsumerID
toolbarsVisible : true,
mode : 'democratic',
selectedPeerId : null,
spotlights : [],
settingsOpen : false,
lockDialogOpen : false,
joined : false,
muteAllInProgress : false,
stopAllVideoInProgress : false,
closeMeetingInProgress : false
};
const room = (state = initialState, action) =>
@@ -110,7 +113,7 @@ const room = (state = initialState, action) =>
case 'TOGGLE_JOINED':
{
const joined = !state.joined;
const joined = true;
return { ...state, joined };
}
@@ -163,6 +166,15 @@ const room = (state = initialState, action) =>
return { ...state, spotlights };
}
case 'MUTE_ALL_IN_PROGRESS':
return { ...state, muteAllInProgress: action.payload.flag };
case 'STOP_ALL_VIDEO_IN_PROGRESS':
return { ...state, stopAllVideoInProgress: action.payload.flag };
case 'CLOSE_MEETING_IN_PROGRESS':
return { ...state, closeMeetingInProgress: action.payload.flag };
default:
return state;
}
+4
View File
@@ -0,0 +1,4 @@
export const ADMIN = 'admin';
export const MODERATOR = 'moderator';
export const AUTHENTICATED = 'authenticated';
export const ALL = 'normal';
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Spotlight中的参与者",
"room.passive": "被动参与者",
"room.videoPaused": "该视频已暂停",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "登录",
"tooltip.logout": "注销",
@@ -60,6 +63,7 @@
"tooltip.lobby": "显示大厅",
"tooltip.settings": "显示设置",
"tooltip.participants": "显示参加者",
"tooltip.kickParticipant": null,
"label.roomName": "房间名称",
"label.chooseRoomButton": "继续",
+7 -3
View File
@@ -4,7 +4,7 @@
"socket.reconnected": "Verbindung wieder herges|tellt",
"socket.requestError": "Fehler bei Serveranfrage",
"room.chooseRoom": "Choose the name of the room you would like to join",
"room.chooseRoom": null,
"room.cookieConsent": "Diese Seite verwendet Cookies, um die Benutzerfreundlichkeit zu erhöhen",
"room.consentUnderstand": "I understand",
"room.joined": "Konferenzraum betreten",
@@ -49,6 +49,9 @@
"room.spotlights": "Aktive Teinehmer",
"room.passive": "Passive Teilnehmer",
"room.videoPaused": "Video gestoppt",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Anmelden",
"tooltip.logout": "Abmelden",
@@ -60,9 +63,10 @@
"tooltip.lobby": "Warteraum",
"tooltip.settings": "Einstellungen",
"tooltip.participants": "Teilnehmer",
"tooltip.kickParticipant": null,
"label.roomName": "Room name",
"label.chooseRoomButton": "Continue",
"label.roomName": null,
"label.chooseRoomButton": null,
"label.yourName": "Dein Name",
"label.newWindow": "In separatem Fenster öffnen",
"label.fullscreen": "Vollbild",
+5 -1
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Deltagere i fokus",
"room.passive": "Passive deltagere",
"room.videoPaused": "Denne video er sat på pause",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Log ind",
"tooltip.logout": "Log ud",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Vis lobby",
"tooltip.settings": "Vis indstillinger",
"tooltip.participants": "Vis deltagere",
"tooltip.kickParticipant": null,
"label.roomName": "Værelsesnavn",
"label.chooseRoomButton": "Fortsæt",
@@ -106,7 +110,7 @@
"filesharing.finished": "Filen er færdig med at downloade",
"filesharing.save": "Gem",
"filesharing.sharedFile": "{displayName} delte en fil",
"filesharing.download": "Download",
"filesharing.download": null,
"filesharing.missingSeeds": "Hvis denne proces tager lang tid, er der muligvis ikke nogen, der seedede denne torrent. Prøv at bede nogen om at uploade den fil, du ønsker at hente.",
"device.devicesChanged": "Detekteret ndringer i dine enheder, konfigurer dine enheder i indstillingsdialogen",
+6 -2
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Συμμετέχοντες στο Spotlight",
"room.passive": "Παθητικοί συμμετέχοντες",
"room.videoPaused": "Το βίντεο έχει σταματήσει",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Σύνδεση",
"tooltip.logout": "Αποσύνδεση",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Εμφάνιση λόμπι",
"tooltip.settings": "Εμφάνιση ρυθμίσεων",
"tooltip.participants": "Εμφάνιση συμμετεχόντων",
"tooltip.kickParticipant": null,
"label.roomName": "Όνομα δωματίου",
"label.chooseRoomButton": "Συνέχεια",
@@ -75,8 +79,8 @@
"label.shareFile": "Διαμοιραστείτε ένα αρχείο",
"label.fileSharingUnsupported": "Ο διαμοιρασμός αρχείων δεν υποστηρίζεται",
"label.unknown": "Άγνωστο",
"label.democratic": "Democratic view",
"label.filmstrip": "Filmstrip view",
"label.democratic": null,
"label.filmstrip": null,
"label.low": "Χαμηλή",
"label.medium": "Μέτρια",
"label.high": "Υψηλή (HD)",
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Participants in Spotlight",
"room.passive": "Passive Participants",
"room.videoPaused": "This video is paused",
"room.muteAll": "Mute all",
"room.stopAllVideo": "Stop all video",
"room.closeMeeting": "Close meeting",
"tooltip.login": "Log in",
"tooltip.logout": "Log out",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Show lobby",
"tooltip.settings": "Show settings",
"tooltip.participants": "Show participants",
"tooltip.kickParticipant": "Kick out participant",
"label.roomName": "Room name",
"label.chooseRoomButton": "Continue",
+130 -126
View File
@@ -1,140 +1,144 @@
{
"socket.disconnected": "Desconectado",
"socket.reconnecting": "Desconectado, intentando reconectar",
"socket.reconnected": "Reconectado",
"socket.requestError": "Error en la petición al servidor",
"socket.disconnected": "Desconectado",
"socket.reconnecting": "Desconectado, intentando reconectar",
"socket.reconnected": "Reconectado",
"socket.requestError": "Error en la petición al servidor",
"room.chooseRoom": "Indique el nombre de la sala a la que le gustaría unirse",
"room.cookieConsent": "Esta web utiliza cookies para mejorar la experiencia de usuario",
"room.consentUnderstand": "I understand",
"room.joined": "Se ha unido a la sala",
"room.cantJoin": "No ha sido posible unirse a la sala",
"room.youLocked": "Ha cerrado la sala",
"room.cantLock": "No ha sido posible cerrar la sala",
"room.youUnLocked": "Ha abierto la sala",
"room.cantUnLock": "No ha sido posible abrir la sala",
"room.locked": "La sala ahora es privada",
"room.unlocked": "La sala ahora es pública",
"room.newLobbyPeer": "Nuevo participante en la sala de espera",
"room.lobbyPeerLeft": "Un participante en espera ha salido",
"room.lobbyPeerChangedDisplayName": "Participante en espera cambió su nombre a {displayName}",
"room.lobbyPeerChangedPicture": "Participante en espera cambió su foto",
"room.setAccessCode": "Código de acceso de la sala actualizado",
"room.accessCodeOn": "Código de acceso de la sala activado",
"room.accessCodeOff": "Código de acceso de la sala desactivado",
"room.peerChangedDisplayName": "{oldDisplayName} es ahora {displayName}",
"room.newPeer": "{displayName} se unió a la sala",
"room.newFile": "Nuevo fichero disponible",
"room.toggleAdvancedMode": "Cambiado a modo avanzado",
"room.setDemocraticView": "Cambiado a modo democrático",
"room.setFilmStripView": "Cambiado a modo viñeta",
"room.loggedIn": "Ha iniciado sesión",
"room.loggedOut": "Ha cerrado su sesión",
"room.changedDisplayName": "Ha cambiado su nombre a {displayName}",
"room.changeDisplayNameError": "Hubo un error al intentar cambiar su nombre",
"room.chatError": "No ha sido posible enviar su mensaje",
"room.aboutToJoin": "Está a punto de unirse a una reunión",
"room.roomId": "ID de la sala: {roomName}",
"room.setYourName": "Indique el nombre con el que quiere participar y cómo quiere unirse:",
"room.audioOnly": "Solo sonido",
"room.audioVideo": "Sonido y vídeo",
"room.youAreReady": "Ok, está preparado",
"room.emptyRequireLogin": "¡La sala está vacía! Puede iniciar sesión para comenzar la reunión o esperar hasta que el anfitrión se una",
"room.locketWait": "La sala es privada - espere hasta que alguien le invite ...",
"room.lobbyAdministration": "Administración de la sala de espera",
"room.peersInLobby": "Participantes en la sala de espera",
"room.lobbyEmpty": "La sala de espera está vacía",
"room.hiddenPeers": "{hiddenPeersCount, plural, one {participante} other {participantes}}",
"room.me": "Yo",
"room.spotlights": "Participantes destacados",
"room.passive": "Participantes pasivos",
"room.videoPaused": "El vídeo está pausado",
"room.chooseRoom": "Indique el nombre de la sala a la que le gustaría unirse",
"room.cookieConsent": "Esta web utiliza cookies para mejorar la experiencia de usuario",
"room.consentUnderstand": "I understand",
"room.joined": "Se ha unido a la sala",
"room.cantJoin": "No ha sido posible unirse a la sala",
"room.youLocked": "Ha cerrado la sala",
"room.cantLock": "No ha sido posible cerrar la sala",
"room.youUnLocked": "Ha abierto la sala",
"room.cantUnLock": "No ha sido posible abrir la sala",
"room.locked": "La sala ahora es privada",
"room.unlocked": "La sala ahora es pública",
"room.newLobbyPeer": "Nuevo participante en la sala de espera",
"room.lobbyPeerLeft": "Un participante en espera ha salido",
"room.lobbyPeerChangedDisplayName": "Participante en espera cambió su nombre a {displayName}",
"room.lobbyPeerChangedPicture": "Participante en espera cambió su foto",
"room.setAccessCode": "Código de acceso de la sala actualizado",
"room.accessCodeOn": "Código de acceso de la sala activado",
"room.accessCodeOff": "Código de acceso de la sala desactivado",
"room.peerChangedDisplayName": "{oldDisplayName} es ahora {displayName}",
"room.newPeer": "{displayName} se unió a la sala",
"room.newFile": "Nuevo fichero disponible",
"room.toggleAdvancedMode": "Cambiado a modo avanzado",
"room.setDemocraticView": "Cambiado a modo democrático",
"room.setFilmStripView": "Cambiado a modo viñeta",
"room.loggedIn": "Ha iniciado sesión",
"room.loggedOut": "Ha cerrado su sesión",
"room.changedDisplayName": "Ha cambiado su nombre a {displayName}",
"room.changeDisplayNameError": "Hubo un error al intentar cambiar su nombre",
"room.chatError": "No ha sido posible enviar su mensaje",
"room.aboutToJoin": "Está a punto de unirse a una reunión",
"room.roomId": "ID de la sala: {roomName}",
"room.setYourName": "Indique el nombre con el que quiere participar y cómo quiere unirse:",
"room.audioOnly": "Solo sonido",
"room.audioVideo": "Sonido y vídeo",
"room.youAreReady": "Ok, está preparado",
"room.emptyRequireLogin": "¡La sala está vacía! Puede iniciar sesión para comenzar la reunión o esperar hasta que el anfitrión se una",
"room.locketWait": "La sala es privada - espere hasta que alguien le invite ...",
"room.lobbyAdministration": "Administración de la sala de espera",
"room.peersInLobby": "Participantes en la sala de espera",
"room.lobbyEmpty": "La sala de espera está vacía",
"room.hiddenPeers": "{hiddenPeersCount, plural, one {participante} other {participantes}}",
"room.me": "Yo",
"room.spotlights": "Participantes destacados",
"room.passive": "Participantes pasivos",
"room.videoPaused": "El vídeo está pausado",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Entrar",
"tooltip.logout": "Salir",
"tooltip.admitFromLobby": "Admitir desde la sala de espera",
"tooltip.lockRoom": "Configurar sala como privada",
"tooltip.unLockRoom": "Configurar sala como pública",
"tooltip.enterFullscreen": "Presentar en pantalla completa",
"tooltip.leaveFullscreen": "Salir de la pantalla completa",
"tooltip.lobby": "Mostrar sala de espera",
"tooltip.settings": "Mostrar ajustes",
"tooltip.participants": "Mostrar participantes",
"tooltip.login": "Entrar",
"tooltip.logout": "Salir",
"tooltip.admitFromLobby": "Admitir desde la sala de espera",
"tooltip.lockRoom": "Configurar sala como privada",
"tooltip.unLockRoom": "Configurar sala como pública",
"tooltip.enterFullscreen": "Presentar en pantalla completa",
"tooltip.leaveFullscreen": "Salir de la pantalla completa",
"tooltip.lobby": "Mostrar sala de espera",
"tooltip.settings": "Mostrar ajustes",
"tooltip.participants": "Mostrar participantes",
"tooltip.kickParticipant": null,
"label.roomName": "Nombre de la sala",
"label.chooseRoomButton": "Continuar",
"label.yourName": "Su nombre",
"label.newWindow": "Nueva ventana",
"label.fullscreen": "Pantalla completa",
"label.openDrawer": "Abrir panel",
"label.leave": "Salir",
"label.chatInput": "Escriba su mensaje...",
"label.chat": "Chat",
"label.filesharing": "Compartir ficheros",
"label.participants": "Participantes",
"label.shareFile": "Compartir fichero",
"label.fileSharingUnsupported": "Compartir ficheros no está disponible",
"label.unknown": "Desconocido",
"label.democratic": "Vista democrática",
"label.filmstrip": "Vista en viñeta",
"label.low": "Baja",
"label.medium": "Media",
"label.high": "Alta (HD)",
"label.veryHigh": "Muy alta (FHD)",
"label.ultra": "Ultra (UHD)",
"label.close": "Cerrar",
"label.roomName": "Nombre de la sala",
"label.chooseRoomButton": "Continuar",
"label.yourName": "Su nombre",
"label.newWindow": "Nueva ventana",
"label.fullscreen": "Pantalla completa",
"label.openDrawer": "Abrir panel",
"label.leave": "Salir",
"label.chatInput": "Escriba su mensaje...",
"label.chat": "Chat",
"label.filesharing": "Compartir ficheros",
"label.participants": "Participantes",
"label.shareFile": "Compartir fichero",
"label.fileSharingUnsupported": "Compartir ficheros no está disponible",
"label.unknown": "Desconocido",
"label.democratic": "Vista democrática",
"label.filmstrip": "Vista en viñeta",
"label.low": "Baja",
"label.medium": "Media",
"label.high": "Alta (HD)",
"label.veryHigh": "Muy alta (FHD)",
"label.ultra": "Ultra (UHD)",
"label.close": "Cerrar",
"settings.settings": "Ajustes",
"settings.camera": "Cámara",
"settings.selectCamera": "Seleccionar dispositivo de vídeo",
"settings.cantSelectCamera": "No ha sido posible seleccionar el dispositivo de vídeo",
"settings.audio": "Dispositivo de sonido",
"settings.selectAudio": "Seleccione dispositivo de sonido",
"settings.cantSelectAudio": "No ha sido posible seleccionar el dispositivo de sonido",
"settings.resolution": "Seleccione su resolución de imagen",
"settings.layout": "Disposición de la sala",
"settings.selectRoomLayout": "Seleccione la disposición de la sala",
"settings.advancedMode": "Modo avanzado",
"settings.permanentTopBar": "Barra superior permanente",
"settings.lastn": "Cantidad de videos visibles",
"settings.settings": "Ajustes",
"settings.camera": "Cámara",
"settings.selectCamera": "Seleccionar dispositivo de vídeo",
"settings.cantSelectCamera": "No ha sido posible seleccionar el dispositivo de vídeo",
"settings.audio": "Dispositivo de sonido",
"settings.selectAudio": "Seleccione dispositivo de sonido",
"settings.cantSelectAudio": "No ha sido posible seleccionar el dispositivo de sonido",
"settings.resolution": "Seleccione su resolución de imagen",
"settings.layout": "Disposición de la sala",
"settings.selectRoomLayout": "Seleccione la disposición de la sala",
"settings.advancedMode": "Modo avanzado",
"settings.permanentTopBar": "Barra superior permanente",
"settings.lastn": "Cantidad de videos visibles",
"filesharing.saveFileError": "No ha sido posible guardar el fichero",
"filesharing.startingFileShare": "Intentando compartir el fichero",
"filesharing.successfulFileShare": "El fichero se compartió con éxito",
"filesharing.unableToShare": "No ha sido posible compartir el fichero",
"filesharing.error": "Hubo un error al compartir el fichero",
"filesharing.finished": "Descarga del fichero finalizada",
"filesharing.save": "Guardar",
"filesharing.sharedFile": "{displayName} compartió un fichero",
"filesharing.download": "Descargar",
"filesharing.missingSeeds": "Si este proceso demora en exceso, puede ocurrir que no haya nadie compartiendo el fichero. Pruebe a pedirle a alguien que vuelva a subir el fichero que busca.",
"filesharing.saveFileError": "No ha sido posible guardar el fichero",
"filesharing.startingFileShare": "Intentando compartir el fichero",
"filesharing.successfulFileShare": "El fichero se compartió con éxito",
"filesharing.unableToShare": "No ha sido posible compartir el fichero",
"filesharing.error": "Hubo un error al compartir el fichero",
"filesharing.finished": "Descarga del fichero finalizada",
"filesharing.save": "Guardar",
"filesharing.sharedFile": "{displayName} compartió un fichero",
"filesharing.download": "Descargar",
"filesharing.missingSeeds": "Si este proceso demora en exceso, puede ocurrir que no haya nadie compartiendo el fichero. Pruebe a pedirle a alguien que vuelva a subir el fichero que busca.",
"devices.devicesChanged": "Sus dispositivos han cambiado, vuelva a configurarlos en la ventana de ajustes",
"devices.devicesChanged": "Sus dispositivos han cambiado, vuelva a configurarlos en la ventana de ajustes",
"device.audioUnsupported": "Sonido no disponible",
"device.activateAudio": "Activar sonido",
"device.muteAudio": "Silenciar sonido",
"device.unMuteAudio": "Reactivar sonido",
"device.audioUnsupported": "Sonido no disponible",
"device.activateAudio": "Activar sonido",
"device.muteAudio": "Silenciar sonido",
"device.unMuteAudio": "Reactivar sonido",
"device.videoUnsupported": "Vídeo no disponible",
"device.startVideo": "Iniciar vídeo",
"device.stopVideo": "Detener vídeo",
"device.videoUnsupported": "Vídeo no disponible",
"device.startVideo": "Iniciar vídeo",
"device.stopVideo": "Detener vídeo",
"device.screenSharingUnsupported": "Compartir pantalla no disponible",
"device.startScreenSharing": "Iniciar compartir pantalla",
"device.stopScreenSharing": "Detener compartir pantalla",
"device.screenSharingUnsupported": "Compartir pantalla no disponible",
"device.startScreenSharing": "Iniciar compartir pantalla",
"device.stopScreenSharing": "Detener compartir pantalla",
"devices.microphoneDisconnected": "Micrófono desconectado",
"devices.microphoneError": "Hubo un error al acceder a su micrófono",
"devices.microPhoneMute": "Desactivar micrófono",
"devices.micophoneUnMute": "Activar micrófono",
"devices.microphoneEnable": "Micrófono activado",
"devices.microphoneMuteError": "No ha sido posible desactivar su micrófono",
"devices.microphoneUnMuteError": "No ha sido posible activar su micrófono",
"devices.microphoneDisconnected": "Micrófono desconectado",
"devices.microphoneError": "Hubo un error al acceder a su micrófono",
"devices.microPhoneMute": "Desactivar micrófono",
"devices.micophoneUnMute": "Activar micrófono",
"devices.microphoneEnable": "Micrófono activado",
"devices.microphoneMuteError": "No ha sido posible desactivar su micrófono",
"devices.microphoneUnMuteError": "No ha sido posible activar su micrófono",
"devices.screenSharingDisconnected": "Pantalla compartida desconectada",
"devices.screenSharingError": "Hubo un error al acceder a su pantalla",
"devices.screenSharingDisconnected": "Pantalla compartida desconectada",
"devices.screenSharingError": "Hubo un error al acceder a su pantalla",
"devices.cameraDisconnected": "Cámara desconectada",
"devices.cameraError": "Hubo un error al acceder a su cámara"
"devices.cameraDisconnected": "Cámara desconectada",
"devices.cameraError": "Hubo un error al acceder a su cámara"
}
+126 -122
View File
@@ -1,139 +1,143 @@
{
"socket.disconnected" : " Vous avez été déconnecté",
"socket.reconnecting" : " Vous avez été déconnecté, reconnexion en cours",
"socket.reconnected" : " Vous êtes reconnecté",
"socket.requestError" : " Erreur sur une requête serveur",
"socket.disconnected": "Vous avez été déconnecté",
"socket.reconnecting": "Vous avez été déconnecté, reconnexion en cours",
"socket.reconnected": "Vous êtes reconnecté",
"socket.requestError": "Erreur sur une requête serveur",
"room.chooseRoom" : " Choisissez le nom de la réunion que vous souhaitez rejoindre",
"room.cookieConsent" : " Ce site utilise les cookies pour améliorer votre expérience utilisateur",
"room.chooseRoom": "Choisissez le nom de la réunion que vous souhaitez rejoindre",
"room.cookieConsent": "Ce site utilise les cookies pour améliorer votre expérience utilisateur",
"room.consentUnderstand": "I understand",
"room.joined" : " Vous avez rejoint la salle",
"room.cantJoin" : " Impossible de rejoindre la salle",
"room.youLocked" : " Vous avez privatisé la salle",
"room.cantLock" : " Impossible de privatiser la salle",
"room.youUnLocked" : " Vous avez dé-privatiser la salle",
"room.cantUnLock" : " Impossible de dé-privatiser la réunion",
"room.locked" : " La réunion est privée",
"room.unlocked" : " La réunion est publique",
"room.newLobbyPeer" : " Un nouveau participant est dans la salle dattente",
"room.lobbyPeerLeft" : " Un participant de la salle dattente vient de partir",
"room.lobbyPeerChangedDisplayName" : " Un participant dans la salle dattente a changé de nom pour {displayName}",
"room.lobbyPeerChangedPicture" : " Un participant dans le hall à changer de photo",
"room.setAccessCode" : " Code daccès à la réunion mis à jour",
"room.accessCodeOn" : " Code daccès à la réunion activée",
"room.accessCodeOff" : " Code daccès à la réunion désactivée",
"room.peerChangedDisplayName" : " {oldDisplayName} est maintenant {displayName}",
"room.newPeer" : " {displayName} a rejoint la salle",
"room.newFile" : " Nouveau fichier disponible",
"room.toggleAdvancedMode" : " Basculer en mode avancé",
"room.setDemocraticView" : " Passer en vue démocratique",
"room.setFilmStripView" : " Passer en vue vignette",
"room.loggedIn" : " Vous êtes connecté",
"room.loggedOut" : " Vous êtes déconnecté",
"room.changedDisplayName" : " Votre nom à changer pour {displayname}",
"room.changeDisplayNameError" : " Une erreur sest produite pour votre changement de nom",
"room.chatError" : " Impossible denvoyer un message",
"room.aboutToJoin" : " Vous allez rejoindre une réunion",
"room.roomId" : " Salle ID: {roomName}",
"room.setYourName" : " Choisissez votre nom de participant puis comment vous connecter :",
"room.audioOnly" : " Audio uniquement",
"room.audioVideo" : " Audio et Vidéo",
"room.youAreReady" : " Ok, vous êtes prêt",
"room.emptyRequireLogin" : " La réunion est vide ! Vous pouvez vous connecter pour commencer la réunion ou attendre qu'un hôte se connecte",
"room.locketWait" : " La réunion est privatisée - attendez que quelquun vous laisse entrer",
"room.lobbyAdministration" : " Administration de la salle dattente",
"room.peersInLobby" : " Participants dans la salle dattente",
"room.lobbyEmpty" : " Il n'y a actuellement aucun participant dans la salle d'attente",
"room.hiddenPeers" : " {hiddenPeersCount, plural, one {participant} other {participants}}",
"room.me" : " Moi",
"room.spotlights" : " Participants actifs",
"room.passive" : " Participants passifs",
"room.videoPaused" : " La vidéo est en pause",
"room.joined": "Vous avez rejoint la salle",
"room.cantJoin": "Impossible de rejoindre la salle",
"room.youLocked": "Vous avez privatisé la salle",
"room.cantLock": "Impossible de privatiser la salle",
"room.youUnLocked": "Vous avez dé-privatiser la salle",
"room.cantUnLock": "Impossible de dé-privatiser la réunion",
"room.locked": "La réunion est privée",
"room.unlocked": "La réunion est publique",
"room.newLobbyPeer": "Un nouveau participant est dans la salle dattente",
"room.lobbyPeerLeft": "Un participant de la salle dattente vient de partir",
"room.lobbyPeerChangedDisplayName": "Un participant dans la salle dattente a changé de nom pour {displayName}",
"room.lobbyPeerChangedPicture": "Un participant dans le hall à changer de photo",
"room.setAccessCode": "Code daccès à la réunion mis à jour",
"room.accessCodeOn": "Code daccès à la réunion activée",
"room.accessCodeOff": "Code daccès à la réunion désactivée",
"room.peerChangedDisplayName": "{oldDisplayName} est maintenant {displayName}",
"room.newPeer": "{displayName} a rejoint la salle",
"room.newFile": "Nouveau fichier disponible",
"room.toggleAdvancedMode": "Basculer en mode avancé",
"room.setDemocraticView": "Passer en vue démocratique",
"room.setFilmStripView": "Passer en vue vignette",
"room.loggedIn": "Vous êtes connecté",
"room.loggedOut": "Vous êtes déconnecté",
"room.changedDisplayName": "Votre nom à changer pour {displayname}",
"room.changeDisplayNameError": "Une erreur sest produite pour votre changement de nom",
"room.chatError": "Impossible denvoyer un message",
"room.aboutToJoin": "Vous allez rejoindre une réunion",
"room.roomId": "Salle ID: {roomName}",
"room.setYourName": "Choisissez votre nom de participant puis comment vous connecter:",
"room.audioOnly": "Audio uniquement",
"room.audioVideo": "Audio et Vidéo",
"room.youAreReady": "Ok, vous êtes prêt",
"room.emptyRequireLogin": "La réunion est vide ! Vous pouvez vous connecter pour commencer la réunion ou attendre qu'un hôte se connecte",
"room.locketWait": "La réunion est privatisée - attendez que quelquun vous laisse entrer",
"room.lobbyAdministration": "Administration de la salle dattente",
"room.peersInLobby": "Participants dans la salle dattente",
"room.lobbyEmpty": "Il n'y a actuellement aucun participant dans la salle d'attente",
"room.hiddenPeers": "{hiddenPeersCount, plural, one {participant} other {participants}}",
"room.me": "Moi",
"room.spotlights": "Participants actifs",
"room.passive": "Participants passifs",
"room.videoPaused": "La vidéo est en pause",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login" : " Connexion",
"tooltip.logout" : " Déconnexion",
"tooltip.admitFromLobby" : " Autorisé depuis la salle d'attente",
"tooltip.lockRoom" : " Privatisation de la salle",
"tooltip.unLockRoom" : " Dé-privatisation de la salle",
"tooltip.enterFullscreen" : " Afficher en plein écran",
"tooltip.leaveFullscreen" : " Quitter le plein écran",
"tooltip.lobby" : " Afficher la salle d'attente",
"tooltip.settings" : " Afficher les paramètres",
"tooltip.login": "Connexion",
"tooltip.logout": "Déconnexion",
"tooltip.admitFromLobby": "Autorisé depuis la salle d'attente",
"tooltip.lockRoom": "Privatisation de la salle",
"tooltip.unLockRoom": "Dé-privatisation de la salle",
"tooltip.enterFullscreen": "Afficher en plein écran",
"tooltip.leaveFullscreen": "Quitter le plein écran",
"tooltip.lobby": "Afficher la salle d'attente",
"tooltip.settings": "Afficher les paramètres",
"tooltip.participants": "Afficher les participants",
"tooltip.kickParticipant": null,
"label.roomName" : " Nom de la salle",
"label.chooseRoomButton" : " Continuer",
"label.yourName" : " Votre nom",
"label.newWindow" : " Nouvelle fenêtre",
"label.fullscreen" : " Plein écran",
"label.openDrawer" : " Ouvrir Drawer",
"label.leave" : " Quiter",
"label.chatInput" : " Entrer un message",
"label.chat" : " Chat",
"label.filesharing" : " Partage de fichier",
"label.participants" : " Participants",
"label.shareFile" : " Partager un fichier",
"label.fileSharingUnsupported" : " Partage de fichier non supporté",
"label.unknown" : " Inconnu",
"label.democratic" : " Vue démocratique",
"label.filmstrip" : " Vue avec miniature",
"label.low" : " Basse définition",
"label.medium" : " Définition normale",
"label.high" : " Haute Définition (HD)",
"label.veryHigh" : " Très Haute Définition (FHD)",
"label.ultra" : " Ultra Haute Définition",
"label.close" : " Fermer",
"label.roomName": "Nom de la salle",
"label.chooseRoomButton": "Continuer",
"label.yourName": "Votre nom",
"label.newWindow": "Nouvelle fenêtre",
"label.fullscreen": "Plein écran",
"label.openDrawer": "Ouvrir Drawer",
"label.leave": "Quiter",
"label.chatInput": "Entrer un message",
"label.chat": "Chat",
"label.filesharing": "Partage de fichier",
"label.participants": "Participants",
"label.shareFile": "Partager un fichier",
"label.fileSharingUnsupported": "Partage de fichier non supporté",
"label.unknown": "Inconnu",
"label.democratic": "Vue démocratique",
"label.filmstrip": "Vue avec miniature",
"label.low": "Basse définition",
"label.medium": "Définition normale",
"label.high": "Haute Définition (HD)",
"label.veryHigh": "Très Haute Définition (FHD)",
"label.ultra": "Ultra Haute Définition",
"label.close": "Fermer",
"settings.settings" : " Paramètres",
"settings.camera" : " Caméra",
"settings.selectCamera" : " Sélectionner votre caméra",
"settings.cantSelectCamera" : " Impossible de sélectionner votre caméra",
"settings.audio" : " Microphone",
"settings.selectAudio" : " Sélectionner votre microphone",
"settings.cantSelectAudio" : " Impossible de sélectionner votre la caméra",
"settings.resolution" : " Sélection votre résolution",
"settings.layout" : " Mode d'affichage de la salle",
"settings.selectRoomLayout" : " Sélectionner l'affiche de la salle",
"settings.advancedMode" : " Mode avancé",
"settings.settings": "Paramètres",
"settings.camera": "Caméra",
"settings.selectCamera": "Sélectionner votre caméra",
"settings.cantSelectCamera": "Impossible de sélectionner votre caméra",
"settings.audio": "Microphone",
"settings.selectAudio": "Sélectionner votre microphone",
"settings.cantSelectAudio": "Impossible de sélectionner votre la caméra",
"settings.resolution": "Sélection votre résolution",
"settings.layout": "Mode d'affichage de la salle",
"settings.selectRoomLayout": "Sélectionner l'affiche de la salle",
"settings.advancedMode": "Mode avancé",
"settings.permanentTopBar": "Barre supérieure permanente",
"settings.lastn": "Nombre de vidéos visibles",
"filesharing.saveFileError" : " Impossible d'enregistrer le fichier",
"filesharing.startingFileShare" : " Début du transfert de fichier",
"filesharing.successfulFileShare" : " Fichier transféré",
"filesharing.unableToShare" : " Impossible de transférer le fichier",
"filesharing.error" : " Erreur lors du transfert de fichier",
"filesharing.finished" : " Fin du transfert de fichier",
"filesharing.save" : " Sauver",
"filesharing.sharedFile" : " {displayName} a partagé un fichier",
"filesharing.download" : " Télécharger",
"filesharing.missingSeeds" : " Si le téléchargement prend trop de temps cest quil ny a peut-être plus personne qui partage ce torrent. Demander à quelquun de repartager le document.",
"devices.devicesChanged" : " Vos périphériques ont changé, reconfigurer vos périphériques avec le menu paramètre",
"filesharing.saveFileError": "Impossible d'enregistrer le fichier",
"filesharing.startingFileShare": "Début du transfert de fichier",
"filesharing.successfulFileShare": "Fichier transféré",
"filesharing.unableToShare": "Impossible de transférer le fichier",
"filesharing.error": "Erreur lors du transfert de fichier",
"filesharing.finished": "Fin du transfert de fichier",
"filesharing.save": "Sauver",
"filesharing.sharedFile": "{displayName} a partagé un fichier",
"filesharing.download": "Télécharger",
"filesharing.missingSeeds": "Si le téléchargement prend trop de temps cest quil ny a peut-être plus personne qui partage ce torrent. Demander à quelquun de repartager le document.",
"devices.devicesChanged": "Vos périphériques ont changé, reconfigurer vos périphériques avec le menu paramètre",
"device.audioUnsupported" : " Microphone non supporté",
"device.activateAudio" : " Activer l'audio",
"device.muteAudio" : " Désactiver l'audio",
"device.unMuteAudio" : " Réactiver l'audio",
"device.audioUnsupported": "Microphone non supporté",
"device.activateAudio": "Activer l'audio",
"device.muteAudio": "Désactiver l'audio",
"device.unMuteAudio": "Réactiver l'audio",
"device.videoUnsupported" : " Vidéo non supporté",
"device.startVideo" : " Démarrer la vidéo",
"device.stopVideo" : " Arrêter la vidéo",
"device.videoUnsupported": "Vidéo non supporté",
"device.startVideo": "Démarrer la vidéo",
"device.stopVideo": "Arrêter la vidéo",
"device.screenSharingUnsupported" : " Partage d'écran non supporté",
"device.startScreenSharing" : " Démarrer le partage d 'écran'",
"device.stopScreenSharing" : " Arrêter le partage d'écran",
"device.screenSharingUnsupported": "Partage d'écran non supporté",
"device.startScreenSharing": "Démarrer le partage d 'écran'",
"device.stopScreenSharing": "Arrêter le partage d'écran",
"devices.microphoneDisconnected" : " Microphone déconnecté",
"devices.microphoneError" : " Une erreur est apparue lors de l'accès à votre microphone",
"devices.microPhoneMute" : " Désactiver le microphone",
"devices.micophoneUnMute" : " Réactiver le microphone",
"devices.microphoneEnable" : " Activer le microphone",
"devices.microphoneMuteError" : " Impossible de désactiver le microphone",
"devices.microphoneUnMuteError" : " Impossible de réactiver le microphone",
"devices.microphoneDisconnected": "Microphone déconnecté",
"devices.microphoneError": "Une erreur est apparue lors de l'accès à votre microphone",
"devices.microPhoneMute": "Désactiver le microphone",
"devices.micophoneUnMute": "Réactiver le microphone",
"devices.microphoneEnable": "Activer le microphone",
"devices.microphoneMuteError": "Impossible de désactiver le microphone",
"devices.microphoneUnMuteError": "Impossible de réactiver le microphone",
"devices.screenSharingDisconnected" : " Partage d'écran déconnecté",
"devices.screenSharingError" : " Une erreur est apparue lors de l'accès à votre partage d'écran",
"devices.screenSharingDisconnected": "Partage d'écran déconnecté",
"devices.screenSharingError": "Une erreur est apparue lors de l'accès à votre partage d'écran",
"devices.cameraDisconnected" : " Caméra déconnectée",
"devices.cameraError" : " Une erreur est apparue lors de l'accès à votre caméra"
"devices.cameraDisconnected": "Caméra déconnectée",
"devices.cameraError": "Une erreur est apparue lors de l'accès à votre caméra"
}
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Učesnici u fokusu",
"room.passive": "Pasivni učesnici",
"room.videoPaused": "Video pauziran",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Prijava",
"tooltip.logout": "Odjava",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Prikaži predvorje",
"tooltip.settings": "Prikaži postavke",
"tooltip.participants": "Pokažite sudionike",
"tooltip.kickParticipant": null,
"label.roomName": "Naziv sobe",
"label.chooseRoomButton": "Nastavi",
+5 -1
View File
@@ -4,7 +4,7 @@
"socket.reconnected": "Sikeres újarkapcsolódás",
"socket.requestError": "Sikertelen szerver lekérés",
"room.chooseRoom": "Choose the name of the room you would like to join",
"room.chooseRoom": null,
"room.cookieConsent": "Ez a weblap a felhasználói élmény fokozása miatt sütiket használ",
"room.consentUnderstand": "I understand",
"room.joined": "Csatlakozátál a konferenciához",
@@ -49,6 +49,9 @@
"room.spotlights": "Látható résztvevők",
"room.passive": "Passzív résztvevők",
"room.videoPaused": "Ez a videóstream szünetel",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Belépés",
"tooltip.logout": "Kilépés",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Az előszobában várakozók listája",
"tooltip.settings": "Beállítások",
"tooltip.participants": "Résztvevők",
"tooltip.kickParticipant": null,
"label.roomName": "Konferencia",
"label.chooseRoomButton": "Tovább",
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Deltakere i fokus",
"room.passive": "Passive deltakere",
"room.videoPaused": "Denne videoen er inaktiv",
"room.muteAll": "Demp alle",
"room.stopAllVideo": "Stopp all video",
"room.closeMeeting": "Avslutt møte",
"tooltip.login": "Logg in",
"tooltip.logout": "Logg ut",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Vis lobby",
"tooltip.settings": "Vis innstillinger",
"tooltip.participants": "Vis deltakere",
"tooltip.kickParticipant": "Spark ut deltaker",
"label.roomName": "Møtenavn",
"label.chooseRoomButton": "Fortsett",
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Aktywni uczestnicy",
"room.passive": "Pasywni uczestnicy",
"room.videoPaused": "To wideo jest wstrzymane.",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Zaloguj",
"tooltip.logout": "Wyloguj",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Pokaż poczekalnię",
"tooltip.settings": "Pokaż ustawienia",
"tooltip.participants": "Pokaż uczestników",
"tooltip.kickParticipant": null,
"label.roomName": "Nazwa konferencji",
"label.chooseRoomButton": "Kontynuuj",
+4
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Participantes em foco",
"room.passive": "Participantes passivos",
"room.videoPaused": "Este vídeo está em pausa",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Entrar",
"tooltip.logout": "Sair",
@@ -60,6 +63,7 @@
"tooltip.lobby": "Apresentar sala de espera",
"tooltip.settings": "Apresentar definições",
"tooltip.participants": "Apresentar participantes",
"tooltip.kickParticipant": null,
"label.roomName": "Nome da sala",
"label.chooseRoomButton": "Continuar",
+6 -1
View File
@@ -49,6 +49,9 @@
"room.spotlights": "Participanți în Spotlight",
"room.passive": "Participanți pasivi",
"room.videoPaused": "Acest video este pus pe pauză",
"room.muteAll": null,
"room.stopAllVideo": null,
"room.closeMeeting": null,
"tooltip.login": "Intră în cont",
"tooltip.logout": "Deconectare",
@@ -58,7 +61,9 @@
"tooltip.enterFullscreen": "Modul ecran complet",
"tooltip.leaveFullscreen": "Ieșire din modul ecran complet",
"tooltip.lobby": "Arată holul",
"tooltip.settings": "Arată participanții",
"tooltip.settings": "Arată setăile",
"tooltip.participants": null,
"tooltip.kickParticipant": null,
"label.roomName": "Numele camerei",
"label.chooseRoomButton": "Continuare",