From a4a1e2177383ee0f8e94e9d1cf9032b7b630a748 Mon Sep 17 00:00:00 2001
From: gnaegi <gnaegi@frentix.com>
Date: Thu, 26 Mar 2020 00:23:48 +0100
Subject: [PATCH] OO-4584 BBB wording, config formatting, more default
 templates, template role for group users

---
 .../bigbluebutton/BigBlueButtonRoles.java     |   1 +
 .../manager/BigBlueButtonManagerImpl.java     |  77 ++++++---
 .../BigBlueButtonEditMeetingsController.java  |  15 +-
 .../ui/BigBlueButtonRunController.java        |  53 +++++-
 .../EditBigBlueButtonMeetingController.java   |  14 +-
 .../EditBigBlueButtonTemplateController.java  |  98 ++++++-----
 .../bigbluebutton/ui/_content/meeting.html    |   4 +-
 .../ui/_i18n/LocalStrings_de.properties       | 160 +++++++++---------
 .../ui/_i18n/LocalStrings_en.properties       | 148 ++++++++--------
 .../ui/_i18n/LocalStrings_fr.properties       |   5 -
 10 files changed, 335 insertions(+), 240 deletions(-)

diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
index b161539fc50..c762f25f8d9 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRoles.java
@@ -34,6 +34,7 @@ import edu.emory.mathcs.backport.java.util.Collections;
  */
 public enum BigBlueButtonRoles {
 	
+	group,
 	coach,
 	owner,
 	author,
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
index 35b01cd8cde..2e600253273 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -88,33 +88,61 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 	public void afterPropertiesSet() throws Exception {
 		List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonMeetingTemplateDao.getTemplates();
 		
-		// Web conferen
-		defaultTemplate("sys-meetings", "Meetings", 5, 5, 240,
+		// Online meeting, all features enable
+		defaultTemplate("sys-meetings", "Meeting", 2, 8, 240,
 				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // recording
-				Boolean.FALSE, Boolean.TRUE, // webcams moderator only, unmute
-				Boolean.FALSE, Boolean.FALSE, // cam, mic
-				Boolean.FALSE, Boolean.TRUE, // chat
-				Boolean.FALSE, Boolean.FALSE, // node, layout
-				Boolean.FALSE, Boolean.TRUE, Boolean.FALSE,
-				GuestPolicyEnum.ALWAYS_ACCEPT, templates);
+				Boolean.FALSE, Boolean.TRUE, 	// webcams moderator only, unmute
+				Boolean.FALSE, Boolean.FALSE, 	// cam, mic
+				Boolean.FALSE, Boolean.FALSE, 	// chat
+				Boolean.FALSE, Boolean.FALSE, 	// notes, layout
+				Boolean.TRUE, 					// breakout
+				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // user list, join-lock, lock configurable
+				GuestPolicyEnum.ALWAYS_ACCEPT, true, templates);
 		
-		defaultTemplate("sys-classes", "Classes", 20, 30, 240,
+		// Traditional classroom setting with many participants. Only presenter has video
+		defaultTemplate("sys-classes", "Classroom", 10, 30, 240,
 				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // recording
-				Boolean.TRUE, Boolean.TRUE, // webcamsmoderator only, unmute
-				Boolean.TRUE, Boolean.TRUE, // cam, mic
-				Boolean.FALSE, Boolean.FALSE, // chat
-				Boolean.FALSE, Boolean.FALSE, // node, layout
-				Boolean.FALSE, Boolean.TRUE, Boolean.FALSE,
-				GuestPolicyEnum.ALWAYS_ACCEPT, templates);
+				Boolean.TRUE,  Boolean.TRUE, 	// webcams moderator only, unmute
+				Boolean.TRUE,  Boolean.FALSE, 	// cam, mic
+				Boolean.FALSE, Boolean.FALSE, 	// chat
+				Boolean.FALSE, Boolean.FALSE, 	// notes, layout
+				Boolean.TRUE, 					// breakout
+				Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, // user list, join-lock, lock configurable
+				GuestPolicyEnum.ALWAYS_ACCEPT, true, templates);
 		
-		defaultTemplate("sys-cafe", "Cafe", 10, 10, 240,
+		// Mixed setup, some with webcams, some without. 
+		defaultTemplate("sys-cafe", "Cafe", 5, 15, 240,
 				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // recording
-				Boolean.FALSE, Boolean.TRUE, // webcams moderator only, unmute
-				Boolean.FALSE, Boolean.FALSE, // cam, mic
-				Boolean.TRUE, Boolean.FALSE, // chat
-				Boolean.FALSE, Boolean.FALSE, // node, layout
-				Boolean.FALSE, Boolean.TRUE, Boolean.FALSE,
-				GuestPolicyEnum.ALWAYS_ACCEPT, templates);
+				Boolean.FALSE, Boolean.TRUE, 	// webcams moderator only, unmute
+				Boolean.TRUE,  Boolean.FALSE, 	// cam, mic
+				Boolean.FALSE, Boolean.FALSE, 	// chat
+				Boolean.FALSE, Boolean.FALSE, 	// notes, layout
+				Boolean.TRUE, 					// breakout
+				Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, // user list, join-lock, lock configurable 
+				GuestPolicyEnum.ALWAYS_ACCEPT, false, templates);
+		
+		// Interview situation, face-to-face meeting
+		defaultTemplate("sys-interview", "Interview", 5, 2, 240,
+				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // recording
+				Boolean.FALSE, Boolean.TRUE, 	// webcams moderator only, unmute
+				Boolean.FALSE, Boolean.FALSE, 	// cam, mic
+				Boolean.FALSE, Boolean.FALSE, 	// chat
+				Boolean.FALSE, Boolean.FALSE, 	// notes, layout
+				Boolean.FALSE, 					// breakout
+				Boolean.FALSE, Boolean.FALSE, Boolean.TRUE, // user list, join-lock, lock configurable
+				GuestPolicyEnum.ALWAYS_ACCEPT, false, templates);
+		
+		// Exam monitoring. Participants have video but only presenter can see the video
+		defaultTemplate("sys-assessment", "Assessment", 1, 30, 240,
+				Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, // recording
+				Boolean.TRUE,  Boolean.TRUE, 	// webcams moderator only, unmute
+				Boolean.FALSE, Boolean.TRUE, 	// cam, mic
+				Boolean.TRUE,  Boolean.FALSE, 	// chat
+				Boolean.TRUE,  Boolean.TRUE, 	// notes, layout
+				Boolean.FALSE, 					// breakout
+				Boolean.TRUE,  Boolean.TRUE, Boolean.FALSE, // user list, join-lock, lock configurable
+				GuestPolicyEnum.ALWAYS_ACCEPT, false, templates);
+
 	}
 	
 	private void defaultTemplate(String externalId, String name,
@@ -124,8 +152,9 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 			Boolean lockSettingsDisableCam, Boolean lockSettingsDisableMic,
 			Boolean lockSettingsDisablePrivateChat, Boolean lockSettingsDisablePublicChat,
 			Boolean lockSettingsDisableNote, Boolean lockSettingsLockedLayout,
+			Boolean breakoutRoomsEnabled,
 			Boolean lockSettingsHideUserList, Boolean lockSettingsLockOnJoin, Boolean lockSettingsLockOnJoinConfigurable,
-			GuestPolicyEnum guestPolicy, List<BigBlueButtonMeetingTemplate> templates) {
+			GuestPolicyEnum guestPolicy, boolean enabled, List<BigBlueButtonMeetingTemplate> templates) {
 		
 		BigBlueButtonMeetingTemplate template = templates.stream()
 				.filter(tpl -> externalId.equals(tpl.getExternalId()))
@@ -146,6 +175,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		template.setAllowStartStopRecording(allowStartStopRecording);
 		template.setWebcamsOnlyForModerator(webcamsOnlyForModerator);
 		template.setAllowModsToUnmuteUsers(allowModsToUnmuteUsers);
+		template.setBreakoutRoomsEnabled(breakoutRoomsEnabled);
 		
 		template.setLockSettingsDisableCam(lockSettingsDisableCam);
 		template.setLockSettingsDisableMic(lockSettingsDisableMic);
@@ -159,6 +189,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		template.setLockSettingsLockOnJoinConfigurable(lockSettingsLockOnJoinConfigurable);
 
 		template.setGuestPolicyEnum(guestPolicy);
+		template.setEnabled(enabled);
 		bigBlueButtonMeetingTemplateDao.updateTemplate(template);
 	}
 
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
index 84834a12e79..e00b6bef0ff 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java
@@ -224,18 +224,23 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController {
 		
 		List<BigBlueButtonRoles> editionRoles = new ArrayList<>();
 		if(businessGroup != null) {
-			if(roles.isAdministrator()) {
+			if(roles.isAdministrator() || roles.isSystemAdmin()) {
 				editionRoles.add(BigBlueButtonRoles.administrator);
 			}
-			if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup.getKey(), true, false, null)) {
-				editionRoles.add(BigBlueButtonRoles.coach);
+			if(roles.isAuthor() || roles.isLearnResourceManager()) {
+				// global authors / LR-managers can use author templates also in groups
+				editionRoles.add(BigBlueButtonRoles.author);
+			}
+			if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup)) {
+				// all group user can choose the group templates (if they are allowed to create group online-meetings)
+				editionRoles.add(BigBlueButtonRoles.group);
 			}
 		} else if(entry != null) {
 			RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(getIdentity(), roles, entry);
-			if(roles.isAdministrator()) {
+			if(roles.isAdministrator() || roles.isSystemAdmin()) {
 				editionRoles.add(BigBlueButtonRoles.administrator);
 			}
-			if(reSecurity.isAuthor()) {
+			if(reSecurity.isAuthor() || roles.isLearnResourceManager()) {
 				editionRoles.add(BigBlueButtonRoles.author);
 			}
 			if(reSecurity.isEntryAdmin()) {
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
index 84cb617a798..5b64ec2f044 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java
@@ -19,6 +19,7 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
@@ -34,12 +35,18 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupService;
+import org.olat.modules.bigbluebutton.BigBlueButtonManager;
 import org.olat.modules.bigbluebutton.BigBlueButtonMeeting;
+import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate;
+import org.olat.modules.bigbluebutton.BigBlueButtonRoles;
 import org.olat.repository.RepositoryEntry;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -69,6 +76,11 @@ public class BigBlueButtonRunController extends BasicController implements Activ
 	private boolean readOnly;
 	private boolean moderator;
 	private boolean administrator;
+
+	@Autowired
+	private BigBlueButtonManager bigBlueButtonManager;
+	@Autowired
+	private BusinessGroupService businessGroupService;
 	
 	public BigBlueButtonRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, String subIdentifier,
 			BusinessGroup group, BigBlueButtonMeetingDefaultConfiguration configuration, boolean admin, boolean moderator, boolean readOnly) {
@@ -82,11 +94,11 @@ public class BigBlueButtonRunController extends BasicController implements Activ
 		this.moderator = moderator;
 		
 		canView = !ureq.getUserSession().getRoles().isGuestOnly();
-
+		
 		if(!canView) {
 			//no accessible to guests
 			mainVC = createVelocityContainer("run");
-		} else if(administrator) {
+		} else if(administrator && hasAtLeastOneTemplate(ureq)) {
 			mainVC = createVelocityContainer("run_admin");
 			
 			segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
@@ -108,6 +120,43 @@ public class BigBlueButtonRunController extends BasicController implements Activ
 		putInitialPanel(mainVC);
 	}
 
+	
+	private boolean hasAtLeastOneTemplate(UserRequest ureq) {
+		// TODO: refactor: copy paste from BigBlueButtonEditMeetingsController.getPermittedRoles()
+		// should also apply to group config form: don't let regular students enable bbb in groups when they have no 
+		// template to choose from.
+		Roles userRoles = ureq.getUserSession().getRoles();
+		
+		List<BigBlueButtonRoles> editionRoles = new ArrayList<>();
+		if(userRoles.isAdministrator() || userRoles.isSystemAdmin()) {
+			editionRoles.add(BigBlueButtonRoles.administrator);
+		}
+		if(userRoles.isAuthor() || userRoles.isLearnResourceManager()) {
+			// global authors / LR-managers can use author templates also in groups
+			editionRoles.add(BigBlueButtonRoles.author);
+		}
+		if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), group)) {
+			// all group user can choose the group templates (if they are allowed to create group online-meetings)
+			editionRoles.add(BigBlueButtonRoles.group);
+		}
+		
+		List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonManager.getTemplates();
+		for(BigBlueButtonMeetingTemplate template:templates) {
+			if(!template.isEnabled()) continue;			
+			List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum();
+			for(BigBlueButtonRoles role:roles) {
+				for(BigBlueButtonRoles editionRole:editionRoles) {
+					if(role.accept(editionRole)) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	
+	
 	@Override
 	protected void doDispose() {
 		//
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
index 2a276e53b9b..d47862050cd 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java
@@ -19,6 +19,7 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -165,7 +166,7 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		permanentEl.select(permKeys[0], permanent);
 		permanentEl.setVisible(bigBlueButtonModule.isPermanentMeetingEnabled());
 
-		Date startDate = meeting == null ? null : meeting.getStartDate();
+		Date startDate = meeting == null ? new Date() : meeting.getStartDate();
 		startDateEl = uifactory.addDateChooser("meeting.start", "meeting.start", startDate, formLayout);
 		startDateEl.setMandatory(!permanent);
 		startDateEl.setDateChooserTimeEnabled(true);
@@ -174,6 +175,13 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		leadTimeEl = uifactory.addTextElement("meeting.leadTime", 8, leadtime, formLayout);
 		
 		Date endDate = meeting == null ? null : meeting.getEndDate();
+		if (endDate == null) {
+			// set meeting time default to 1 hour
+			Calendar calendar = Calendar.getInstance();
+		    calendar.setTime(startDate);
+		    calendar.add(Calendar.HOUR_OF_DAY, 1);
+		    endDate = calendar.getTime();
+		}
 		endDateEl = uifactory.addDateChooser("meeting.end", "meeting.end", endDate, formLayout);
 		endDateEl.setMandatory(!permanent);
 		endDateEl.setDefaultValue(startDateEl);
@@ -215,7 +223,9 @@ public class EditBigBlueButtonMeetingController extends FormBasicController {
 		if(templateEl.isOneSelected()) {
 			BigBlueButtonMeetingTemplate template = getSelectedTemplate();
 			if(template != null && template.getMaxParticipants() != null) {
-				String[] args = new String[] { template.getMaxParticipants().toString() };				
+				Integer maxConcurrentInt = template.getMaxConcurrentMeetings();
+				String maxConcurrent = (maxConcurrentInt == null ? " ∞" : maxConcurrentInt.toString());
+				String[] args = new String[] { template.getMaxParticipants().toString(), maxConcurrent};				
 				if(template.getWebcamsOnlyForModerator() != null && template.getWebcamsOnlyForModerator().booleanValue()) {
 					templateEl.setExampleKey("template.explain.max.participants.with.webcams.mod", args);
 				} else {
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
index 793555ab024..b4b77d4c771 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonTemplateController.java
@@ -118,10 +118,28 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		String description = template == null ? "" : template.getDescription();
 		descriptionEl = uifactory.addTextAreaElement("template.description", "template.description", 2000, 4, 72, false, false, description, formLayout);
 		
+		String maxParticipants = template == null || template.getMaxParticipants() == null ? null : template.getMaxParticipants().toString();
+		maxParticipantsEl = uifactory.addTextElement("template.maxParticipants", "template.maxParticipants", 8, maxParticipants, formLayout);
+		maxParticipantsEl.setMandatory(true);
+		
+		String maxDuration = null;
+		if(template == null) {
+			maxDuration = "240";
+		} else if(template.getMaxDuration() != null) {
+			maxDuration = template.getMaxDuration().toString();
+		}
+		maxDurationEl = uifactory.addTextElement("template.maxDuration", "template.maxDuration", 8, maxDuration, formLayout);
+
 		boolean enable = template == null || template.isEnabled();
 		enableEl = uifactory.addCheckboxesHorizontal("template.enabled", "template.enabled", formLayout, onKeys, new String[] { "" });
 		enableEl.select(onKeys[0], enable);
 		
+		/* ----------- */
+		uifactory.addSpacerElement("sp1", formLayout, false);
+
+		String maxConcurrentMeetings = template == null || template.getMaxConcurrentMeetings() == null ? "" : template.getMaxConcurrentMeetings().toString();
+		maxConcurrentMeetingsEl = uifactory.addTextElement("template.max.concurrent.meetings", "template.max.concurrent.meetings", 8, maxConcurrentMeetings, formLayout);
+		
 		KeyValues rolesKeyValues = new KeyValues();
 		for(BigBlueButtonRoles role:BigBlueButtonRoles.values()) {
 			rolesKeyValues.add(KeyValues.entry(role.name(), translate("role.".concat(role.name()))));
@@ -137,34 +155,29 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		for(BigBlueButtonRoles role:roles) {
 			rolesEl.select(role.name(), true);
 		}
+
+		/* ----------- */
+		uifactory.addSpacerElement("sp2", formLayout, false);
+
+		String[] onValues = new String[] { translate("yes"), translate("no")  };
 		
-		String maxConcurrentMeetings = template == null || template.getMaxConcurrentMeetings() == null ? "" : template.getMaxConcurrentMeetings().toString();
-		maxConcurrentMeetingsEl = uifactory.addTextElement("template.max.concurrent.meetings", "template.max.concurrent.meetings", 8, maxConcurrentMeetings, formLayout);
+		Boolean webcamsOnlyForModerator = template == null ? null : template.getWebcamsOnlyForModerator();
+		webcamsOnlyForModeratorEl = uifactory.addRadiosHorizontal("template.webcamsOnlyForModerator", formLayout, yesNoKeys, onValues);
+		select(webcamsOnlyForModerator, webcamsOnlyForModeratorEl, true);
 		
-		String maxParticipants = template == null || template.getMaxParticipants() == null ? null : template.getMaxParticipants().toString();
-		maxParticipantsEl = uifactory.addTextElement("template.maxParticipants", "template.maxParticipants", 8, maxParticipants, formLayout);
-		maxParticipantsEl.setMandatory(true);
+		Boolean muteOnStart = template == null ? null : template.getMuteOnStart();
+		muteOnStartEl = uifactory.addRadiosHorizontal("template.muteOnStart", formLayout, yesNoKeys, onValues);
+		select(muteOnStart, muteOnStartEl, false);
 		
-		String maxDuration = null;
-		if(template == null) {
-			maxDuration = "240";
-		} else if(template.getMaxDuration() != null) {
-			maxDuration = template.getMaxDuration().toString();
-		}
-		maxDurationEl = uifactory.addTextElement("template.maxDuration", "template.maxDuration", 8, maxDuration, formLayout);
-
-		String[] onValues = new String[] { translate("yes"), translate("no")  };
+		Boolean allowModsToUnmuteUsers = template == null ? null : template.getAllowModsToUnmuteUsers();
+		allowModsToUnmuteUsersEl = uifactory.addRadiosHorizontal("template.allowModsToUnmuteUsers", formLayout, yesNoKeys, onValues);
+		select(allowModsToUnmuteUsers, allowModsToUnmuteUsersEl, false);
 		
 		Boolean record = template == null ? null : template.getRecord();
 		recordEl = uifactory.addRadiosHorizontal("template.record", formLayout, yesNoKeys, onValues);
 		recordEl.addActionListener(FormEvent.ONCHANGE);
 		select(record, recordEl, false);
 		
-		Boolean breakout = template == null ? null : template.getBreakoutRoomsEnabled();
-		breakoutEl = uifactory.addRadiosHorizontal("template.breakout", formLayout, yesNoKeys, onValues);
-		breakoutEl.addActionListener(FormEvent.ONCHANGE);
-		select(breakout, breakoutEl, true);
-		
 		Boolean autoStartRecording = template == null ? null : template.getAutoStartRecording();
 		autoStartRecordingEl = uifactory.addRadiosHorizontal("template.autoStartRecording", formLayout, yesNoKeys, onValues);
 		select(autoStartRecording, autoStartRecordingEl, false);
@@ -173,17 +186,23 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		allowStartStopRecordingEl = uifactory.addRadiosHorizontal("template.allowStartStopRecording", formLayout, yesNoKeys, onValues);
 		select(allowStartStopRecording, allowStartStopRecordingEl, true);
 		
-		Boolean muteOnStart = template == null ? null : template.getMuteOnStart();
-		muteOnStartEl = uifactory.addRadiosHorizontal("template.muteOnStart", formLayout, yesNoKeys, onValues);
-		select(muteOnStart, muteOnStartEl, false);
+		Boolean breakout = template == null ? null : template.getBreakoutRoomsEnabled();
+		breakoutEl = uifactory.addRadiosHorizontal("template.breakout", formLayout, yesNoKeys, onValues);
+		breakoutEl.addActionListener(FormEvent.ONCHANGE);
+		select(breakout, breakoutEl, true);
 		
-		Boolean webcamsOnlyForModerator = template == null ? null : template.getWebcamsOnlyForModerator();
-		webcamsOnlyForModeratorEl = uifactory.addRadiosHorizontal("template.webcamsOnlyForModerator", formLayout, yesNoKeys, onValues);
-		select(webcamsOnlyForModerator, webcamsOnlyForModeratorEl, true);
+		Boolean lockSettingsLockOnJoin = template == null ? null : template.getLockSettingsLockOnJoin();
+		lockSettingsLockOnJoinEl = uifactory.addRadiosHorizontal("template.lockSettingsLockOnJoin", formLayout, yesNoKeys, onValues);
+		lockSettingsLockOnJoinEl.addActionListener(FormEvent.ONCHANGE);
+		select(lockSettingsLockOnJoin, lockSettingsLockOnJoinEl, true);
 		
-		Boolean allowModsToUnmuteUsers = template == null ? null : template.getAllowModsToUnmuteUsers();
-		allowModsToUnmuteUsersEl = uifactory.addRadiosHorizontal("template.allowModsToUnmuteUsers", formLayout, yesNoKeys, onValues);
-		select(allowModsToUnmuteUsers, allowModsToUnmuteUsersEl, false);
+		Boolean lockSettingsLockOnJoinConfigurable = template == null ? null : template.getLockSettingsLockOnJoinConfigurable();
+		lockSettingsLockOnJoinConfigurableEl = uifactory.addRadiosHorizontal("template.lockSettingsLockOnJoinConfigurable", formLayout, yesNoKeys, onValues);
+		select(lockSettingsLockOnJoinConfigurable, lockSettingsLockOnJoinConfigurableEl, false);
+			
+		/* ----------- */
+		uifactory.addSpacerElement("sp2", formLayout, false);
+		uifactory.addStaticTextElement("template.lock", "template.lock", null, formLayout);		
 		
 		Boolean lockSettingsDisableCam = template == null ? null : template.getLockSettingsDisableCam();
 		lockSettingsDisableCamEl = uifactory.addRadiosHorizontal("template.lockSettingsDisableCam", formLayout, yesNoKeys, onValues);
@@ -193,35 +212,26 @@ public class EditBigBlueButtonTemplateController extends FormBasicController {
 		lockSettingsDisableMicEl = uifactory.addRadiosHorizontal("template.lockSettingsDisableMic", formLayout, yesNoKeys, onValues);
 		select(lockSettingsDisableMic, lockSettingsDisableMicEl, false);
 		
-		Boolean lockSettingsDisablePrivateChat = template == null ? null : template.getLockSettingsDisablePrivateChat();
-		lockSettingsDisablePrivateChatEl =  uifactory.addRadiosHorizontal("template.lockSettingsDisablePrivateChat", formLayout, yesNoKeys, onValues);
-		select(lockSettingsDisablePrivateChat, lockSettingsDisablePrivateChatEl, false);
-		
 		Boolean lockSettingsDisablePublicChat = template == null ? null : template.getLockSettingsDisablePublicChat();
 		lockSettingsDisablePublicChatEl =  uifactory.addRadiosHorizontal("template.lockSettingsDisablePublicChat", formLayout, yesNoKeys, onValues);
 		select(lockSettingsDisablePublicChat, lockSettingsDisablePublicChatEl, false);
 		
+		Boolean lockSettingsDisablePrivateChat = template == null ? null : template.getLockSettingsDisablePrivateChat();
+		lockSettingsDisablePrivateChatEl =  uifactory.addRadiosHorizontal("template.lockSettingsDisablePrivateChat", formLayout, yesNoKeys, onValues);
+		select(lockSettingsDisablePrivateChat, lockSettingsDisablePrivateChatEl, false);
+		
 		Boolean lockSettingsDisableNote = template == null ? null : template.getLockSettingsDisableNote();
 		lockSettingsDisableNoteEl =  uifactory.addRadiosHorizontal("template.lockSettingsDisableNote", formLayout, yesNoKeys, onValues);
 		select(lockSettingsDisableNote, lockSettingsDisableNoteEl, false);
 		
-		Boolean lockSettingsLockedLayout = template == null ? null : template.getLockSettingsLockedLayout();
-		lockSettingsLockedLayoutEl = uifactory.addRadiosHorizontal("template.lockSettingsLockedLayout", formLayout, yesNoKeys, onValues);
-		select(lockSettingsLockedLayout, lockSettingsLockedLayoutEl, false);
-		
 		Boolean lockSettingsHideUserList = template == null ? null : template.getLockSettingsHideUserList();
 		lockSettingsHideUserListEl = uifactory.addRadiosHorizontal("template.lockSettingsHideUserList", formLayout, yesNoKeys, onValues);
 		select(lockSettingsHideUserList, lockSettingsHideUserListEl, false);
 		
-		Boolean lockSettingsLockOnJoin = template == null ? null : template.getLockSettingsLockOnJoin();
-		lockSettingsLockOnJoinEl = uifactory.addRadiosHorizontal("template.lockSettingsLockOnJoin", formLayout, yesNoKeys, onValues);
-		lockSettingsLockOnJoinEl.addActionListener(FormEvent.ONCHANGE);
-		select(lockSettingsLockOnJoin, lockSettingsLockOnJoinEl, true);
+		Boolean lockSettingsLockedLayout = template == null ? null : template.getLockSettingsLockedLayout();
+		lockSettingsLockedLayoutEl = uifactory.addRadiosHorizontal("template.lockSettingsLockedLayout", formLayout, yesNoKeys, onValues);
+		select(lockSettingsLockedLayout, lockSettingsLockedLayoutEl, false);
 		
-		Boolean lockSettingsLockOnJoinConfigurable = template == null ? null : template.getLockSettingsLockOnJoinConfigurable();
-		lockSettingsLockOnJoinConfigurableEl = uifactory.addRadiosHorizontal("template.lockSettingsLockOnJoinConfigurable", formLayout, yesNoKeys, onValues);
-		select(lockSettingsLockOnJoinConfigurable, lockSettingsLockOnJoinConfigurableEl, false);
-	
 		FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add("buttons", buttonLayout);
 		uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
index 7f066b8c3b7..5e3781462cd 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_content/meeting.html
@@ -29,7 +29,9 @@
 <div class="o_block_large">
 	<fieldset>
 		<legend>$r.translate("recordings")</legend>
-		<div class="o_info">$r.translate("recording.browser.infos")</div>
+		#if ($r.isTrue($hasRecordings))
+		<div class="o_note"><i class="o_icon o_icon-fw o_icon_info"> </i> $r.translate("recording.browser.infos")</div>
+		#end
 		$r.render("recordings")
 	</fieldset>
 </div>
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
index a7f7aa3ff1c..48d943e2baa 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
@@ -1,116 +1,112 @@
 #Thu Mar 19 21:29:32 CET 2020
 account.configuration=Konfiguration
-add.meeting=Meeting hinzuf\u00FCgen
-add.template=Vorlage erstellen
+add.meeting=Online-Termin hinzuf\u00FCgen
+add.template=Raumvorlage erstellen
 admin.menu.title=BigBlueButton
-admin.menu.title.alt=BigBlueButton
-bigbluebutton.intro=Konfiguration von BigBlueButton Web Conferencing
+admin.menu.title.alt=BigBlueButton Web Conferencing
+bigbluebutton.intro=BigBlueButton ist ein Open Source Web Conferencing System speziell f\u00fcr eLearning. Weitere Informationen zu BigBlueButton findet sich auf der <a href='https://bigbluebutton.org' target='_blank'>BigBlueButton Webseite</a> und dem <a href='https://github.com/bigbluebutton' target='_blank'>BigBlueButton GitHub Repository</a>
 bigbluebutton.module.enabled=Modul "BigBlueButton"
-bigbluebutton.module.enabled.for=Einschalten f\u00FCr
+bigbluebutton.module.enabled.for=Aktivieren f\u00FCr
 bigbluebutton.module.enabled.for.courses=Kurse
 bigbluebutton.module.enabled.for.groups=Gruppen
-bigbluebutton.title=BigBlueButton
+bigbluebutton.title=Konfiguration BigBlueButton Web Conferencing Service
 calendar.open=Raumbuchungen anzeigen
 calendar.title=Kalender
 check=Serververbindung testen
-confirm.delete.meeting=Wollen Sie wirklich den Meeting "{0}" l\u00F6schen?
-confirm.delete.meeting.title=Meeting "{0}" l\u00F6schen
-confirm.delete.template=Wollen Sie wirklich die Vorlage "{0}" l\u00F6schen?
-confirm.delete.template.title=Vorlage "{0}" l\u00F6schen
-connection.failed=Login fehlgeschlagen.
-connection.successful=Login erfolgreich\!
-edit.template=Vorlage "{0}" bearbeiten
-enable.permanent.meeting=Dauernd Meeting einschalten
-enable.adhoc.meeting=Adhoc Meeting einschalten
-error.duration=Meeting dauert zu lange. Maximal Dauer ist {0} Minuten.
-error.end.past=Meeting kann nicht in Vergangenheit geplant werden.
+confirm.delete.meeting=Wollen Sie wirklich den Online-Termin "{0}" l\u00F6schen?
+confirm.delete.meeting.title=Online-Termin "{0}" l\u00F6schen
+confirm.delete.template=Wollen Sie wirklich die Raumvorlage "{0}" l\u00F6schen?
+confirm.delete.template.title=Raumvorlage "{0}" l\u00F6schen
+connection.failed=BigBlueButton API Login fehlgeschlagen.
+connection.successful=BigBlueButton API Login erfolgreich\!
+edit.template=Raumvorlage "{0}" bearbeiten
+enable.permanent.meeting=Online-Termine ohne Datum
+enable.adhoc.meeting=Adhoc Online-Termin
+error.duration=Termindauer \u00fcberschritten. Maximal Dauer: {0} Minuten.
+error.end.past=Der Online-Termin kann nicht in Vergangenheit geplant werden.
 error.prefix=Ein Fehler ist aufgetreten\:
 error.server.raw={1} <small>Schl\u00FCssel\: {0}</small>
-error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein.
-error.too.long.time=Zeit ist zu lang. Es ist auf {0} Minuten limitiert.
-guest.policy.always.accept=Always accept
-guest.policy.always.deny=Always deny
-guest.policy.ask.moderator=Ask moderator
-meeting.create.intro=Das Meeting wurde noch nicht er\u00f6ffnet. Teilnehmer k\u00F6nnen den Raum f\u00fcr ein geplantes Meeting ggf. nicht betreten.
+error.start.after.end=Das Enddatum darf nicht vor dem Beginndatum sein.
+error.too.long.time=Zeit ist zu lang. Es sind maximal {0} Minuten erlaubt.
+meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00f6ffnet. Teilnehmer k\u00F6nnen den Raum f\u00fcr noch nicht betreten.
 meeting.description=Beschreibung
-meeting.end=End
-meeting.ended=Meeting ist schon beendet.
+meeting.end=Ende
+meeting.ended=Der Online-Termin wurde bereits beendet.
 meeting.followupTime=Nachlaufzeit (Min.)
-meeting.go.button=Zum Meeting Raum gehen
+meeting.go.button=Zum Online-Termin Raum
 meeting.join.button=Meeting beitreten
 meeting.leadTime=Vorlaufzeit (Min.)
 meeting.name=Name
-meeting.no.template=Standardeinstellungen
-meeting.permanent=Typ
-meeting.permanent.on=Dauernd
-meeting.resource=Resource
+meeting.permanent=Online-Termin planung
+meeting.permanent.on=Ohne Datum
+meeting.resource=Kontext
 meeting.start=Beginn
-meeting.start.button=Meeting starten
-meeting.template=Vorlage
-meeting.welcome=Begr\u00FCssung
-meetings.admin.title=Konfiguration
-meetings.past=Alte Meetings
-meetings.title=Meetings
-meetings.upcoming=Zuk\u00FCnftige Meetings
+meeting.start.button=Online-Termin starten
+meeting.template=Raumvorlage
+meeting.welcome=Begr\u00FCssungstext
+meetings.admin.title=Terminverwaltung
+meetings.past=Abgelaufene Online-Termine
+meetings.title=Online-Termine
+meetings.upcoming=Aktuelle und zuk\u00FCnftige Online-Termine
 minutes={0} Min.
-no.meeting.configured=Es sind noch keine Meetings konfiguriert.
-no.template.configured=Es sind noch keine Vorlage konfiguriert.
-no.recordings=Es sind noch keine Aufzeichnungen vorhanden.
-no.upcoming.meetings=Sie haben keine zuk\u00FCnftigen Meetings.
-option.baseurl=URL BigBlueButton Server
+no.meeting.configured=Zur Zeit sind keine Online-Termine vorhanden.
+no.template.configured=Es sind keine aktiven Raumvorlagen vorhanden.
+no.recordings=Es ist zur Zeit noch keine Aufzeichnung f\u00FCr diesen Online-Termin vorhanden.
+no.upcoming.meetings=Zur Zeit sind keine aktuellen oder zuk\u00FCnftigen Online-Termine vorhanden.
+option.baseurl=BigBlueButton API URL 
 option.baseurl.example=https\://bigbluebutton.openolat.com/bigbluebutton/
 option.bigbluebutton.secret=Secret
 option.bigbluebutton.shared.secret=Shared secret
 recordings=Aufzeichnungen
 recording.browser.infos=Aufzeichnungen k\u00F6nnen nur mit Google Chrome und Firefox gesehen werden.
 recording.type.podcast=Podcast
-recording.type.presentation=Vorstellung
+recording.type.presentation=Pr\u00E4sentation
 role.administrator=Administrator
 role.author=Autor
 role.coach=Betreuer
-role.owner=Course owner
-server.overloaded=Es gibt kein Platz verf\u00FCgbar auf dem Server an den gew\u00E4hlten Datum.
-table.header.enabled=Eingeschaltet
-table.header.permanent=Dauernd
+role.owner=Kursbesitzer
+role.group=Gruppenmitglied
+server.overloaded=F\u00FCr das gew\u00E4hlten Datum/Uhrzeit ist kein Raum verf\u00FCgbar. W\u00E4hlen Sie ein anderes Datum/Uhrzeit oder eine andere Raumvorlage.
+table.header.enabled=Aktiv
+table.header.permanent=Ohne Datum
 table.header.system=System
-table.header.max.concurrent.meetings=Gleichseitig Meetings
-table.header.max.duration=Max. Dauer
-table.header.max.participants=Max. Teilnehmer
+table.header.max.concurrent.meetings=R\u00E4ume
+table.header.max.duration=Dauer
+table.header.max.participants=Teilnehmer
 table.header.recording.name=Name
 table.header.recording.type=Typ
 table.header.recording.open=\u00D6ffnen
 table.header.recording.start=Beginn
-table.header.recording.end=End
-table.header.template=Typ
-table.header.webcams.only.moderator=Webcams Moderatoren
-template.allowModsToUnmuteUsers=Allow moderators to unmute users
-template.allowStartStopRecording=Allow to start / stop recording
-template.autoStartRecording=Auto start recording
-template.breakout=Breakout Meetings erlauben
+table.header.recording.end=Ende
+table.header.template=Raumvorlage
+table.header.webcams.only.moderator=Nur Moderatorenkamera
+template.allowModsToUnmuteUsers=Moderatoren d\u00FCrfen Teilnehmer-Mikrofon aktiveren
+template.allowStartStopRecording=Starten und Stoppen von Aufzeichnungen zulassen
+template.autoStartRecording=Aufzeichnung automatisch starten
+template.breakout=Breakout-R\u00E4me zulassen
 template.description=Beschreibung
-template.enabled=Vorlage einschalten
-template.explain.max.participants=Max. Anzahl von Teilnehmer: {0}
-template.explain.max.participants.with.webcams.mod=Max. Anzahl von Teilnehmer: {0}, Webcams f\u00FCr Moderatoren
-template.guestPolicy=Guest policy
-template.lockSettingsDisableCam=Lock settings disable camera
-template.lockSettingsDisableMic=Lock settings disable micro
-template.lockSettingsDisableNote=Lock settings disable note
-template.lockSettingsDisablePrivateChat=Lock settings disable private chat
-template.lockSettingsDisablePublicChat=Lock settings disable public chat
-template.lockSettingsLockedLayout=Lock settings locked layout
-template.lockSettingsHideUserList=Hide user list for locked users
-template.lockSettingsLockOnJoin=Put viewer into lock mode on join
-template.lockSettingsLockOnJoinConfigurable=Moderator cannot change setting above
-template.maxDuration=Max. L\u00E4nge des Meeting (Minuten)
-template.maxParticipants=Max. Teilnehmer
-template.maxParticipants.default=Standard
-template.max.concurrent.meetings=Max. gleichzeitige Meetings
-template.muteOnStart=Mute on start
-template.name=Name
-template.record=Aufzeichnen
-template.roles=Erlaubt Vorlage zu verwenden
-template.webcamsOnlyForModerator=Webcams only for moderators
-templates.title=Vorlagen
+template.enabled=Raumvorlage aktivieren
+template.explain.max.participants=Max. Anzahl Teilnehmer: {0} ({1} R\u00E4ume verf\u00FCgbar)
+template.explain.max.participants.with.webcams.mod=Max. Anzahl Teilnehmer: {0}, nur Moderatorenkamera ({1} R\u00E4ume verf\u00FCgbar)
+template.lock=F\u00FCr gesperrte Teilnehmer... 
+template.lockSettingsDisableCam=Kamera ausschalten
+template.lockSettingsDisableMic=Mikrofon ausschalten
+template.lockSettingsDisableNote=Gmeinsame Notizen ausschalten
+template.lockSettingsDisablePrivateChat=Privater Chat ausschalten
+template.lockSettingsDisablePublicChat=Öffentlicher Chat ausschalten
+template.lockSettingsLockedLayout=Layoutanpassung ausschalten
+template.lockSettingsHideUserList=Teilnehmerliste ausschalten
+template.lockSettingsLockOnJoin=Teilnehmer bei Eintritt automatisch sperren
+template.lockSettingsLockOnJoinConfigurable=Ausschalten der automatischen Sperre durch Moderator verhindern
+template.maxDuration=Dauer (Minuten)
+template.maxParticipants=Anzahl Teilnehmer
+template.max.concurrent.meetings=Anzahl R\u00E4ume
+template.muteOnStart=Teilnehmer-Mikrofon beim Eintritt deaktivieren
+template.name=Raumname
+template.record=Aufzeichnungen des Online-Termins zulassen
+template.roles=Raumvorlage aktiviert f\u00FCr
+template.webcamsOnlyForModerator=Nur Moderatorenkamera
+templates.title=Raumvorlagen
 view=Ansehen
-view.template=Vorlage "{0}"
-warning.template.in.use=Die Vorlage kann nicht gel\u00F6scht werden weil sie nocht benutzt wird.
+view.template=Raumvorlage "{0}"
+warning.template.in.use=Die Raumvorlage kann nicht gel\u00F6scht werden da sie nocht benutzt wird. L\u00F6schschen Sie zuerst die entsprechenden Online-Termine oder deaktivieren Sie die Raumvorlage.
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
index e6e99d7b471..32d118f1c3f 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
@@ -1,63 +1,59 @@
 #Thu Mar 19 21:29:07 CET 2020
 account.configuration=Configuration
-add.meeting=Add meeting
-add.template=New template
+add.meeting=Add online-meeting
+add.template=New room template
 admin.menu.title=BigBlueButton
-admin.menu.title.alt=BigBlueButton
-bigbluebutton.intro=Configuration of BigBlueButton Web Conferencing
+admin.menu.title.alt=BigBlueButton Web Conferencing
+bigbluebutton.intro=BigBlueButton is an Open Source Web Conferencing System designed for learning. More information about BigBlueButton can be found on the <a href='https://bigbluebutton.org' target='_blank'>BigBlueButton web page</a> and the <a href='https://github.com/bigbluebutton' target='_blank'>BigBlueButton GitHub repository</a>
 bigbluebutton.module.enabled=Module "BigBlueButton"
-bigbluebutton.module.enabled.for=Enable for
+bigbluebutton.module.enabled.for=Activate for
 bigbluebutton.module.enabled.for.courses=Courses
 bigbluebutton.module.enabled.for.groups=Groups
-bigbluebutton.title=BigBlueButton
+bigbluebutton.title=Configuration of BigBlueButton Web Conferencing service
 calendar.open=Show room bookings
 calendar.title=Calendar
-check=Check the connection
-confirm.delete.meeting=Do you really want to delete the meeting "{0}"?
-confirm.delete.meeting.title=Delete meeting "{0}"
-confirm.delete.template=Do you really want to delete the template "{0}"?
-confirm.delete.template.title=Delete template "{0}"
-connection.failed=Login failed.
-connection.successful=Login successful\!
-edit.template=Edit template "{0}"
-enable.permanent.meeting=Enable permanent meeting
-enable.adhoc.meeting=Enable adhoc meeting
-error.duration=Meeting is too long. Maximal duration is {0} minutes.
-error.end.past=Meeting cannot be planned in the past.
+check=Check server connection
+confirm.delete.meeting=Do you really want to delete the online-meeting "{0}"?
+confirm.delete.meeting.title=Delete online-meeting "{0}"
+confirm.delete.template=Do you really want to delete the room-template "{0}"?
+confirm.delete.template.title=Delete room-template "{0}"
+connection.failed=BigBlueButton API login failed.
+connection.successful=BigBlueButton API login successful\!
+edit.template=Edit room-template "{0}"
+enable.permanent.meeting=Online-Meetings without date
+enable.adhoc.meeting=Adhoc online-meeting
+error.duration=Meeting duration is too long. Maximal duration: {0} minutes.
+error.end.past=Online-meeting cannot be planned in the past.
 error.prefix=An error happened\:
 error.server.raw={1} <small>Key {0}</small>
-error.start.after.end=The end date of the meeting must not be before the start date.
+error.start.after.end=The end date must not be before the start date.
 error.too.long.time=Time is too long. It is limited to {0} minutes.
-guest.policy.always.accept=Always accept
-guest.policy.always.deny=Always deny
-guest.policy.ask.moderator=Ask moderator
-meeting.create.intro=The meeting has not been opened, yet. Participants are not able to enter the classroom for a meeting.
+meeting.create.intro=The meeting has not yet been started by the coach. Participants are not able to enter the classroom.
 meeting.description=Description
 meeting.end=End date
-meeting.ended=Meeting already ended.
+meeting.ended=The online-meeting has already ended.
 meeting.followupTime=Follow-up (min.)
-meeting.go.button=Go to the meeting room
+meeting.go.button=Go to the onlin-meeting room
 meeting.join.button=Join the meeting
 meeting.leadTime=Prep time (min.)
 meeting.name=Name
-meeting.no.template=Default settings
-meeting.permanent=Typ
-meeting.permanent.on=Permanent
-meeting.resource=Resource
+meeting.permanent=Onine-Meeting scheduling
+meeting.permanent.on=Without date
+meeting.resource=Context
 meeting.start=Start date
-meeting.start.button=Start the meeting
-meeting.template=Template
+meeting.start.button=Start the online-meeting
+meeting.template=Room-template
 meeting.welcome=Welcome message
-meetings.admin.title=Configuration
-meetings.past=Old meetings
-meetings.title=Meetings
-meetings.upcoming=Upcoming meetings
+meetings.admin.title=Meeting management
+meetings.past=Past online-meetings
+meetings.title=Online-meetings
+meetings.upcoming=Current and upcoming onlin-meetings
 minutes={0} min.
-no.meeting.configured=No meetings have been configured yet.
-no.recordings=There is no recording available for the moment.
-no.template.configured=No templates have been configured yet.
-no.upcoming.meetings=You don't have any upcoming meeting.
-option.baseurl=URL BigBlueButton Server
+no.meeting.configured=There are no online-meetings available at this time.
+no.recordings=There is no recording available for this online-meeting at this time.
+no.template.configured=There are no active room-templates available.
+no.upcoming.meetings=There are no current or upcoming meetings available at this time.
+option.baseurl=BigBlueButton API URL
 option.baseurl.example=https\://bigbluebutton.openolat.com/bigbluebutton/
 option.bigbluebutton.secret=Secret
 option.bigbluebutton.shared.secret=Shared secret
@@ -68,50 +64,50 @@ recording.type.presentation=Presentation
 role.administrator=Administrator
 role.author=Author
 role.coach=Coach
-role.owner=Kursbesitzer
-server.overloaded=There is no place available on the server for the choosen dates.
+role.owner=Course owner
+role.group=Group user
+server.overloaded=There is no room available for the choosen date/time. Choose another date/time or another room template.
 table.header.enabled=Enabled
-table.header.permanent=Permanent
+table.header.permanent=Withour date
 table.header.system=System
-table.header.max.concurrent.meetings=Concurrent meetings
-table.header.max.duration=Max. duration
-table.header.max.participants=Max. participants
+table.header.max.concurrent.meetings=Rooms
+table.header.max.duration=Duration
+table.header.max.participants=Participants
 table.header.recording.name=Name
 table.header.recording.type=Type
 table.header.recording.open=Open
 table.header.recording.start=Start
 table.header.recording.end=End
-table.header.template=Type
-table.header.webcams.only.moderator=Webcams moderators
-template.allowModsToUnmuteUsers=Allow moderators to unmute users
-template.allowStartStopRecording=Allow to start / stop recording
-template.autoStartRecording=Auto start recording
-template.breakout=Allow breakout meetings
+table.header.template=Room-template
+table.header.webcams.only.moderator=Webcams only for moderators
+template.allowModsToUnmuteUsers=Allow moderators to activate the participants microphone
+template.allowStartStopRecording=Allow to start / stop of recordings
+template.autoStartRecording=Automatically start recording
+template.breakout=Allow breakout rooms
 template.description=Description
-template.enabled=Enable template
-template.explain.max.participants=Max. number of participants: {0}
-template.explain.max.participants.with.webcams.mod=Max. number of participants: {0}, webcams for moderators
-template.guestPolicy=Guest policy
-template.lockSettingsDisableCam=Lock settings disable camera
-template.lockSettingsDisableMic=Lock settings disable micro
-template.lockSettingsDisableNote=Lock settings disable note
-template.lockSettingsDisablePrivateChat=Lock settings disable private chat
-template.lockSettingsDisablePublicChat=Lock settings disable public chat
-template.lockSettingsLockedLayout=Lock settings locked layout
-template.lockSettingsHideUserList=Hide user list for locked users
-template.lockSettingsLockOnJoin=Put viewer into lock mode on join
-template.lockSettingsLockOnJoinConfigurable=Moderator cannot change setting above
-template.maxDuration=Max. duration of the meeting (minutes)
-template.maxParticipants=Max. participants
-template.maxParticipants.default=Default
-template.max.concurrent.meetings=Max. concurrent meetings
-template.muteOnStart=Mute on start
-template.name=Name
-template.record=Record
-template.roles=Allow to use the template
+template.enabled=Enable room-template
+template.explain.max.participants=Max. number of participants: {0} ({1} rooms available)
+template.explain.max.participants.with.webcams.mod=Max. number of participants: {0}, only moderator webcam ({1} rooms available)
+template.lock=For locked participants... 
+template.lockSettingsDisableCam=disable webcam
+template.lockSettingsDisableMic=disable microphone
+template.lockSettingsDisableNote=disable shared-notes
+template.lockSettingsDisablePrivateChat=disable private chat
+template.lockSettingsDisablePublicChat=disable public chat
+template.lockSettingsLockedLayout=disable layout changes
+template.lockSettingsHideUserList=disable participant list
+template.lockSettingsLockOnJoin=Put participants into lock mode on join
+template.lockSettingsLockOnJoinConfigurable=Prevent disabling of the automatic locking by the moderator
+template.maxDuration=Duration (minutes)
+template.maxParticipants=Number of participants
+template.max.concurrent.meetings=Number of rooms
+template.muteOnStart=Disable participant microphone on join
+template.name=Room name
+template.record=Allow meeting recording
+template.roles=Room-template activated for
 template.webcamsOnlyForModerator=Webcams only for moderators
-templates.title=Templates
+templates.title=Room-templates
 view=View
-view.template=Template "{0}"
-warning.template.in.use=The template cannot be deleted. It's still used.
+view.template=Room-template "{0}"
+warning.template.in.use=The room-template cannot be deleted because it is used by online-meetings. Delete the corresponding online-meeting or de-activate the room-template.
 
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
index 9f217247d3b..9aee62b80ba 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
@@ -21,9 +21,6 @@ edit.template=\u00C9diter le mod\u00E8le "{0}"
 error.prefix=Une erreur s'est produite\:
 error.server.raw={1} <small>Cl\u00E9\: {0}</small>
 error.start.after.end=La date de fin du rendez-vous ne peut se trouver avant la date de d\u00E9but.
-guest.policy.always.accept=Toujours accepter
-guest.policy.always.deny=Toujours refuser
-guest.policy.ask.moderator=Demander au mod\u00E9rateur
 meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der.
 meeting.description=Description
 meeting.end=Date de fin
@@ -33,7 +30,6 @@ meeting.go.button=Aller \u00E0 la salle du meeting
 meeting.join.button=Rejoindre le meeting
 meeting.leadTime=Pr\u00E9paration (min.)
 meeting.name=Nom
-meeting.no.template=Configuration par d\u00E9faut
 meeting.permanent=Type
 meeting.permanent.on=Permanent
 meeting.resource=Ressource
@@ -59,7 +55,6 @@ table.header.permanent=Permanent
 table.header.system=Syst\u00E8me
 template.description=Description
 template.maxParticipants=Nombre max. de participants
-template.maxParticipants.default=D\u00E9fault
 template.name=Nom
 templates.title=Mod\u00E8les
 warning.template.in.use=Le mod\u00E8le ne peut pas \u00EAtre effacer car il est encore utilis\u00E9.
-- 
GitLab