Option to make side drawer push videos to the side and be permanent, fixes #320

auto_join_3.3
Håvar Aambø Fosstveit 2020-05-09 00:03:56 +02:00
parent c5143de647
commit 1690394328
26 changed files with 174 additions and 21 deletions

View File

@ -57,6 +57,9 @@ var config =
// If true, will show media control buttons in separate // If true, will show media control buttons in separate
// control bar, not in the ME container. // control bar, not in the ME container.
buttonControlBar : false, buttonControlBar : false,
// If false, will push videos away to make room for side
// drawer. If true, will overlay side drawer over videos
drawerOverlayed : true,
// Timeout for autohiding topbar and button control bar // Timeout for autohiding topbar and button control bar
hideTimeout : 3000, hideTimeout : 3000,
lastN : 4, lastN : 4,

View File

@ -43,6 +43,11 @@ export const toggleButtonControlBar = () =>
type : 'TOGGLE_BUTTON_CONTROL_BAR' type : 'TOGGLE_BUTTON_CONTROL_BAR'
}); });
export const toggleDrawerOverlayed = () =>
({
type : 'TOGGLE_DRAWER_OVERLAYED'
});
export const toggleShowNotifications = () => export const toggleShowNotifications = () =>
({ ({
type : 'TOGGLE_SHOW_NOTIFICATIONS' type : 'TOGGLE_SHOW_NOTIFICATIONS'

View File

@ -14,6 +14,7 @@ import { withStyles } from '@material-ui/core/styles';
import * as roomActions from '../../actions/roomActions'; import * as roomActions from '../../actions/roomActions';
import * as toolareaActions from '../../actions/toolareaActions'; import * as toolareaActions from '../../actions/toolareaActions';
import { useIntl, FormattedMessage } from 'react-intl'; import { useIntl, FormattedMessage } from 'react-intl';
import classnames from 'classnames';
import AppBar from '@material-ui/core/AppBar'; import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar'; import Toolbar from '@material-ui/core/Toolbar';
import MenuItem from '@material-ui/core/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
@ -43,6 +44,31 @@ import InfoIcon from '@material-ui/icons/Info';
const styles = (theme) => const styles = (theme) =>
({ ({
persistentDrawerOpen :
{
width : 'calc(100% - 30vw)',
marginLeft : '30vw',
[theme.breakpoints.down('lg')] :
{
width : 'calc(100% - 40vw)',
marginLeft : '40vw'
},
[theme.breakpoints.down('md')] :
{
width : 'calc(100% - 50vw)',
marginLeft : '50vw'
},
[theme.breakpoints.down('sm')] :
{
width : 'calc(100% - 70vw)',
marginLeft : '70vw'
},
[theme.breakpoints.down('xs')] :
{
width : 'calc(100% - 90vw)',
marginLeft : '90vw'
}
},
menuButton : menuButton :
{ {
margin : 0, margin : 0,
@ -188,6 +214,9 @@ const TopBar = (props) =>
peersLength, peersLength,
lobbyPeers, lobbyPeers,
permanentTopBar, permanentTopBar,
drawerOverlayed,
toolAreaOpen,
isMobile,
myPicture, myPicture,
loggedIn, loggedIn,
loginEnabled, loginEnabled,
@ -248,7 +277,12 @@ const TopBar = (props) =>
<React.Fragment> <React.Fragment>
<AppBar <AppBar
position='fixed' position='fixed'
className={room.toolbarsVisible || permanentTopBar ? classes.show : classes.hide} className={classnames(
room.toolbarsVisible || permanentTopBar ?
classes.show : classes.hide,
!(isMobile || drawerOverlayed) && toolAreaOpen ?
classes.persistentDrawerOpen : null
)}
> >
<Toolbar> <Toolbar>
<PulsingBadge <PulsingBadge
@ -728,9 +762,12 @@ TopBar.propTypes =
{ {
roomClient : PropTypes.object.isRequired, roomClient : PropTypes.object.isRequired,
room : appPropTypes.Room.isRequired, room : appPropTypes.Room.isRequired,
isMobile : PropTypes.bool.isRequired,
peersLength : PropTypes.number, peersLength : PropTypes.number,
lobbyPeers : PropTypes.array, lobbyPeers : PropTypes.array,
permanentTopBar : PropTypes.bool, permanentTopBar : PropTypes.bool.isRequired,
drawerOverlayed : PropTypes.bool.isRequired,
toolAreaOpen : PropTypes.bool.isRequired,
myPicture : PropTypes.string, myPicture : PropTypes.string,
loggedIn : PropTypes.bool.isRequired, loggedIn : PropTypes.bool.isRequired,
loginEnabled : PropTypes.bool.isRequired, loginEnabled : PropTypes.bool.isRequired,
@ -767,9 +804,12 @@ const makeMapStateToProps = () =>
const mapStateToProps = (state) => const mapStateToProps = (state) =>
({ ({
room : state.room, room : state.room,
isMobile : state.me.browser.platform === 'mobile',
peersLength : peersLengthSelector(state), peersLength : peersLengthSelector(state),
lobbyPeers : lobbyPeersKeySelector(state), lobbyPeers : lobbyPeersKeySelector(state),
permanentTopBar : state.settings.permanentTopBar, permanentTopBar : state.settings.permanentTopBar,
drawerOverlayed : state.settings.drawerOverlayed,
toolAreaOpen : state.toolarea.toolAreaOpen,
loggedIn : state.me.loggedIn, loggedIn : state.me.loggedIn,
loginEnabled : state.me.loginEnabled, loginEnabled : state.me.loginEnabled,
myPicture : state.me.picture, myPicture : state.me.picture,
@ -832,12 +872,15 @@ export default withRoomContext(connect(
prev.peers === next.peers && prev.peers === next.peers &&
prev.lobbyPeers === next.lobbyPeers && prev.lobbyPeers === next.lobbyPeers &&
prev.settings.permanentTopBar === next.settings.permanentTopBar && prev.settings.permanentTopBar === next.settings.permanentTopBar &&
prev.settings.drawerOverlayed === next.settings.drawerOverlayed &&
prev.me.loggedIn === next.me.loggedIn && prev.me.loggedIn === next.me.loggedIn &&
prev.me.browser === next.me.browser &&
prev.me.loginEnabled === next.me.loginEnabled && prev.me.loginEnabled === next.me.loginEnabled &&
prev.me.picture === next.me.picture && prev.me.picture === next.me.picture &&
prev.me.roles === next.me.roles && prev.me.roles === next.me.roles &&
prev.toolarea.unreadMessages === next.toolarea.unreadMessages && prev.toolarea.unreadMessages === next.toolarea.unreadMessages &&
prev.toolarea.unreadFiles === next.toolarea.unreadFiles prev.toolarea.unreadFiles === next.toolarea.unreadFiles &&
prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen
); );
} }
} }

View File

@ -22,6 +22,7 @@ const styles = (theme) =>
display : 'flex', display : 'flex',
flexDirection : 'row', flexDirection : 'row',
flexWrap : 'wrap', flexWrap : 'wrap',
overflow : 'hidden',
justifyContent : 'center', justifyContent : 'center',
alignItems : 'center', alignItems : 'center',
alignContent : 'center' alignContent : 'center'
@ -189,6 +190,7 @@ Democratic.propTypes =
toolbarsVisible : PropTypes.bool.isRequired, toolbarsVisible : PropTypes.bool.isRequired,
permanentTopBar : PropTypes.bool.isRequired, permanentTopBar : PropTypes.bool.isRequired,
buttonControlBar : PropTypes.bool.isRequired, buttonControlBar : PropTypes.bool.isRequired,
toolAreaOpen : PropTypes.bool.isRequired,
classes : PropTypes.object.isRequired classes : PropTypes.object.isRequired
}; };
@ -199,7 +201,8 @@ const mapStateToProps = (state) =>
spotlightsPeers : spotlightPeersSelector(state), spotlightsPeers : spotlightPeersSelector(state),
toolbarsVisible : state.room.toolbarsVisible, toolbarsVisible : state.room.toolbarsVisible,
permanentTopBar : state.settings.permanentTopBar, permanentTopBar : state.settings.permanentTopBar,
buttonControlBar : state.settings.buttonControlBar buttonControlBar : state.settings.buttonControlBar,
toolAreaOpen : state.toolarea.toolAreaOpen
}; };
}; };
@ -217,7 +220,8 @@ export default connect(
prev.room.spotlights === next.room.spotlights && prev.room.spotlights === next.room.spotlights &&
prev.room.toolbarsVisible === next.room.toolbarsVisible && prev.room.toolbarsVisible === next.room.toolbarsVisible &&
prev.settings.permanentTopBar === next.settings.permanentTopBar && prev.settings.permanentTopBar === next.settings.permanentTopBar &&
prev.settings.buttonControlBar === next.settings.buttonControlBar prev.settings.buttonControlBar === next.settings.buttonControlBar &&
prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen
); );
} }
} }

View File

@ -25,6 +25,7 @@ const styles = () =>
height : '100%', height : '100%',
width : '100%', width : '100%',
display : 'grid', display : 'grid',
overflow : 'hidden',
gridTemplateColumns : '1fr', gridTemplateColumns : '1fr',
gridTemplateRows : '1fr 0.25fr' gridTemplateRows : '1fr 0.25fr'
}, },
@ -334,6 +335,7 @@ Filmstrip.propTypes = {
spotlights : PropTypes.array.isRequired, spotlights : PropTypes.array.isRequired,
boxes : PropTypes.number, boxes : PropTypes.number,
toolbarsVisible : PropTypes.bool.isRequired, toolbarsVisible : PropTypes.bool.isRequired,
toolAreaOpen : PropTypes.bool.isRequired,
permanentTopBar : PropTypes.bool, permanentTopBar : PropTypes.bool,
classes : PropTypes.object.isRequired classes : PropTypes.object.isRequired
}; };
@ -349,6 +351,7 @@ const mapStateToProps = (state) =>
spotlights : state.room.spotlights, spotlights : state.room.spotlights,
boxes : videoBoxesSelector(state), boxes : videoBoxesSelector(state),
toolbarsVisible : state.room.toolbarsVisible, toolbarsVisible : state.room.toolbarsVisible,
toolAreaOpen : state.toolarea.toolAreaOpen,
permanentTopBar : state.settings.permanentTopBar permanentTopBar : state.settings.permanentTopBar
}; };
}; };
@ -364,6 +367,7 @@ export default withRoomContext(connect(
prev.room.activeSpeakerId === next.room.activeSpeakerId && prev.room.activeSpeakerId === next.room.activeSpeakerId &&
prev.room.selectedPeerId === next.room.selectedPeerId && prev.room.selectedPeerId === next.room.selectedPeerId &&
prev.room.toolbarsVisible === next.room.toolbarsVisible && prev.room.toolbarsVisible === next.room.toolbarsVisible &&
prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen &&
prev.settings.permanentTopBar === next.settings.permanentTopBar && prev.settings.permanentTopBar === next.settings.permanentTopBar &&
prev.peers === next.peers && prev.peers === next.peers &&
prev.consumers === next.consumers && prev.consumers === next.consumers &&

View File

@ -12,6 +12,7 @@ import { FormattedMessage } from 'react-intl';
import CookieConsent from 'react-cookie-consent'; import CookieConsent from 'react-cookie-consent';
import CssBaseline from '@material-ui/core/CssBaseline'; import CssBaseline from '@material-ui/core/CssBaseline';
import SwipeableDrawer from '@material-ui/core/SwipeableDrawer'; import SwipeableDrawer from '@material-ui/core/SwipeableDrawer';
import Drawer from '@material-ui/core/Drawer';
import Hidden from '@material-ui/core/Hidden'; import Hidden from '@material-ui/core/Hidden';
import Notifications from './Notifications/Notifications'; import Notifications from './Notifications/Notifications';
import MeetingDrawer from './MeetingDrawer/MeetingDrawer'; import MeetingDrawer from './MeetingDrawer/MeetingDrawer';
@ -45,6 +46,27 @@ const styles = (theme) =>
backgroundSize : 'cover', backgroundSize : 'cover',
backgroundRepeat : 'no-repeat' backgroundRepeat : 'no-repeat'
}, },
drawer :
{
width : '30vw',
flexShrink : 0,
[theme.breakpoints.down('lg')] :
{
width : '40vw'
},
[theme.breakpoints.down('md')] :
{
width : '50vw'
},
[theme.breakpoints.down('sm')] :
{
width : '70vw'
},
[theme.breakpoints.down('xs')] :
{
width : '90vw'
}
},
drawerPaper : drawerPaper :
{ {
width : '30vw', width : '30vw',
@ -147,6 +169,7 @@ class Room extends React.PureComponent
advancedMode, advancedMode,
showNotifications, showNotifications,
buttonControlBar, buttonControlBar,
drawerOverlayed,
toolAreaOpen, toolAreaOpen,
toggleToolArea, toggleToolArea,
classes, classes,
@ -159,6 +182,8 @@ class Room extends React.PureComponent
democratic : Democratic democratic : Democratic
}[room.mode]; }[room.mode];
const container = window !== undefined ? window.document.body : undefined;
return ( return (
<div className={classes.root}> <div className={classes.root}>
{ !isElectron() && { !isElectron() &&
@ -195,22 +220,45 @@ class Room extends React.PureComponent
onFullscreen={this.handleToggleFullscreen} onFullscreen={this.handleToggleFullscreen}
/> />
<nav> { (browser.platform === 'mobile' || drawerOverlayed) ?
<Hidden implementation='css'> <nav>
<SwipeableDrawer <Hidden implementation='css'>
variant='temporary' <SwipeableDrawer
anchor={theme.direction === 'rtl' ? 'right' : 'left'} container={container}
open={toolAreaOpen} variant='temporary'
onClose={() => toggleToolArea()} anchor={theme.direction === 'rtl' ? 'right' : 'left'}
onOpen={() => toggleToolArea()} open={toolAreaOpen}
classes={{ onClose={() => toggleToolArea()}
paper : classes.drawerPaper onOpen={() => toggleToolArea()}
}} classes={{
> paper : classes.drawerPaper
<MeetingDrawer closeDrawer={toggleToolArea} /> }}
</SwipeableDrawer> ModalProps={{
</Hidden> keepMounted : true // Better open performance on mobile.
</nav> }}
>
<MeetingDrawer closeDrawer={toggleToolArea} />
</SwipeableDrawer>
</Hidden>
</nav>
:
<nav className={toolAreaOpen ? classes.drawer : null}>
<Hidden implementation='css'>
<Drawer
variant='persistent'
anchor={theme.direction === 'rtl' ? 'right' : 'left'}
open={toolAreaOpen}
onClose={() => toggleToolArea()}
onOpen={() => toggleToolArea()}
classes={{
paper : classes.drawerPaper
}}
>
<MeetingDrawer closeDrawer={toggleToolArea} />
</Drawer>
</Hidden>
</nav>
}
{ browser.platform === 'mobile' && browser.os !== 'ios' && { browser.platform === 'mobile' && browser.os !== 'ios' &&
<WakeLock /> <WakeLock />
@ -252,6 +300,7 @@ Room.propTypes =
advancedMode : PropTypes.bool.isRequired, advancedMode : PropTypes.bool.isRequired,
showNotifications : PropTypes.bool.isRequired, showNotifications : PropTypes.bool.isRequired,
buttonControlBar : PropTypes.bool.isRequired, buttonControlBar : PropTypes.bool.isRequired,
drawerOverlayed : PropTypes.bool.isRequired,
toolAreaOpen : PropTypes.bool.isRequired, toolAreaOpen : PropTypes.bool.isRequired,
setToolbarsVisible : PropTypes.func.isRequired, setToolbarsVisible : PropTypes.func.isRequired,
toggleToolArea : PropTypes.func.isRequired, toggleToolArea : PropTypes.func.isRequired,
@ -266,6 +315,7 @@ const mapStateToProps = (state) =>
advancedMode : state.settings.advancedMode, advancedMode : state.settings.advancedMode,
showNotifications : state.settings.showNotifications, showNotifications : state.settings.showNotifications,
buttonControlBar : state.settings.buttonControlBar, buttonControlBar : state.settings.buttonControlBar,
drawerOverlayed : state.settings.drawerOverlayed,
toolAreaOpen : state.toolarea.toolAreaOpen toolAreaOpen : state.toolarea.toolAreaOpen
}); });
@ -294,6 +344,7 @@ export default connect(
prev.settings.advancedMode === next.settings.advancedMode && prev.settings.advancedMode === next.settings.advancedMode &&
prev.settings.showNotifications === next.settings.showNotifications && prev.settings.showNotifications === next.settings.showNotifications &&
prev.settings.buttonControlBar === next.settings.buttonControlBar && prev.settings.buttonControlBar === next.settings.buttonControlBar &&
prev.settings.drawerOverlayed === next.settings.drawerOverlayed &&
prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen
); );
} }

View File

@ -26,12 +26,14 @@ const styles = (theme) =>
}); });
const AppearenceSettings = ({ const AppearenceSettings = ({
isMobile,
room, room,
settings, settings,
onTogglePermanentTopBar, onTogglePermanentTopBar,
onToggleHiddenControls, onToggleHiddenControls,
onToggleButtonControlBar, onToggleButtonControlBar,
onToggleShowNotifications, onToggleShowNotifications,
onToggleDrawerOverlayed,
handleChangeMode, handleChangeMode,
classes classes
}) => }) =>
@ -111,6 +113,16 @@ const AppearenceSettings = ({
defaultMessage : 'Separate media controls' defaultMessage : 'Separate media controls'
})} })}
/> />
{ !isMobile &&
<FormControlLabel
className={classes.setting}
control={<Checkbox checked={settings.drawerOverlayed} onChange={onToggleDrawerOverlayed} value='drawerOverlayed' />}
label={intl.formatMessage({
id : 'settings.drawerOverlayed',
defaultMessage : 'Side drawer over content'
})}
/>
}
<FormControlLabel <FormControlLabel
className={classes.setting} className={classes.setting}
control={<Checkbox checked={settings.showNotifications} onChange={onToggleShowNotifications} value='showNotifications' />} control={<Checkbox checked={settings.showNotifications} onChange={onToggleShowNotifications} value='showNotifications' />}
@ -125,18 +137,21 @@ const AppearenceSettings = ({
AppearenceSettings.propTypes = AppearenceSettings.propTypes =
{ {
isMobile : PropTypes.bool.isRequired,
room : appPropTypes.Room.isRequired, room : appPropTypes.Room.isRequired,
settings : PropTypes.object.isRequired, settings : PropTypes.object.isRequired,
onTogglePermanentTopBar : PropTypes.func.isRequired, onTogglePermanentTopBar : PropTypes.func.isRequired,
onToggleHiddenControls : PropTypes.func.isRequired, onToggleHiddenControls : PropTypes.func.isRequired,
onToggleButtonControlBar : PropTypes.func.isRequired, onToggleButtonControlBar : PropTypes.func.isRequired,
onToggleShowNotifications : PropTypes.func.isRequired, onToggleShowNotifications : PropTypes.func.isRequired,
onToggleDrawerOverlayed : PropTypes.func.isRequired,
handleChangeMode : PropTypes.func.isRequired, handleChangeMode : PropTypes.func.isRequired,
classes : PropTypes.object.isRequired classes : PropTypes.object.isRequired
}; };
const mapStateToProps = (state) => const mapStateToProps = (state) =>
({ ({
isMobile : state.me.browser.platform === 'mobile',
room : state.room, room : state.room,
settings : state.settings settings : state.settings
}); });
@ -146,6 +161,7 @@ const mapDispatchToProps = {
onToggleHiddenControls : settingsActions.toggleHiddenControls, onToggleHiddenControls : settingsActions.toggleHiddenControls,
onToggleShowNotifications : settingsActions.toggleShowNotifications, onToggleShowNotifications : settingsActions.toggleShowNotifications,
onToggleButtonControlBar : settingsActions.toggleButtonControlBar, onToggleButtonControlBar : settingsActions.toggleButtonControlBar,
onToggleDrawerOverlayed : settingsActions.toggleDrawerOverlayed,
handleChangeMode : roomActions.setDisplayMode handleChangeMode : roomActions.setDisplayMode
}; };
@ -157,6 +173,7 @@ export default connect(
areStatesEqual : (next, prev) => areStatesEqual : (next, prev) =>
{ {
return ( return (
prev.me.browser === next.me.browser &&
prev.room === next.room && prev.room === next.room &&
prev.settings === next.settings prev.settings === next.settings
); );

View File

@ -19,6 +19,7 @@ const initialState =
showNotifications : true, showNotifications : true,
notificationSounds : true, notificationSounds : true,
buttonControlBar : window.config.buttonControlBar || false, buttonControlBar : window.config.buttonControlBar || false,
drawerOverlayed : window.config.drawerOverlayed || true,
...window.config.defaultAudio ...window.config.defaultAudio
}; };
@ -153,6 +154,13 @@ const settings = (state = initialState, action) =>
return { ...state, buttonControlBar }; return { ...state, buttonControlBar };
} }
case 'TOGGLE_DRAWER_OVERLAYED':
{
const drawerOverlayed = !state.drawerOverlayed;
return { ...state, drawerOverlayed };
}
case 'TOGGLE_HIDDEN_CONTROLS': case 'TOGGLE_HIDDEN_CONTROLS':
{ {
const hiddenControls = !state.hiddenControls; const hiddenControls = !state.hiddenControls;

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "无法保存文件", "filesharing.saveFileError": "无法保存文件",
"filesharing.startingFileShare": "正在尝试共享文件", "filesharing.startingFileShare": "正在尝试共享文件",

View File

@ -137,6 +137,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Není možné uložit soubor", "filesharing.saveFileError": "Není možné uložit soubor",
"filesharing.startingFileShare": "Pokouším se sdílet soubor", "filesharing.startingFileShare": "Pokouším se sdílet soubor",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Fehler beim Speichern der Datei", "filesharing.saveFileError": "Fehler beim Speichern der Datei",
"filesharing.startingFileShare": "Starte Teilen der Datei", "filesharing.startingFileShare": "Starte Teilen der Datei",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Kan ikke gemme fil", "filesharing.saveFileError": "Kan ikke gemme fil",
"filesharing.startingFileShare": "Forsøger at dele filen", "filesharing.startingFileShare": "Forsøger at dele filen",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Αδυναμία αποθήκευσης του αρχείου", "filesharing.saveFileError": "Αδυναμία αποθήκευσης του αρχείου",
"filesharing.startingFileShare": "Προσπάθεια διαμοιρασμού αρχείου", "filesharing.startingFileShare": "Προσπάθεια διαμοιρασμού αρχείου",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": "Echo cancellation", "settings.echoCancellation": "Echo cancellation",
"settings.autoGainControl": "Auto gain control", "settings.autoGainControl": "Auto gain control",
"settings.noiseSuppression": "Noise suppression", "settings.noiseSuppression": "Noise suppression",
"settings.drawerOverlayed": "Side drawer over content",
"filesharing.saveFileError": "Unable to save file", "filesharing.saveFileError": "Unable to save file",
"filesharing.startingFileShare": "Attempting to share file", "filesharing.startingFileShare": "Attempting to share file",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "No ha sido posible guardar el fichero", "filesharing.saveFileError": "No ha sido posible guardar el fichero",
"filesharing.startingFileShare": "Intentando compartir el fichero", "filesharing.startingFileShare": "Intentando compartir el fichero",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Impossible d'enregistrer le fichier", "filesharing.saveFileError": "Impossible d'enregistrer le fichier",
"filesharing.startingFileShare": "Début du transfert de fichier", "filesharing.startingFileShare": "Début du transfert de fichier",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Nije moguće spremiti datoteku", "filesharing.saveFileError": "Nije moguće spremiti datoteku",
"filesharing.startingFileShare": "Pokušaj dijeljenja datoteke", "filesharing.startingFileShare": "Pokušaj dijeljenja datoteke",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": "Visszhangelnyomás", "settings.echoCancellation": "Visszhangelnyomás",
"settings.autoGainControl": "Automatikus hangerő", "settings.autoGainControl": "Automatikus hangerő",
"settings.noiseSuppression": "Zajelnyomás", "settings.noiseSuppression": "Zajelnyomás",
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "A file-t nem sikerült elmenteni", "filesharing.saveFileError": "A file-t nem sikerült elmenteni",
"filesharing.startingFileShare": "Fájl megosztása", "filesharing.startingFileShare": "Fájl megosztása",

View File

@ -137,6 +137,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Impossibile salvare file", "filesharing.saveFileError": "Impossibile salvare file",
"filesharing.startingFileShare": "Tentativo di condivisione file", "filesharing.startingFileShare": "Tentativo di condivisione file",

View File

@ -132,6 +132,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Nav iespējams saglabāt failu", "filesharing.saveFileError": "Nav iespējams saglabāt failu",
"filesharing.startingFileShare": "Tiek mēģināts kopīgot failu", "filesharing.startingFileShare": "Tiek mēģināts kopīgot failu",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": "Echokansellering", "settings.echoCancellation": "Echokansellering",
"settings.autoGainControl": "Auto gain kontroll", "settings.autoGainControl": "Auto gain kontroll",
"settings.noiseSuppression": "Støy reduksjon", "settings.noiseSuppression": "Støy reduksjon",
"settings.drawerOverlayed": "Sidemeny over innhold",
"filesharing.saveFileError": "Klarte ikke å lagre fil", "filesharing.saveFileError": "Klarte ikke å lagre fil",
"filesharing.startingFileShare": "Starter fildeling", "filesharing.startingFileShare": "Starter fildeling",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Nie można zapisać pliku", "filesharing.saveFileError": "Nie można zapisać pliku",
"filesharing.startingFileShare": "Próba udostępnienia pliku", "filesharing.startingFileShare": "Próba udostępnienia pliku",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Impossível de gravar o ficheiro", "filesharing.saveFileError": "Impossível de gravar o ficheiro",
"filesharing.startingFileShare": "Tentando partilha de ficheiro", "filesharing.startingFileShare": "Tentando partilha de ficheiro",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Încercarea de a salva fișierul a eșuat", "filesharing.saveFileError": "Încercarea de a salva fișierul a eșuat",
"filesharing.startingFileShare": "Partajarea fișierului", "filesharing.startingFileShare": "Partajarea fișierului",

View File

@ -135,6 +135,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Dosya kaydedilemiyor", "filesharing.saveFileError": "Dosya kaydedilemiyor",
"filesharing.startingFileShare": "Paylaşılan dosyaya erişiliyor", "filesharing.startingFileShare": "Paylaşılan dosyaya erişiliyor",

View File

@ -138,6 +138,7 @@
"settings.echoCancellation": null, "settings.echoCancellation": null,
"settings.autoGainControl": null, "settings.autoGainControl": null,
"settings.noiseSuppression": null, "settings.noiseSuppression": null,
"settings.drawerOverlayed": null,
"filesharing.saveFileError": "Неможливо зберегти файл", "filesharing.saveFileError": "Неможливо зберегти файл",
"filesharing.startingFileShare": "Спроба поділитися файлом", "filesharing.startingFileShare": "Спроба поділитися файлом",