From 264ae1ed2541a4ebe93d0a9b649ea8fe5f7905ec Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 2 Apr 2020 08:35:54 +0200
Subject: [PATCH] OO-4615: show an error message if AC doesn't respond

Show an error message if AC doesn't respond to the simplest call to
create a breeze session.
---
 .../manager/AbstractAdobeConnectProvider.java | 218 +++++++++++-------
 .../adobeconnect/manager/DFNprovider.java     |  66 +++---
 .../ui/_i18n/LocalStrings_de.properties       |   1 +
 .../ui/_i18n/LocalStrings_en.properties       |   1 +
 .../ui/_i18n/LocalStrings_fr.properties       | 151 ++++++------
 5 files changed, 244 insertions(+), 193 deletions(-)

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 0872e22edba..57a6564871a 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/AbstractAdobeConnectProvider.java
@@ -98,10 +98,14 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	 */
 	@Override
 	public AdobeConnectSco createScoMeeting(String name, String description, String folderScoId,
-			String templateId, Date startDate, Date endDate, Locale locale, AdobeConnectErrors error) {
+			String templateId, Date startDate, Date endDate, Locale locale, AdobeConnectErrors errors) {
 		if(folderScoId == null) {
-			folderScoId = adminFolderScoId(error);
+			folderScoId = adminFolderScoId(errors);
 		}
+		if(folderScoId == null || errors.hasErrors()) {
+			return null;
+		}
+
 		String lang = getLanguage(locale);
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder
@@ -123,7 +127,7 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 			builder.queryParam("date-end", formatDate(endDate));
 		}
 		
-		List<AdobeConnectSco> createdScos = sendScoRequest(builder, error);
+		List<AdobeConnectSco> createdScos = sendScoRequest(builder, errors);
 		return createdScos == null || createdScos.isEmpty() ? null : createdScos.get(0);
 	}
 	
@@ -146,6 +150,10 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	@Override
 	public AdobeConnectSco createFolder(String name, AdobeConnectErrors errors) {
 		String folderScoId = adminFolderScoId(errors);
+		if(folderScoId == null || errors.hasErrors()) {
+			return null;
+		}
+		
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder
 			.queryParam("action", "sco-update")
@@ -159,6 +167,10 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	@Override
 	public List<AdobeConnectSco> getFolderByName(String name, AdobeConnectErrors errors) {
 		String folderScoId = adminFolderScoId(errors);
+		if(folderScoId == null || errors.hasErrors()) {
+			return new ArrayList<>();
+		}
+		
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder
 			.queryParam("action", "sco-contents")
@@ -182,6 +194,10 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	public boolean updateScoMeeting(String scoId, String name, String description, String templateId,
 			Date startDate, Date endDate, AdobeConnectErrors errors) {
 		String folderScoId = adminFolderScoId(errors);
+		if(folderScoId == null || errors.hasErrors()) {
+			return false;
+		}
+		
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder
 			.queryParam("action", "sco-update")
@@ -201,19 +217,21 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 		if(endDate != null) {
 			builder.queryParam("date-end", formatDate(endDate));
 		}
-		
+
 		boolean ok = false;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200 || statusCode == 201) {
-				ok = AdobeConnectUtils.isStatusOk(response.getEntity());
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200 || statusCode == 201) {
+					ok = AdobeConnectUtils.isStatusOk(response.getEntity());
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return ok;
 	}
@@ -274,19 +292,21 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 		builder
 			.queryParam("action", "sco-delete")
 			.queryParam("sco-id", meeting.getScoId());
-		
+
 		boolean ok = false;
 		HttpGet get = createAdminMethod(builder, error);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode >= 200 && statusCode < 400) {
-				ok = AdobeConnectUtils.isStatusOk(response.getEntity());
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode >= 200 && statusCode < 400) {
+					ok = AdobeConnectUtils.isStatusOk(response.getEntity());
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return ok;
 	}
@@ -310,15 +330,17 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 
 		boolean ok = false;
 		HttpGet get = createAdminMethod(builder, error);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode >= 200 && statusCode < 400) {
-				ok = true;
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode >= 200 && statusCode < 400) {
+					ok = true;
+				}
+				EntityUtils.consume(response.getEntity());
+			} catch(Exception e) {
+				log.error("", e);
 			}
-			EntityUtils.consume(response.getEntity());
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return ok;
 	}
@@ -342,15 +364,17 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 		
 		boolean ok = false;
 		HttpGet get = createAdminMethod(builder, error);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode >= 200 && statusCode < 400) {
-				ok = true;
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode >= 200 && statusCode < 400) {
+					ok = true;
+				}
+				EntityUtils.consume(response.getEntity());
+			} catch(Exception e) {
+				log.error("", e);
 			}
-			EntityUtils.consume(response.getEntity());
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return ok;
 	}
@@ -373,17 +397,19 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 
 		boolean ok = false;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode >= 200 && statusCode < 400) {
-				List<AdobeConnectPermission> permissions = parsePermissions(response.getEntity(), errors);
-				ok = permissions != null && !permissions.isEmpty();
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode >= 200 && statusCode < 400) {
+					List<AdobeConnectPermission> permissions = parsePermissions(response.getEntity(), errors);
+					ok = permissions != null && !permissions.isEmpty();
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return ok;
 	}
@@ -435,16 +461,18 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 
 		List<AdobeConnectSco> shortCuts = null;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200) {
-				shortCuts = parseScos(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200) {
+					shortCuts = parseScos(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return shortCuts;
 	}
@@ -462,16 +490,18 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 		
 		AdobeConnectPrincipal user = null;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-			CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200) {
-				user = parseCommonInfo(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+				CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200) {
+					user = parseCommonInfo(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return user;
 	}
@@ -544,6 +574,11 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 			log.error("", e);
 		}
 		
+		if(session == null) {
+			errors.append(new AdobeConnectError(AdobeConnectErrorCodes.serverNotAvailable));
+			return null;
+		}
+		
 		UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
 		builder = builder
 			.queryParam("action", "login")
@@ -579,16 +614,18 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	protected List<AdobeConnectSco> sendScoRequest(UriBuilder builder, AdobeConnectErrors errors) {
 		List<AdobeConnectSco> scos = null;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200 || statusCode == 201) {
-				scos = parseScos(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200 || statusCode == 201) {
+					scos = parseScos(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return scos;
 	}
@@ -596,16 +633,18 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	protected List<AdobeConnectPrincipal> sendPrincipalRequest(UriBuilder builder, AdobeConnectErrors errors) {
 		List<AdobeConnectPrincipal> users = null;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200 || statusCode == 201) {
-				users = parsePrincipals(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200 || statusCode == 201) {
+					users = parsePrincipals(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return users;
 	}
@@ -683,9 +722,12 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
 	
 	protected HttpGet createAdminMethod(UriBuilder builder, AdobeConnectErrors errors) {
 		BreezeSession session = getAdminSession(errors);
-		builder.queryParam("session", session.getSession());
-		HttpGet get = new HttpGet(builder.build());
-		get.setHeader(new BasicHeader("Cookie", COOKIE + session.getSession()));
+		HttpGet get = null;
+		if(session != null) {
+			builder.queryParam("session", session.getSession());
+			get = new HttpGet(builder.build());
+			get.setHeader(new BasicHeader("Cookie", COOKIE + session.getSession()));
+		}
 		return get;
 	}
 
diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
index 28e72595220..d0a6804a242 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java
@@ -74,16 +74,18 @@ public class DFNprovider extends AbstractAdobeConnectProvider {
 
 		List<AdobeConnectPrincipal> users = null;
 		HttpGet get = createAdminMethod(builder, errors);
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200 || statusCode == 201) {
-				users = parsePrincipals(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200 || statusCode == 201) {
+					users = parsePrincipals(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return users != null && !users.isEmpty() ? users.get(0) : null;
 	}
@@ -97,18 +99,20 @@ public class DFNprovider extends AbstractAdobeConnectProvider {
 			.queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John"))
 			.queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe"));
 
-		HttpGet get = createAdminMethod(builder, errors);
 		List<AdobeConnectPrincipal> users = null;
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200 || statusCode == 201) {
-				users = parsePrincipals(response.getEntity(), errors);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		HttpGet get = createAdminMethod(builder, errors);
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200 || statusCode == 201) {
+					users = parsePrincipals(response.getEntity(), errors);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return users != null && !users.isEmpty() ? users.get(0) : null;
 	}
@@ -124,19 +128,21 @@ public class DFNprovider extends AbstractAdobeConnectProvider {
 		builder
 			.queryParam("action", "lms-user-login")
 			.queryParam("login", authentication.getAuthusername());
-
-		HttpGet get = createAdminMethod(builder, errors);
+		
 		BreezeSession session = null;
-		try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-				CloseableHttpResponse response = httpClient.execute(get)) {
-			int statusCode = response.getStatusLine().getStatusCode();
-			if(statusCode == 200) {
-				session = AdobeConnectUtils.getBreezeSessionFromXml(response);
-			} else {
-				EntityUtils.consume(response.getEntity());
+		HttpGet get = createAdminMethod(builder, errors);
+		if(get != null) {
+			try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+					CloseableHttpResponse response = httpClient.execute(get)) {
+				int statusCode = response.getStatusLine().getStatusCode();
+				if(statusCode == 200) {
+					session = AdobeConnectUtils.getBreezeSessionFromXml(response);
+				} else {
+					EntityUtils.consume(response.getEntity());
+				}
+			} catch(Exception e) {
+				log.error("", e);
 			}
-		} catch(Exception e) {
-			log.error("", e);
 		}
 		return session;
 	}
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 f0db324c020..aef5b7ba35e 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
@@ -34,6 +34,7 @@ error.noAccessDenied=Zugang verboten
 error.noSuchItem=Existiert nicht
 error.prefix=Ein Fehler ist aufgetreten\:
 error.rangeError=Datumsbereich ist nicht g\u00FCltig.
+error.serverNotAvailable=Der Server ist zurzeit nicht verf\u00FCgbar.
 error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein.
 error.unkown=Unerwartete Fehler
 form.invalidchar.noamp=Das Und-Zeichen ist nicht erlaubt.
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 5e1006f2f98..61b599a8484 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
@@ -34,6 +34,7 @@ error.noAccessDenied=Access denied
 error.noSuchItem=Doesn't exists
 error.prefix=An error happened\:
 error.rangeError=The range is not valid.
+error.serverNotAvailable=The server is currently not available.
 error.start.after.end=The end date of the meeting must not be before the start date.
 error.unkown=Unkown error
 form.invalidchar.noamp=The ampersand is not allowed.
diff --git a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_fr.properties
index bb424e72e68..1e3992bbd1e 100644
--- a/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/adobeconnect/ui/_i18n/LocalStrings_fr.properties
@@ -1,90 +1,91 @@
-#Mon Aug 19 18:05:41 CEST 2019
-meeting.join.button=Rejoindre le meeting
-meetings.upcoming=Meetings \u00E0 venir
+#Thu Apr 02 08:26:09 CEST 2020
+add.meeting=Ajouter un meeting
+admin.menu.title=Adobe Connect
+admin.menu.title.alt=Configuration Adobe Connect
+adobeconnect.account.configuration=Configuration
+adobeconnect.intro=Configuration d'Adobe Connect
+adobeconnect.module.enabled=Module "Adobe Connect"
+adobeconnect.module.enabled.for=Activer pour
+adobeconnect.module.enabled.for.courses=Cours
 adobeconnect.module.enabled.for.groups=Groupes
-meeting.deleted=Le meeting a \u00E9t\u00E9 effac\u00E9 avec succ\u00E8s.
-option.clean.meetings=Nettoy\u00E9 les meetings (jours)
+adobeconnect.module.provider=Fournisseur
+adobeconnect.title=Adobe Connect
+check=Tester la connection
+confirm.delete.meeting=Voulez-vous vraiment effacer le meeting "{0}"?
+confirm.delete.meeting.title=Effacer le meeting "{0}"
+connection.failed=L'authentification a \u00E9chou\u00E9e.
+connection.successful=L'authentication a r\u00E9ussi.
+content.begin=Date de d\u00E9but
+content.icon=<i class\='o_icon o_filetype_file'> </i>
+content.name=Nom
+content.open=Ouvrir
+content.resource=Ressource
+content.type=Type
+error.adminDenied=Acc\u00E8s \u00E0 Adobe Connect refus\u00E9
+error.customerDoesntExist=L'utilisateur n'existe pas.
+error.duplicateField=La valeur de "{0}" a d\u00E9j\u00E0 \u00E9t\u00E9 utilis\u00E9e.
+error.formatError=Le format de "{0}" n'est pas valide.
+error.illegalOperation=L'op\u00E9ration n'est pas autoris\u00E9e.
 error.invalid.meeting=Le meeting a \u00E9t\u00E9 cr\u00E9\u00E9 avec une autre configuration d'Adobe Connect et ne peut plus \u00EAtre ouvert.
-meetings.content=Contenu
-no.shared.contents=Pas de documents partag\u00E9s.
-no.meeting.configured=Aucun meeting n'a \u00E9t\u00E9 configur\u00E9 pour l'instant.
+error.invalidField=La valeur de "{0}" n'est pas valide.
 error.missingParameter=Informations manquantes
+error.missingParameter0Fehlende=Informations
 error.noAccessDenied=Acc\u00E8s refus\u00E9
-meeting.start=Date de d\u00E9but
-option.single.meeting.single=Cr\u00E9er seulement une salle de meeting par \u00E9l\u00E9ment de cours ou groupe
-content.begin=Date de d\u00E9but
-meeting.description=Description
-option.single.meeting=Meetings partag\u00E9s
-content.icon=<i class\='o_icon o_filetype_file'> </i>
-meeting.leadTime=Pr\u00E9paration (min.)
-meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der.
-adobeconnect.title=Adobe Connect
+error.noSuchItem=N'existe pas
+error.prefix=Une erreur s'est produite\:
 error.rangeError=L'intervalle n'est pas valide.
-option.create.meeting.differed=Diff\u00E9r\u00E9
-adobeconnect.module.enabled.for=Activer pour
-adobeconnect.module.enabled=Module "Adobe Connect"
-meeting.start.button=Commencer le meeting
-meeting.templates=Mod\u00E8le
-adobeconnect.intro=Configuration d'Adobe Connect
+error.serverNotAvailable=Le serveur n'est pas disponible pour le moment.
+error.start.after.end=La date de fin du rendez-vous ne peut se trouver avant la date de d\u00E9but.
 error.unkown=Erreur inconnue
-meeting.go.button=Aller \u00E0 la salle du meeting
-connection.successful=L'authentication a r\u00E9ussi.
-option.create.meeting.immediately=Imm\u00E9diatement
-option.single.meeting.perdate=Cr\u00E9er un meeting par date
-no.template=Aucun mod\u00E8le
+form.invalidchar.noamp=L'esperluette n'est pas permis.
 meeting.configure.button=Aller dans la salle de r\u00E9union et la configurer
-error.illegalOperation=L'op\u00E9ration n'est pas autoris\u00E9e.
-meeting.register.button=S'enregister
-option.baseurl=URL du serveur Adobe Connect
+meeting.create.button=Ouvrir le meeting
+meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der.
+meeting.deleted=Le meeting a \u00E9t\u00E9 effac\u00E9 avec succ\u00E8s.
+meeting.description=Description
+meeting.end=Date de fin
+meeting.ended=Le meeting est termin\u00E9.
+meeting.followupTime=P\u00E9riode de temporisation (min.)
+meeting.go.button=Aller \u00E0 la salle du meeting
+meeting.join.button=Rejoindre le meeting
+meeting.leadTime=Pr\u00E9paration (min.)
+meeting.name=Nom
 meeting.permanent=Type
+meeting.permanent.explain=Les meetings permanents partagent la m\u00EAme salle de r\u00E9union au sein d'un \u00E9l\u00E9ment de cours ou d'un groupe.
+meeting.permanent.on=Permanent
+meeting.register.button=S'enregister
+meeting.resource=Ressource
+meeting.share.documents=Partager des documents
+meeting.share.documents.of=Partager les documents de "{0}"
+meeting.start=Date de d\u00E9but
+meeting.start.button=Commencer le meeting
 meeting.successfully.registered=Enregistrement r\u00E9ussi.
-check=Tester la connection
-adobeconnect.module.provider=Fournisseur
-content.resource=Ressource
-warning.no.meeting=Le meeting a \u00E9t\u00E9 effac\u00E9.
-adobeconnect.account.configuration=Configuration
-confirm.delete.meeting=Voulez-vous vraiment effacer le meeting "{0}"?
-meeting.followupTime=P\u00E9riode de temporisation (min.)
+meeting.templates=Mod\u00E8le
 meetings.admin.title=Configuration
-no.upcoming.meetings=Vous n'avez pas meeting pr\u00E9vu \u00E0 l'avenir.
-error.prefix=Une erreur s'est produite\:
-error.missingParameter0Fehlende=Informations
-content.name=Nom
+meetings.content=Contenu
+meetings.past=Meetings anciens
+meetings.title=Meetings
+meetings.upcoming=Meetings \u00E0 venir
 no.contents=Ce meeting n'a pas de contenu.
-option.baseurl.example=https\://meet73287594.adobeconnect.com/api/xml
-add.meeting=Ajouter un meeting
-option.adminlogin=Nom d'utilisateur
-meeting.permanent.on=Permanent
-error.duplicateField=La valeur de "{0}" a d\u00E9j\u00E0 \u00E9t\u00E9 utilis\u00E9e.
-warning.not.registered.shared.documents=Seules les personnes qui se sont enregistr\u00E9s peuvent voir les documents partag\u00E9s.
-meeting.share.documents.of=Partager les documents de "{0}"
-connection.failed=L'authentification a \u00E9chou\u00E9e.
-meeting.create.button=Ouvrir le meeting
-error.invalidField=La valeur de "{0}" n'est pas valide.
-option.create.meeting=Cr\u00E9er les meetings
-warning.no.access=Vous ne pouvez pas encore acc\u00E9der au meeting.
-error.adminDenied=Acc\u00E8s \u00E0 Adobe Connect refus\u00E9
-error.noSuchItem=N'existe pas
-admin.menu.title.alt=Configuration Adobe Connect
-meeting.resource=Ressource
-table.header.permanent=Permanent
-meeting.permanent.explain=Les meetings permanents partagent la m\u00EAme salle de r\u00E9union au sein d'un \u00E9l\u00E9ment de cours ou d'un groupe.
+no.meeting.configured=Aucun meeting n'a \u00E9t\u00E9 configur\u00E9 pour l'instant.
+no.shared.contents=Pas de documents partag\u00E9s.
+no.template=Aucun mod\u00E8le
+no.upcoming.meetings=Vous n'avez pas meeting pr\u00E9vu \u00E0 l'avenir.
 option.accountid=Compte ID
-meeting.ended=Le meeting est termin\u00E9.
-confirm.delete.meeting.title=Effacer le meeting "{0}"
 option.accountid.explain=L'ID du compte est optionnelle. Si l'ID d'un compte n'est pas sp\u00E9cifi\u00E9e, le compte de l'utilisateur d\u00E9fini ci-dessus sera utilis\u00E9.
+option.adminlogin=Nom d'utilisateur
 option.adminpassword=Mot de passe
-error.customerDoesntExist=L'utilisateur n'existe pas.
-content.type=Type
+option.baseurl=URL du serveur Adobe Connect
+option.baseurl.example=https\://meet73287594.adobeconnect.com/api/xml
+option.clean.meetings=Nettoy\u00E9 les meetings (jours)
+option.create.meeting=Cr\u00E9er les meetings
+option.create.meeting.differed=Diff\u00E9r\u00E9
+option.create.meeting.immediately=Imm\u00E9diatement
 option.dont.clean.meetings=Jamais
-admin.menu.title=Adobe Connect
-error.start.after.end=La date de fin du rendez-vous ne peut se trouver avant la date de d\u00E9but.
-meeting.end=Date de fin
-meeting.share.documents=Partager des documents
-error.formatError=Le format de "{0}" n'est pas valide.
-meetings.title=Meetings
-adobeconnect.module.enabled.for.courses=Cours
-meetings.past=Meetings anciens
-content.open=Ouvrir
-meeting.name=Nom
-form.invalidchar.noamp=L'esperluette n'est pas permis.
+option.single.meeting=Meetings partag\u00E9s
+option.single.meeting.perdate=Cr\u00E9er un meeting par date
+option.single.meeting.single=Cr\u00E9er seulement une salle de meeting par \u00E9l\u00E9ment de cours ou groupe
+table.header.permanent=Permanent
+warning.no.access=Vous ne pouvez pas encore acc\u00E9der au meeting.
+warning.no.meeting=Le meeting a \u00E9t\u00E9 effac\u00E9.
+warning.not.registered.shared.documents=Seules les personnes qui se sont enregistr\u00E9s peuvent voir les documents partag\u00E9s.
-- 
GitLab