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