diff --git a/appinfo/info.xml b/appinfo/info.xml index 1aebcb0b..0e40713d 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -42,7 +42,7 @@ Vrij en open source onder de EUPL-1.2-licentie. **Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl. ]]> - 0.2.23-unstable.20261002120000 + 0.2.23-unstable.20261003100000 EUPL-1.2 Conduction Planninq diff --git a/l10n/be.js b/l10n/be.js index cd9d5cc3..a4f09ec1 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без групы-ўладальніка", "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", - "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі." + "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, які выкладаюць на гэтым уроку, напрыклад факультатыў, калі школьная навучальная праграма яго ведае.", + "Online meeting link": "Спасылка на анлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Дзе вучні далучаюцца да гэтага ўрока анлайн. Кнопка «Далучыцца» з'яўляецца толькі для спасылкі https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index 68ad169e..c28caf89 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -1355,7 +1355,11 @@ "No owning group": "Без групы-ўладальніка", "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", - "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі." + "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, які выкладаюць на гэтым уроку, напрыклад факультатыў, калі школьная навучальная праграма яго ведае.", + "Online meeting link": "Спасылка на анлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Дзе вучні далучаюцца да гэтага ўрока анлайн. Кнопка «Далучыцца» з'яўляецца толькі для спасылкі https." }, "plurals": {} } diff --git a/l10n/bg.js b/l10n/bg.js index 38345c3c..bbd49ad8 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без група собственик", "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", "Could not change the owning group": "Групата собственик не можа да бъде променена", - "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят." + "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курсът, който се преподава в този час, например избираем предмет, когато училищното приложение за обучение го познава.", + "Online meeting link": "Връзка към онлайн часа", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Къде учениците се присъединяват към този час онлайн. Бутонът Присъедини се се показва само за https връзка." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index 38ebd450..848a4ac5 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -1355,7 +1355,11 @@ "No owning group": "Без група собственик", "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", "Could not change the owning group": "Групата собственик не можа да бъде променена", - "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят." + "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курсът, който се преподава в този час, например избираем предмет, когато училищното приложение за обучение го познава.", + "Online meeting link": "Връзка към онлайн часа", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Къде учениците се присъединяват към този час онлайн. Бутонът Присъедини се се показва само за https връзка." }, "plurals": null } diff --git a/l10n/bs.js b/l10n/bs.js index 7e5efdc5..eebfa94d 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Bez grupe vlasnika", "Could not search for groups. Please try again.": "Pretraga grupa nije uspjela. Pokušajte ponovo.", "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", - "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi." + "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom času, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Link za online čas", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom času online. Dugme Pridruži se prikazuje se samo za https link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index 1971f5e8..745bc60e 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -1355,7 +1355,11 @@ "No owning group": "Bez grupe vlasnika", "Could not search for groups. Please try again.": "Pretraga grupa nije uspjela. Pokušajte ponovo.", "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", - "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi." + "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom času, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Link za online čas", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom času online. Dugme Pridruži se prikazuje se samo za https link." }, "plurals": null } diff --git a/l10n/ca.js b/l10n/ca.js index d2f909a4..833e89a7 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Sense grup propietari", "Could not search for groups. Please try again.": "No s'han pogut cercar grups. Torneu-ho a provar.", "Could not change the owning group": "No s'ha pogut canviar el grup propietari", - "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien." + "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curs que s'imparteix en aquesta classe, com una optativa, quan l'aplicació d'aprenentatge de l'escola el coneix.", + "Online meeting link": "Enllaç de la classe en línia", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "On els alumnes s'uneixen a aquesta classe en línia. El botó Uneix-te només apareix amb un enllaç https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index 34319ea6..dbcd2789 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -1355,7 +1355,11 @@ "No owning group": "Sense grup propietari", "Could not search for groups. Please try again.": "No s'han pogut cercar grups. Torneu-ho a provar.", "Could not change the owning group": "No s'ha pogut canviar el grup propietari", - "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien." + "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curs que s'imparteix en aquesta classe, com una optativa, quan l'aplicació d'aprenentatge de l'escola el coneix.", + "Online meeting link": "Enllaç de la classe en línia", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "On els alumnes s'uneixen a aquesta classe en línia. El botó Uneix-te només apareix amb un enllaç https." }, "plurals": null } diff --git a/l10n/cs.js b/l10n/cs.js index 233dee42..ce5d98ca 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Žádná vlastnická skupina", "Could not search for groups. Please try again.": "Skupiny se nepodařilo vyhledat. Zkuste to znovu.", "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", - "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové." + "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, který se v této hodině vyučuje, například volitelný předmět, pokud ho školní výuková aplikace zná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde se žáci k této hodině připojí online. Tlačítko Připojit se zobrazí jen u odkazu https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index c3acf66a..fd178501 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -1355,7 +1355,11 @@ "No owning group": "Žádná vlastnická skupina", "Could not search for groups. Please try again.": "Skupiny se nepodařilo vyhledat. Zkuste to znovu.", "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", - "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové." + "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, který se v této hodině vyučuje, například volitelný předmět, pokud ho školní výuková aplikace zná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde se žáci k této hodině připojí online. Tlačítko Připojit se zobrazí jen u odkazu https." }, "plurals": null } diff --git a/l10n/da.js b/l10n/da.js index 08c2b91c..611a508a 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Ingen ejergruppe", "Could not search for groups. Please try again.": "Kunne ikke søge efter grupper. Prøv igen.", "Could not change the owning group": "Kunne ikke ændre ejergruppen", - "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det." + "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Det kursus, timen underviser i, fx et valgfag, når skolens læringsapp kender det.", + "Online meeting link": "Link til onlinetimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor eleverne deltager i timen online. Knappen Deltag vises kun ved et https-link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index b9b8f2af..85cfe601 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -1355,7 +1355,11 @@ "No owning group": "Ingen ejergruppe", "Could not search for groups. Please try again.": "Kunne ikke søge efter grupper. Prøv igen.", "Could not change the owning group": "Kunne ikke ændre ejergruppen", - "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det." + "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Det kursus, timen underviser i, fx et valgfag, når skolens læringsapp kender det.", + "Online meeting link": "Link til onlinetimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor eleverne deltager i timen online. Knappen Deltag vises kun ved et https-link." }, "plurals": null } diff --git a/l10n/de.js b/l10n/de.js index 19f6edaa..f5af5d22 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Keine besitzende Gruppe", "Could not search for groups. Please try again.": "Gruppensuche fehlgeschlagen. Bitte versuche es erneut.", "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", - "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es." + "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Der Kurs, den diese Stunde unterrichtet, etwa ein Wahlfach, wenn die Lern-App der Schule ihn kennt.", + "Online meeting link": "Link zur Online-Stunde", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wo Schüler online an dieser Stunde teilnehmen. Die Schaltfläche Teilnehmen erscheint nur bei einem https-Link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 91bdaee4..54ded581 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -1355,7 +1355,11 @@ "No owning group": "Keine besitzende Gruppe", "Could not search for groups. Please try again.": "Gruppensuche fehlgeschlagen. Bitte versuche es erneut.", "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", - "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es." + "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Der Kurs, den diese Stunde unterrichtet, etwa ein Wahlfach, wenn die Lern-App der Schule ihn kennt.", + "Online meeting link": "Link zur Online-Stunde", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wo Schüler online an dieser Stunde teilnehmen. Die Schaltfläche Teilnehmen erscheint nur bei einem https-Link." }, "plurals": null } diff --git a/l10n/el.js b/l10n/el.js index a53577e2..5149fd15 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Χωρίς ομάδα ιδιοκτήτη", "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", - "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν." + "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν.", + "Course": "Μάθημα", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Το μάθημα που διδάσκεται σε αυτή την ώρα, για παράδειγμα ένα μάθημα επιλογής, όταν η εκπαιδευτική εφαρμογή του σχολείου το γνωρίζει.", + "Online meeting link": "Σύνδεσμος διαδικτυακού μαθήματος", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Πού συνδέονται οι μαθητές σε αυτό το μάθημα διαδικτυακά. Το κουμπί Συμμετοχή εμφανίζεται μόνο για σύνδεσμο https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index abfb22e3..ea2dd210 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -1355,7 +1355,11 @@ "No owning group": "Χωρίς ομάδα ιδιοκτήτη", "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", - "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν." + "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν.", + "Course": "Μάθημα", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Το μάθημα που διδάσκεται σε αυτή την ώρα, για παράδειγμα ένα μάθημα επιλογής, όταν η εκπαιδευτική εφαρμογή του σχολείου το γνωρίζει.", + "Online meeting link": "Σύνδεσμος διαδικτυακού μαθήματος", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Πού συνδέονται οι μαθητές σε αυτό το μάθημα διαδικτυακά. Το κουμπί Συμμετοχή εμφανίζεται μόνο για σύνδεσμο https." }, "plurals": null } diff --git a/l10n/en.js b/l10n/en.js index d2afdd52..7887e14a 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1335,7 +1335,11 @@ OC.L10N.register( "No owning group": "No owning group", "Could not search for groups. Please try again.": "Could not search for groups. Please try again.", "Could not change the owning group": "Could not change the owning group", - "You can read this project. Only its members change it.": "You can read this project. Only its members change it." + "You can read this project. Only its members change it.": "You can read this project. Only its members change it.", + "Course": "Course", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "The course this lesson teaches, such as an elective, when the school's learning app knows it.", + "Online meeting link": "Online meeting link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Where pupils join this lesson online. Pupils see a Join button only for an https link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index 87c50788..53517176 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1334,7 +1334,11 @@ "No owning group": "No owning group", "Could not search for groups. Please try again.": "Could not search for groups. Please try again.", "Could not change the owning group": "Could not change the owning group", - "You can read this project. Only its members change it.": "You can read this project. Only its members change it." + "You can read this project. Only its members change it.": "You can read this project. Only its members change it.", + "Course": "Course", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "The course this lesson teaches, such as an elective, when the school's learning app knows it.", + "Online meeting link": "Online meeting link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Where pupils join this lesson online. Pupils see a Join button only for an https link." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/es.js b/l10n/es.js index 902d1ccc..f41bda9d 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Sin grupo propietario", "Could not search for groups. Please try again.": "No se pudieron buscar grupos. Inténtalo de nuevo.", "Could not change the owning group": "No se pudo cambiar el grupo propietario", - "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian." + "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian.", + "Course": "Curso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curso que se imparte en esta clase, como una optativa, cuando la aplicación de aprendizaje del centro lo conoce.", + "Online meeting link": "Enlace de la clase en línea", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dónde se unen los alumnos a esta clase en línea. El botón Unirse solo aparece con un enlace https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index 8ff33c0e..912205cc 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -1355,7 +1355,11 @@ "No owning group": "Sin grupo propietario", "Could not search for groups. Please try again.": "No se pudieron buscar grupos. Inténtalo de nuevo.", "Could not change the owning group": "No se pudo cambiar el grupo propietario", - "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian." + "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian.", + "Course": "Curso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curso que se imparte en esta clase, como una optativa, cuando la aplicación de aprendizaje del centro lo conoce.", + "Online meeting link": "Enlace de la clase en línea", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dónde se unen los alumnos a esta clase en línea. El botón Unirse solo aparece con un enlace https." }, "plurals": null } diff --git a/l10n/et.js b/l10n/et.js index f6283ec9..ae55ce25 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Omanikgruppi pole", "Could not search for groups. Please try again.": "Gruppide otsimine ebaõnnestus. Proovi uuesti.", "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", - "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed." + "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursus, mida selles tunnis õpetatakse, näiteks valikaine, kui kooli õpperakendus seda teab.", + "Online meeting link": "Veebitunni link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kus õpilased selle tunniga veebis liituvad. Nupp Liitu kuvatakse ainult https-lingi korral." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index 0c88c6a4..6bf901f8 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -1355,7 +1355,11 @@ "No owning group": "Omanikgruppi pole", "Could not search for groups. Please try again.": "Gruppide otsimine ebaõnnestus. Proovi uuesti.", "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", - "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed." + "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursus, mida selles tunnis õpetatakse, näiteks valikaine, kui kooli õpperakendus seda teab.", + "Online meeting link": "Veebitunni link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kus õpilased selle tunniga veebis liituvad. Nupp Liitu kuvatakse ainult https-lingi korral." }, "plurals": null } diff --git a/l10n/fi.js b/l10n/fi.js index fe61b62b..c4803b31 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Ei omistajaryhmää", "Could not search for groups. Please try again.": "Ryhmien haku epäonnistui. Yritä uudelleen.", "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", - "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä." + "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä.", + "Course": "Kurssi", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurssi, jota tällä tunnilla opetetaan, esimerkiksi valinnainen kurssi, kun koulun oppimissovellus tuntee sen.", + "Online meeting link": "Verkkotunnin linkki", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Mistä oppilaat liittyvät tälle tunnille verkossa. Liity-painike näkyy vain https-linkille." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index dda1a10c..16c61549 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -1355,7 +1355,11 @@ "No owning group": "Ei omistajaryhmää", "Could not search for groups. Please try again.": "Ryhmien haku epäonnistui. Yritä uudelleen.", "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", - "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä." + "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä.", + "Course": "Kurssi", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurssi, jota tällä tunnilla opetetaan, esimerkiksi valinnainen kurssi, kun koulun oppimissovellus tuntee sen.", + "Online meeting link": "Verkkotunnin linkki", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Mistä oppilaat liittyvät tälle tunnille verkossa. Liity-painike näkyy vain https-linkille." }, "plurals": null } diff --git a/l10n/fr.js b/l10n/fr.js index 1120aecc..469bd346 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Aucun groupe propriétaire", "Could not search for groups. Please try again.": "Impossible de rechercher des groupes. Veuillez réessayer.", "Could not change the owning group": "Impossible de modifier le groupe propriétaire", - "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient." + "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Le cours enseigné dans cette leçon, par exemple une option, lorsque l'application d'apprentissage de l'école le connaît.", + "Online meeting link": "Lien de la leçon en ligne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Où les élèves rejoignent cette leçon en ligne. Le bouton Rejoindre n'apparaît que pour un lien https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index c7c279e8..55232c39 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -1355,7 +1355,11 @@ "No owning group": "Aucun groupe propriétaire", "Could not search for groups. Please try again.": "Impossible de rechercher des groupes. Veuillez réessayer.", "Could not change the owning group": "Impossible de modifier le groupe propriétaire", - "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient." + "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Le cours enseigné dans cette leçon, par exemple une option, lorsque l'application d'apprentissage de l'école le connaît.", + "Online meeting link": "Lien de la leçon en ligne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Où les élèves rejoignent cette leçon en ligne. Le bouton Rejoindre n'apparaît que pour un lien https." }, "plurals": null } diff --git a/l10n/ga.js b/l10n/ga.js index d319ca5c..1078724b 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Gan grúpa úinéara", "Could not search for groups. Please try again.": "Níorbh fhéidir grúpaí a chuardach. Bain triail eile as.", "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", - "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é." + "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é.", + "Course": "Cúrsa", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "An cúrsa a mhúintear sa cheacht seo, mar shampla ábhar roghnach, nuair is eol d'aip foghlama na scoile é.", + "Online meeting link": "Nasc an cheachta ar líne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Áit a nglacann daltaí páirt sa cheacht seo ar líne. Ní thaispeántar an cnaipe Glac páirt ach le nasc https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index d4c10e57..be681ef3 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -1355,7 +1355,11 @@ "No owning group": "Gan grúpa úinéara", "Could not search for groups. Please try again.": "Níorbh fhéidir grúpaí a chuardach. Bain triail eile as.", "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", - "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é." + "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é.", + "Course": "Cúrsa", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "An cúrsa a mhúintear sa cheacht seo, mar shampla ábhar roghnach, nuair is eol d'aip foghlama na scoile é.", + "Online meeting link": "Nasc an cheachta ar líne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Áit a nglacann daltaí páirt sa cheacht seo ar líne. Ní thaispeántar an cnaipe Glac páirt ach le nasc https." }, "plurals": null } diff --git a/l10n/hr.js b/l10n/hr.js index cfc135de..96f9aa69 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Bez grupe vlasnika", "Could not search for groups. Please try again.": "Pretraživanje grupa nije uspjelo. Pokušajte ponovno.", "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", - "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi." + "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom satu, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Poveznica na online sat", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom satu online. Gumb Pridruži se prikazuje se samo za https poveznicu." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index ca49b710..ad0ecaaa 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -1355,7 +1355,11 @@ "No owning group": "Bez grupe vlasnika", "Could not search for groups. Please try again.": "Pretraživanje grupa nije uspjelo. Pokušajte ponovno.", "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", - "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi." + "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom satu, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Poveznica na online sat", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom satu online. Gumb Pridruži se prikazuje se samo za https poveznicu." }, "plurals": null } diff --git a/l10n/hu.js b/l10n/hu.js index 47633c78..bada38fa 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Nincs tulajdonos csoport", "Could not search for groups. Please try again.": "Nem sikerült csoportokat keresni. Próbáld újra.", "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", - "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják." + "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják.", + "Course": "Kurzus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A kurzus, amelyet ezen az órán tanítanak, például egy választható tárgy, ha az iskola tanulási alkalmazása ismeri.", + "Online meeting link": "Online óra hivatkozása", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ahol a tanulók online csatlakoznak ehhez az órához. A Csatlakozás gomb csak https-hivatkozásnál jelenik meg." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index 638483d2..7eec03f1 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -1355,7 +1355,11 @@ "No owning group": "Nincs tulajdonos csoport", "Could not search for groups. Please try again.": "Nem sikerült csoportokat keresni. Próbáld újra.", "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", - "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják." + "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják.", + "Course": "Kurzus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A kurzus, amelyet ezen az órán tanítanak, például egy választható tárgy, ha az iskola tanulási alkalmazása ismeri.", + "Online meeting link": "Online óra hivatkozása", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ahol a tanulók online csatlakoznak ehhez az órához. A Csatlakozás gomb csak https-hivatkozásnál jelenik meg." }, "plurals": null } diff --git a/l10n/is.js b/l10n/is.js index 51211502..79e347cc 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Enginn eigandahópur", "Could not search for groups. Please try again.": "Ekki tókst að leita að hópum. Reyndu aftur.", "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", - "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því." + "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því.", + "Course": "Námskeið", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Námskeiðið sem kennt er í þessari kennslustund, til dæmis valáfangi, þegar námsapp skólans þekkir það.", + "Online meeting link": "Tengill á netkennslustund", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvar nemendur taka þátt í þessari kennslustund á netinu. Hnappurinn Taka þátt birtist aðeins fyrir https-tengil." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index bf5c577f..773ee714 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -1355,7 +1355,11 @@ "No owning group": "Enginn eigandahópur", "Could not search for groups. Please try again.": "Ekki tókst að leita að hópum. Reyndu aftur.", "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", - "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því." + "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því.", + "Course": "Námskeið", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Námskeiðið sem kennt er í þessari kennslustund, til dæmis valáfangi, þegar námsapp skólans þekkir það.", + "Online meeting link": "Tengill á netkennslustund", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvar nemendur taka þátt í þessari kennslustund á netinu. Hnappurinn Taka þátt birtist aðeins fyrir https-tengil." }, "plurals": {} } diff --git a/l10n/it.js b/l10n/it.js index cb4ca052..b0b6a256 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Nessun gruppo proprietario", "Could not search for groups. Please try again.": "Impossibile cercare i gruppi. Riprova.", "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", - "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano." + "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano.", + "Course": "Corso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il corso insegnato in questa lezione, ad esempio un corso opzionale, quando l'app di apprendimento della scuola lo conosce.", + "Online meeting link": "Link della lezione online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dove gli studenti partecipano online a questa lezione. Il pulsante Partecipa appare solo con un link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index 695a3851..71e450e6 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -1355,7 +1355,11 @@ "No owning group": "Nessun gruppo proprietario", "Could not search for groups. Please try again.": "Impossibile cercare i gruppi. Riprova.", "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", - "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano." + "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano.", + "Course": "Corso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il corso insegnato in questa lezione, ad esempio un corso opzionale, quando l'app di apprendimento della scuola lo conosce.", + "Online meeting link": "Link della lezione online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dove gli studenti partecipano online a questa lezione. Il pulsante Partecipa appare solo con un link https." }, "plurals": null } diff --git a/l10n/lb.js b/l10n/lb.js index 47f628e5..33f7a1aa 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Kee Besëtzergrupp", "Could not search for groups. Please try again.": "Gruppe konnten net gesicht ginn. Probéier nach eng Kéier.", "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", - "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en." + "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "De Cours, deen an dëser Stonn ënnerriicht gëtt, zum Beispill eng Optioun, wann d'Léier-App vun der Schoul en kennt.", + "Online meeting link": "Link op déi online Stonn", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wou d'Schüler online un dëser Stonn deelhuelen. De Knäppchen Deelhuelen erschéngt nëmme bei engem https-Link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index 2ba5c9ba..244256dc 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -1355,7 +1355,11 @@ "No owning group": "Kee Besëtzergrupp", "Could not search for groups. Please try again.": "Gruppe konnten net gesicht ginn. Probéier nach eng Kéier.", "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", - "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en." + "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "De Cours, deen an dëser Stonn ënnerriicht gëtt, zum Beispill eng Optioun, wann d'Léier-App vun der Schoul en kennt.", + "Online meeting link": "Link op déi online Stonn", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wou d'Schüler online un dëser Stonn deelhuelen. De Knäppchen Deelhuelen erschéngt nëmme bei engem https-Link." }, "plurals": null } diff --git a/l10n/lt.js b/l10n/lt.js index cc28bb55..2b6c7118 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Nėra savininkės grupės", "Could not search for groups. Please try again.": "Nepavyko ieškoti grupių. Bandykite dar kartą.", "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", - "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai." + "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai.", + "Course": "Kursas", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursas, kurio mokoma per šią pamoką, pavyzdžiui, pasirenkamasis dalykas, kai mokyklos mokymosi programėlė jį žino.", + "Online meeting link": "Nuotolinės pamokos nuoroda", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur mokiniai prisijungia prie šios pamokos nuotoliu. Mygtukas Prisijungti rodomas tik su https nuoroda." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index 0aeb7e59..10add341 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -1355,7 +1355,11 @@ "No owning group": "Nėra savininkės grupės", "Could not search for groups. Please try again.": "Nepavyko ieškoti grupių. Bandykite dar kartą.", "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", - "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai." + "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai.", + "Course": "Kursas", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursas, kurio mokoma per šią pamoką, pavyzdžiui, pasirenkamasis dalykas, kai mokyklos mokymosi programėlė jį žino.", + "Online meeting link": "Nuotolinės pamokos nuoroda", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur mokiniai prisijungia prie šios pamokos nuotoliu. Mygtukas Prisijungti rodomas tik su https nuoroda." }, "plurals": null } diff --git a/l10n/lv.js b/l10n/lv.js index e47667b8..2da307bd 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Nav īpašnieku grupas", "Could not search for groups. Please try again.": "Neizdevās meklēt grupas. Mēģiniet vēlreiz.", "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", - "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki." + "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki.", + "Course": "Kurss", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurss, kas tiek mācīts šajā stundā, piemēram, izvēles priekšmets, ja skolas mācību lietotne to zina.", + "Online meeting link": "Tiešsaistes stundas saite", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur skolēni pievienojas šai stundai tiešsaistē. Poga Pievienoties tiek rādīta tikai https saitei." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index b5c2a656..3de26a15 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -1355,7 +1355,11 @@ "No owning group": "Nav īpašnieku grupas", "Could not search for groups. Please try again.": "Neizdevās meklēt grupas. Mēģiniet vēlreiz.", "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", - "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki." + "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki.", + "Course": "Kurss", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurss, kas tiek mācīts šajā stundā, piemēram, izvēles priekšmets, ja skolas mācību lietotne to zina.", + "Online meeting link": "Tiešsaistes stundas saite", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur skolēni pievienojas šai stundai tiešsaistē. Poga Pievienoties tiek rādīta tikai https saitei." }, "plurals": null } diff --git a/l10n/mk.js b/l10n/mk.js index e79bc90a..31c9588a 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без група сопственик", "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", "Could not change the owning group": "Групата сопственик не може да се промени", - "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови." + "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предметот што се предава на овој час, на пример изборен предмет, кога училишната апликација за учење го знае.", + "Online meeting link": "Врска до онлајн часот", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Каде учениците се приклучуваат на овој час онлајн. Копчето Приклучи се се прикажува само за https врска." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index 0626f5be..809f16b7 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -1355,7 +1355,11 @@ "No owning group": "Без група сопственик", "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", "Could not change the owning group": "Групата сопственик не може да се промени", - "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови." + "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предметот што се предава на овој час, на пример изборен предмет, кога училишната апликација за учење го знае.", + "Online meeting link": "Врска до онлајн часот", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Каде учениците се приклучуваат на овој час онлајн. Копчето Приклучи се се прикажува само за https врска." }, "plurals": null } diff --git a/l10n/mt.js b/l10n/mt.js index f47bd380..0966cd3d 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "L-ebda grupp sid", "Could not search for groups. Please try again.": "Ma setgħux jiġu mfittxija gruppi. Erġa' pprova.", "Could not change the owning group": "Il-grupp sid ma setax jinbidel", - "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh." + "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh.", + "Course": "Kors", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il-kors mgħallem f'din il-lezzjoni, bħal suġġett fakultattiv, meta l-app tat-tagħlim tal-iskola tkun tafu.", + "Online meeting link": "Link tal-lezzjoni online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Fejn l-istudenti jingħaqdu ma' din il-lezzjoni online. Il-buttuna Ingħaqad tidher biss għal link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index da365c22..b0035468 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -1355,7 +1355,11 @@ "No owning group": "L-ebda grupp sid", "Could not search for groups. Please try again.": "Ma setgħux jiġu mfittxija gruppi. Erġa' pprova.", "Could not change the owning group": "Il-grupp sid ma setax jinbidel", - "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh." + "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh.", + "Course": "Kors", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il-kors mgħallem f'din il-lezzjoni, bħal suġġett fakultattiv, meta l-app tat-tagħlim tal-iskola tkun tafu.", + "Online meeting link": "Link tal-lezzjoni online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Fejn l-istudenti jingħaqdu ma' din il-lezzjoni online. Il-buttuna Ingħaqad tidher biss għal link https." }, "plurals": {} } diff --git a/l10n/nb.js b/l10n/nb.js index 91c791c4..b4bbf61c 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Ingen eiergruppe", "Could not search for groups. Please try again.": "Kunne ikke søke etter grupper. Prøv igjen.", "Could not change the owning group": "Kunne ikke endre eiergruppen", - "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det." + "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurset timen underviser i, for eksempel et valgfag, når skolens læringsapp kjenner det.", + "Online meeting link": "Lenke til nettimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor elevene blir med i timen på nett. Knappen Bli med vises bare for en https-lenke." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index c443df1f..31c1d893 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -1355,7 +1355,11 @@ "No owning group": "Ingen eiergruppe", "Could not search for groups. Please try again.": "Kunne ikke søke etter grupper. Prøv igjen.", "Could not change the owning group": "Kunne ikke endre eiergruppen", - "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det." + "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurset timen underviser i, for eksempel et valgfag, når skolens læringsapp kjenner det.", + "Online meeting link": "Lenke til nettimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor elevene blir med i timen på nett. Knappen Bli med vises bare for en https-lenke." }, "plurals": {} } diff --git a/l10n/nl.js b/l10n/nl.js index 3666e2f4..2298fe38 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1369,7 +1369,11 @@ OC.L10N.register( "No owning group": "Geen eigenaar-groep", "Could not search for groups. Please try again.": "Kon niet naar groepen zoeken. Probeer het opnieuw.", "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", - "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het." + "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het.", + "Course": "Vak", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Het vak dat in deze les gegeven wordt, zoals een keuzevak, als de leerapp van de school het kent.", + "Online meeting link": "Link naar de online les", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Waar leerlingen online aan deze les deelnemen. Leerlingen zien alleen bij een https-link een knop Deelnemen." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 7fe3eb6c..8e5f3f53 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1368,7 +1368,11 @@ "No owning group": "Geen eigenaar-groep", "Could not search for groups. Please try again.": "Kon niet naar groepen zoeken. Probeer het opnieuw.", "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", - "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het." + "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het.", + "Course": "Vak", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Het vak dat in deze les gegeven wordt, zoals een keuzevak, als de leerapp van de school het kent.", + "Online meeting link": "Link naar de online les", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Waar leerlingen online aan deze les deelnemen. Leerlingen zien alleen bij een https-link een knop Deelnemen." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index 167d704f..ddc53c0a 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Brak grupy właściciela", "Could not search for groups. Please try again.": "Nie udało się wyszukać grup. Spróbuj ponownie.", "Could not change the owning group": "Nie udało się zmienić grupy właściciela", - "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie." + "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurs, którego dotyczy ta lekcja, na przykład przedmiot do wyboru, gdy szkolna aplikacja do nauki go zna.", + "Online meeting link": "Link do lekcji online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdzie uczniowie dołączają do tej lekcji online. Przycisk Dołącz pojawia się tylko dla linku https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 65118d4d..bcbeedfc 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -1355,7 +1355,11 @@ "No owning group": "Brak grupy właściciela", "Could not search for groups. Please try again.": "Nie udało się wyszukać grup. Spróbuj ponownie.", "Could not change the owning group": "Nie udało się zmienić grupy właściciela", - "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie." + "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurs, którego dotyczy ta lekcja, na przykład przedmiot do wyboru, gdy szkolna aplikacja do nauki go zna.", + "Online meeting link": "Link do lekcji online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdzie uczniowie dołączają do tej lekcji online. Przycisk Dołącz pojawia się tylko dla linku https." }, "plurals": {} } diff --git a/l10n/pt.js b/l10n/pt.js index fe959f30..5cd007cd 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Sem grupo proprietário", "Could not search for groups. Please try again.": "Não foi possível procurar grupos. Tente novamente.", "Could not change the owning group": "Não foi possível alterar o grupo proprietário", - "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram." + "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram.", + "Course": "Disciplina", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A disciplina lecionada nesta aula, como uma opção, quando a aplicação de aprendizagem da escola a conhece.", + "Online meeting link": "Ligação da aula online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Onde os alunos entram nesta aula online. O botão Entrar só aparece com uma ligação https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 82fceaf8..e06ca66b 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -1355,7 +1355,11 @@ "No owning group": "Sem grupo proprietário", "Could not search for groups. Please try again.": "Não foi possível procurar grupos. Tente novamente.", "Could not change the owning group": "Não foi possível alterar o grupo proprietário", - "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram." + "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram.", + "Course": "Disciplina", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A disciplina lecionada nesta aula, como uma opção, quando a aplicação de aprendizagem da escola a conhece.", + "Online meeting link": "Ligação da aula online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Onde os alunos entram nesta aula online. O botão Entrar só aparece com uma ligação https." }, "plurals": {} } diff --git a/l10n/rm.js b/l10n/rm.js index e655713b..5c50e571 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Nagina gruppa possessura", "Could not search for groups. Please try again.": "Impussibel da tschertgar gruppas. Emprova anc ina giada.", "Could not change the owning group": "Impussibel da midar la gruppa possessura", - "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan." + "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il curs che vegn instruì en questa lecziun, per exempel ina materia facultativa, sche l'app d'emprender da la scola al enconuscha.", + "Online meeting link": "Link a la lecziun online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Nua che las scolaras ed ils scolars sa participeschan online a questa lecziun. Il buttun Participar cumpara mo per in link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index 55a7aaef..8c6220a5 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -1355,7 +1355,11 @@ "No owning group": "Nagina gruppa possessura", "Could not search for groups. Please try again.": "Impussibel da tschertgar gruppas. Emprova anc ina giada.", "Could not change the owning group": "Impussibel da midar la gruppa possessura", - "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan." + "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il curs che vegn instruì en questa lecziun, per exempel ina materia facultativa, sche l'app d'emprender da la scola al enconuscha.", + "Online meeting link": "Link a la lecziun online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Nua che las scolaras ed ils scolars sa participeschan online a questa lecziun. Il buttun Participar cumpara mo per in link https." }, "plurals": null } diff --git a/l10n/ro.js b/l10n/ro.js index 18f35905..8f25e103 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Fără grup proprietar", "Could not search for groups. Please try again.": "Nu s-au putut căuta grupuri. Încearcă din nou.", "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", - "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică." + "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Cursul predat în această lecție, de exemplu o opțională, când aplicația de învățare a școlii îl cunoaște.", + "Online meeting link": "Linkul lecției online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Unde se alătură elevii acestei lecții online. Butonul Alătură-te apare doar pentru un link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index 167ceb2f..182d49db 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -1355,7 +1355,11 @@ "No owning group": "Fără grup proprietar", "Could not search for groups. Please try again.": "Nu s-au putut căuta grupuri. Încearcă din nou.", "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", - "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică." + "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Cursul predat în această lecție, de exemplu o opțională, când aplicația de învățare a școlii îl cunoaște.", + "Online meeting link": "Linkul lecției online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Unde se alătură elevii acestei lecții online. Butonul Alătură-te apare doar pentru un link https." }, "plurals": {} } diff --git a/l10n/ru.js b/l10n/ru.js index 5a0e18d8..c20403fc 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без группы-владельца", "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", "Could not change the owning group": "Не удалось изменить группу-владельца", - "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники." + "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, который преподаётся на этом уроке, например факультатив, если школьное учебное приложение его знает.", + "Online meeting link": "Ссылка на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где ученики подключаются к этому уроку онлайн. Кнопка «Присоединиться» появляется только для ссылки https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index c06f51be..e797a3c6 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -1355,7 +1355,11 @@ "No owning group": "Без группы-владельца", "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", "Could not change the owning group": "Не удалось изменить группу-владельца", - "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники." + "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, который преподаётся на этом уроке, например факультатив, если школьное учебное приложение его знает.", + "Online meeting link": "Ссылка на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где ученики подключаются к этому уроку онлайн. Кнопка «Присоединиться» появляется только для ссылки https." }, "plurals": {} } diff --git a/l10n/sk.js b/l10n/sk.js index acd9f1ff..263b559b 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Žiadna vlastnícka skupina", "Could not search for groups. Please try again.": "Skupiny sa nepodarilo vyhľadať. Skúste to znova.", "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", - "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia." + "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, ktorý sa na tejto hodine vyučuje, napríklad voliteľný predmet, ak ho školská výučbová aplikácia pozná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde sa žiaci k tejto hodine pripoja online. Tlačidlo Pripojiť sa zobrazí len pri odkaze https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index 27840fe0..f9aaad7f 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -1355,7 +1355,11 @@ "No owning group": "Žiadna vlastnícka skupina", "Could not search for groups. Please try again.": "Skupiny sa nepodarilo vyhľadať. Skúste to znova.", "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", - "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia." + "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, ktorý sa na tejto hodine vyučuje, napríklad voliteľný predmet, ak ho školská výučbová aplikácia pozná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde sa žiaci k tejto hodine pripoja online. Tlačidlo Pripojiť sa zobrazí len pri odkaze https." }, "plurals": null } diff --git a/l10n/sl.js b/l10n/sl.js index 8be7a072..5c023b55 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Brez lastniške skupine", "Could not search for groups. Please try again.": "Skupin ni bilo mogoče poiskati. Poskusite znova.", "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", - "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani." + "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet, ki se poučuje pri tej uri, na primer izbirni predmet, ko ga šolska učna aplikacija pozna.", + "Online meeting link": "Povezava do spletne ure", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kje se učenci pridružijo tej uri na spletu. Gumb Pridruži se se prikaže le pri povezavi https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index fc212183..cf805c95 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -1355,7 +1355,11 @@ "No owning group": "Brez lastniške skupine", "Could not search for groups. Please try again.": "Skupin ni bilo mogoče poiskati. Poskusite znova.", "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", - "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani." + "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet, ki se poučuje pri tej uri, na primer izbirni predmet, ko ga šolska učna aplikacija pozna.", + "Online meeting link": "Povezava do spletne ure", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kje se učenci pridružijo tej uri na spletu. Gumb Pridruži se se prikaže le pri povezavi https." }, "plurals": null } diff --git a/l10n/sq.js b/l10n/sq.js index b96c5044..e99a424e 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Pa grup pronar", "Could not search for groups. Please try again.": "Grupet nuk mund të kërkoheshin. Provoni përsëri.", "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", - "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë." + "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursi që jepet në këtë orë mësimi, për shembull një lëndë me zgjedhje, kur aplikacioni mësimor i shkollës e njeh.", + "Online meeting link": "Lidhja e mësimit në internet", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ku nxënësit i bashkohen këtij mësimi në internet. Butoni Bashkohu shfaqet vetëm për një lidhje https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index a07f4f5d..edb0f043 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -1355,7 +1355,11 @@ "No owning group": "Pa grup pronar", "Could not search for groups. Please try again.": "Grupet nuk mund të kërkoheshin. Provoni përsëri.", "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", - "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë." + "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursi që jepet në këtë orë mësimi, për shembull një lëndë me zgjedhje, kur aplikacioni mësimor i shkollës e njeh.", + "Online meeting link": "Lidhja e mësimit në internet", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ku nxënësit i bashkohen këtij mësimi në internet. Butoni Bashkohu shfaqet vetëm për një lidhje https." }, "plurals": {} } diff --git a/l10n/sr.js b/l10n/sr.js index 1daa4b53..2a17b019 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без групе власника", "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", "Could not change the owning group": "Групу власника није могуће променити", - "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови." + "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предмет који се предаје на овом часу, на пример изборни предмет, када га школска апликација за учење познаје.", + "Online meeting link": "Веза за онлајн час", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где се ученици придружују овом часу онлајн. Дугме Придружи се приказује се само за https везу." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index 9af38495..2e701d01 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -1355,7 +1355,11 @@ "No owning group": "Без групе власника", "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", "Could not change the owning group": "Групу власника није могуће променити", - "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови." + "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предмет који се предаје на овом часу, на пример изборни предмет, када га школска апликација за учење познаје.", + "Online meeting link": "Веза за онлајн час", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где се ученици придружују овом часу онлајн. Дугме Придружи се приказује се само за https везу." }, "plurals": null } diff --git a/l10n/sv.js b/l10n/sv.js index d7bd9050..55560f26 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Ingen ägargrupp", "Could not search for groups. Please try again.": "Det gick inte att söka efter grupper. Försök igen.", "Could not change the owning group": "Det gick inte att ändra ägargruppen", - "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det." + "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursen som lektionen undervisar i, till exempel ett tillval, när skolans lärapp känner till den.", + "Online meeting link": "Länk till onlinelektionen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Var eleverna ansluter till lektionen online. Knappen Anslut visas bara för en https-länk." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index 108e1be1..27822288 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -1355,7 +1355,11 @@ "No owning group": "Ingen ägargrupp", "Could not search for groups. Please try again.": "Det gick inte att söka efter grupper. Försök igen.", "Could not change the owning group": "Det gick inte att ändra ägargruppen", - "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det." + "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursen som lektionen undervisar i, till exempel ett tillval, när skolans lärapp känner till den.", + "Online meeting link": "Länk till onlinelektionen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Var eleverna ansluter till lektionen online. Knappen Anslut visas bara för en https-länk." }, "plurals": null } diff --git a/l10n/tr.js b/l10n/tr.js index 030545d7..0ebbac58 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Sahip grup yok", "Could not search for groups. Please try again.": "Gruplar aranamadı. Lütfen yeniden deneyin.", "Could not change the owning group": "Sahip grup değiştirilemedi", - "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir." + "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir.", + "Course": "Ders", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Bu derste işlenen ders, örneğin bir seçmeli ders, okulun öğrenme uygulaması onu bildiğinde.", + "Online meeting link": "Çevrimiçi ders bağlantısı", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Öğrencilerin bu derse çevrimiçi katıldığı yer. Katıl düğmesi yalnızca https bağlantısında görünür." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index 21345b8c..80b0623e 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -1355,7 +1355,11 @@ "No owning group": "Sahip grup yok", "Could not search for groups. Please try again.": "Gruplar aranamadı. Lütfen yeniden deneyin.", "Could not change the owning group": "Sahip grup değiştirilemedi", - "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir." + "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir.", + "Course": "Ders", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Bu derste işlenen ders, örneğin bir seçmeli ders, okulun öğrenme uygulaması onu bildiğinde.", + "Online meeting link": "Çevrimiçi ders bağlantısı", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Öğrencilerin bu derse çevrimiçi katıldığı yer. Katıl düğmesi yalnızca https bağlantısında görünür." }, "plurals": {} } diff --git a/l10n/uk.js b/l10n/uk.js index 30d04b88..378884bb 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -1356,7 +1356,11 @@ OC.L10N.register( "No owning group": "Без групи-власника", "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", "Could not change the owning group": "Не вдалося змінити групу-власника", - "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники." + "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, який викладають на цьому уроці, наприклад вибірковий предмет, якщо шкільний навчальний застосунок його знає.", + "Online meeting link": "Посилання на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Де учні приєднуються до цього уроку онлайн. Кнопка «Приєднатися» з'являється лише для посилання https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index 03d2b064..ccfa32bd 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -1355,7 +1355,11 @@ "No owning group": "Без групи-власника", "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", "Could not change the owning group": "Не вдалося змінити групу-власника", - "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники." + "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, який викладають на цьому уроці, наприклад вибірковий предмет, якщо шкільний навчальний застосунок його знає.", + "Online meeting link": "Посилання на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Де учні приєднуються до цього уроку онлайн. Кнопка «Приєднатися» з'являється лише для посилання https." }, "plurals": {} } diff --git a/lib/Event/TimetableSessionsQueryEvent.php b/lib/Event/TimetableSessionsQueryEvent.php index 160b5273..f1247498 100644 --- a/lib/Event/TimetableSessionsQueryEvent.php +++ b/lib/Event/TimetableSessionsQueryEvent.php @@ -49,9 +49,14 @@ class TimetableSessionsQueryEvent extends Event { /** * Contract version of this event and its result. * + * Version 2 (DECISIONS row 53): a query may name only a `courseId`, and + * every lesson carries `courseId` and `onlineMeetingUrl`. + * * @var int + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 */ - public const CONTRACT_VERSION = 1; + public const CONTRACT_VERSION = 2; /** * The sessions found, once planninq handled the event successfully. diff --git a/lib/Service/TimetableSessionQuery.php b/lib/Service/TimetableSessionQuery.php index 9d4af0a7..83a372b2 100644 --- a/lib/Service/TimetableSessionQuery.php +++ b/lib/Service/TimetableSessionQuery.php @@ -59,7 +59,7 @@ class TimetableSessionQuery { * * @var string[] */ - public const IDENTITY_KEYS = ['cohortId', 'groupReference', 'teacherUserId', 'teacherReference']; + public const IDENTITY_KEYS = ['cohortId', 'groupReference', 'teacherUserId', 'teacherReference', 'courseId']; /** * Seconds the window is widened by in the OpenRegister prefilter. @@ -260,7 +260,7 @@ private function parseIdentity(array $criteria): array { } if ($identity === []) { - throw new InvalidArgumentException('Name a cohortId, groupReference, teacherUserId or teacherReference to read a timetable.'); + throw new InvalidArgumentException('Name a cohortId, groupReference, teacherUserId, teacherReference or courseId to read a timetable.'); } return $identity; diff --git a/lib/Service/TimetableSessionRows.php b/lib/Service/TimetableSessionRows.php index 30414d90..0ede6ee2 100644 --- a/lib/Service/TimetableSessionRows.php +++ b/lib/Service/TimetableSessionRows.php @@ -50,7 +50,24 @@ class TimetableSessionRows { * * @var string[] */ - private const OPTIONAL_FIELDS = ['groupReference', 'cohortId', 'teacherReference', 'teacherUserId', 'roomReference', 'roomLabel']; + private const OPTIONAL_FIELDS = [ + 'groupReference', + 'cohortId', + 'teacherReference', + 'teacherUserId', + 'roomReference', + 'roomLabel', + 'courseId', + 'onlineMeetingUrl', + ]; + + /** + * Optional fields an empty value clears (stored as null) rather than + * storing an empty string their format would refuse (contract v2). + * + * @var string[] + */ + private const CLEARABLE_FIELDS = ['courseId', 'onlineMeetingUrl']; /** * Normalise an ObjectService result set to a plain list of rows. @@ -223,4 +240,49 @@ private function entityId(object $entity): string { return ''; }//end entityId() + + /** + * Set a clearable field the caller sent empty (or null) to null. + * + * @param array $row The normalised row. + * @param array $raw The row as delivered. + * + * @return array The row. + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ + public function withClearedFields(array $row, array $raw): array { + foreach (self::CLEARABLE_FIELDS as $field) { + if (array_key_exists($field, $raw) === true && ($row[$field] ?? '') === '') { + $row[$field] = null; + } + } + + return $row; + }//end withClearedFields() + + /** + * Check a row's course id and online link, which the schema stores as a + * uuid and an address: a value OpenRegister would refuse is rejected + * before anything is written, with its own code. + * + * @param array $row The normalised row. + * + * @return array{code:string,message:string}|null The problem, or null. + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ + public function courseOrLinkError(array $row): ?array { + $course = $row['courseId'] ?? null; + if ($course !== null && preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', (string)$course) !== 1) { + return ['code' => 'invalid-course-id', 'message' => 'The course id must be the uuid of a course.']; + } + + $link = $row['onlineMeetingUrl'] ?? null; + if ($link !== null && (filter_var((string)$link, FILTER_VALIDATE_URL) === false || parse_url((string)$link, PHP_URL_HOST) === null)) { + return ['code' => 'invalid-link', 'message' => 'The online meeting link must be a full web address.']; + } + + return null; + }//end courseOrLinkError() }//end class diff --git a/lib/Service/TimetableSessionService.php b/lib/Service/TimetableSessionService.php index 50edc973..1e990374 100644 --- a/lib/Service/TimetableSessionService.php +++ b/lib/Service/TimetableSessionService.php @@ -101,6 +101,8 @@ class TimetableSessionService { 'roomReference', 'roomLabel', 'status', + 'courseId', + 'onlineMeetingUrl', ]; /** @@ -489,7 +491,7 @@ private function normalise(array $raw, string $sourceSystem): array { } } - return $row; + return $this->rows->withClearedFields(row: $row, raw: $raw); }//end normalise() /** @@ -521,7 +523,7 @@ private function validate(array $row): ?array { return ['code' => 'invalid-status', 'message' => 'Status must be draft, scheduled or cancelled.']; } - return null; + return $this->rows->courseOrLinkError(row: $row); }//end validate() /** diff --git a/lib/Settings/planninq_register.json b/lib/Settings/planninq_register.json index 334e6e98..fef3780a 100644 --- a/lib/Settings/planninq_register.json +++ b/lib/Settings/planninq_register.json @@ -3,7 +3,7 @@ "info": { "title": "Planninq Register", "description": "Register containing all schemas for the Planninq application.", - "version": "0.36.0" + "version": "0.37.0" }, "x-openregister": { "type": "application", @@ -2226,7 +2226,7 @@ "timetableSession": { "slug": "timetableSession", "icon": "ClockOutline", - "version": "0.3.0", + "version": "0.4.0", "title": "Timetable session", "description": "One lesson in a school timetable as the rostering system knows it: when it runs, for which group, with which teacher, in which room and for which subject. Delivered by a rostering import and matched again by source and occurrence id.", "x-schema-org": "schema:Event", @@ -2339,6 +2339,21 @@ "type": "string", "description": "The room name shown with the lesson." }, + "courseId": { + "title": "Course", + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The course this lesson teaches, such as an elective, when the school's learning app knows it." + }, + "onlineMeetingUrl": { + "title": "Online meeting link", + "type": "string", + "format": "uri", + "nullable": true, + "maxLength": 2048, + "description": "Where pupils join this lesson online. Pupils see a Join button only for an https link." + }, "status": { "title": "Status", "type": "string", diff --git a/openspec/changes/timetable-course-query/proposal.md b/openspec/changes/timetable-course-query/proposal.md new file mode 100644 index 00000000..1f45151e --- /dev/null +++ b/openspec/changes/timetable-course-query/proposal.md @@ -0,0 +1,23 @@ +--- +kind: code +--- + +# Answer a timetable query by course, and carry a lesson's course and online link + +## Why + +With planninq installed, learniq's timetable source resolves to planninq, and two things it needs are missing. Its elective picker cannot warn about two overlapping electives, because planninq's query event has no way to ask for one course's lessons. Its timetable never shows a Join action, because a planninq lesson has no online link. Evidence from the learniq live pass: `livepass/learniq/timetabling-student-choice-placement/slots.txt` and `livepass/learniq/timetabling-online-lesson-link/`. + +Decision: Ruben, DECISIONS row 53 (learniq live pass D8): "build the planninq path: planninq answers the course query and carries a lesson link; learniq reads both." The contract both apps build against is `for-ruben/planninq-timetable-course-query-and-lesson-link.md` (contract v2). learniq's half is on its branch `fix/planninq-course-sessions-and-link`. + +## What changes + +- `TimetableSessionsQueryEvent::CONTRACT_VERSION` becomes 2. learniq sends a course query only from version 2. +- The `timetableSession` schema gains `courseId` (uuid, nullable) and `onlineMeetingUrl` (uri, nullable). An import sets them through the existing upsert; a malformed value is refused with `invalid-course-id` or `invalid-link` before anything is written, and an empty value clears the field. +- `courseId` becomes an identity key of the query: a query naming only a course answers that course's lessons, with the same window, cancelled and draft rules as every other query. +- Every lesson the query answers carries `courseId` and `onlineMeetingUrl`, null when unset, on every query. + +## Out of scope + +- No screen in planninq edits either field yet; they arrive through the import (the upsert event and the admin endpoint). +- learniq's reading of both fields lives in learniq. diff --git a/openspec/changes/timetable-course-query/specs/school-timetable/spec.md b/openspec/changes/timetable-course-query/specs/school-timetable/spec.md new file mode 100644 index 00000000..4d643ec1 --- /dev/null +++ b/openspec/changes/timetable-course-query/specs/school-timetable/spec.md @@ -0,0 +1,24 @@ +# school-timetable delta: timetable-course-query + +## ADDED Requirements + +### Requirement: Another app reads a course's lessons and their online link (REQ-007) +`TimetableSessionsQueryEvent` MUST carry contract version 2. A lesson MAY carry a `courseId` (the uuid of the course it teaches) and an `onlineMeetingUrl`; an upsert MUST refuse a `courseId` that is not a uuid with `invalid-course-id` and an `onlineMeetingUrl` that is not an absolute address with `invalid-link`, before writing, and an empty value MUST clear the field. `courseId` MUST be accepted as the only identity filter of a query, answering the lessons whose `courseId` equals it under the same window, cancelled and draft rules as every other query. Every lesson a query answers MUST carry `courseId` and `onlineMeetingUrl`, null when unset. Feature tier: V1. + +#### Scenario: A course query answers that course's lessons +- GIVEN two lessons of course A in the requested week, one of course A later, one of course B and one with no course +- WHEN a query event asks for `courseId: A` in that week +- THEN the two lessons of course A inside the week are returned, earliest first +- @e2e exclude An in-process event between two apps has no screen to drive; TimetableCourseQueryTest::testACourseQueryAnswersThatCoursesLessons runs the real listener, service and query over an in-memory OpenRegister + +#### Scenario: Every lesson carries its course and link +- GIVEN a lesson with a course and an https link and a lesson with neither +- WHEN a cohort query answers both +- THEN the first carries its `courseId` and `onlineMeetingUrl` and the second carries both keys as null +- @e2e exclude An in-process event between two apps has no screen to drive; TimetableCourseQueryTest::testEveryLessonCarriesItsCourseAndLink + +#### Scenario: A malformed course or link is refused +- GIVEN a delivery with a lesson whose `courseId` is `spaans` and one whose `onlineMeetingUrl` is `lokaal 12` +- WHEN it is upserted +- THEN both are rejected, with `invalid-course-id` and `invalid-link`, and nothing is written +- @e2e exclude The upsert is reached through an event and an admin endpoint with no screen; TimetableCourseQueryTest::testAMalformedCourseOrLinkIsRefused diff --git a/openspec/changes/timetable-course-query/tasks.md b/openspec/changes/timetable-course-query/tasks.md new file mode 100644 index 00000000..1c088180 --- /dev/null +++ b/openspec/changes/timetable-course-query/tasks.md @@ -0,0 +1,11 @@ +# Tasks: timetable-course-query + +## 1. Contract v2 + +- [x] 1.1 `courseId` and `onlineMeetingUrl` on the `timetableSession` schema (0.4.0, register 0.37.0), writable through the upsert, validated before writing, empty clears. Verify: `TimetableCourseQueryTest::testTheStoredLessonFitsTheRegisterSchema` validates what is stored against the real fragment with Opis; `testAMalformedCourseOrLinkIsRefused`. +- [x] 1.2 `courseId` is an identity key of `TimetableSessionQuery`, and the refusal names it. Verify: `TimetableCourseQueryTest::testACourseQueryAnswersThatCoursesLessons`, `testTheRefusalNamesTheCourse`. +- [x] 1.3 Every lesson in the read shape carries `courseId` and `onlineMeetingUrl`, null when unset; `CONTRACT_VERSION` is 2. Verify: `TimetableCourseQueryTest::testEveryLessonCarriesItsCourseAndLink`, `testTheContractVersionSaysTheCourseQueryExists`. + +## 2. Live check (with learniq) + +- [ ] 2.1 After learniq's `fix/planninq-course-sessions-and-link` lands: set `courseId` on two overlapping planninq lessons for two elective courses; `GET /apps/learniq/api/timetable/course-slots?courseIds=,&withCore=1` as a learner answers both slots and the picker warns; set an https `onlineMeetingUrl` on a lesson and My timetable shows Join, opening in a new tab. learniq refreshes its stub of the event class (`tests/Stubs/Planninq/Event/TimetableSessionsQueryEvent.php`) when this lands. diff --git a/tests/unit/Listener/TimetableCourseQueryTest.php b/tests/unit/Listener/TimetableCourseQueryTest.php new file mode 100644 index 00000000..0e4c4b91 --- /dev/null +++ b/tests/unit/Listener/TimetableCourseQueryTest.php @@ -0,0 +1,246 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Tests\Unit\Listener; + +require_once __DIR__ . '/../Support/InMemoryTimetableObjectService.php'; +require_once __DIR__ . '/../Support/RegisterSchemaValidation.php'; + +use OCA\Planninq\Event\TimetableSessionsQueryEvent; +use OCA\Planninq\Listener\TimetableSessionsQueryListener; +use OCA\Planninq\Service\TimetableSessionService; +use OCA\Planninq\Tests\Unit\Support\InMemoryTimetableObjectService; +use OCA\Planninq\Tests\Unit\Support\RegisterSchemaValidation; +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Psr\Log\NullLogger; + +/** + * A course query answers one course's lessons, and every lesson carries its course and link. + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ +class TimetableCourseQueryTest extends TestCase { + use RegisterSchemaValidation; + + private const COURSE_A = '4f1c2b7e-9a51-4c3e-8d2a-0b6e1f3a5c71'; + + private const COURSE_B = '8b0d6e2f-3c47-4a19-9e85-7d2c1a4b6f90'; + + /** + * The in-memory OpenRegister. + * + * @var InMemoryTimetableObjectService + */ + private InMemoryTimetableObjectService $objectService; + + /** + * The real service. + * + * @var TimetableSessionService + */ + private TimetableSessionService $sessions; + + /** + * The listener under test. + * + * @var TimetableSessionsQueryListener + */ + private TimetableSessionsQueryListener $listener; + + /** + * Build the listener over the real service and an in-memory OpenRegister. + * + * @return void + */ + protected function setUp(): void { + parent::setUp(); + + $this->objectService = new InMemoryTimetableObjectService(); + $container = $this->createMock(originalClassName: ContainerInterface::class); + $container->method('get')->willReturn($this->objectService); + + $this->sessions = new TimetableSessionService(container: $container, logger: new NullLogger()); + $this->listener = new TimetableSessionsQueryListener(sessions: $this->sessions, logger: new NullLogger()); + + }//end setUp() + + /** + * Deliver lessons through the real upsert, the way an import writes them. + * + * @param array> $rows The rows. + * + * @return array The upsert result. + */ + private function deliver(array $rows): array { + return $this->sessions->upsert(sourceSystem: 'roster-zermelo', sessions: $rows); + + }//end deliver() + + /** + * One lesson row. + * + * @param string $ref The occurrence id. + * @param string $start Start moment. + * @param array $extra Extra fields. + * + * @return array + */ + private function lesson(string $ref, string $start, array $extra=[]): array { + return array_merge( + [ + 'externalRef' => $ref, + 'subject' => 'Spaans', + 'startsAt' => $start, + 'endsAt' => date(DATE_ATOM, ((int)strtotime($start) + 3000)), + 'cohortId' => 'c-1', + 'status' => 'scheduled', + ], + $extra + ); + + }//end lesson() + + /** + * learniq reads CONTRACT_VERSION: below 2 it sends no course query. + * + * @return void + */ + public function testTheContractVersionSaysTheCourseQueryExists(): void { + self::assertGreaterThanOrEqual(expected: 2, actual: TimetableSessionsQueryEvent::CONTRACT_VERSION); + + }//end testTheContractVersionSaysTheCourseQueryExists() + + /** + * A query naming only a course answers that course's lessons in the window, earliest first. + * + * @return void + */ + public function testACourseQueryAnswersThatCoursesLessons(): void { + $result = $this->deliver( + rows: [ + $this->lesson(ref: 'a-2', start: '2026-10-06T10:00:00+02:00', extra: ['courseId' => self::COURSE_A]), + $this->lesson(ref: 'a-1', start: '2026-10-05T10:00:00+02:00', extra: ['courseId' => self::COURSE_A]), + $this->lesson(ref: 'a-late', start: '2026-11-30T10:00:00+01:00', extra: ['courseId' => self::COURSE_A]), + $this->lesson(ref: 'b-1', start: '2026-10-05T10:00:00+02:00', extra: ['courseId' => self::COURSE_B]), + $this->lesson(ref: 'none', start: '2026-10-05T11:00:00+02:00'), + ] + ); + self::assertSame(expected: [], actual: $result['rejected']); + + $event = new TimetableSessionsQueryEvent( + sourceApp: 'learniq', + criteria: ['courseId' => self::COURSE_A, 'limit' => 1000, 'from' => '2026-10-05T00:00:00+02:00', 'to' => '2026-10-11T23:59:59+02:00'] + ); + $this->listener->handle($event); + + self::assertNull(actual: $event->getError()); + self::assertTrue(condition: $event->isHandled()); + self::assertSame(expected: ['a-1', 'a-2'], actual: array_column((array)$event->getSessions(), 'externalRef')); + self::assertSame(expected: [self::COURSE_A, self::COURSE_A], actual: array_column((array)$event->getSessions(), 'courseId')); + + }//end testACourseQueryAnswersThatCoursesLessons() + + /** + * Every lesson carries courseId and onlineMeetingUrl, null when unset, on a cohort query too. + * + * @return void + */ + public function testEveryLessonCarriesItsCourseAndLink(): void { + $this->deliver( + rows: [ + $this->lesson(ref: 'online', start: '2026-10-05T09:00:00+02:00', extra: ['courseId' => self::COURSE_A, 'onlineMeetingUrl' => 'https://meet.example.org/spaans-4b']), + $this->lesson(ref: 'plain', start: '2026-10-05T10:00:00+02:00'), + ] + ); + + $event = new TimetableSessionsQueryEvent(sourceApp: 'learniq', criteria: ['cohortId' => 'c-1']); + $this->listener->handle($event); + + $byRef = array_column((array)$event->getSessions(), null, 'externalRef'); + self::assertSame(expected: 'https://meet.example.org/spaans-4b', actual: $byRef['online']['onlineMeetingUrl']); + self::assertSame(expected: self::COURSE_A, actual: $byRef['online']['courseId']); + self::assertArrayHasKey(key: 'courseId', array: $byRef['plain']); + self::assertArrayHasKey(key: 'onlineMeetingUrl', array: $byRef['plain']); + self::assertNull(actual: $byRef['plain']['courseId']); + self::assertNull(actual: $byRef['plain']['onlineMeetingUrl']); + + }//end testEveryLessonCarriesItsCourseAndLink() + + /** + * What the upsert stores is accepted by the real timetableSession fragment. + * + * @return void + */ + public function testTheStoredLessonFitsTheRegisterSchema(): void { + $this->deliver( + rows: [ + $this->lesson(ref: 'online', start: '2026-10-05T09:00:00+02:00', extra: ['courseId' => self::COURSE_A, 'onlineMeetingUrl' => 'https://meet.example.org/spaans-4b']), + $this->lesson(ref: 'cleared', start: '2026-10-05T10:00:00+02:00', extra: ['courseId' => '', 'onlineMeetingUrl' => '']), + ] + ); + + self::assertCount(expectedCount: 2, haystack: $this->objectService->rows['timetableSession']); + foreach ($this->objectService->rows['timetableSession'] as $data) { + self::assertSame(expected: [], actual: $this->registerSchemaErrors(slug: 'timetableSession', payload: $data), message: (string)$data['externalRef']); + } + + }//end testTheStoredLessonFitsTheRegisterSchema() + + /** + * A course id that is not a uuid, or a link that is not an address, is refused before it is written. + * + * @return void + */ + public function testAMalformedCourseOrLinkIsRefused(): void { + $result = $this->deliver( + rows: [ + $this->lesson(ref: 'bad-course', start: '2026-10-05T09:00:00+02:00', extra: ['courseId' => 'spaans']), + $this->lesson(ref: 'bad-link', start: '2026-10-05T10:00:00+02:00', extra: ['onlineMeetingUrl' => 'lokaal 12']), + ] + ); + + self::assertSame( + expected: ['bad-course' => 'invalid-course-id', 'bad-link' => 'invalid-link'], + actual: array_column($result['rejected'], 'errorCode', 'externalRef') + ); + self::assertSame(expected: [], actual: ($this->objectService->rows['timetableSession'] ?? [])); + + }//end testAMalformedCourseOrLinkIsRefused() + + /** + * The refusal for a query without identity names courseId too. + * + * @return void + */ + public function testTheRefusalNamesTheCourse(): void { + $event = new TimetableSessionsQueryEvent(sourceApp: 'learniq', criteria: ['from' => '2026-10-05T00:00:00+02:00']); + $this->listener->handle($event); + + self::assertNull(actual: $event->getSessions()); + self::assertStringContainsString(needle: 'courseId', haystack: (string)$event->getError()); + + }//end testTheRefusalNamesTheCourse() +}//end class diff --git a/tests/unit/Settings/PlanninqRegisterSchemaTest.php b/tests/unit/Settings/PlanninqRegisterSchemaTest.php index d4938461..8b12d0c9 100644 --- a/tests/unit/Settings/PlanninqRegisterSchemaTest.php +++ b/tests/unit/Settings/PlanninqRegisterSchemaTest.php @@ -1362,7 +1362,7 @@ public function testTimetableSessionStatusAllowsDraft(): void { self::assertSame(expected: ['draft', 'scheduled', 'cancelled'], actual: $status['enum']); self::assertSame(expected: 'scheduled', actual: $status['default']); self::assertSame(expected: 'Draft', actual: $status['x-enum-labels']['draft']); - self::assertSame(expected: '0.3.0', actual: $this->register['components']['schemas']['timetableSession']['version']); + self::assertTrue(condition: version_compare($this->register['components']['schemas']['timetableSession']['version'], '0.3.0', '>='), message: 'the draft status arrived in 0.3.0'); $lesson = ['externalRef' => 'zm-1', 'sourceSystem' => 'roster-zermelo', 'subject' => 'Wiskunde', 'title' => 'Wiskunde', 'startsAt' => '2026-10-05T09:00:00+02:00', 'endsAt' => '2026-10-05T09:50:00+02:00', 'status' => 'draft']; self::assertSame(expected: [], actual: $this->registerSchemaErrors(slug: 'timetableSession', payload: $lesson));