From d5faec249effd6da8af0016cda88310287b00ffc Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 3 Oct 2026 08:40:30 +0200 Subject: [PATCH 1/3] test(timetable): a course query answers one course's lessons, and every lesson carries its course and link (contract v2, red) --- .../timetable-course-query/proposal.md | 23 ++ .../specs/school-timetable/spec.md | 24 ++ .../changes/timetable-course-query/tasks.md | 11 + .../Listener/TimetableCourseQueryTest.php | 246 ++++++++++++++++++ 4 files changed, 304 insertions(+) create mode 100644 openspec/changes/timetable-course-query/proposal.md create mode 100644 openspec/changes/timetable-course-query/specs/school-timetable/spec.md create mode 100644 openspec/changes/timetable-course-query/tasks.md create mode 100644 tests/unit/Listener/TimetableCourseQueryTest.php 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 From c3463b08ce18d883dae6b4bb8b60b0ddc7c43ad2 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 3 Oct 2026 08:40:30 +0200 Subject: [PATCH 2/3] feat(timetable): answer a timetable query by course, and carry a lesson's course and online link (contract v2) DECISIONS row 53 (learniq live pass D8). TimetableSessionsQueryEvent::CONTRACT_VERSION 2; courseId is an identity key; timetableSession gains courseId (uuid) and onlineMeetingUrl (uri), both nullable, writable through the upsert, refused when malformed (invalid-course-id, invalid-link), cleared by an empty value; every lesson in the read shape carries both. Schema 0.4.0, register 0.37.0, 4 strings x 36 locales. --- appinfo/info.xml | 2 +- l10n/be.js | 6 +++- l10n/be.json | 6 +++- l10n/bg.js | 6 +++- l10n/bg.json | 6 +++- l10n/bs.js | 6 +++- l10n/bs.json | 6 +++- l10n/ca.js | 6 +++- l10n/ca.json | 6 +++- l10n/cs.js | 6 +++- l10n/cs.json | 6 +++- l10n/da.js | 6 +++- l10n/da.json | 6 +++- l10n/de.js | 6 +++- l10n/de.json | 6 +++- l10n/el.js | 6 +++- l10n/el.json | 6 +++- l10n/en.js | 6 +++- l10n/en.json | 6 +++- l10n/es.js | 6 +++- l10n/es.json | 6 +++- l10n/et.js | 6 +++- l10n/et.json | 6 +++- l10n/fi.js | 6 +++- l10n/fi.json | 6 +++- l10n/fr.js | 6 +++- l10n/fr.json | 6 +++- l10n/ga.js | 6 +++- l10n/ga.json | 6 +++- l10n/hr.js | 6 +++- l10n/hr.json | 6 +++- l10n/hu.js | 6 +++- l10n/hu.json | 6 +++- l10n/is.js | 6 +++- l10n/is.json | 6 +++- l10n/it.js | 6 +++- l10n/it.json | 6 +++- l10n/lb.js | 6 +++- l10n/lb.json | 6 +++- l10n/lt.js | 6 +++- l10n/lt.json | 6 +++- l10n/lv.js | 6 +++- l10n/lv.json | 6 +++- l10n/mk.js | 6 +++- l10n/mk.json | 6 +++- l10n/mt.js | 6 +++- l10n/mt.json | 6 +++- l10n/nb.js | 6 +++- l10n/nb.json | 6 +++- l10n/nl.js | 6 +++- l10n/nl.json | 6 +++- l10n/pl.js | 6 +++- l10n/pl.json | 6 +++- l10n/pt.js | 6 +++- l10n/pt.json | 6 +++- l10n/rm.js | 6 +++- l10n/rm.json | 6 +++- l10n/ro.js | 6 +++- l10n/ro.json | 6 +++- l10n/ru.js | 6 +++- l10n/ru.json | 6 +++- l10n/sk.js | 6 +++- l10n/sk.json | 6 +++- l10n/sl.js | 6 +++- l10n/sl.json | 6 +++- l10n/sq.js | 6 +++- l10n/sq.json | 6 +++- l10n/sr.js | 6 +++- l10n/sr.json | 6 +++- l10n/sv.js | 6 +++- l10n/sv.json | 6 +++- l10n/tr.js | 6 +++- l10n/tr.json | 6 +++- l10n/uk.js | 6 +++- l10n/uk.json | 6 +++- lib/Event/TimetableSessionsQueryEvent.php | 7 +++- lib/Service/TimetableSessionQuery.php | 4 +-- lib/Service/TimetableSessionRows.php | 2 +- lib/Service/TimetableSessionService.php | 43 ++++++++++++++++++++++- lib/Settings/planninq_register.json | 19 ++++++++-- 80 files changed, 439 insertions(+), 82 deletions(-) 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 41dfe88d..54f9755a 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Група не знойдзена. Налады абагульвання вашага адміністратара вызначаюць, якія групы вы можаце знайсці.", "No owning group": "Без групы-ўладальніка", "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", - "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка" + "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", + "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 3db398be..5fd867de 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Група не знойдзена. Налады абагульвання вашага адміністратара вызначаюць, якія групы вы можаце знайсці.", "No owning group": "Без групы-ўладальніка", "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", - "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка" + "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", + "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 72c71afa..c21c29bc 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Не е намерена група. Настройките за споделяне на администратора определят кои групи можете да намерите.", "No owning group": "Без група собственик", "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", - "Could not change the owning group": "Групата собственик не можа да бъде променена" + "Could not change the owning group": "Групата собственик не можа да бъде променена", + "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 bf34b1b3..8e414bf8 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Не е намерена група. Настройките за споделяне на администратора определят кои групи можете да намерите.", "No owning group": "Без група собственик", "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", - "Could not change the owning group": "Групата собственик не можа да бъде променена" + "Could not change the owning group": "Групата собственик не можа да бъде променена", + "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 b725dbe5..f5427d5c 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", "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" + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "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 39c7d1ad..e3c54a6a 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", "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" + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "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 dd6c93a1..3013ff20 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "No s'ha trobat cap grup. La configuració de compartició del vostre administrador decideix quins grups podeu trobar.", "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" + "Could not change the owning group": "No s'ha pogut canviar el grup propietari", + "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 ce270368..d4d4374f 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "No s'ha trobat cap grup. La configuració de compartició del vostre administrador decideix quins grups podeu trobar.", "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" + "Could not change the owning group": "No s'ha pogut canviar el grup propietari", + "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 98437040..09f6aeff 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Žádná skupina nenalezena. Nastavení sdílení vašeho správce určuje, které skupiny můžete najít.", "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" + "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", + "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 153727f8..4e792ff7 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Žádná skupina nenalezena. Nastavení sdílení vašeho správce určuje, které skupiny můžete najít.", "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" + "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", + "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 64f223e5..4ddfc9c4 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe fundet. Din administrators delingsindstillinger bestemmer, hvilke grupper du kan finde.", "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" + "Could not change the owning group": "Kunne ikke ændre ejergruppen", + "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 139b81ce..804b1bd7 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe fundet. Din administrators delingsindstillinger bestemmer, hvilke grupper du kan finde.", "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" + "Could not change the owning group": "Kunne ikke ændre ejergruppen", + "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 ccbaa96f..e583a347 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Keine Gruppe gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, welche Gruppen du finden kannst.", "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" + "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", + "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 3ae3f231..40a833ca 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Keine Gruppe gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, welche Gruppen du finden kannst.", "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" + "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", + "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 1b73939c..df03af7e 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Δεν βρέθηκε ομάδα. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας ορίζουν ποιες ομάδες μπορείτε να βρείτε.", "No owning group": "Χωρίς ομάδα ιδιοκτήτη", "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", - "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη" + "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", + "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 a3a1b1b9..cae79ade 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Δεν βρέθηκε ομάδα. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας ορίζουν ποιες ομάδες μπορείτε να βρείτε.", "No owning group": "Χωρίς ομάδα ιδιοκτήτη", "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", - "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη" + "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", + "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 4ef11d36..648e0f66 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1334,7 +1334,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "No group found. Your admin's sharing settings decide which groups you can find.", "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" + "Could not change the owning group": "Could not change the owning group", + "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 cc0dde3e..deed963c 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1333,7 +1333,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "No group found. Your admin's sharing settings decide which groups you can find.", "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" + "Could not change the owning group": "Could not change the owning group", + "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 d47b33cb..b54b536c 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "No se encontró ningún grupo. La configuración de uso compartido de tu administrador decide qué grupos puedes encontrar.", "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" + "Could not change the owning group": "No se pudo cambiar el grupo propietario", + "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 84fc7d26..70643011 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "No se encontró ningún grupo. La configuración de uso compartido de tu administrador decide qué grupos puedes encontrar.", "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" + "Could not change the owning group": "No se pudo cambiar el grupo propietario", + "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 68f0af44..795e26a0 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Gruppi ei leitud. Sinu administraatori jagamisseaded määravad, milliseid gruppe saad leida.", "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" + "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", + "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 6aef8013..34beedc4 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Gruppi ei leitud. Sinu administraatori jagamisseaded määravad, milliseid gruppe saad leida.", "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" + "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", + "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 4d6a2cde..9aafce2e 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ryhmää ei löytynyt. Ylläpitäjäsi jakoasetukset määräävät, mitkä ryhmät voit löytää.", "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" + "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", + "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 6f2baa6f..c46ac4d5 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ryhmää ei löytynyt. Ylläpitäjäsi jakoasetukset määräävät, mitkä ryhmät voit löytää.", "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" + "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", + "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 e599e140..088ada57 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Aucun groupe trouvé. Les paramètres de partage de votre administrateur déterminent les groupes que vous pouvez trouver.", "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" + "Could not change the owning group": "Impossible de modifier le groupe propriétaire", + "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 0018d4e8..f06be742 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Aucun groupe trouvé. Les paramètres de partage de votre administrateur déterminent les groupes que vous pouvez trouver.", "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" + "Could not change the owning group": "Impossible de modifier le groupe propriétaire", + "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 e65485bb..5d3efec4 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Níor aimsíodh aon ghrúpa. Socruithe comhroinnte do riarthóra a shocraíonn na grúpaí is féidir leat a aimsiú.", "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ú" + "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", + "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 1ff4eb9b..6faf8dd0 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Níor aimsíodh aon ghrúpa. Socruithe comhroinnte do riarthóra a shocraíonn na grúpaí is féidir leat a aimsiú.", "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ú" + "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", + "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 d05e88fe..8f3b7627 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", "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" + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "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 6df31d1d..0206d0d6 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", "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" + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "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 c1a9a9b3..e9487582 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nem található csoport. A rendszergazda megosztási beállításai döntik el, mely csoportokat találhatod meg.", "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" + "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", + "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 e5f1d88d..a65fafd8 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nem található csoport. A rendszergazda megosztási beállításai döntik el, mely csoportokat találhatod meg.", "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" + "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", + "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 9ab48b4f..8ec3db51 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Enginn hópur fannst. Deilingarstillingar kerfisstjórans ráða hvaða hópa þú getur fundið.", "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" + "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", + "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 4e43d76e..10fc2655 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Enginn hópur fannst. Deilingarstillingar kerfisstjórans ráða hvaða hópa þú getur fundið.", "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" + "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", + "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 6b8fefac..1554690c 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nessun gruppo trovato. Le impostazioni di condivisione del tuo amministratore decidono quali gruppi puoi trovare.", "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" + "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", + "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 2be9c23e..39dfa943 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nessun gruppo trovato. Le impostazioni di condivisione del tuo amministratore decidono quali gruppi puoi trovare.", "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" + "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", + "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 66417a9c..74a223fa 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Kee Grupp fonnt. D'Deelastellunge vun denger Administratioun bestëmmen, wéi eng Gruppen s du fanne kanns.", "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" + "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", + "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 6b533ad7..aa7ba4b8 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Kee Grupp fonnt. D'Deelastellunge vun denger Administratioun bestëmmen, wéi eng Gruppen s du fanne kanns.", "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" + "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", + "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 693af1f5..3744a620 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Grupė nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, kokias grupes galite rasti.", "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" + "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", + "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 dd47cecc..54aec391 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Grupė nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, kokias grupes galite rasti.", "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" + "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", + "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 fbad0b62..38f1ab5f 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Grupa netika atrasta. Jūsu administratora koplietošanas iestatījumi nosaka, kuras grupas varat atrast.", "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" + "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", + "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 84a6d335..03b1ee06 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Grupa netika atrasta. Jūsu administratora koplietošanas iestatījumi nosaka, kuras grupas varat atrast.", "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" + "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", + "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 f6702c60..4c87dd2c 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Не е пронајдена група. Поставките за споделување на вашиот администратор одредуваат кои групи можете да ги најдете.", "No owning group": "Без група сопственик", "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", - "Could not change the owning group": "Групата сопственик не може да се промени" + "Could not change the owning group": "Групата сопственик не може да се промени", + "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 ad64cbd7..f64ac30e 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Не е пронајдена група. Поставките за споделување на вашиот администратор одредуваат кои групи можете да ги најдете.", "No owning group": "Без група сопственик", "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", - "Could not change the owning group": "Групата сопственик не може да се промени" + "Could not change the owning group": "Групата сопственик не може да се промени", + "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 ead9d62e..2facdd3f 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ma nstab l-ebda grupp. Is-settings tal-qsim tal-amministratur tiegħek jiddeċiedu liema gruppi tista' ssib.", "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" + "Could not change the owning group": "Il-grupp sid ma setax jinbidel", + "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 7ebe9ef8..14f0d2c2 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ma nstab l-ebda grupp. Is-settings tal-qsim tal-amministratur tiegħek jiddeċiedu liema gruppi tista' ssib.", "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" + "Could not change the owning group": "Il-grupp sid ma setax jinbidel", + "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 3326d030..0059bfdf 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe funnet. Administratorens delingsinnstillinger avgjør hvilke grupper du kan finne.", "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" + "Could not change the owning group": "Kunne ikke endre eiergruppen", + "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 74a7cb64..f00da4a9 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe funnet. Administratorens delingsinnstillinger avgjør hvilke grupper du kan finne.", "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" + "Could not change the owning group": "Kunne ikke endre eiergruppen", + "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 e037a3a7..af11589f 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1368,7 +1368,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Geen groep gevonden. De deelinstellingen van je beheerder bepalen welke groepen je kunt vinden.", "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" + "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", + "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 bfe29ae3..23784edf 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1367,7 +1367,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Geen groep gevonden. De deelinstellingen van je beheerder bepalen welke groepen je kunt vinden.", "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" + "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", + "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 6e12bb16..f0bd3dae 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nie znaleziono grupy. Ustawienia udostępniania administratora decydują, które grupy możesz znaleźć.", "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" + "Could not change the owning group": "Nie udało się zmienić grupy właściciela", + "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 55f3451e..d23b430d 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nie znaleziono grupy. Ustawienia udostępniania administratora decydują, które grupy możesz znaleźć.", "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" + "Could not change the owning group": "Nie udało się zmienić grupy właściciela", + "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 4bbb4c80..30367fd4 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nenhum grupo encontrado. As definições de partilha do seu administrador decidem que grupos pode encontrar.", "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" + "Could not change the owning group": "Não foi possível alterar o grupo proprietário", + "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 53952587..3f127a33 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nenhum grupo encontrado. As definições de partilha do seu administrador decidem que grupos pode encontrar.", "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" + "Could not change the owning group": "Não foi possível alterar o grupo proprietário", + "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 c8aaa3fe..46f2ed74 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Chattà nagina gruppa. Las configuraziuns da cundivisiun da tes administratur decidan tge gruppas che ti pos chattar.", "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" + "Could not change the owning group": "Impussibel da midar la gruppa possessura", + "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 122bb479..94cd13af 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Chattà nagina gruppa. Las configuraziuns da cundivisiun da tes administratur decidan tge gruppas che ti pos chattar.", "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" + "Could not change the owning group": "Impussibel da midar la gruppa possessura", + "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 e7480a9b..f38c4bbf 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Niciun grup găsit. Setările de partajare ale administratorului decid ce grupuri poți găsi.", "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" + "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", + "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 8f136321..5b477f67 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Niciun grup găsit. Setările de partajare ale administratorului decid ce grupuri poți găsi.", "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" + "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", + "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 62de6104..6570d4b5 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Группа не найдена. Настройки общего доступа вашего администратора определяют, какие группы вы можете найти.", "No owning group": "Без группы-владельца", "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", - "Could not change the owning group": "Не удалось изменить группу-владельца" + "Could not change the owning group": "Не удалось изменить группу-владельца", + "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 689b4c78..b900b0c2 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Группа не найдена. Настройки общего доступа вашего администратора определяют, какие группы вы можете найти.", "No owning group": "Без группы-владельца", "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", - "Could not change the owning group": "Не удалось изменить группу-владельца" + "Could not change the owning group": "Не удалось изменить группу-владельца", + "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 83c2b4a5..ba8cb353 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nenašla sa žiadna skupina. Nastavenia zdieľania vášho správcu určujú, ktoré skupiny môžete nájsť.", "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ť" + "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", + "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 b7f5fb36..dd9ef10e 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nenašla sa žiadna skupina. Nastavenia zdieľania vášho správcu určujú, ktoré skupiny môžete nájsť.", "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ť" + "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", + "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 dcc96fd6..8784c04d 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ni najdene skupine. Nastavitve deljenja vašega skrbnika določajo, katere skupine lahko najdete.", "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" + "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", + "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 219d2ac3..1019a1ef 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ni najdene skupine. Nastavitve deljenja vašega skrbnika določajo, katere skupine lahko najdete.", "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" + "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", + "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 e6a05e05..57324f09 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Nuk u gjet asnjë grup. Cilësimet e ndarjes së administratorit tuaj vendosin cilat grupe mund të gjeni.", "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" + "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", + "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 6747da81..4e7e8edb 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Nuk u gjet asnjë grup. Cilësimet e ndarjes së administratorit tuaj vendosin cilat grupe mund të gjeni.", "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" + "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", + "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 528dc508..60c0124a 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Није пронађена ниједна група. Подешавања дељења вашег администратора одређују које групе можете пронаћи.", "No owning group": "Без групе власника", "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", - "Could not change the owning group": "Групу власника није могуће променити" + "Could not change the owning group": "Групу власника није могуће променити", + "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 be76d2d3..055d4de9 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Није пронађена ниједна група. Подешавања дељења вашег администратора одређују које групе можете пронаћи.", "No owning group": "Без групе власника", "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", - "Could not change the owning group": "Групу власника није могуће променити" + "Could not change the owning group": "Групу власника није могуће променити", + "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 2519002d..225d5056 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen grupp hittades. Din administratörs delningsinställningar avgör vilka grupper du kan hitta.", "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" + "Could not change the owning group": "Det gick inte att ändra ägargruppen", + "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 e1a92361..5e68ceeb 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen grupp hittades. Din administratörs delningsinställningar avgör vilka grupper du kan hitta.", "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" + "Could not change the owning group": "Det gick inte att ändra ägargruppen", + "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 0f284169..f2b2f74c 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Grup bulunamadı. Yöneticinizin paylaşım ayarları hangi grupları bulabileceğinizi belirler.", "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" + "Could not change the owning group": "Sahip grup değiştirilemedi", + "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 e833aa8f..1b89e680 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Grup bulunamadı. Yöneticinizin paylaşım ayarları hangi grupları bulabileceğinizi belirler.", "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" + "Could not change the owning group": "Sahip grup değiştirilemedi", + "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 33759261..0f120c54 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -1355,7 +1355,11 @@ OC.L10N.register( "No group found. Your admin's sharing settings decide which groups you can find.": "Групу не знайдено. Налаштування спільного доступу вашого адміністратора визначають, які групи ви можете знайти.", "No owning group": "Без групи-власника", "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", - "Could not change the owning group": "Не вдалося змінити групу-власника" + "Could not change the owning group": "Не вдалося змінити групу-власника", + "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 8bcbf77b..f8f67ff3 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -1354,7 +1354,11 @@ "No group found. Your admin's sharing settings decide which groups you can find.": "Групу не знайдено. Налаштування спільного доступу вашого адміністратора визначають, які групи ви можете знайти.", "No owning group": "Без групи-власника", "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", - "Could not change the owning group": "Не вдалося змінити групу-власника" + "Could not change the owning group": "Не вдалося змінити групу-власника", + "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..3c33638a 100644 --- a/lib/Service/TimetableSessionRows.php +++ b/lib/Service/TimetableSessionRows.php @@ -50,7 +50,7 @@ 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']; /** * Normalise an ObjectService result set to a plain list of rows. diff --git a/lib/Service/TimetableSessionService.php b/lib/Service/TimetableSessionService.php index 50edc973..9c9a7cdf 100644 --- a/lib/Service/TimetableSessionService.php +++ b/lib/Service/TimetableSessionService.php @@ -101,8 +101,18 @@ class TimetableSessionService { 'roomReference', 'roomLabel', 'status', + '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']; + /** * The fields compared as moments in time rather than as strings. * @@ -489,6 +499,12 @@ private function normalise(array $raw, string $sourceSystem): array { } } + foreach (self::CLEARABLE_FIELDS as $field) { + if (array_key_exists($field, $raw) === true && ($row[$field] ?? '') === '') { + $row[$field] = null; + } + } + return $row; }//end normalise() @@ -521,9 +537,34 @@ private function validate(array $row): ?array { return ['code' => 'invalid-status', 'message' => 'Status must be draft, scheduled or cancelled.']; } - return null; + return $this->validateCourseAndLink(row: $row); }//end validate() + /** + * 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 here, + * with its own code, before anything is written. + * + * @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 + */ + private function validateCourseAndLink(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 validateCourseAndLink() + /** * Find the stored session for a (source, occurrence id) pair. * 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", From 58a45726a3d9a54a39df441f226e67cd96127524 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 3 Oct 2026 08:43:43 +0200 Subject: [PATCH 3/3] refactor(timetable): keep the course and link rules beside the row shape, so the session service stays under phpmd's complexity limit Also wraps the optional field list for phpcs, and the draft-status test checks the timetableSession version is at least 0.3.0 instead of pinning it. --- lib/Service/TimetableSessionRows.php | 64 ++++++++++++++++++- lib/Service/TimetableSessionService.php | 43 +------------ .../Settings/PlanninqRegisterSchemaTest.php | 2 +- 3 files changed, 66 insertions(+), 43 deletions(-) diff --git a/lib/Service/TimetableSessionRows.php b/lib/Service/TimetableSessionRows.php index 3c33638a..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', 'courseId', 'onlineMeetingUrl']; + 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 9c9a7cdf..1e990374 100644 --- a/lib/Service/TimetableSessionService.php +++ b/lib/Service/TimetableSessionService.php @@ -105,14 +105,6 @@ class TimetableSessionService { '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']; - /** * The fields compared as moments in time rather than as strings. * @@ -499,13 +491,7 @@ private function normalise(array $raw, string $sourceSystem): array { } } - foreach (self::CLEARABLE_FIELDS as $field) { - if (array_key_exists($field, $raw) === true && ($row[$field] ?? '') === '') { - $row[$field] = null; - } - } - - return $row; + return $this->rows->withClearedFields(row: $row, raw: $raw); }//end normalise() /** @@ -537,34 +523,9 @@ private function validate(array $row): ?array { return ['code' => 'invalid-status', 'message' => 'Status must be draft, scheduled or cancelled.']; } - return $this->validateCourseAndLink(row: $row); + return $this->rows->courseOrLinkError(row: $row); }//end validate() - /** - * 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 here, - * with its own code, before anything is written. - * - * @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 - */ - private function validateCourseAndLink(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 validateCourseAndLink() - /** * Find the stored session for a (source, occurrence id) pair. * 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));