diff --git a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java index 3971704e395d59711fb4cd26c69ff81be3419d87..5d47185ac0019cce1ba26aafbaefbe719458f729 100644 --- a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java @@ -125,8 +125,7 @@ public class AdobeConnectCourseNode extends AbstractAccessableCourseNode { boolean moderator = admin || userCourseEnv.isCoach(); // create run controller RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); - boolean allowGuestAccess = getModuleConfiguration().getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false); - AdobeConnectMeetingDefaultConfiguration configuration = new AdobeConnectMeetingDefaultConfiguration(allowGuestAccess); + AdobeConnectMeetingDefaultConfiguration configuration = new AdobeConnectMeetingDefaultConfiguration(true); controller = new AdobeConnectRunController(ureq, wControl, entry, getIdent(), null, configuration, admin, moderator, userCourseEnv.isCourseReadOnly()); } diff --git a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditController.java b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditController.java index 121cc0dbc1d1f8531f1c317f35e4e7f3289441ff..052c52d51e909b2ba2f96e2f57634a560eb7515c 100644 --- a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditController.java +++ b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditController.java @@ -22,7 +22,6 @@ package org.olat.course.nodes.adobeconnect; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.tabbedpane.TabbedPane; -import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.ControllerEventListener; import org.olat.core.gui.control.Event; @@ -52,9 +51,7 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr private static final String[] paneKeys = { PANE_TAB_VCCONFIG, PANE_TAB_ACCESSIBILITY }; private TabbedPane tabPane; - private final VelocityContainer editVc; - private AdobeConnectEditFormController editForm; private ConditionEditController accessibilityCondContr; private final AdobeConnectCourseNode courseNode; @@ -63,7 +60,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr ICourse course, UserCourseEnvironment userCourseEnv) { super(ureq, wControl); this.courseNode = courseNode; - editVc = createVelocityContainer("edit"); String providerId = courseNode.getModuleConfiguration().getStringValue("vc_provider_id"); if("wimba".equals(providerId)) { @@ -74,10 +70,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr accessibilityCondContr = new ConditionEditController(ureq, wControl, userCourseEnv, accessCondition, AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), courseNode)); listenTo(accessibilityCondContr); - - editForm = new AdobeConnectEditFormController(ureq, getWindowControl(), courseNode); - listenTo(editForm); - editVc.put("configuration", editForm.getInitialComponent()); } @Override @@ -108,10 +100,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr courseNode.setPreConditionAccess(cond); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } - } else if (source == editForm) { // config form action - if (event == NodeEditController.NODECONFIG_CHANGED_EVENT) { - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } } } @@ -120,7 +108,5 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr tabPane = tabbedPane; tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessibilityCondContr.getWrappedDefaultAccessConditionVC(translate("condition.accessibility.title"))); - tabbedPane.addTab(translate(PANE_TAB_VCCONFIG), editVc); } - } diff --git a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditFormController.java b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditFormController.java deleted file mode 100644 index f5b491e9b17f04f62622f225fc663b92882aa35a..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectEditFormController.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * <a href="http://www.openolat.org"> - * OpenOLAT - Online Learning and Training</a><br> - * <p> - * Licensed under the Apache License, Version 2.0 (the "License"); <br> - * you may not use this file except in compliance with the License.<br> - * You may obtain a copy of the License at the - * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> - * <p> - * Unless required by applicable law or agreed to in writing,<br> - * software distributed under the License is distributed on an "AS IS" BASIS, <br> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> - * See the License for the specific language governing permissions and <br> - * limitations under the License. - * <p> - * Initial code contributed and copyrighted by<br> - * frentix GmbH, http://www.frentix.com - * <p> - */ -package org.olat.course.nodes.adobeconnect; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; -import org.olat.core.gui.components.form.flexible.impl.FormBasicController; -import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.util.Util; -import org.olat.course.editor.NodeEditController; -import org.olat.course.nodes.AdobeConnectCourseNode; -import org.olat.modules.ModuleConfiguration; -import org.olat.modules.adobeconnect.ui.AdobeConnectRunController; - -/** - * - * Initial date: 1 mars 2019<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class AdobeConnectEditFormController extends FormBasicController { - - private static final String[] onKeys = new String[] { "on" }; - - private MultipleSelectionElement guestAllowedEl; - //private MultipleSelectionElement guestAllowedStartEl; - - private ModuleConfiguration config; - - public AdobeConnectEditFormController(UserRequest ureq, WindowControl wControl, - AdobeConnectCourseNode courseNode) { - super(ureq, wControl, Util.createPackageTranslator(AdobeConnectRunController.class, ureq.getLocale())); - config = courseNode.getModuleConfiguration(); - initForm(ureq); - } - - @Override - protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - setFormTitle("pane.tab.vcconfig"); - setFormContextHelp("Communication and Collaboration#_openmeeting"); - - String[] guestValues = new String[] { translate("vc.access.open") }; - guestAllowedEl = uifactory.addCheckboxesHorizontal("guest.allowed", formLayout, onKeys, guestValues); - if(!config.getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false)) { - guestAllowedEl.select(onKeys[0], true); - } - /* - String[] guestStartValues = new String[] { translate("vc.access.start") }; - guestAllowedStartEl = uifactory.addCheckboxesHorizontal("moderator.start.meeting", formLayout, onKeys, guestStartValues); - if(config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, true)) { - guestAllowedStartEl.select(onKeys[0], true); - } - */ - - FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); - formLayout.add(buttonsCont); - uifactory.addFormSubmitButton("save", buttonsCont); - - } - - @Override - protected void doDispose() { - // - } - - @Override - protected void formOK(UserRequest ureq) { - config.setBooleanEntry(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, !guestAllowedEl.isSelected(0)); - //config.setBooleanEntry(AdobeConnectEditController.MODERATOR_START_MEETING, guestAllowedStartEl.isSelected(0)); - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } -} diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java b/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java index 607347452bd4814048e9e7e2346b6caf68b7419b..715479ee5a23a0da6b446d952e50055f7ecacb8e 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java @@ -44,6 +44,8 @@ import org.olat.course.ICourse; import org.olat.course.nodes.AdobeConnectCourseNode; import org.olat.modules.adobeconnect.AdobeConnectMeeting; import org.olat.modules.adobeconnect.AdobeConnectModule; +import org.olat.modules.adobeconnect.model.AdobeConnectError; +import org.olat.modules.adobeconnect.model.AdobeConnectErrorCodes; import org.olat.modules.adobeconnect.model.AdobeConnectErrors; import org.olat.modules.adobeconnect.model.AdobeConnectPermission; import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal; @@ -259,7 +261,7 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI { UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder(); builder .queryParam("action", "sco-delete") - .queryParam("sco-id", "adahgf" /* meeting.getScoId() */); + .queryParam("sco-id", meeting.getScoId()); boolean ok = false; HttpGet get = createAdminMethod(builder, error); @@ -542,10 +544,12 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI { CloseableHttpResponse response = httpClient.execute(getLogin)) { int statusCode = response.getStatusLine().getStatusCode(); if(statusCode == 200) { - BreezeSession loginSession = AdobeConnectUtils.getBreezeSessionIfOk(response); + BreezeSession loginSession = AdobeConnectUtils.getBreezeSessionIfOk(response, session); if(loginSession != null) {// OK session = loginSession; currentSession = loginSession; + } else { + errors.append(new AdobeConnectError(AdobeConnectErrorCodes.adminDenied)); } } EntityUtils.consumeQuietly(response.getEntity()); diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java index fa4ea78f151377f3d0c426eb98e93eb8bf178e01..4eaf57600c7447cbd50b63bef074d14098ecb120 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java @@ -136,35 +136,39 @@ public class AdobeConnectManagerImpl implements AdobeConnectManager, DeletableGr public void createMeeting(String name, String description, String templateId, Date start, Date end, Locale locale, boolean allAccess, RepositoryEntry entry, String subIdent, BusinessGroup businessGroup, - Identity actingIdentity, AdobeConnectErrors error) { + Identity actingIdentity, AdobeConnectErrors errors) { AdobeConnectSco folder; String folderName = generateFolderName(entry, subIdent, businessGroup); - List<AdobeConnectSco> folderScos = getAdapter().getFolderByName(folderName, error); + List<AdobeConnectSco> folderScos = getAdapter().getFolderByName(folderName, errors); if(folderScos == null || folderScos.isEmpty()) { - folder = getAdapter().createFolder(folderName, error); + folder = getAdapter().createFolder(folderName, errors); } else { folder = folderScos.get(0); } + + if(errors.hasErrors()) { + return;// we need a folder + } - AdobeConnectSco sco = getAdapter().createScoMeeting(name, description, folder.getScoId(), templateId, start, end, locale, error); + AdobeConnectSco sco = getAdapter().createScoMeeting(name, description, folder.getScoId(), templateId, start, end, locale, errors); if(sco != null) { - getAdapter().setPermissions(sco.getScoId(), true, error); - AdobeConnectPrincipal admin = getAdapter().adminCommonInfo(error); + getAdapter().setPermissions(sco.getScoId(), true, errors); + AdobeConnectPrincipal admin = getAdapter().adminCommonInfo(errors); if(admin != null) { - getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), error); + getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), errors); } - String actingUser = getOrCreateUser(actingIdentity, true, error); + String actingUser = getOrCreateUser(actingIdentity, true, errors); if(actingUser != null) { - getAdapter().setMember(sco.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), error); + getAdapter().setMember(sco.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), errors); } // try harder if the meeting hasn't a single host if(actingUser == null && admin == null) { - admin = getAdapter().getPrincipalByLogin(adobeConnectModule.getAdminLogin(), error); + admin = getAdapter().getPrincipalByLogin(adobeConnectModule.getAdminLogin(), errors); if(admin != null) { - getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), error); + getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), errors); } } diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java index c3ab0b27c9d5879233fd8b1408e8f49eb5857624..02494744a98007edeed28eed74348b22a8347bb6 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java @@ -22,6 +22,7 @@ package org.olat.modules.adobeconnect.manager; import java.io.InputStream; import java.io.StringWriter; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; @@ -67,18 +68,23 @@ public class AdobeConnectUtils { } } - protected static BreezeSession getBreezeSessionIfOk(HttpResponse response) { + protected static BreezeSession getBreezeSessionIfOk(HttpResponse response, BreezeSession infoSession) { BreezeSession session = null; try { HttpEntity entity = response.getEntity(); Document doc = getDocumentFromEntity(entity); - if(AdobeConnectUtils.isStatusOk(doc)) { + if(isStatusOk(doc)) { + print(doc); Header header = response.getFirstHeader("Set-Cookie"); if(header != null) { session = BreezeSession.valueOf(header); } else { String cookie = getFirstElementValue(doc.getDocumentElement(), "cookie"); - session = BreezeSession.valueOf(cookie); + if(StringHelper.containsNonWhitespace(cookie)) { + session = BreezeSession.valueOf(cookie); + } else { + session = infoSession; + } } } } catch (Exception e) { @@ -122,6 +128,7 @@ public class AdobeConnectUtils { protected static Document getDocumentFromEntity(HttpEntity entity) throws Exception { try(InputStream in=entity.getContent()) { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); return dBuilder.parse(in); } catch(Exception e) { @@ -204,9 +211,11 @@ public class AdobeConnectUtils { } protected static void print(Document document) { - if(log.isDebugEnabled() || true) { + if(log.isDebugEnabled()) { try(StringWriter writer = new StringWriter()) { - Transformer transformer = TransformerFactory.newInstance().newTransformer(); + TransformerFactory factory = TransformerFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer transformer = factory.newTransformer(); Source source = new DOMSource(document); transformer.transform(source, new StreamResult(writer)); writer.flush(); diff --git a/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrorCodes.java b/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrorCodes.java index c04724762270b5d0568fec1e310eb5f5a06f20a8..9ae34a56351a4872805bf949ee14f11eca0dd1ee 100644 --- a/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrorCodes.java +++ b/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrorCodes.java @@ -27,6 +27,7 @@ package org.olat.modules.adobeconnect.model; */ public enum AdobeConnectErrorCodes { + adminDenied, duplicateField, invalidField, formatError, diff --git a/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrors.java b/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrors.java index a6e89303815aea95ea2ac8f86961d2d52c6af4f6..c43b9d7cc7eddfb0c5bfb81cd1e4299d18d7be12 100644 --- a/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrors.java +++ b/src/main/java/org/olat/modules/adobeconnect/model/AdobeConnectErrors.java @@ -38,9 +38,9 @@ public class AdobeConnectErrors implements Serializable { return errors; } - public void append(AdobeConnectErrors errors) { - if(errors.hasErrors()) { - this.errors.addAll(errors.getErrors()); + public void append(AdobeConnectErrors error) { + if(error.hasErrors()) { + this.errors.addAll(error.getErrors()); } } diff --git a/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java b/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java index 0ec074be7d847d4d8778393ffb685d106f73fb61..881fa99c97f460442aafa70be61f946e2cec1ea0 100644 --- a/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java +++ b/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java @@ -99,9 +99,12 @@ public class AdobeConnectMeetingController extends FormBasicController { initForm(ureq); if(validMeeting) { - AdobeConnectErrors error = new AdobeConnectErrors(); - registered = adobeConnectManager.isRegistered(meeting, getIdentity(), getPermission(), error); + AdobeConnectErrors errors = new AdobeConnectErrors(); + registered = adobeConnectManager.isRegistered(meeting, getIdentity(), getPermission(), errors); loadModel(); + if(errors.hasErrors()) { + getWindowControl().setWarning(AdobeConnectErrorHelper.formatErrors(getTranslator(), errors)); + } } updateButtons(); } diff --git a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_de.properties index ab024bc10475c3eb242d06c041358bf096e864b6..8379d04984ed0d7de4b37b8c0894b28bf496b6af 100644 --- a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_de.properties @@ -1,5 +1,5 @@ #Tue Apr 23 14:44:31 CEST 2019 -add.meeting=Add meeting +add.meeting=Meeting hinzuf\u00FCgen admin.menu.title=Adobe Connect admin.menu.title.alt=Adobe Connect adobeconnect.account.configuration=Konfiguration @@ -18,6 +18,7 @@ content.name=Name content.open=\u00D6ffnen content.resource=Ressource content.type=Typ +error.adminDenied=Adobe Connect Zugang verboten error.duplicateField=Der Wert "{0}" ist schon in Einsatz. error.customerDoesntExist=Benutzer existiert nicht. error.formatError=Der Format von "{0}" ist nicht g\u00FCltig. @@ -25,13 +26,14 @@ error.illegalOperation=Operation verboten error.invalidField=Der Wert "{0}" ist nicht g\u00FCltig. error.invalid.meeting=Das Meeting wurde f\u00FCr eine andere Konfiguration erstellt und kann nicht ge\u00F6ffnet werden. error.missingParameter=Fehlende Informationen -error.noAccessDenied=Zugang verbotten +error.noAccessDenied=Zugang verboten error.noSuchItem=Existiert nicht error.prefix=Ein Fehler ist aufgetreten\: -error.rangeError=Bereich ist nicht g\u00FCltig. +error.rangeError=Datumsbereich ist nicht g\u00FCltig. error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein. error.unkown=Unerwartete Fehler meeting.description=Beschreibung +meeting.deleted=Meeting wurde gel\u00F6scht. meeting.end=Enddatum meeting.ended=Meeting ist schon beendet. meeting.join.button=Meeting beitreten @@ -40,8 +42,8 @@ meeting.permanent=Typ meeting.permanent.on=Dauernd meeting.register.button=Anmelden meeting.resource=Resource -meeting.share.documents=Dokumenten verteilen -meeting.share.documents.of=Dokumenten von "{0}" verteilen +meeting.share.documents=Dateien bereitstellen +meeting.share.documents.of=Dateien von "{0}" bereitstellen meeting.start=Beginndatum meeting.start.button=Meeting starten meeting.successfully.registered=Erfolgreich angemeldet. @@ -49,13 +51,13 @@ meeting.templates=Vorlage meetings.admin.title=Konfiguration meetings.content=Inhalt meetings.past=Alte Meetings -meetings.title=Schulungen +meetings.title=Meetingr\u00E4ume meetings.upcoming=Zuk\u00FCnftige Meetings no.contents=Dieser Meeting enth\u00E4lt kein Inhalt -no.meeting.configured=Es gibt kein Meeting geplant. -no.shared.contents=Dieser Meeting verteilt kein Inhalt. +no.meeting.configured=Es sind noch keine Meetings konfiguriert. +no.shared.contents=Keine Meeting Dateien verf\u00FCgbar. no.template=Keine Vorlage -no.upcoming.meetings=Sie haben kein zuk\u00FCnftige Meeting. +no.upcoming.meetings=Sie haben keine zuk\u00FCnftigen Meetings. option.adminlogin=Benutzername option.adminpassword=Passwort option.baseurl=URL Adobe Connect Server diff --git a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_en.properties index f483c98af90f2de8b8b40e3933430ecf1fdb0ee3..bf2a07be4be3f1935eaabcd805efdb1b44c31f1d 100644 --- a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_en.properties @@ -32,6 +32,7 @@ error.prefix=An error happened\: error.rangeError=The range is not valid. error.start.after.end=The end date of the meeting must not be before the start date. error.unkown=Unkown error +meeting.deleted=Meeting successfully deleted. meeting.description=Description meeting.end=End date meeting.ended=Meeting already ended. @@ -41,8 +42,8 @@ meeting.permanent=Typ meeting.permanent.on=Dauernd meeting.register.button=Register meeting.resource=Resource -meeting.share.documents=Share documents -meeting.share.documents.of=Share documents of "{0}" +meeting.share.documents=Share files +meeting.share.documents.of=Share files of "{0}" meeting.start=Start date meeting.start.button=Start the meeting meeting.successfully.registered=Successfully registered. @@ -50,11 +51,11 @@ meeting.templates=Template meetings.admin.title=Configuration meetings.content=Content meetings.past=Old meetings -meetings.title=Trainings +meetings.title=Meeting rooms meetings.upcoming=Upcoming meetings no.contents=This meeting doesn't have any content -no.meeting.configured=There isn't any planned meeting. -no.shared.contents=This meeting doesn't have any shared content yet. +no.meeting.configured=No meetings have been configured yet. +no.shared.contents=No future meetings scheduled. no.template=No template no.upcoming.meetings=You don't have any upcoming meeting. option.adminlogin=Username