From ab25b8e5d75799d4b5bb1d9a4ea6b8dca3c54254 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Wed, 10 Jun 2026 02:56:00 +0100 Subject: [PATCH] chore: improve enrollment documentation --- apps/api/src/services/course/invite.ts | 11 +- .../settings/components/auth-general.svelte | 19 ++- .../src/lib/utils/translations/da.json | 95 +++++------ .../src/lib/utils/translations/de.json | 149 +++++++++--------- .../src/lib/utils/translations/en.json | 149 +++++++++--------- .../src/lib/utils/translations/es.json | 129 ++++++++------- .../src/lib/utils/translations/fr.json | 149 +++++++++--------- .../src/lib/utils/translations/hi.json | 149 +++++++++--------- .../src/lib/utils/translations/pl.json | 105 ++++++------ .../src/lib/utils/translations/pt.json | 71 +++++---- .../src/lib/utils/translations/ru.json | 123 ++++++++------- .../src/lib/utils/translations/vi.json | 147 +++++++++-------- apps/docs/content/docs/course.mdx | 60 ++++++- apps/docs/content/docs/enterprise-sso.mdx | 2 +- .../docs/how-to-guides/course-enrollment.mdx | 113 +++++++++---- .../docs/how-to-guides/course-landingpage.mdx | 93 +++++++++-- .../docs/how-to-guides/course-types.mdx | 73 +++++++++ .../docs/how-to-guides/custom-domain.mdx | 80 ++++++++++ .../how-to-guides/customize-organization.mdx | 11 +- .../docs/how-to-guides/invite-students.mdx | 23 ++- .../docs/content/docs/how-to-guides/meta.json | 7 +- .../docs/how-to-guides/org-landing-page.mdx | 77 +++++++++ .../how-to-guides/roles-and-permissions.mdx | 62 ++++++++ .../docs/how-to-guides/setup-profile.mdx | 45 ------ apps/docs/content/docs/meta.json | 1 + apps/docs/content/docs/organization.mdx | 38 ++++- apps/docs/content/docs/programs.mdx | 63 +++++++- apps/docs/content/docs/student-dashboard.mdx | 84 +++++++++- apps/docs/content/docs/tags.mdx | 4 +- apps/docs/content/docs/terminology.mdx | 18 +++ packages/db/src/queries/course/course.ts | 16 +- packages/db/src/schema.ts | 1 + .../validation/organization/organization.ts | 3 +- 33 files changed, 1442 insertions(+), 728 deletions(-) create mode 100644 apps/docs/content/docs/how-to-guides/course-types.mdx create mode 100644 apps/docs/content/docs/how-to-guides/custom-domain.mdx create mode 100644 apps/docs/content/docs/how-to-guides/org-landing-page.mdx create mode 100644 apps/docs/content/docs/how-to-guides/roles-and-permissions.mdx delete mode 100644 apps/docs/content/docs/how-to-guides/setup-profile.mdx create mode 100644 apps/docs/content/docs/terminology.mdx diff --git a/apps/api/src/services/course/invite.ts b/apps/api/src/services/course/invite.ts index ad3d7522..7a8684dd 100644 --- a/apps/api/src/services/course/invite.ts +++ b/apps/api/src/services/course/invite.ts @@ -631,7 +631,12 @@ export async function enrollInCourse( } const courseMetadata = (courseWithRelations.metadata as { allowNewStudent?: boolean } | null) ?? null; - if (courseMetadata?.allowNewStudent === false) { + const isInternalEnrollmentOnly = + (org.settings as { internalEnrollmentOnly?: boolean } | null)?.internalEnrollmentOnly ?? false; + + const orgMemberId = await getOrganizationMemberIdByOrgAndProfile(org.id, user.id); + + if (courseMetadata?.allowNewStudent === false && !(isInternalEnrollmentOnly && orgMemberId)) { throw new AppError('This course is not accepting new students', ErrorCodes.VALIDATION_ERROR, 400); } @@ -649,8 +654,6 @@ export async function enrollInCourse( }; } - const orgMemberId = await getOrganizationMemberIdByOrgAndProfile(org.id, user.id); - if (!orgMemberId) { await createOrganizationMember({ organizationId: org.id, @@ -950,7 +953,7 @@ export async function acceptStudentInvite(token: string, user: TAuthUser, contex throw new AppError('This invite is not valid for student enrollment', ErrorCodes.UNAUTHORIZED, 403); } - if (course.status !== 'ACTIVE' || !course.isPublished) { + if (course.status !== 'ACTIVE') { throw new AppError('This course is not available for enrollment', ErrorCodes.VALIDATION_ERROR, 400); } diff --git a/apps/dashboard/src/lib/features/settings/components/auth-general.svelte b/apps/dashboard/src/lib/features/settings/components/auth-general.svelte index f173a221..5558ccd4 100644 --- a/apps/dashboard/src/lib/features/settings/components/auth-general.svelte +++ b/apps/dashboard/src/lib/features/settings/components/auth-general.svelte @@ -16,6 +16,7 @@ let allowPublicSignups = $state(!$currentOrg?.settings?.signup?.inviteOnly); let disableEmailPassword = $state($currentOrg?.disableEmailPassword ?? false); let disableGoogleAuth = $state($currentOrg?.disableGoogleAuth ?? false); + let internalEnrollmentOnly = $state($currentOrg?.settings?.internalEnrollmentOnly ?? false); let isSaving = $state(false); // Sync with store when it changes @@ -26,6 +27,7 @@ allowPublicSignups = !$currentOrg.settings?.signup?.inviteOnly; disableEmailPassword = $currentOrg.disableEmailPassword ?? false; disableGoogleAuth = $currentOrg.disableGoogleAuth ?? false; + internalEnrollmentOnly = $currentOrg.settings?.internalEnrollmentOnly ?? false; } }); @@ -47,7 +49,8 @@ signup: { ...existingSignup, inviteOnly: !allowPublicSignups - } + }, + internalEnrollmentOnly }, disableEmailPassword, disableGoogleAuth @@ -67,7 +70,8 @@ disableSignupMessage !== ($currentOrg?.disableSignupMessage ?? '') || allowPublicSignups !== currentAllowPublicSignups || disableEmailPassword !== ($currentOrg?.disableEmailPassword ?? false) || - disableGoogleAuth !== ($currentOrg?.disableGoogleAuth ?? false) + disableGoogleAuth !== ($currentOrg?.disableGoogleAuth ?? false) || + internalEnrollmentOnly !== ($currentOrg?.settings?.internalEnrollmentOnly ?? false) ); @@ -104,6 +108,17 @@ + + + +
+ {$t('settings.auth.general.internal_enrollment_only.label')} + + {$t('settings.auth.general.internal_enrollment_only.description')} + +
+
+ {#if disableSignup} diff --git a/apps/dashboard/src/lib/utils/translations/da.json b/apps/dashboard/src/lib/utils/translations/da.json index ffb401ff..d619c71e 100644 --- a/apps/dashboard/src/lib/utils/translations/da.json +++ b/apps/dashboard/src/lib/utils/translations/da.json @@ -104,8 +104,8 @@ "min_char": "Feltet skal indeholde 5 eller flere tegn" }, "site_name": { - "min_char": "Webstedets navn skal indeholde 5 eller flere tegn", - "hyphen_rule": "Webstedets navn kan ikke starte eller slutte med en bindestreg" + "min_char": "Academy-underdomænet skal indeholde 5 eller flere tegn", + "hyphen_rule": "Academy-underdomænet kan ikke starte eller slutte med en bindestreg" }, "organization_name": { "min_char": "Organisationen skal indeholde 5 eller flere tegn", @@ -457,7 +457,8 @@ "not_in_progress": "Intet kursus i gang", "any_progress": "Ethvert kursus, du starter, vil blive vist her", "not_completed": "Intet kursus gennemført", - "any_course": "Ethvert kursus, du gennemfører, vil blive vist her" + "any_course": "Ethvert kursus, du gennemfører, vil blive vist her", + "find_courses": "Find kurser" }, "lms_navigation": { "home": "Hjem", @@ -538,7 +539,7 @@ "loading_chart": "Indlæser diagram...", "no_data_default": "Ingen tilgængelige data", "no_data_default_description": "Der er ingen data at vise på nuværende tidspunkt.", - "subtitle": "Forstå, hvordan besøgende opdager dine kurser og konverterer til elever.", + "subtitle": "Forstå, hvordan besøgende opdager dine kurser og konverterer til studerende.", "refresh": "Opdater", "popularTypes": { "heading": "Populære kursustyper", @@ -599,13 +600,13 @@ "course_types": "Kursustyper" }, "course_metrics": { - "page_subtitle": "Tilmelding, lektionsafslutning, karakterer og fremskridt pr. elev for dette kursus.", + "page_subtitle": "Tilmelding, afslutning af lektioner, karakterer og fremskridt pr. elev for dette kursus.", "progress_distribution_card_description": "Hvor mange elever falder der ind i hvert afslutningsbånd.", "grade_distribution_card_description": "Hvor mange elever falder der ind i hvert klassetrin.", "students_table_description": "Sorterbar oversigt med links til elevprofiler.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} knyttet til lektioner", - "kpi_progress_grade": "{grade} % gennemsnitlig træningskarakter på tværs af tilmeldte elever" + "kpi_progress_grade": "{grade} % gennemsnitlig øvelseskarakter på tværs af tilmeldte elever" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Elevprofil", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -780,7 +781,7 @@ }, "callout": { "legend": "Offentlig kursusopkald", - "description": "Vist i bunden af hver lektion og i stedet for låste genstande. Brug det til at lede elever til dit websted eller et betalt kursus.", + "description": "Vist i bunden af ​​hver lektion og i stedet for låste genstande. Brug det til at lede studerende til dit websted eller et betalt kursus.", "title_label": "Titel", "title_placeholder": "Vil du gå dybere ind i dette?", "description_label": "Beskrivelse", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Send invitationsmails med det samme", "create_email_invites": "Opret e-mail-invitationer", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Vælg studerende, der allerede er i denne organisation, og giv dem direkte adgang til dette kursus.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1505,8 +1506,8 @@ "add_button": "Tilføj link" }, "edit": { - "instructions_placeholder": "Valgfri instruktioner til elever", - "helper": "Elever kan indsende en eller flere gyldige URL'er (http/https)." + "instructions_placeholder": "Valgfri vejledning til elever", + "helper": "Studerende kan indsende en eller flere gyldige URL'er (http/https)." } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Korrekt værdi", - "correct_value_info": "De forventede numeriske svar elever skal aflevere for at blive markeret korrekt.", + "correct_value_info": "Det forventede numeriske svar skal eleverne aflevere for at blive markeret korrekt.", "tolerance_label": "Tolerance", "tolerance_info": "Tilladt forskel fra den korrekte værdi (f.eks. accepterer 0,5 +/-0,5).", "correct_value_placeholder": "Korrekt værdi", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "Korrekt stjerneværdi", - "correct_value_info": "Eleverne med stjernetæller skal vælge at optjene hele point.", + "correct_value_info": "Stjernetæller-eleverne skal vælge for at optjene fulde point.", "max_stars_label": "Maksimalt antal stjerner", - "max_stars_info": "Hvor mange stjerner eleverne ser (1-10). Standard er 5.", + "max_stars_info": "Hvor mange stjerner ser eleverne (1-10). Standard er 5.", "correct_value_placeholder": "f.eks. 3", "max_stars_placeholder": "f.eks. 5" } @@ -2039,7 +2040,7 @@ "not_compliance_title": "Overholdelse er ikke aktiveret", "not_compliance_description": "Dette kursus er ikke konfigureret som et compliance-kursus.", "loading": "Indlæser overholdelsesposter...", - "learners": "Elever", + "learners": "studerende", "learners_description": "Denne tabel viser den seneste cyklus for hver elev.", "current_cycle": "Nuværende cyklus", "current_cycle_description": "Din aktive overholdelsescyklus og fornyelsesdatoer.", @@ -2047,7 +2048,7 @@ "history_description": "Hver række er en registreret overholdelsescyklus for dette kursus.", "no_active_cycle": "Ingen aktiv compliance-cyklus", "empty_history": "Der er ikke registreret nogen overholdelseshistorik endnu.", - "empty_overview": "Der er endnu ingen registrering af elevoverholdelse.", + "empty_overview": "Der er endnu ingen tilgængelige optegnelser om overholdelse af elever.", "not_available": "Ikke tilgængelig", "status": { "no_record": "Ingen rekord", @@ -2060,7 +2061,7 @@ "waived": "Frafaldet" }, "summary": { - "total_learners": "Samlede elever", + "total_learners": "Samlet studerende", "no_record": "Ingen rekord", "not_started": "Ikke startet", "in_progress": "I gang", @@ -2071,7 +2072,7 @@ "waived": "Frafaldet" }, "fields": { - "learner": "Lærer", + "learner": "Student", "email": "E-mail", "status": "Status", "cycle": "Cyklus", @@ -2091,8 +2092,8 @@ "due_date_helper": "Bruges til nulstilling og forlængelse.", "reset_action": "Nulstil cyklus", "extend_action": "Forlæng forfaldsdatoen", - "waive_title": "Giv afkald på udvalgte elever", - "waive_description": "Anvend dispensation til de valgte elever. Du kan lade udløbsdatoen stå tom for en tidsubegrænset dispensation.", + "waive_title": "Fraskriv udvalgte elever", + "waive_description": "Anvend dispensation til de udvalgte elever. Du kan lade udløbsdatoen stå tom for en tidsubegrænset dispensation.", "waiver_reason_label": "Årsag til afkald", "waiver_reason_helper": "Valgfri kontekst for revisioner og fremtidige anmeldelser.", "waiver_expires_at_label": "Afkaldet udløber kl", @@ -2106,7 +2107,7 @@ }, "tabs": { "overview": "Oversigt", - "learners": "Elever" + "learners": "studerende" }, "overview_metrics": { "heading": "Kursus øjebliksbillede", @@ -2348,8 +2349,8 @@ "afternoon_heading": "God eftermiddag", "evening_heading": "God aften", "create_course": "Opret kursus", - "view_site": "Se websted", - "visit_site": "Besøg hjemmesiden", + "view_site": "Åbent Akademi", + "visit_site": "Åbent Akademi", "current_lesson": "Lærer i øjeblikket", "your_progress": "Dine fremskridt", "continue": "Fortsæt", @@ -2382,7 +2383,7 @@ "publish_course": "Udgiv kursus", "items_completed": "Varer afsluttet", "currently_learning": "Lærer i øjeblikket", - "learner": "Lærer", + "learner": "Student", "progress": "Fremskridt", "pick_up_where_you_left_off": "Fortsæt hvor du slap", "course_awaits_you": "{title} venter på dig", @@ -2402,7 +2403,9 @@ "login_activity_description": "Ugens mest aktive dage (sidste 90 dage)", "login_activity_no_data": "Ingen login-aktivitet endnu", "login_activity_logins": "logins", - "open_academy": "Åbent Akademi" + "open_academy": "Åbent Akademi", + "explore_more_courses": "Udforsk flere kurser", + "view_more": "Se mere" }, "schedule": { "title": "Dit skema", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Opgrader din plan for at tilpasse login-baggrunden.", "preview_alt": "Forhåndsvisning af login-baggrund" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Vælg, hvilke faner, bannere, kursusværktøjer og ekstramateriale eleverne ser." }, "domains": { "title": "Brugerdefineret domæne", @@ -2479,7 +2482,7 @@ "pending_verification_description": "DNS-poster blev fundet. SSL-udstedelse eller -validering er stadig i gang.", "reconnect_description": "Dette domæne skal forbindes igen gennem det nye Cloudflare-opsætningsflow.", "error_description": "Dette tilpassede domæne eksisterer, men bekræftelsen er ikke fuldført endnu.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Kør dit akademi på en webadresse, du ejer.", "dns_record": "DNS-record", "record_active": "Opdaget", "record_pending": "Afventer", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Opret organisation", "name": "Organisationens navn", - "org_sitename": "Organisationens webstedsnavn", + "org_sitename": "Akademiets underdomæne", "create": "Opret", - "sitename": "Sitenavn findes allerede", + "sitename": "Academy-underdomænet findes allerede", "error_organization": "Noget gik galt under oprettelsen af denne organisation. Genindlæs og prøv igen" }, "setup": { @@ -3150,7 +3153,7 @@ "add_theme": "Tilføj tema" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Indstil navn, logo og tema, som eleverne ser for denne organisation." }, "profile": { "heading": "Profil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "AI underviser" }, "subheadings": { - "view_site": "Se webstedet" + "view_site": "Åbent Akademi" }, "auth": { "title": "Autentificering", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Tillad offentlige tilmeldinger", "description": "Når den er deaktiveret, kan kun brugere med et invitationslink tilmelde sig. Aktiver for at tillade alle at oprette en konto." + }, + "internal_enrollment_only": { + "label": "Kun intern tilmelding", + "description": "Når det er aktiveret, er ethvert offentliggjort kursus åbent for selvtilmelding for alle studerende i din organisation. Brug med Disable Signup til at oprette et lukket, kun for inviterede akademi, hvor elever kan deltage i ethvert offentliggjort kursus uden opsætning pr. kursus." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Venner og familie", "fullname": "Fuldt navn", "name": "Organisationens navn", - "organisation_sitename": "Organisationens webstedsnavn", + "organisation_sitename": "Akademiets underdomæne", "what_brings": "Hvad bringer dig til", "how": "Hvordan hørte du om os?", "back": "Tilbage", @@ -3874,7 +3881,7 @@ "created": "Mål skabt", "updated": "Mål opdateret", "deleted": "Mål slettet", - "delete_confirm": "Vil du slette dette mål? Statushistorik for hver elev vil blive fjernet.", + "delete_confirm": "Vil du slette dette mål? Per-elev statushistorik vil blive fjernet.", "lms": { "heading": "Dine mål", "empty_title": "Ingen mål tildelt", @@ -3926,7 +3933,7 @@ "team_pass_rate_label": "Holdbeståelsesprocent (%)", "deadline_label": "Deadline", "deadline_date_label": "Deadline dato", - "relative_days_label": "Dage fra eleven er med", + "relative_days_label": "Dage fra eleven tiltræder", "recurring_months_label": "Gentag hver (måned)", "reminders_label": "Påmindelser (dage før termin)", "reminders_helper": "Kommasepareret. Eksempel: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Overholdelse", "subtitle": "Spor certificeringsstatus på tværs af alle overholdelseskurser i din organisation.", "learners": { - "heading": "Elever", + "heading": "studerende", "subtitle": "{count, number} matcher", "empty": "Ingen elever matcher dette filter", - "learner": "Lærer", + "learner": "Student", "course": "Kursus", "status": "Status", "due_date": "Forfalder", @@ -4362,7 +4369,7 @@ "description": "Overholdelseskurser med elevstatus tæller", "empty": "Ingen compliance-kurser endnu", "course": "Kursus", - "learners": "Elever", + "learners": "studerende", "completion": "Fuldførelse" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Af kurs", - "learners": "Elever" + "learners": "studerende" }, "summary": { - "heading": "Elevstatus", - "description": "Tæller på tværs af elever i alle overholdelseskurser." + "heading": "Student status", + "description": "Tæller på tværs af elever i alle compliance-kurser." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Vil du slette dette arbejdsområde?", "delete_confirm_body": "Dette fjerner permanent arbejdsområdet, dets medlemmer og dets kurser. Dette kan ikke fortrydes.", "name_label": "Arbejdsområdets navn", - "site_name_label": "Webstedets navn", + "site_name_label": "Akademiets underdomæne", "create_modal_title": "Opret et nyt arbejdsområde", "create_modal_submit": "Skab arbejdsrum", "cancel": "Annuller", "read_only_badge": "Skrivebeskyttet", - "usage_banner": "{learners} elever og {tokens} AI-tokens brugt på tværs af {workspaces} arbejdsområder denne måned", + "usage_banner": "{students} studerende og {tokens} AI-tokens brugt på tværs af {workspaces}-arbejdsområder denne måned", "secondary_billing_notice": "Fakturering administreres af dit primære arbejdsområde ({primaryName}).", "go_to_primary": "Gå til det primære arbejdsområde" }, @@ -4452,8 +4459,8 @@ "atCap": "Ved cap", "approaching": "Nærmer sig hætten", "totalActive": "Aktive elever denne måned", - "learnersHeading": "Elever", - "headerLearner": "Lærer", + "learnersHeading": "studerende", + "headerLearner": "Student", "headerMessages": "Beskeder", "headerTokens": "Poletter", "headerStatus": "Status", diff --git a/apps/dashboard/src/lib/utils/translations/de.json b/apps/dashboard/src/lib/utils/translations/de.json index 3ca4752b..2eb7624c 100644 --- a/apps/dashboard/src/lib/utils/translations/de.json +++ b/apps/dashboard/src/lib/utils/translations/de.json @@ -104,8 +104,8 @@ "min_char": "Das Feld muss 5 oder mehr Zeichen enthalten" }, "site_name": { - "min_char": "Der Site-Name muss mindestens 5 Zeichen enthalten", - "hyphen_rule": "Der Site-Name darf nicht mit einem Bindestrich beginnen oder enden" + "min_char": "Die Academy-Subdomain muss 5 oder mehr Zeichen enthalten", + "hyphen_rule": "Die Academy-Subdomain darf nicht mit einem Bindestrich beginnen oder enden" }, "organization_name": { "min_char": "Die Organisation muss 5 oder mehr Zeichen enthalten", @@ -457,7 +457,8 @@ "not_in_progress": "Kein Kurs in Bearbeitung", "any_progress": "Jeder Kurs, den Sie starten, wird hier angezeigt", "not_completed": "Kein Kurs abgeschlossen", - "any_course": "Alle von Ihnen abgeschlossenen Kurse werden hier angezeigt" + "any_course": "Alle von Ihnen abgeschlossenen Kurse werden hier angezeigt", + "find_courses": "Kurse finden" }, "lms_navigation": { "home": "Zuhause", @@ -538,7 +539,7 @@ "loading_chart": "Diagramm wird geladen...", "no_data_default": "Keine Daten verfügbar", "no_data_default_description": "Derzeit sind keine Daten zum Anzeigen vorhanden.", - "subtitle": "Verstehen Sie, wie Besucher Ihre Kurse entdecken und zu Lernenden werden.", + "subtitle": "Verstehen Sie, wie Besucher Ihre Kurse entdecken und zu Studenten werden.", "refresh": "Aktualisieren", "popularTypes": { "heading": "Beliebte Kurstypen", @@ -599,13 +600,13 @@ "course_types": "Kurstypen" }, "course_metrics": { - "page_subtitle": "Anmeldung, Unterrichtsabschluss, Noten und Fortschritt pro Teilnehmer für diesen Kurs.", - "progress_distribution_card_description": "Wie viele Lernende fallen in jedes Abschlussband?", - "grade_distribution_card_description": "Wie viele Lernende fallen in jede Klassenstufe?", - "students_table_description": "Sortierbare Übersicht mit Links zu Lernprofilen.", + "page_subtitle": "Anmeldung, Unterrichtsabschluss, Noten und Fortschritt pro Schüler für diesen Kurs.", + "progress_distribution_card_description": "Wie viele Schüler fallen in jede Abschlussgruppe?", + "grade_distribution_card_description": "Wie viele Schüler fallen in jede Klassenstufe?", + "students_table_description": "Sortierbare Übersicht mit Links zu Studierendenprofilen.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}}, zugeordnet zu Lektionen", - "kpi_progress_grade": "{grade} % durchschnittliche Übungsnote aller eingeschriebenen Lernenden" + "kpi_progress_grade": "{grade} % durchschnittliche Übungsnote aller eingeschriebenen Schüler" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Studentenprofil", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -762,7 +763,7 @@ "save": "Änderungen speichern", "tags": { "title": "Schlagworte", - "description": "Weisen Sie Tags zu, damit Lernende diesen Kurs mithilfe von Filtern entdecken können.", + "description": "Weisen Sie Tags zu, damit Studierende diesen Kurs mithilfe von Filtern entdecken können.", "empty": "Keine Tags ausgewählt", "add": "Tag hinzufügen", "popover_title": "Wählen Sie Tags aus", @@ -780,7 +781,7 @@ }, "callout": { "legend": "Hinweis zum öffentlichen Kurs", - "description": "Wird am Ende jeder Lektion und anstelle von gesperrten Gegenständen angezeigt. Nutzen Sie es, um Lernende auf Ihre Website oder einen kostenpflichtigen Kurs zu leiten.", + "description": "Wird am Ende jeder Lektion und anstelle von gesperrten Gegenständen angezeigt. Nutzen Sie es, um Studierende auf Ihre Website oder einen kostenpflichtigen Kurs zu leiten.", "title_label": "Titel", "title_placeholder": "Möchten Sie näher darauf eingehen?", "description_label": "Beschreibung", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Senden Sie sofort Einladungs-E-Mails", "create_email_invites": "Erstellen Sie E-Mail-Einladungen", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Wählen Sie Studierende aus, die dieser Organisation bereits angehören, und gewähren Sie ihnen direkten Zugang zu diesem Kurs.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1442,7 +1443,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "Die Lernenden antworten mit einem langen Text", + "placeholder": "Die Schüler antworten mit einem Langtext", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -1505,8 +1506,8 @@ "add_button": "Link hinzufügen" }, "edit": { - "instructions_placeholder": "Optionale Anweisungen für Lernende", - "helper": "Lernende können eine oder mehrere gültige URLs (http/https) einreichen." + "instructions_placeholder": "Optionale Anleitung für Studierende", + "helper": "Studierende können eine oder mehrere gültige URLs (http/https) angeben." } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Korrekter Wert", - "correct_value_info": "Die erwartete numerische Antwort muss von den Lernenden eingereicht werden, um als richtig bewertet zu werden.", + "correct_value_info": "Die erwartete numerische Antwort muss von den Schülern eingereicht werden, um als richtig bewertet zu werden.", "tolerance_label": "Toleranz", "tolerance_info": "Zulässige Abweichung vom korrekten Wert (Beispiel: 0,5 akzeptiert +/-0,5).", "correct_value_placeholder": "Korrekter Wert", @@ -1659,7 +1660,7 @@ "edit": { "template_label": "Satzvorlage", "template_placeholder": "Messungen zur Beschreibung unserer Daten werden als ___ bezeichnet. Das ___ ist eine Funktion...", - "template_helper": "Verwenden Sie für jedes Leerzeichen drei Unterstriche (___). Den Lernenden wird eine Wortdatenbank mit richtigen Antworten und Ablenkungsmanövern angezeigt.", + "template_helper": "Verwenden Sie für jedes Leerzeichen drei Unterstriche (___). Den Schülern wird eine Wortdatenbank mit richtigen Antworten und Ablenkungsmanövern angezeigt.", "no_blanks_warning": "Fügen Sie Ihrer Vorlage mindestens eine ___ leere Markierung hinzu.", "correct_answers_heading": "Richtige Antwort für jedes Leerzeichen", "blank_label": "Leer", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "Korrekter Sternwert", - "correct_value_info": "Um die volle Punktzahl zu erhalten, müssen die Lernenden die Anzahl der Sterne auswählen.", + "correct_value_info": "Die Schüler müssen die Anzahl der Sterne auswählen, um die volle Punktzahl zu erhalten.", "max_stars_label": "Maximale Sterne", - "max_stars_info": "Wie viele Sterne sehen Lernende (1–10)? Der Standardwert ist 5.", + "max_stars_info": "Wie viele Sterne sehen die Schüler (1–10)? Der Standardwert ist 5.", "correct_value_placeholder": "z.B. 3", "max_stars_placeholder": "z.B. 5" } @@ -1698,7 +1699,7 @@ }, "preview": { "max_duration_label": "Maximale Dauer", - "manual_grading": "Die Lernenden zeichnen eine kurze Videoantwort auf. Manuelle Bewertung erforderlich." + "manual_grading": "Die Schüler zeichnen eine kurze Videoantwort auf. Manuelle Bewertung erforderlich." }, "take": { "unsupported": "Die Videoaufzeichnung wird in diesem Browser nicht unterstützt.", @@ -2039,15 +2040,15 @@ "not_compliance_title": "Compliance ist nicht aktiviert", "not_compliance_description": "Dieser Kurs ist nicht als Compliance-Kurs konfiguriert.", "loading": "Compliance-Datensätze werden geladen...", - "learners": "Lernende", - "learners_description": "Diese Tabelle zeigt den neuesten Zyklus für jeden Lernenden.", + "learners": "Studenten", + "learners_description": "Diese Tabelle zeigt den letzten Zyklus für jeden Schüler.", "current_cycle": "Aktueller Zyklus", "current_cycle_description": "Ihr aktiver Compliance-Zyklus und Ihre Verlängerungstermine.", "history": "Vergangene Zyklen", "history_description": "Jede Zeile ist ein aufgezeichneter Compliance-Zyklus für diesen Kurs.", "no_active_cycle": "Kein aktiver Compliance-Zyklus", "empty_history": "Es wurde noch kein Compliance-Verlauf erfasst.", - "empty_overview": "Es sind noch keine Compliance-Aufzeichnungen für Lernende verfügbar.", + "empty_overview": "Es sind noch keine Compliance-Aufzeichnungen für Studierende verfügbar.", "not_available": "Nicht verfügbar", "status": { "no_record": "Keine Aufzeichnung", @@ -2060,7 +2061,7 @@ "waived": "Verzichtet" }, "summary": { - "total_learners": "Insgesamt Lernende", + "total_learners": "Gesamtzahl der Studierenden", "no_record": "Keine Aufzeichnung", "not_started": "Nicht gestartet", "in_progress": "In Bearbeitung", @@ -2071,7 +2072,7 @@ "waived": "Verzichtet" }, "fields": { - "learner": "Lernender", + "learner": "Student", "email": "E-Mail", "status": "Status", "cycle": "Zyklus", @@ -2083,34 +2084,34 @@ }, "bulk_actions": { "title": "Massenaktionen", - "description": "Wählen Sie Lernende aus und wenden Sie eine Compliance-Aktion auf ihren aktuellen Zyklus an.", - "select_all": "Wählen Sie alle sichtbaren Lernenden aus", + "description": "Wählen Sie Studierende aus und wenden Sie eine Compliance-Aktion auf ihren aktuellen Zyklus an.", + "select_all": "Wählen Sie alle sichtbaren Schüler aus", "selected_count": "{count} ausgewählt", "clear_selection": "Klare Auswahl", "due_date_label": "Fälligkeitsdatum", "due_date_helper": "Wird zum Zurücksetzen und Erweitern von Aktionen verwendet.", "reset_action": "Zyklus zurücksetzen", "extend_action": "Fälligkeitstermin verlängern", - "waive_title": "Verzicht auf ausgewählte Lernende", - "waive_description": "Wenden Sie einen Verzicht auf die ausgewählten Lernenden an. Für einen unbefristeten Verzicht können Sie das Ablaufdatum leer lassen.", + "waive_title": "Verzicht auf ausgewählte Studierende", + "waive_description": "Wenden Sie einen Verzicht auf die ausgewählten Studenten an. Für einen unbefristeten Verzicht können Sie das Ablaufdatum leer lassen.", "waiver_reason_label": "Verzichtsgrund", "waiver_reason_helper": "Optionaler Kontext für Audits und zukünftige Überprüfungen.", "waiver_expires_at_label": "Der Verzicht endet am", "waiver_expires_at_helper": "Lassen Sie das Feld leer, wenn die Verzichtserklärung nicht automatisch ablaufen soll.", "waive_action": "Verzicht beantragen", "modal": { - "description": "Sie aktualisieren {count} ausgewählte Lernende.", + "description": "Sie aktualisieren {count} ausgewählte Schüler.", "cancel": "Abbrechen", "apply": "Aktion anwenden" } }, "tabs": { "overview": "Übersicht", - "learners": "Lernende" + "learners": "Studenten" }, "overview_metrics": { "heading": "Kursschnappschuss", - "description": "Die Teilnehmer werden für diesen Kurs nach Status gezählt." + "description": "Die Anzahl der Studierenden für diesen Kurs richtet sich nach dem Status." }, "empty_overview_description": "Halten Sie Ihre Mitarbeiter konform und verfolgen Sie, wer im Rückstand ist." } @@ -2214,7 +2215,7 @@ "product_name": "Produktname", "product_summary": "Was macht das Produkt?", "audience": "Wer ist das Publikum?", - "outcome": "Was sollen die Lernenden nach dem Kurs können?", + "outcome": "Was sollen Studierende nach dem Kurs können?", "depth": "Wie tief soll der Kurs gehen?", "topic": "Thema oder Nische", "expertise_level": "Zielkompetenzniveau", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Werden Sie Experte für X", - "description": "Ein Tiefenkurs, der Lernende zu Experten für ein bestimmtes Thema oder eine bestimmte Nische macht.", + "description": "Ein Vertiefungskurs, der Studierende zu Experten für ein bestimmtes Thema oder eine bestimmte Nische macht.", "form_title": "Erzählen Sie uns von dem Thema" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Guten Tag", "evening_heading": "Guten Abend", "create_course": "Kurs erstellen", - "view_site": "Website ansehen", - "visit_site": "Besuchen Sie die Website", + "view_site": "Offene Akademie", + "visit_site": "Offene Akademie", "current_lesson": "Derzeit lernen", "your_progress": "Ihr Fortschritt", "continue": "Weiter", @@ -2382,7 +2383,7 @@ "publish_course": "Kurs veröffentlichen", "items_completed": "Artikel abgeschlossen", "currently_learning": "Derzeit lernen", - "learner": "Lernender", + "learner": "Student", "progress": "Fortschritt", "pick_up_where_you_left_off": "Machen Sie dort weiter, wo Sie aufgehört haben", "course_awaits_you": "{title} erwartet Sie", @@ -2402,7 +2403,9 @@ "login_activity_description": "Aktivste Tage der Woche (letzte 90 Tage)", "login_activity_no_data": "Noch keine Login-Aktivität", "login_activity_logins": "Anmeldungen", - "open_academy": "Offene Akademie" + "open_academy": "Offene Akademie", + "explore_more_courses": "Entdecken Sie weitere Kurse", + "view_more": "Mehr anzeigen" }, "schedule": { "title": "Ihr Zeitplan", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Upgraden Sie Ihren Plan, um den Anmelde-Hintergrund anzupassen.", "preview_alt": "Vorschau Anmelde-Hintergrund" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Wählen Sie aus, welche Registerkarten, Banner, Kurstools und Extras den Studierenden angezeigt werden." }, "domains": { "title": "Benutzerdefinierte Domäne", @@ -2479,7 +2482,7 @@ "pending_verification_description": "DNS-Einträge wurden gefunden. Die SSL-Ausstellung oder -Validierung ist noch im Gange.", "reconnect_description": "Diese Domäne muss über den neuen Cloudflare-Setup-Ablauf erneut verbunden werden.", "error_description": "Diese benutzerdefinierte Domäne existiert, aber die Überprüfung ist noch nicht abgeschlossen.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Betreiben Sie Ihre Akademie unter einer Webadresse, die Sie besitzen.", "dns_record": "DNS-Eintrag", "record_active": "Erkannt", "record_pending": "Ausstehend", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Organisation erstellen", "name": "Name der Organisation", - "org_sitename": "Name der Organisationssite", + "org_sitename": "Subdomain der Akademie", "create": "Erstellen", - "sitename": "Sitename existiert bereits", + "sitename": "Die Academy-Subdomain existiert bereits", "error_organization": "Beim Erstellen dieser Organisation ist ein Fehler aufgetreten. Bitte laden Sie es neu und versuchen Sie es erneut" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "Statistik entfernen", "label_field": "Etikett", "value_field": "Wert", - "label_placeholder": "Aktive Lernende", + "label_placeholder": "Aktive Studierende", "value_placeholder": "1.200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "Thema hinzufügen" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Legen Sie den Namen, das Logo und das Thema fest, das die Schüler für diese Organisation sehen." }, "profile": { "heading": "Profil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "KI-Tutor" }, "subheadings": { - "view_site": "Website ansehen" + "view_site": "Offene Akademie" }, "auth": { "title": "Authentifizierung", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Öffentliche Anmeldungen zulassen", "description": "Wenn die Funktion deaktiviert ist, können sich nur Benutzer mit einem Einladungslink anmelden. Aktivieren Sie diese Option, damit jeder ein Konto erstellen kann." + }, + "internal_enrollment_only": { + "label": "Nur interne Anmeldung", + "description": "Wenn diese Option aktiviert ist, steht jeder veröffentlichte Kurs allen Studierenden in Ihrer Organisation zur Selbsteinschreibung offen. Verwenden Sie die Option „Anmeldung deaktivieren“, um eine geschlossene, nur auf Einladung zugängliche Akademie zu erstellen, in der Studierende jedem veröffentlichten Kurs ohne kursspezifische Einrichtung beitreten können." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Freunde und Familie", "fullname": "Vollständiger Name", "name": "Name der Organisation", - "organisation_sitename": "Name der Organisationssite", + "organisation_sitename": "Subdomain der Akademie", "what_brings": "Was bringt dich dazu", "how": "Wie haben Sie von uns erfahren?", "back": "Zurück", @@ -3874,7 +3881,7 @@ "created": "Ziel erstellt", "updated": "Ziel aktualisiert", "deleted": "Ziel gelöscht", - "delete_confirm": "Dieses Ziel löschen? Der Statusverlauf pro Lernender wird entfernt.", + "delete_confirm": "Dieses Ziel löschen? Der Statusverlauf pro Schüler wird entfernt.", "lms": { "heading": "Ihre Ziele", "empty_title": "Keine Ziele zugewiesen", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "Absolutes Datum", - "relative_to_join": "Bezogen auf den Beitritt von Lernenden", + "relative_to_join": "Bezogen auf den Beitritt von Studierenden", "recurring": "Wiederkehrend", "none": "Keine Frist" }, @@ -3922,11 +3929,11 @@ "type_label": "Typ", "courses_label": "Kurse", "required_count_label": "Anzahl der erforderlichen Kurse", - "score_threshold_label": "Bestehenspunktzahl pro Lernendem (%)", + "score_threshold_label": "Bestehenspunktzahl pro Schüler (%)", "team_pass_rate_label": "Erfolgsquote der Mannschaft (%)", "deadline_label": "Frist", "deadline_date_label": "Deadline-Datum", - "relative_days_label": "Tage ab dem Zeitpunkt, an dem der Lernende beitritt", + "relative_days_label": "Tage ab dem Beitritt des Schülers", "recurring_months_label": "Wiederholen Sie alle (Monate)", "reminders_label": "Erinnerungen (Tage vor Fälligkeit)", "reminders_helper": "Durch Kommas getrennt. Beispiel: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Compliance", "subtitle": "Verfolgen Sie den Zertifizierungsstatus aller Compliance-Kurse in Ihrem Unternehmen.", "learners": { - "heading": "Lernende", + "heading": "Studenten", "subtitle": "{count, number} passend", - "empty": "Keine Lernenden entsprechen diesem Filter", - "learner": "Lernender", + "empty": "Keine Schüler entsprechen diesem Filter", + "learner": "Student", "course": "Kurs", "status": "Status", "due_date": "Fällig", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Kurse", - "description": "Compliance-Kurse mit Lernerstatus zählen", + "description": "Compliance-Kurse mit Studierendenstatus zählen", "empty": "Noch keine Compliance-Kurse", "course": "Kurs", - "learners": "Lernende", + "learners": "Studenten", "completion": "Fertigstellung" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Natürlich", - "learners": "Lernende" + "learners": "Studenten" }, "summary": { - "heading": "Status des Lernenden", - "description": "Zählt alle Lernenden in allen Compliance-Kursen." + "heading": "Studentenstatus", + "description": "Zählt für alle Teilnehmer aller Compliance-Kurse." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Diesen Arbeitsbereich löschen?", "delete_confirm_body": "Dadurch werden der Arbeitsbereich, seine Mitglieder und seine Kurse dauerhaft entfernt. Dies kann nicht rückgängig gemacht werden.", "name_label": "Name des Arbeitsbereichs", - "site_name_label": "Site-Name", + "site_name_label": "Subdomain der Akademie", "create_modal_title": "Erstellen Sie einen neuen Arbeitsbereich", "create_modal_submit": "Arbeitsbereich erstellen", "cancel": "Abbrechen", "read_only_badge": "Schreibgeschützt", - "usage_banner": "{learners} Lernende und {tokens} KI-Tokens, die diesen Monat in allen {workspaces}-Arbeitsbereichen verwendet werden", + "usage_banner": "{students} Studenten und {tokens} KI-Tokens, die diesen Monat in {workspaces} Arbeitsbereichen verwendet werden", "secondary_billing_notice": "Die Abrechnung wird von Ihrem primären Arbeitsbereich ({primaryName}) verwaltet.", "go_to_primary": "Gehen Sie zum primären Arbeitsbereich" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "Faire Nutzung durch KI-Lehrer", "atCap": "An der Kappe", "approaching": "Annäherung an die Kappe", - "totalActive": "Aktive Lernende diesen Monat", - "learnersHeading": "Lernende", - "headerLearner": "Lernender", + "totalActive": "Aktive Studenten diesen Monat", + "learnersHeading": "Studenten", + "headerLearner": "Student", "headerMessages": "Nachrichten", "headerTokens": "Token", "headerStatus": "Status", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "Nur Hinweise (keine direkten Antworten)", "direct_answer": "Erlauben Sie direkte Antworten", - "block_during_exercise": "Blockieren Sie die Hilfe, während der Lernende eine Übung durchführt" + "block_during_exercise": "Blockieren Sie die Hilfe, während der Schüler eine Übung durchführt" }, "responseLength": { "short": "Kurz (1–3 Sätze)", @@ -4503,11 +4510,11 @@ "welcomeMessage": "Willkommensnachricht", "welcomeMessage_description": "Wird über der ersten Antwort des Tutors in jeder neuen Konversation angezeigt.", "disclaimerFooter": "Fußzeile des Haftungsausschlusses", - "disclaimerFooter_description": "Wird an jede Antwort des Tutors angehängt, damit die Lernenden sich daran erinnern, dass der Tutor keine Person ist.", + "disclaimerFooter_description": "Wird an jede Antwort des Tutors angehängt, damit die Schüler sich daran erinnern, dass der Tutor keine Person ist.", "thingsToSay": "Dinge zu sagen", - "thingsToSay_description": "Beispiele: „Erinnern Sie die Lernenden immer daran, den Lehrplan vor Woche 3 zu lesen.“ „Ermutigen Sie die Lernenden, die Lektionen in ihren eigenen Worten zusammenzufassen.“", + "thingsToSay_description": "Beispiele: „Erinnern Sie die Schüler immer daran, den Lehrplan vor Woche 3 zu lesen.“ „Ermutigen Sie die Schüler, die Lektionen in ihren eigenen Worten zusammenzufassen.“", "thingsNotToSay": "Dinge, die man nicht sagen sollte", - "thingsNotToSay_description": "Beispiele: „Geben Sie bei der Abschlussprüfung keine Antworten preis.“ „Sagen Sie den Lernenden niemals, welche Bewertung Sie geschrieben haben.“", + "thingsNotToSay_description": "Beispiele: „Geben Sie bei der Abschlussprüfung keine Antworten preis.“ „Erzählen Sie den Schülern niemals, welche Rezension Sie geschrieben haben.“", "forbiddenTopics": "Verbotene Themen", "forbiddenTopics_description": "Durch Kommas getrennte Liste. Der Tutor wird es ablehnen, diese zu besprechen.", "forbiddenTopics_placeholder": "Politik, Religion, persönliche medizinische Beratung", @@ -4525,17 +4532,17 @@ }, "section": { "availability": "Verfügbarkeit", - "availability_description": "Schalten Sie den KI-Tutor für Lernende in diesem Arbeitsbereich ein oder aus.", + "availability_description": "Schalten Sie den KI-Tutor für Schüler in diesem Arbeitsbereich ein oder aus.", "personality": "Persönlichkeit", "personality_description": "Wie sich der Tutor vorstellt und wie lang seine Antworten sind.", "guidance": "Dinge, die man sagen sollte · Dinge, die man nicht sagen sollte", "guidance_description": "Freitext-Anleitungen, denen der Tutor bei jeder Antwort folgt, sowie eine optionale Liste mit Tabu-Themen.", "assessment": "Übungen und Beurteilungen", - "assessment_description": "Wie sich der Tutor verhält, wenn ein Lernender um Hilfe bei einer Übung bittet.", + "assessment_description": "Wie sich der Tutor verhält, wenn ein Schüler um Hilfe bei einer Übung bittet.", "grounding": "Begründung und Zitate", "grounding_description": "Begrenzen Sie, worüber der Tutor sprechen kann und ob er Kursmaterial zitiert.", "escalation": "Eskalation", - "escalation_description": "Wohin können Lernende verwiesen werden, wenn sie einen echten Menschen brauchen?", + "escalation_description": "Wohin können Schüler verwiesen werden, wenn sie einen echten Menschen brauchen?", "inheritance": "Kursvererbung", "inheritance_description": "Übernehmen Sie die Standardeinstellungen des Arbeitsbereichs oder legen Sie Überschreibungen pro Kurs fest." }, diff --git a/apps/dashboard/src/lib/utils/translations/en.json b/apps/dashboard/src/lib/utils/translations/en.json index c96bdc38..a8ba3e7c 100644 --- a/apps/dashboard/src/lib/utils/translations/en.json +++ b/apps/dashboard/src/lib/utils/translations/en.json @@ -21,17 +21,17 @@ }, "section": { "availability": "Availability", - "availability_description": "Turn the AI tutor on or off for learners in this workspace.", + "availability_description": "Turn the AI tutor on or off for students in this workspace.", "personality": "Personality", "personality_description": "How the tutor introduces itself and how long its replies are.", "guidance": "Things to say · things not to say", "guidance_description": "Free-text guidance the tutor will follow in every reply, plus an optional list of off-limits topics.", "assessment": "Exercises & assessments", - "assessment_description": "How the tutor behaves when a learner asks for help with an exercise.", + "assessment_description": "How the tutor behaves when a student asks for help with an exercise.", "grounding": "Grounding & citations", "grounding_description": "Limit what the tutor can talk about and whether it cites course material.", "escalation": "Escalation", - "escalation_description": "Where to point learners when they need a real human.", + "escalation_description": "Where to point students when they need a real human.", "inheritance": "Course inheritance", "inheritance_description": "Inherit workspace defaults or set per-course overrides." }, @@ -44,11 +44,11 @@ "welcomeMessage": "Welcome message", "welcomeMessage_description": "Shown above the first tutor reply in every new conversation.", "disclaimerFooter": "Disclaimer footer", - "disclaimerFooter_description": "Appended to every tutor reply so learners remember the tutor isn't a person.", + "disclaimerFooter_description": "Appended to every tutor reply so students remember the tutor isn't a person.", "thingsToSay": "Things to say", - "thingsToSay_description": "Examples: \"Always remind learners to read the syllabus before week 3.\" \"Encourage learners to summarize lessons in their own words.\"", + "thingsToSay_description": "Examples: \"Always remind students to read the syllabus before week 3.\" \"Encourage students to summarize lessons in their own words.\"", "thingsNotToSay": "Things not to say", - "thingsNotToSay_description": "Examples: \"Don't reveal answers to the final exam.\" \"Never tell learners which review you wrote.\"", + "thingsNotToSay_description": "Examples: \"Don't reveal answers to the final exam.\" \"Never tell students which review you wrote.\"", "forbiddenTopics": "Forbidden topics", "forbiddenTopics_description": "Comma-separated list. The tutor will decline to discuss these.", "forbiddenTopics_placeholder": "politics, religion, personal medical advice", @@ -79,7 +79,7 @@ "assessmentMode": { "hint_only": "Hints only (no direct answers)", "direct_answer": "Allow direct answers", - "block_during_exercise": "Block help while the learner is in an exercise" + "block_during_exercise": "Block help while the student is in an exercise" }, "codePolicy": { "hints_only": "Hints only", @@ -101,9 +101,9 @@ "tutorSummaryTitle": "AI tutor fair-use", "atCap": "At cap", "approaching": "Approaching cap", - "totalActive": "Active learners this month", - "learnersHeading": "Learners", - "headerLearner": "Learner", + "totalActive": "Active students this month", + "learnersHeading": "Students", + "headerLearner": "Student", "headerMessages": "Messages", "headerTokens": "Tokens", "headerStatus": "Status", @@ -130,12 +130,12 @@ "delete_confirm_title": "Delete this workspace?", "delete_confirm_body": "This permanently removes the workspace, its members, and its courses. This cannot be undone.", "name_label": "Workspace name", - "site_name_label": "Site name", + "site_name_label": "Academy subdomain", "create_modal_title": "Create a new workspace", "create_modal_submit": "Create workspace", "cancel": "Cancel", "read_only_badge": "Read-only", - "usage_banner": "{learners} learners and {tokens} AI tokens used across {workspaces} workspaces this month", + "usage_banner": "{students} students and {tokens} AI tokens used across {workspaces} workspaces this month", "secondary_billing_notice": "Billing is managed by your primary workspace ({primaryName}).", "go_to_primary": "Go to primary workspace" } @@ -244,7 +244,7 @@ "friends": "Friends and family", "fullname": "Full Name", "name": "Name of Organization", - "organisation_sitename": "Organisation Site name", + "organisation_sitename": "Academy subdomain", "what_brings": "What brings you to", "how": "How did you hear about us?", "back": "Back", @@ -296,12 +296,12 @@ "title": "Compliance", "subtitle": "Track certification status across every compliance course in your organization.", "summary": { - "heading": "Learner status", - "description": "Counts across learners in all compliance courses." + "heading": "Student status", + "description": "Counts across students in all compliance courses." }, "tabs": { "courses": "By course", - "learners": "Learners" + "learners": "Students" }, "status": { "compliant": "Compliant", @@ -326,17 +326,17 @@ }, "courses": { "heading": "Courses", - "description": "Compliance courses with learner status counts", + "description": "Compliance courses with student status counts", "empty": "No compliance courses yet", "course": "Course", - "learners": "Learners", + "learners": "Students", "completion": "Completion" }, "learners": { - "heading": "Learners", + "heading": "Students", "subtitle": "{count, number} matching", - "empty": "No learners match this filter", - "learner": "Learner", + "empty": "No students match this filter", + "learner": "Student", "course": "Course", "status": "Status", "due_date": "Due", @@ -393,7 +393,7 @@ "settings": { "heading": "Settings", "subheadings": { - "view_site": "View site" + "view_site": "Open Academy" }, "tabs": { "profile_tab": "Profile", @@ -435,7 +435,7 @@ "logout": "Log out" }, "organization": { - "page_subtitle": "Set the name, logo, and theme learners see for this organization.", + "page_subtitle": "Set the name, logo, and theme students see for this organization.", "organization_profile": { "heading": "Organization", "organization_name": "Organization Name", @@ -535,7 +535,11 @@ }, "save_button": "Save Changes", "note_title": "Note", - "note_description": "These settings only affect this organization. Admins can always sign in using their credentials for break-glass access." + "note_description": "These settings only affect this organization. Admins can always sign in using their credentials for break-glass access.", + "internal_enrollment_only": { + "label": "Internal Enrollment Only", + "description": "When enabled, any published course is open for self-enrollment to all students in your organization. Use with Disable Signup to create a closed, invite-only academy where students can join any published course without per-course setup." + } }, "sso": { "connection": { @@ -713,7 +717,7 @@ "remove": "Remove stat", "label_field": "Label", "value_field": "Value", - "label_placeholder": "Active learners", + "label_placeholder": "Active students", "value_placeholder": "1,200" } }, @@ -1504,9 +1508,9 @@ "add_org": { "create_org": "Create Organization", "name": "Name of Organization", - "org_sitename": "Organisation Site name", + "org_sitename": "Academy subdomain", "create": "Create", - "sitename": "Sitename already exists", + "sitename": "Academy subdomain already exists", "error_organization": "Something went wrong while creating this organization. Please reload and try again" }, "navigation": { @@ -1563,7 +1567,7 @@ }, "settings": { "domains": { - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Run your academy on a web address you own.", "title": "Custom domain", "add": "Add", "url": "URL", @@ -1605,7 +1609,7 @@ "custom_code": "Custom code" }, "customize_lms": { - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see.", + "page_subtitle": "Choose which tabs, banners, course tools, and extras students see.", "title": "Customize LMS", "disabled": "Disabled", "enabled": "Enabled", @@ -1651,12 +1655,12 @@ "afternoon_heading": "Good Afternoon", "evening_heading": "Good Evening", "create_course": "Create Course", - "view_site": "View Site", - "visit_site": "Visit Website", + "view_site": "Open Academy", + "visit_site": "Open Academy", "open_academy": "Open Academy", "current_lesson": "Currently Learning", "currently_learning": "Currently Learning", - "learner": "Learner", + "learner": "Student", "your_progress": "Your Progress", "progress": "Progress", "continue": "Continue", @@ -1688,6 +1692,8 @@ "no_certifications_yet": "No certificates earned yet", "no_certifications_yet_description": "When students complete a course and earn a certificate, they will appear here", "view_courses": "View courses", + "explore_more_courses": "Explore more courses", + "view_more": "View more", "no_of_courses": "Number of courses", "no_courses_description": "Courses created within this organization", "total_students": "Total students", @@ -1861,7 +1867,7 @@ "created": "Goal created", "updated": "Goal updated", "deleted": "Goal deleted", - "delete_confirm": "Delete this goal? Per-learner status history will be removed.", + "delete_confirm": "Delete this goal? Per-student status history will be removed.", "modal": { "create_title": "New goal", "edit_title": "Edit goal", @@ -1872,11 +1878,11 @@ "type_label": "Type", "courses_label": "Courses", "required_count_label": "Number of courses required", - "score_threshold_label": "Per-learner pass score (%)", + "score_threshold_label": "Per-student pass score (%)", "team_pass_rate_label": "Team pass rate (%)", "deadline_label": "Deadline", "deadline_date_label": "Deadline date", - "relative_days_label": "Days from when the learner joins", + "relative_days_label": "Days from when the student joins", "recurring_months_label": "Repeat every (months)", "reminders_label": "Reminders (days before due)", "reminders_helper": "Comma-separated. Example: 7, 3, 1", @@ -1892,7 +1898,7 @@ }, "deadline_kind": { "absolute": "Absolute date", - "relative_to_join": "Relative to learner joining", + "relative_to_join": "Relative to student joining", "recurring": "Recurring", "none": "No deadline" }, @@ -2045,7 +2051,7 @@ }, "expert_on_x": { "title": "Become an Expert on X", - "description": "A depth course turning learners into experts on a specific topic or niche.", + "description": "A depth course turning students into experts on a specific topic or niche.", "form_title": "Tell us about the topic" }, "submit": "Continue", @@ -2056,7 +2062,7 @@ "product_name": "Product name", "product_summary": "What does the product do?", "audience": "Who is the audience?", - "outcome": "What should learners be able to do after the course?", + "outcome": "What should students be able to do after the course?", "depth": "How deep should the course go?", "topic": "Topic or niche", "expertise_level": "Target expertise level", @@ -2701,7 +2707,7 @@ "numeric": { "edit": { "correct_value_label": "Correct value", - "correct_value_info": "The expected numeric answer learners must submit to be marked correct.", + "correct_value_info": "The expected numeric answer students must submit to be marked correct.", "tolerance_label": "Tolerance", "tolerance_info": "Allowed difference from the correct value (for example, 0.5 accepts +/-0.5).", "correct_value_placeholder": "Correct value", @@ -2723,9 +2729,9 @@ "star": { "edit": { "correct_value_label": "Correct star value", - "correct_value_info": "The star count learners must select to earn full points.", + "correct_value_info": "The star count students must select to earn full points.", "max_stars_label": "Maximum stars", - "max_stars_info": "How many stars learners see (1–10). Default is 5.", + "max_stars_info": "How many stars students see (1–10). Default is 5.", "correct_value_placeholder": "e.g. 3", "max_stars_placeholder": "e.g. 5" }, @@ -2755,7 +2761,7 @@ "edit": { "template_label": "Sentence template", "template_placeholder": "Measurements to describe our data are called ___. The ___ is a function...", - "template_helper": "Use three underscores (___) for each blank. Learners will see a word bank with correct answers and distractors.", + "template_helper": "Use three underscores (___) for each blank. Students will see a word bank with correct answers and distractors.", "no_blanks_warning": "Add at least one ___ blank marker in your template.", "correct_answers_heading": "Correct answer for each blank", "blank_label": "Blank", @@ -2828,7 +2834,7 @@ }, "preview": { "max_duration_label": "Max duration", - "manual_grading": "Learners record a short video response. Manual grading required." + "manual_grading": "Students record a short video response. Manual grading required." }, "submission": { "no_video": "No video submitted.", @@ -2842,8 +2848,8 @@ }, "link": { "edit": { - "instructions_placeholder": "Optional instructions for learners", - "helper": "Learners can submit one or more valid URLs (http/https)." + "instructions_placeholder": "Optional instructions for students", + "helper": "Students can submit one or more valid URLs (http/https)." }, "take": { "helper": "Add one or more links. Only valid http/https URLs are accepted.", @@ -2908,7 +2914,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "Learners will answer with long-form text", + "placeholder": "Students will answer with long-form text", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -3027,46 +3033,46 @@ "not_compliance_title": "Compliance is not enabled", "not_compliance_description": "This course is not configured as a compliance course.", "loading": "Loading compliance records...", - "learners": "Learners", - "learners_description": "This table shows the latest cycle for each learner.", + "learners": "Students", + "learners_description": "This table shows the latest cycle for each student.", "current_cycle": "Current cycle", "current_cycle_description": "Your active compliance cycle and renewal dates.", "history": "Past cycles", "history_description": "Each row is one recorded compliance cycle for this course.", "no_active_cycle": "No active compliance cycle", "empty_history": "No compliance history has been recorded yet.", - "empty_overview": "No learner compliance records are available yet.", + "empty_overview": "No student compliance records are available yet.", "empty_overview_description": "Keep your employees compliant and track who is behind.", "not_available": "Not available", "tabs": { "overview": "Overview", - "learners": "Learners" + "learners": "Students" }, "bulk_actions": { "title": "Bulk actions", - "description": "Select learners and apply a compliance action to their current cycle.", - "select_all": "Select all visible learners", + "description": "Select students and apply a compliance action to their current cycle.", + "select_all": "Select all visible students", "selected_count": "{count} selected", "clear_selection": "Clear selection", "due_date_label": "Due date", "due_date_helper": "Used for reset and extend actions.", "reset_action": "Reset cycle", "extend_action": "Extend due date", - "waive_title": "Waive selected learners", - "waive_description": "Apply a waiver to the selected learners. You can leave the expiration empty for an open-ended waiver.", + "waive_title": "Waive selected students", + "waive_description": "Apply a waiver to the selected students. You can leave the expiration empty for an open-ended waiver.", "waiver_reason_label": "Waiver reason", "waiver_reason_helper": "Optional context for audits and future reviews.", "waiver_expires_at_label": "Waiver expires at", "waiver_expires_at_helper": "Leave empty if the waiver should not expire automatically.", "waive_action": "Apply waiver", "modal": { - "description": "You are updating {count} selected learners.", + "description": "You are updating {count} selected students.", "cancel": "Cancel", "apply": "Apply action" } }, "fields": { - "learner": "Learner", + "learner": "Student", "email": "Email", "status": "Status", "cycle": "Cycle", @@ -3077,7 +3083,7 @@ "attempts": "Attempts" }, "summary": { - "total_learners": "Total learners", + "total_learners": "Total students", "no_record": "No record", "not_started": "Not started", "in_progress": "In progress", @@ -3089,7 +3095,7 @@ }, "overview_metrics": { "heading": "Course snapshot", - "description": "Learner counts by status for this course." + "description": "Student counts by status for this course." }, "status": { "no_record": "No record", @@ -3152,7 +3158,7 @@ "send_invite_emails": "Send invite emails immediately", "create_email_invites": "Create Email Invites", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Choose students already in this organization and grant them direct access to this course.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -3501,7 +3507,7 @@ "fix_blocking_questions": "Fix blocking questions", "callout": { "legend": "Public course callout", - "description": "Shown at the bottom of each lesson and in place of locked items. Use it to drive learners to your site or a paid course.", + "description": "Shown at the bottom of each lesson and in place of locked items. Use it to drive students to your site or a paid course.", "title_label": "Title", "title_placeholder": "Want to go deeper on this?", "description_label": "Description", @@ -3526,7 +3532,7 @@ }, "tags": { "title": "Tags", - "description": "Assign tags so learners can discover this course with filters.", + "description": "Assign tags so students can discover this course with filters.", "empty": "No tags selected", "add": "Add tag", "popover_title": "Select tags", @@ -3601,7 +3607,7 @@ "selected_count": "{count} selected", "assign_courses": "Assign to Courses", "user_analytics": { - "title": "Learner profile", + "title": "Student profile", "page_subtitle": "Progress, grades, and activity across their courses." }, "import": { @@ -3706,15 +3712,15 @@ "loading_chart": "Loading chart...", "no_data_default": "No data available", "no_data_default_description": "There is no data to display at this time.", - "subtitle": "Understand how visitors discover your courses and convert into learners.", + "subtitle": "Understand how visitors discover your courses and convert into students.", "course_metrics": { - "page_subtitle": "Enrollment, lesson completion, grades, and per-learner progress for this course.", - "progress_distribution_card_description": "How many learners fall into each completion band.", - "grade_distribution_card_description": "How many learners fall into each grade band.", - "students_table_description": "Sortable overview with links to learner profiles.", + "page_subtitle": "Enrollment, lesson completion, grades, and per-student progress for this course.", + "progress_distribution_card_description": "How many students fall into each completion band.", + "grade_distribution_card_description": "How many students fall into each grade band.", + "students_table_description": "Sortable overview with links to student profiles.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} mapped to lessons", - "kpi_progress_grade": "{grade}% average exercise grade across enrolled learners" + "kpi_progress_grade": "{grade}% average exercise grade across enrolled students" }, "tabs": { "overview": "Overview", @@ -3902,7 +3908,8 @@ "not_in_progress": "No Course In progress", "any_progress": "Any course that you start will be displayed here", "not_completed": "No Course Completed", - "any_course": "Any course that you complete will be displayed here" + "any_course": "Any course that you complete will be displayed here", + "find_courses": "Find courses" }, "exercises": { "heading": "Exercises", @@ -4261,8 +4268,8 @@ "hyphen_rule": "Organization name cannot start or end with a hyphen" }, "site_name": { - "min_char": "Site name must contain 5 or more characters", - "hyphen_rule": "Site name cannot start or end with a hyphen" + "min_char": "Academy subdomain must contain 5 or more characters", + "hyphen_rule": "Academy subdomain cannot start or end with a hyphen" }, "news_feed": { "min_char": "Field must contain 5 or more characters" diff --git a/apps/dashboard/src/lib/utils/translations/es.json b/apps/dashboard/src/lib/utils/translations/es.json index b79a371a..23745656 100644 --- a/apps/dashboard/src/lib/utils/translations/es.json +++ b/apps/dashboard/src/lib/utils/translations/es.json @@ -104,8 +104,8 @@ "min_char": "El campo debe contener 5 o más caracteres." }, "site_name": { - "min_char": "El nombre del sitio debe contener 5 o más caracteres.", - "hyphen_rule": "El nombre del sitio no puede empezar ni terminar con un guión." + "min_char": "El subdominio de la Academia debe contener 5 o más caracteres.", + "hyphen_rule": "El subdominio Academy no puede comenzar ni terminar con un guión" }, "organization_name": { "min_char": "La organización debe contener 5 o más caracteres.", @@ -457,7 +457,8 @@ "not_in_progress": "Ningún curso en curso", "any_progress": "Cualquier curso que inicies se mostrará aquí.", "not_completed": "Ningún curso completado", - "any_course": "Cualquier curso que completes se mostrará aquí." + "any_course": "Cualquier curso que completes se mostrará aquí.", + "find_courses": "encontrar cursos" }, "lms_navigation": { "home": "Inicio", @@ -599,13 +600,13 @@ "course_types": "Tipos de cursos" }, "course_metrics": { - "page_subtitle": "Inscripción, finalización de lecciones, calificaciones y progreso por alumno para este curso.", - "progress_distribution_card_description": "¿Cuántos alumnos se encuentran en cada banda de finalización?", - "grade_distribution_card_description": "Cuántos alumnos se encuentran en cada grupo de grado.", - "students_table_description": "Descripción general ordenable con enlaces a perfiles de alumnos.", + "page_subtitle": "Inscripción, finalización de lecciones, calificaciones y progreso por estudiante para este curso.", + "progress_distribution_card_description": "¿Cuántos estudiantes caen en cada banda de finalización?", + "grade_distribution_card_description": "¿Cuántos estudiantes caen en cada grupo de grado?", + "students_table_description": "Descripción general ordenable con enlaces a perfiles de estudiantes.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} asignados a lecciones", - "kpi_progress_grade": "{grade}% de calificación promedio de ejercicio entre los estudiantes inscritos" + "kpi_progress_grade": "{grade}% de calificación promedio de ejercicio entre los estudiantes matriculados" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Perfil de estudiante", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -762,7 +763,7 @@ "save": "Guardar cambios", "tags": { "title": "Etiquetas", - "description": "Asigne etiquetas para que los alumnos puedan descubrir este curso con filtros.", + "description": "Asigne etiquetas para que los estudiantes puedan descubrir este curso con filtros.", "empty": "No hay etiquetas seleccionadas", "add": "Agregar etiqueta", "popover_title": "Seleccionar etiquetas", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Enviar correos electrónicos de invitación inmediatamente", "create_email_invites": "Crear invitaciones por correo electrónico", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Elija estudiantes que ya estén en esta organización y concédales acceso directo a este curso.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1442,7 +1443,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "Los alumnos responderán con un texto extenso.", + "placeholder": "Los estudiantes responderán con un texto extenso.", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -1505,7 +1506,7 @@ "add_button": "Agregar enlace" }, "edit": { - "instructions_placeholder": "Instrucciones opcionales para los estudiantes.", + "instructions_placeholder": "Instrucciones opcionales para estudiantes.", "helper": "Los estudiantes pueden enviar una o más URL válidas (http/https)." } }, @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Valor correcto", - "correct_value_info": "La respuesta numérica esperada que los alumnos deben enviar para que se marque como correcta.", + "correct_value_info": "La respuesta numérica esperada que los estudiantes deben enviar para que se califique como correcta.", "tolerance_label": "Tolerancia", "tolerance_info": "Diferencia permitida con respecto al valor correcto (por ejemplo, 0,5 acepta +/-0,5).", "correct_value_placeholder": "Valor correcto", @@ -1659,7 +1660,7 @@ "edit": { "template_label": "Plantilla de oración", "template_placeholder": "Las medidas para describir nuestros datos se llaman ___. El ___ es una función...", - "template_helper": "Utilice tres guiones bajos (___) para cada espacio en blanco. Los alumnos verán un banco de palabras con respuestas correctas y distractores.", + "template_helper": "Utilice tres guiones bajos (___) para cada espacio en blanco. Los estudiantes verán un banco de palabras con respuestas correctas y distractores.", "no_blanks_warning": "Agrega al menos un ___ marcador en blanco en tu plantilla.", "correct_answers_heading": "Respuesta correcta para cada espacio en blanco.", "blank_label": "En blanco", @@ -1681,7 +1682,7 @@ "correct_value_label": "Valor de estrella correcto", "correct_value_info": "El conteo de estrellas que los estudiantes deben seleccionar para ganar puntos completos.", "max_stars_label": "Estrellas máximas", - "max_stars_info": "Cuántas estrellas ven los alumnos (1–10). El valor predeterminado es 5.", + "max_stars_info": "Cuántas estrellas ven los estudiantes (1–10). El valor predeterminado es 5.", "correct_value_placeholder": "por ej. 3", "max_stars_placeholder": "por ej. 5" } @@ -1698,7 +1699,7 @@ }, "preview": { "max_duration_label": "Duración máxima", - "manual_grading": "Los alumnos graban una breve respuesta en vídeo. Se requiere calificación manual." + "manual_grading": "Los estudiantes graban una breve respuesta en video. Se requiere calificación manual." }, "take": { "unsupported": "La grabación de vídeo no es compatible con este navegador.", @@ -2039,15 +2040,15 @@ "not_compliance_title": "El cumplimiento no está habilitado", "not_compliance_description": "Este curso no está configurado como un curso de cumplimiento.", "loading": "Cargando registros de cumplimiento...", - "learners": "Estudiantes", - "learners_description": "Esta tabla muestra el último ciclo de cada alumno.", + "learners": "estudiantes", + "learners_description": "Esta tabla muestra el último ciclo de cada estudiante.", "current_cycle": "Ciclo actual", "current_cycle_description": "Su ciclo de cumplimiento activo y fechas de renovación.", "history": "Ciclos pasados", "history_description": "Cada fila es un ciclo de cumplimiento registrado para este curso.", "no_active_cycle": "Sin ciclo de cumplimiento activo", "empty_history": "Aún no se ha registrado ningún historial de cumplimiento.", - "empty_overview": "Aún no hay registros de cumplimiento de los alumnos disponibles.", + "empty_overview": "Aún no hay registros de cumplimiento de los estudiantes disponibles.", "not_available": "No disponible", "status": { "no_record": "Sin registro", @@ -2060,7 +2061,7 @@ "waived": "Renunciado" }, "summary": { - "total_learners": "Alumnos totales", + "total_learners": "Estudiantes totales", "no_record": "Sin registro", "not_started": "No iniciado", "in_progress": "En progreso", @@ -2071,7 +2072,7 @@ "waived": "Renunciado" }, "fields": { - "learner": "aprendiz", + "learner": "estudiante", "email": "Correo electrónico", "status": "Estado", "cycle": "ciclo", @@ -2084,33 +2085,33 @@ "bulk_actions": { "title": "Acciones masivas", "description": "Seleccione estudiantes y aplique una acción de cumplimiento a su ciclo actual.", - "select_all": "Seleccionar todos los alumnos visibles", + "select_all": "Seleccionar todos los estudiantes visibles", "selected_count": "{count} seleccionado", "clear_selection": "Borrar selección", "due_date_label": "fecha de vencimiento", "due_date_helper": "Se utiliza para restablecer y ampliar acciones.", "reset_action": "Reiniciar ciclo", "extend_action": "Extender la fecha de vencimiento", - "waive_title": "Renunciar a los alumnos seleccionados", - "waive_description": "Aplicar una exención a los alumnos seleccionados. Puede dejar el vencimiento vacío para una exención abierta.", + "waive_title": "Renunciar a estudiantes seleccionados", + "waive_description": "Aplicar una exención a los estudiantes seleccionados. Puede dejar el vencimiento vacío para una exención abierta.", "waiver_reason_label": "Motivo de la renuncia", "waiver_reason_helper": "Contexto opcional para auditorías y revisiones futuras.", "waiver_expires_at_label": "La exención vence en", "waiver_expires_at_helper": "Déjelo en blanco si la exención no debe caducar automáticamente.", "waive_action": "Aplicar exención", "modal": { - "description": "Estás actualizando a {count} alumnos seleccionados.", + "description": "Estás actualizando {count} estudiantes seleccionados.", "cancel": "Cancelar", "apply": "Aplicar acción" } }, "tabs": { "overview": "Descripción general", - "learners": "Estudiantes" + "learners": "estudiantes" }, "overview_metrics": { "heading": "Resumen del curso", - "description": "El alumno cuenta por estado para este curso." + "description": "El estudiante cuenta por estado para este curso." }, "empty_overview_description": "Haga que sus empleados cumplan y realice un seguimiento de quién está detrás." } @@ -2214,7 +2215,7 @@ "product_name": "Nombre del producto", "product_summary": "¿Qué hace el producto?", "audience": "¿Quién es la audiencia?", - "outcome": "¿Qué deberían poder hacer los alumnos después del curso?", + "outcome": "¿Qué deberían poder hacer los estudiantes después del curso?", "depth": "¿Qué profundidad debe tener el curso?", "topic": "Tema o nicho", "expertise_level": "Nivel de experiencia objetivo", @@ -2348,8 +2349,8 @@ "afternoon_heading": "Buenas tardes", "evening_heading": "Buenas noches", "create_course": "Crear curso", - "view_site": "Ver sitio", - "visit_site": "Visitar sitio web", + "view_site": "Academia Abierta", + "visit_site": "Academia Abierta", "current_lesson": "Actualmente aprendiendo", "your_progress": "Tu progreso", "continue": "Continuar", @@ -2382,7 +2383,7 @@ "publish_course": "Publicar curso", "items_completed": "Artículos completados", "currently_learning": "Actualmente aprendiendo", - "learner": "aprendiz", + "learner": "estudiante", "progress": "Progreso", "pick_up_where_you_left_off": "Continua donde lo dejaste", "course_awaits_you": "{title} te espera", @@ -2402,7 +2403,9 @@ "login_activity_description": "Días más activos de la semana (últimos 90 días)", "login_activity_no_data": "Aún no hay actividad de inicio de sesión", "login_activity_logins": "inicios de sesión", - "open_academy": "Academia Abierta" + "open_academy": "Academia Abierta", + "explore_more_courses": "Explora más cursos", + "view_more": "Ver más" }, "schedule": { "title": "Tu horario", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Mejora tu plan para personalizar el fondo de acceso.", "preview_alt": "Vista previa del fondo de acceso" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Elija qué pestañas, pancartas, herramientas del curso y extras verán los estudiantes." }, "domains": { "title": "Dominio personalizado", @@ -2479,7 +2482,7 @@ "pending_verification_description": "Se encontraron registros DNS. La emisión o validación de SSL aún está en curso.", "reconnect_description": "Este dominio debe conectarse nuevamente a través del nuevo flujo de configuración de Cloudflare.", "error_description": "Este dominio personalizado existe, pero la verificación aún no se ha completado.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Dirige tu academia en una dirección web de tu propiedad.", "dns_record": "registro DNS", "record_active": "Detectado", "record_pending": "Pendiente", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Crear organización", "name": "Nombre de la organización", - "org_sitename": "Nombre del sitio de la organización", + "org_sitename": "subdominio de la academia", "create": "crear", - "sitename": "El nombre del sitio ya existe", + "sitename": "El subdominio de la Academia ya existe", "error_organization": "Algo salió mal al crear esta organización. Por favor recarga e intenta nuevamente" }, "setup": { @@ -3150,7 +3153,7 @@ "add_theme": "Agregar tema" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Establezca el nombre, el logotipo y el tema que ven los estudiantes para esta organización." }, "profile": { "heading": "Perfil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Tutor de IA" }, "subheadings": { - "view_site": "Ver sitio" + "view_site": "Academia Abierta" }, "auth": { "title": "Autenticación", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Permitir registros públicos", "description": "Cuando está deshabilitado, solo los usuarios con un enlace de invitación pueden registrarse. Habilite esta opción para permitir que cualquiera pueda crear una cuenta." + }, + "internal_enrollment_only": { + "label": "Inscripción interna únicamente", + "description": "Cuando está habilitado, cualquier curso publicado está abierto para la autoinscripción de todos los estudiantes de su organización. Úselo con Desactivar registro para crear una academia cerrada solo por invitación donde los estudiantes pueden unirse a cualquier curso publicado sin configuración por curso." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Amigos y familiares", "fullname": "Nombre completo", "name": "Nombre de la organización", - "organisation_sitename": "Nombre del sitio de la organización", + "organisation_sitename": "subdominio de la academia", "what_brings": "¿Qué te trae a", "how": "¿Cómo supiste de nosotros?", "back": "Atrás", @@ -3874,7 +3881,7 @@ "created": "Objetivo creado", "updated": "Objetivo actualizado", "deleted": "Objetivo eliminado", - "delete_confirm": "¿Eliminar este objetivo? Se eliminará el historial de estado por alumno.", + "delete_confirm": "¿Eliminar este objetivo? Se eliminará el historial de estado por estudiante.", "lms": { "heading": "Tus objetivos", "empty_title": "No hay objetivos asignados", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "fecha absoluta", - "relative_to_join": "En relación con la incorporación del alumno", + "relative_to_join": "En relación con la incorporación de estudiantes", "recurring": "recurrente", "none": "Sin fecha límite" }, @@ -3922,11 +3929,11 @@ "type_label": "Tipo", "courses_label": "Cursos", "required_count_label": "Número de cursos requeridos", - "score_threshold_label": "Puntuación aprobada por alumno (%)", + "score_threshold_label": "Puntaje aprobado por estudiante (%)", "team_pass_rate_label": "Tasa de aprobación del equipo (%)", "deadline_label": "Fecha límite", "deadline_date_label": "Fecha límite", - "relative_days_label": "Días desde que el alumno se une", + "relative_days_label": "Días desde que se incorpora el estudiante", "recurring_months_label": "Repetir cada (meses)", "reminders_label": "Recordatorios (días antes del vencimiento)", "reminders_helper": "Separados por comas. Ejemplo: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Cumplimiento", "subtitle": "Realice un seguimiento del estado de la certificación en todos los cursos de cumplimiento de su organización.", "learners": { - "heading": "Estudiantes", + "heading": "estudiantes", "subtitle": "{count, number} coincidente", - "empty": "Ningún alumno coincide con este filtro", - "learner": "aprendiz", + "empty": "Ningún estudiante coincide con este filtro", + "learner": "estudiante", "course": "Curso", "status": "Estado", "due_date": "debido", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Cursos", - "description": "Cursos de cumplimiento con recuentos del estado del alumno", + "description": "Cumplimiento de cursos con estatus de estudiante.", "empty": "Aún no hay cursos de cumplimiento", "course": "Curso", - "learners": "Estudiantes", + "learners": "estudiantes", "completion": "Finalización" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Por curso", - "learners": "Estudiantes" + "learners": "estudiantes" }, "summary": { - "heading": "Estado de alumno", - "description": "Cuenta entre los alumnos de todos los cursos de cumplimiento." + "heading": "Estado de estudiante", + "description": "Cuenta entre los estudiantes en todos los cursos de cumplimiento." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "¿Eliminar este espacio de trabajo?", "delete_confirm_body": "Esto elimina permanentemente el espacio de trabajo, sus miembros y sus cursos. Esto no se puede deshacer.", "name_label": "Nombre del espacio de trabajo", - "site_name_label": "Nombre del sitio", + "site_name_label": "subdominio de la academia", "create_modal_title": "Crear un nuevo espacio de trabajo", "create_modal_submit": "Crear espacio de trabajo", "cancel": "Cancelar", "read_only_badge": "Sólo lectura", - "usage_banner": "{learners} alumnos y {tokens} tokens de IA utilizados en {workspaces} espacios de trabajo este mes", + "usage_banner": "{students} estudiantes y {tokens} tokens de IA utilizados en {workspaces} espacios de trabajo este mes", "secondary_billing_notice": "La facturación la administra su espacio de trabajo principal ({primaryName}).", "go_to_primary": "Ir al espacio de trabajo principal" }, @@ -4452,8 +4459,8 @@ "atCap": "en la gorra", "approaching": "Gorra acercándose", "totalActive": "Estudiantes activos este mes", - "learnersHeading": "Estudiantes", - "headerLearner": "aprendiz", + "learnersHeading": "estudiantes", + "headerLearner": "estudiante", "headerMessages": "Mensajes", "headerTokens": "Fichas", "headerStatus": "Estado", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "Solo sugerencias (sin respuestas directas)", "direct_answer": "Permitir respuestas directas", - "block_during_exercise": "Bloquear la ayuda mientras el alumno realiza un ejercicio." + "block_during_exercise": "Ayuda en bloque mientras el alumno realiza un ejercicio." }, "responseLength": { "short": "Corto (1 a 3 oraciones)", @@ -4503,9 +4510,9 @@ "welcomeMessage": "Mensaje de bienvenida", "welcomeMessage_description": "Se muestra arriba la primera respuesta del tutor en cada nueva conversación.", "disclaimerFooter": "Pie de página de descargo de responsabilidad", - "disclaimerFooter_description": "Se adjunta a cada respuesta del tutor para que los alumnos recuerden que el tutor no es una persona.", + "disclaimerFooter_description": "Se adjunta a cada respuesta del tutor para que los estudiantes recuerden que el tutor no es una persona.", "thingsToSay": "Cosas que decir", - "thingsToSay_description": "Ejemplos: \"Recuerde siempre a los alumnos que lean el programa de estudios antes de la semana 3\". \"Anima a los alumnos a resumir las lecciones con sus propias palabras\".", + "thingsToSay_description": "Ejemplos: \"Recuerde siempre a los estudiantes que lean el programa de estudios antes de la semana 3\". \"Anima a los estudiantes a resumir las lecciones con sus propias palabras\".", "thingsNotToSay": "Cosas que no decir", "thingsNotToSay_description": "Ejemplos: \"No reveles las respuestas del examen final\". \"Nunca les digas a los estudiantes qué reseña escribiste\".", "forbiddenTopics": "Temas prohibidos", @@ -4525,7 +4532,7 @@ }, "section": { "availability": "Disponibilidad", - "availability_description": "Active o desactive el tutor de IA para los alumnos en este espacio de trabajo.", + "availability_description": "Active o desactive el tutor de IA para los estudiantes en este espacio de trabajo.", "personality": "Personalidad", "personality_description": "Cómo se presenta el tutor y cuánto duran sus respuestas.", "guidance": "Cosas que decir · cosas que no decir", @@ -4535,7 +4542,7 @@ "grounding": "Puesta a tierra y citaciones", "grounding_description": "Limite de qué puede hablar el tutor y si cita material del curso.", "escalation": "Escalada", - "escalation_description": "Dónde señalar a los alumnos cuando necesitan un ser humano real.", + "escalation_description": "Dónde señalar a los estudiantes cuando necesitan un ser humano real.", "inheritance": "Herencia del curso", "inheritance_description": "Herede los valores predeterminados del espacio de trabajo o establezca anulaciones por curso." }, diff --git a/apps/dashboard/src/lib/utils/translations/fr.json b/apps/dashboard/src/lib/utils/translations/fr.json index 3f718151..c99f45e5 100644 --- a/apps/dashboard/src/lib/utils/translations/fr.json +++ b/apps/dashboard/src/lib/utils/translations/fr.json @@ -104,8 +104,8 @@ "min_char": "Le champ doit contenir 5 caractères ou plus" }, "site_name": { - "min_char": "Le nom du site doit contenir 5 caractères ou plus", - "hyphen_rule": "Le nom du site ne peut pas commencer ou se terminer par un trait d'union" + "min_char": "Le sous-domaine Academy doit contenir 5 caractères ou plus", + "hyphen_rule": "Le sous-domaine Academy ne peut pas commencer ou se terminer par un trait d'union" }, "organization_name": { "min_char": "L'organisation doit contenir 5 caractères ou plus", @@ -457,7 +457,8 @@ "not_in_progress": "Aucun cours en cours", "any_progress": "Tout cours que vous commencez sera affiché ici", "not_completed": "Aucun cours terminé", - "any_course": "Tout cours que vous terminez sera affiché ici" + "any_course": "Tout cours que vous terminez sera affiché ici", + "find_courses": "Trouver des cours" }, "lms_navigation": { "home": "Accueil", @@ -538,7 +539,7 @@ "loading_chart": "Chargement du graphique...", "no_data_default": "Aucune donnée disponible", "no_data_default_description": "Il n'y a aucune donnée à afficher pour le moment.", - "subtitle": "Comprenez comment les visiteurs découvrent vos cours et se transforment en apprenants.", + "subtitle": "Comprenez comment les visiteurs découvrent vos cours et se transforment en étudiants.", "refresh": "Actualiser", "popularTypes": { "heading": "Types de cours populaires", @@ -599,13 +600,13 @@ "course_types": "Types de cours" }, "course_metrics": { - "page_subtitle": "Inscription, achèvement des cours, notes et progrès par apprenant pour ce cours.", - "progress_distribution_card_description": "Combien d’apprenants entrent dans chaque tranche d’achèvement.", - "grade_distribution_card_description": "Combien d’apprenants appartiennent à chaque tranche scolaire.", - "students_table_description": "Aperçu triable avec des liens vers les profils d'apprenants.", + "page_subtitle": "Inscription, achèvement des cours, notes et progrès par élève pour ce cours.", + "progress_distribution_card_description": "Combien d’élèves entrent dans chaque tranche d’achèvement.", + "grade_distribution_card_description": "Combien d’élèves appartiennent à chaque tranche scolaire.", + "students_table_description": "Aperçu triable avec des liens vers les profils des étudiants.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} mappés aux leçons", - "kpi_progress_grade": "{grade} % de note moyenne d'exercice parmi les apprenants inscrits" + "kpi_progress_grade": "{grade} % de note d'exercice moyenne parmi les étudiants inscrits" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Profil étudiant", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -762,7 +763,7 @@ "save": "Enregistrer les modifications", "tags": { "title": "Balises", - "description": "Attribuez des balises pour que les apprenants puissent découvrir ce cours avec des filtres.", + "description": "Attribuez des balises pour que les étudiants puissent découvrir ce cours avec des filtres.", "empty": "Aucune balise sélectionnée", "add": "Ajouter une balise", "popover_title": "Sélectionnez les balises", @@ -780,7 +781,7 @@ }, "callout": { "legend": "Appel du cours public", - "description": "Affiché au bas de chaque leçon et à la place des éléments verrouillés. Utilisez-le pour diriger les apprenants vers votre site ou vers un cours payant.", + "description": "Affiché au bas de chaque leçon et à la place des éléments verrouillés. Utilisez-le pour diriger les étudiants vers votre site ou vers un cours payant.", "title_label": "Titre", "title_placeholder": "Vous voulez approfondir ce sujet ?", "description_label": "Descriptif", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Envoyer immédiatement des e-mails d'invitation", "create_email_invites": "Créer des invitations par e-mail", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Choisissez les étudiants déjà dans cette organisation et accordez-leur un accès direct à ce cours.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1442,7 +1443,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "Les apprenants répondront avec un texte long", + "placeholder": "Les étudiants répondront avec un texte long", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -1505,8 +1506,8 @@ "add_button": "Ajouter un lien" }, "edit": { - "instructions_placeholder": "Instructions facultatives pour les apprenants", - "helper": "Les apprenants peuvent soumettre une ou plusieurs URL valides (http/https)." + "instructions_placeholder": "Instructions facultatives pour les étudiants", + "helper": "Les étudiants peuvent soumettre une ou plusieurs URL valides (http/https)." } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Valeur correcte", - "correct_value_info": "La réponse numérique attendue que les apprenants doivent soumettre pour être marquée comme correcte.", + "correct_value_info": "La réponse numérique attendue que les étudiants doivent soumettre pour être notée comme correcte.", "tolerance_label": "Tolérance", "tolerance_info": "Différence autorisée par rapport à la valeur correcte (par exemple, 0,5 accepte +/-0,5).", "correct_value_placeholder": "Valeur correcte", @@ -1659,7 +1660,7 @@ "edit": { "template_label": "Modèle de phrase", "template_placeholder": "Les mesures pour décrire nos données sont appelées ___. Le ___ est une fonction...", - "template_helper": "Utilisez trois traits de soulignement (___) pour chaque espace. Les apprenants verront une banque de mots avec des réponses correctes et des éléments de distraction.", + "template_helper": "Utilisez trois traits de soulignement (___) pour chaque espace. Les élèves verront une banque de mots avec des réponses correctes et des éléments de distraction.", "no_blanks_warning": "Ajoutez au moins un ___ marqueur vierge dans votre modèle.", "correct_answers_heading": "Bonne réponse pour chaque blanc", "blank_label": "Vide", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "Valeur d'étoile correcte", - "correct_value_info": "Les apprenants qui comptent les étoiles doivent sélectionner pour gagner la totalité des points.", + "correct_value_info": "Les étudiants qui comptent les étoiles doivent sélectionner pour gagner tous les points.", "max_stars_label": "Nombre maximum d'étoiles", - "max_stars_info": "Combien d’étoiles les apprenants voient (1 à 10). La valeur par défaut est 5.", + "max_stars_info": "Combien d’étoiles les élèves voient (1 à 10). La valeur par défaut est 5.", "correct_value_placeholder": "par ex. 3", "max_stars_placeholder": "par ex. 5" } @@ -1698,7 +1699,7 @@ }, "preview": { "max_duration_label": "Durée maximale", - "manual_grading": "Les apprenants enregistrent une courte réponse vidéo. Classement manuel requis." + "manual_grading": "Les élèves enregistrent une courte réponse vidéo. Classement manuel requis." }, "take": { "unsupported": "L'enregistrement vidéo n'est pas pris en charge dans ce navigateur.", @@ -2039,15 +2040,15 @@ "not_compliance_title": "La conformité n'est pas activée", "not_compliance_description": "Ce cours n'est pas configuré comme cours de conformité.", "loading": "Chargement des enregistrements de conformité...", - "learners": "Apprenants", - "learners_description": "Ce tableau montre le dernier cycle pour chaque apprenant.", + "learners": "Étudiants", + "learners_description": "Ce tableau présente le dernier cycle de chaque élève.", "current_cycle": "Cycle actuel", "current_cycle_description": "Votre cycle de conformité actif et vos dates de renouvellement.", "history": "Cycles passés", "history_description": "Chaque ligne correspond à un cycle de conformité enregistré pour ce cours.", "no_active_cycle": "Aucun cycle de conformité actif", "empty_history": "Aucun historique de conformité n’a encore été enregistré.", - "empty_overview": "Aucun dossier de conformité des apprenants n’est encore disponible.", + "empty_overview": "Aucun dossier de conformité des étudiants n’est encore disponible.", "not_available": "Non disponible", "status": { "no_record": "Aucun enregistrement", @@ -2060,7 +2061,7 @@ "waived": "Renoncé" }, "summary": { - "total_learners": "Nombre total d'apprenants", + "total_learners": "Nombre total d'étudiants", "no_record": "Aucun enregistrement", "not_started": "Pas démarré", "in_progress": "En cours", @@ -2071,7 +2072,7 @@ "waived": "Renoncé" }, "fields": { - "learner": "Apprenant", + "learner": "Étudiant", "email": "Courriel", "status": "Statut", "cycle": "Cycle", @@ -2083,34 +2084,34 @@ }, "bulk_actions": { "title": "Actions groupées", - "description": "Sélectionnez les apprenants et appliquez une action de conformité à leur cycle actuel.", - "select_all": "Sélectionnez tous les apprenants visibles", + "description": "Sélectionnez les étudiants et appliquez une action de conformité à leur cycle en cours.", + "select_all": "Sélectionnez tous les étudiants visibles", "selected_count": "{count} sélectionnés", "clear_selection": "Effacer la sélection", "due_date_label": "Date d'échéance", "due_date_helper": "Utilisé pour les actions de réinitialisation et d’extension.", "reset_action": "Cycle de réinitialisation", "extend_action": "Prolonger la date d'échéance", - "waive_title": "Renoncer aux apprenants sélectionnés", - "waive_description": "Appliquer une dérogation aux apprenants sélectionnés. Vous pouvez laisser l’expiration vide pour une renonciation illimitée.", + "waive_title": "Renoncer aux étudiants sélectionnés", + "waive_description": "Appliquer une dérogation aux étudiants sélectionnés. Vous pouvez laisser l’expiration vide pour une renonciation illimitée.", "waiver_reason_label": "Raison de la renonciation", "waiver_reason_helper": "Contexte facultatif pour les audits et les examens futurs.", "waiver_expires_at_label": "La renonciation expire à", "waiver_expires_at_helper": "Laissez vide si la renonciation ne doit pas expirer automatiquement.", "waive_action": "Demander une renonciation", "modal": { - "description": "Vous mettez à jour {count} apprenants sélectionnés.", + "description": "Vous mettez à jour {count} étudiants sélectionnés.", "cancel": "Annuler", "apply": "Appliquer l'action" } }, "tabs": { "overview": "Aperçu", - "learners": "Apprenants" + "learners": "Étudiants" }, "overview_metrics": { "heading": "Aperçu du cours", - "description": "L'apprenant compte par statut pour ce cours." + "description": "L'étudiant compte par statut pour ce cours." }, "empty_overview_description": "Gardez vos employés conformes et suivez qui est derrière." } @@ -2214,7 +2215,7 @@ "product_name": "Nom du produit", "product_summary": "Que fait le produit ?", "audience": "Quel est le public ?", - "outcome": "Que devraient être capables les apprenants de faire après le cours ?", + "outcome": "Que doivent être capables les étudiants de faire après le cours ?", "depth": "Jusqu’où doit aller le cours ?", "topic": "Sujet ou niche", "expertise_level": "Niveau d’expertise cible", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Devenez un expert sur X", - "description": "Un cours approfondi transformant les apprenants en experts sur un sujet ou une niche spécifique.", + "description": "Un cours approfondi transformant les étudiants en experts sur un sujet ou une niche spécifique.", "form_title": "Parlez-nous du sujet" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Bon après-midi", "evening_heading": "Bonsoir", "create_course": "Créer un cours", - "view_site": "Voir le site", - "visit_site": "Visitez le site Web", + "view_site": "Académie ouverte", + "visit_site": "Académie ouverte", "current_lesson": "En cours d'apprentissage", "your_progress": "Votre progression", "continue": "Continuer", @@ -2382,7 +2383,7 @@ "publish_course": "Publier le cours", "items_completed": "Éléments terminés", "currently_learning": "En cours d'apprentissage", - "learner": "Apprenant", + "learner": "Étudiant", "progress": "Progrès", "pick_up_where_you_left_off": "Reprenez là où vous vous étiez arrêté", "course_awaits_you": "{title} vous attend", @@ -2402,7 +2403,9 @@ "login_activity_description": "Jours les plus actifs de la semaine (90 derniers jours)", "login_activity_no_data": "Aucune activité de connexion pour le moment", "login_activity_logins": "connexions", - "open_academy": "Académie ouverte" + "open_academy": "Académie ouverte", + "explore_more_courses": "Explorez plus de cours", + "view_more": "Voir plus" }, "schedule": { "title": "Votre emploi du temps", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Passez à une offre supérieure pour personnaliser l’arrière-plan de connexion.", "preview_alt": "Aperçu de l’arrière-plan de connexion" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Choisissez les onglets, bannières, outils de cours et extras que les étudiants voient." }, "domains": { "title": "Domaine personnalisé", @@ -2479,7 +2482,7 @@ "pending_verification_description": "Des enregistrements DNS ont été trouvés. L'émission ou la validation SSL est toujours en cours.", "reconnect_description": "Ce domaine doit être à nouveau connecté via le nouveau flux de configuration Cloudflare.", "error_description": "Ce domaine personnalisé existe, mais la vérification n'est pas encore terminée.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Gérez votre académie sur une adresse Web que vous possédez.", "dns_record": "Enregistrement DNS", "record_active": "Détecté", "record_pending": "En attente", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Créer une organisation", "name": "Nom de l'organisation", - "org_sitename": "Nom du site de l'organisation", + "org_sitename": "Sous-domaine Académie", "create": "Créer", - "sitename": "Le nom du site existe déjà", + "sitename": "Le sous-domaine Academy existe déjà", "error_organization": "Quelque chose s'est mal passé lors de la création de cette organisation. Veuillez recharger et réessayer" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "Supprimer la statistique", "label_field": "Étiquette", "value_field": "Valeur", - "label_placeholder": "Apprenants actifs", + "label_placeholder": "Étudiants actifs", "value_placeholder": "1 200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "Ajouter un thème" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Définissez le nom, le logo et le thème que les étudiants voient pour cette organisation." }, "profile": { "heading": "Profil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Tuteur IA" }, "subheadings": { - "view_site": "Voir le site" + "view_site": "Académie ouverte" }, "auth": { "title": "Authentification", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Autoriser les inscriptions publiques", "description": "Lorsqu'il est désactivé, seuls les utilisateurs disposant d'un lien d'invitation peuvent s'inscrire. Activez pour permettre à quiconque de créer un compte." + }, + "internal_enrollment_only": { + "label": "Inscription interne uniquement", + "description": "Lorsqu'il est activé, tout cours publié est ouvert à l'auto-inscription à tous les étudiants de votre organisation. Utilisez avec Désactiver l'inscription pour créer une académie fermée sur invitation uniquement où les étudiants peuvent rejoindre n'importe quel cours publié sans configuration par cours." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Amis et famille", "fullname": "Nom complet", "name": "Nom de l'organisation", - "organisation_sitename": "Nom du site de l'organisation", + "organisation_sitename": "Sous-domaine Académie", "what_brings": "Qu'est-ce qui t'amène à", "how": "Comment avez-vous entendu parler de nous ?", "back": "Retour", @@ -3874,7 +3881,7 @@ "created": "Objectif créé", "updated": "Objectif mis à jour", "deleted": "Objectif supprimé", - "delete_confirm": "Supprimer cet objectif ? L’historique du statut de chaque apprenant sera supprimé.", + "delete_confirm": "Supprimer cet objectif ? L’historique du statut de chaque étudiant sera supprimé.", "lms": { "heading": "Vos objectifs", "empty_title": "Aucun objectif assigné", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "Date absolue", - "relative_to_join": "Par rapport à l'adhésion de l'apprenant", + "relative_to_join": "Par rapport à l'adhésion des étudiants", "recurring": "Récurrent", "none": "Pas de date limite" }, @@ -3922,11 +3929,11 @@ "type_label": "Tapez", "courses_label": "Cours", "required_count_label": "Nombre de cours requis", - "score_threshold_label": "Note de réussite par apprenant (%)", + "score_threshold_label": "Note de réussite par élève (%)", "team_pass_rate_label": "Taux de réussite des équipes (%)", "deadline_label": "Date limite", "deadline_date_label": "Date limite", - "relative_days_label": "Jours à compter de l'arrivée de l'apprenant", + "relative_days_label": "Jours à compter de l'arrivée de l'étudiant", "recurring_months_label": "Répéter tous les (mois)", "reminders_label": "Rappels (jours avant l'échéance)", "reminders_helper": "Séparés par des virgules. Exemple : 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Conformité", "subtitle": "Suivez le statut de la certification pour chaque cours de conformité de votre organisation.", "learners": { - "heading": "Apprenants", + "heading": "Étudiants", "subtitle": "{count, number} correspondant", - "empty": "Aucun apprenant ne correspond à ce filtre", - "learner": "Apprenant", + "empty": "Aucun étudiant ne correspond à ce filtre", + "learner": "Étudiant", "course": "Cours", "status": "Statut", "due_date": "Due", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Cours", - "description": "Cours de conformité avec décompte du statut d'apprenant", + "description": "Cours de conformité avec le statut d'étudiant compte", "empty": "Pas encore de cours de conformité", "course": "Cours", - "learners": "Apprenants", + "learners": "Étudiants", "completion": "Achèvement" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Par cours", - "learners": "Apprenants" + "learners": "Étudiants" }, "summary": { - "heading": "Statut d'apprenant", - "description": "Compte parmi les apprenants dans tous les cours de conformité." + "heading": "Statut d'étudiant", + "description": "Compte parmi les étudiants dans tous les cours de conformité." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Supprimer cet espace de travail ?", "delete_confirm_body": "Cela supprime définitivement l'espace de travail, ses membres et ses cours. Cela ne peut pas être annulé.", "name_label": "Nom de l'espace de travail", - "site_name_label": "Nom du site", + "site_name_label": "Sous-domaine Académie", "create_modal_title": "Créer un nouvel espace de travail", "create_modal_submit": "Créer un espace de travail", "cancel": "Annuler", "read_only_badge": "Lecture seule", - "usage_banner": "{learners} apprenants et {tokens} jetons IA utilisés dans {workspaces} espaces de travail ce mois-ci", + "usage_banner": "{students} étudiants et {tokens} jetons d'IA utilisés dans {workspaces} espaces de travail ce mois-ci", "secondary_billing_notice": "La facturation est gérée par votre espace de travail principal ({primaryName}).", "go_to_primary": "Accéder à l'espace de travail principal" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "Utilisation équitable du tuteur IA", "atCap": "Au plafond", "approaching": "Cap en approche", - "totalActive": "Apprenants actifs ce mois-ci", - "learnersHeading": "Apprenants", - "headerLearner": "Apprenant", + "totalActive": "Étudiants actifs ce mois-ci", + "learnersHeading": "Étudiants", + "headerLearner": "Étudiant", "headerMessages": "Messages", "headerTokens": "Jetons", "headerStatus": "Statut", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "Conseils uniquement (pas de réponses directes)", "direct_answer": "Autoriser les réponses directes", - "block_during_exercise": "Bloquer l'aide pendant que l'apprenant est dans un exercice" + "block_during_exercise": "Bloquer l'aide pendant que l'élève est dans un exercice" }, "responseLength": { "short": "Court (1 à 3 phrases)", @@ -4503,11 +4510,11 @@ "welcomeMessage": "Message de bienvenue", "welcomeMessage_description": "Affiché au-dessus de la première réponse du tuteur dans chaque nouvelle conversation.", "disclaimerFooter": "Pied de page", - "disclaimerFooter_description": "Ajouté à chaque réponse du tuteur pour que les apprenants se souviennent que le tuteur n'est pas une personne.", + "disclaimerFooter_description": "Ajouté à chaque réponse du tuteur pour que les étudiants se souviennent que le tuteur n'est pas une personne.", "thingsToSay": "Choses à dire", - "thingsToSay_description": "Exemples : « Rappelez toujours aux apprenants de lire le programme avant la semaine 3. » \"Encouragez les apprenants à résumer les leçons dans leurs propres mots.\"", + "thingsToSay_description": "Exemples : « Rappelez toujours aux étudiants de lire le programme avant la semaine 3. » \"Encouragez les élèves à résumer les leçons dans leurs propres mots.\"", "thingsNotToSay": "Choses à ne pas dire", - "thingsNotToSay_description": "Exemples : « Ne révélez pas les réponses à l'examen final. » \"Ne dites jamais aux apprenants quelle critique vous avez rédigée.\"", + "thingsNotToSay_description": "Exemples : « Ne révélez pas les réponses à l'examen final. » \"Ne dites jamais aux étudiants quelle critique vous avez rédigée.\"", "forbiddenTopics": "Sujets interdits", "forbiddenTopics_description": "Liste séparée par des virgules. Le tuteur refusera d’en discuter.", "forbiddenTopics_placeholder": "politique, religion, conseils médicaux personnels", @@ -4525,17 +4532,17 @@ }, "section": { "availability": "Disponibilité", - "availability_description": "Activez ou désactivez le tuteur IA pour les apprenants de cet espace de travail.", + "availability_description": "Activez ou désactivez le tuteur IA pour les étudiants de cet espace de travail.", "personality": "Personnalité", "personality_description": "Comment le tuteur se présente et combien de temps durent ses réponses.", "guidance": "Choses à dire · choses à ne pas dire", "guidance_description": "Des conseils en texte libre que le tuteur suivra dans chaque réponse, ainsi qu'une liste facultative de sujets interdits.", "assessment": "Exercices et évaluations", - "assessment_description": "Comment se comporte le tuteur lorsqu'un apprenant demande de l'aide pour un exercice.", + "assessment_description": "Comment se comporte le tuteur lorsqu'un élève demande de l'aide pour un exercice.", "grounding": "Fondement et citations", "grounding_description": "Limitez ce dont le tuteur peut parler et s'il cite du matériel de cours.", "escalation": "Escalade", - "escalation_description": "Où diriger les apprenants lorsqu’ils ont besoin d’un véritable humain.", + "escalation_description": "Où diriger les étudiants lorsqu'ils ont besoin d'un véritable humain.", "inheritance": "Héritage de cours", "inheritance_description": "Héritez des valeurs par défaut de l'espace de travail ou définissez des remplacements par cours." }, diff --git a/apps/dashboard/src/lib/utils/translations/hi.json b/apps/dashboard/src/lib/utils/translations/hi.json index 7a02e422..6c56df39 100644 --- a/apps/dashboard/src/lib/utils/translations/hi.json +++ b/apps/dashboard/src/lib/utils/translations/hi.json @@ -104,8 +104,8 @@ "min_char": "फ़ील्ड में 5 या अधिक वर्ण होने चाहिए" }, "site_name": { - "min_char": "साइट नाम में 5 या अधिक अक्षर होने चाहिए", - "hyphen_rule": "साइट का नाम किसी हाइफ़न से प्रारंभ या समाप्त नहीं हो सकता" + "min_char": "अकादमी उपडोमेन में 5 या अधिक अक्षर होने चाहिए", + "hyphen_rule": "अकादमी उपडोमेन एक हाइफ़न के साथ प्रारंभ या समाप्त नहीं हो सकता" }, "organization_name": { "min_char": "संगठन में 5 या अधिक वर्ण होने चाहिए", @@ -457,7 +457,8 @@ "not_in_progress": "कोई पाठ्यक्रम प्रगति पर नहीं है", "any_progress": "आपके द्वारा शुरू किया गया कोई भी कोर्स यहां प्रदर्शित किया जाएगा", "not_completed": "कोई कोर्स पूरा नहीं हुआ", - "any_course": "आपके द्वारा पूरा किया गया कोई भी पाठ्यक्रम यहां प्रदर्शित किया जाएगा" + "any_course": "आपके द्वारा पूरा किया गया कोई भी पाठ्यक्रम यहां प्रदर्शित किया जाएगा", + "find_courses": "पाठ्यक्रम खोजें" }, "lms_navigation": { "home": "घर", @@ -538,7 +539,7 @@ "loading_chart": "चार्ट लोड हो रहा है...", "no_data_default": "कोई डेटा उपलब्ध नहीं है", "no_data_default_description": "इस समय प्रदर्शित करने के लिए कोई डेटा नहीं है.", - "subtitle": "समझें कि विज़िटर आपके पाठ्यक्रमों को कैसे खोजते हैं और शिक्षार्थियों में परिवर्तित होते हैं।", + "subtitle": "समझें कि विज़िटर आपके पाठ्यक्रमों को कैसे खोजते हैं और छात्रों में परिवर्तित होते हैं।", "refresh": "ताज़ा करें", "popularTypes": { "heading": "लोकप्रिय पाठ्यक्रम प्रकार", @@ -599,13 +600,13 @@ "course_types": "पाठ्यक्रम के प्रकार" }, "course_metrics": { - "page_subtitle": "इस पाठ्यक्रम के लिए नामांकन, पाठ समापन, ग्रेड और प्रति-शिक्षार्थी प्रगति।", - "progress_distribution_card_description": "प्रत्येक समापन बैंड में कितने शिक्षार्थी आते हैं।", - "grade_distribution_card_description": "प्रत्येक ग्रेड बैंड में कितने शिक्षार्थी आते हैं।", - "students_table_description": "शिक्षार्थी प्रोफाइल के लिंक के साथ क्रमबद्ध अवलोकन।", + "page_subtitle": "इस पाठ्यक्रम के लिए नामांकन, पाठ समापन, ग्रेड और प्रति छात्र प्रगति।", + "progress_distribution_card_description": "प्रत्येक समापन बैंड में कितने छात्र आते हैं।", + "grade_distribution_card_description": "प्रत्येक ग्रेड बैंड में कितने छात्र आते हैं।", + "students_table_description": "छात्र प्रोफाइल के लिंक के साथ क्रमबद्ध अवलोकन।", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} पाठों के अनुसार मैप किया गया", - "kpi_progress_grade": "नामांकित शिक्षार्थियों में {grade}% औसत व्यायाम ग्रेड" + "kpi_progress_grade": "नामांकित विद्यार्थियों में {ग्रेड}% औसत व्यायाम ग्रेड" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "छात्र प्रोफ़ाइल", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -762,7 +763,7 @@ "save": "परिवर्तन सहेजें", "tags": { "title": "टैग", - "description": "टैग निर्दिष्ट करें ताकि शिक्षार्थी फ़िल्टर के साथ इस पाठ्यक्रम को खोज सकें।", + "description": "टैग निर्दिष्ट करें ताकि छात्र फ़िल्टर के साथ इस पाठ्यक्रम को खोज सकें।", "empty": "कोई टैग चयनित नहीं", "add": "टैग जोड़ें", "popover_title": "टैग चुनें", @@ -780,7 +781,7 @@ }, "callout": { "legend": "सार्वजनिक पाठ्यक्रम कॉलआउट", - "description": "प्रत्येक पाठ के नीचे और लॉक की गई वस्तुओं के स्थान पर दिखाया गया है। इसका उपयोग शिक्षार्थियों को अपनी साइट या सशुल्क पाठ्यक्रम तक ले जाने के लिए करें।", + "description": "प्रत्येक पाठ के नीचे और लॉक की गई वस्तुओं के स्थान पर दिखाया गया है। इसका उपयोग छात्रों को अपनी साइट या सशुल्क पाठ्यक्रम तक ले जाने के लिए करें।", "title_label": "शीर्षक", "title_placeholder": "क्या आप इस पर गहराई से जाना चाहते हैं?", "description_label": "विवरण", @@ -1102,7 +1103,7 @@ "send_invite_emails": "तुरंत आमंत्रण ईमेल भेजें", "create_email_invites": "ईमेल आमंत्रण बनाएँ", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "इस संगठन में पहले से ही मौजूद छात्रों को चुनें और उन्हें इस पाठ्यक्रम तक सीधी पहुंच प्रदान करें।", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1442,7 +1443,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "शिक्षार्थी लंबे प्रारूप वाले पाठ के साथ उत्तर देंगे", + "placeholder": "छात्र लंबे प्रारूप वाले पाठ के साथ उत्तर देंगे", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -1505,8 +1506,8 @@ "add_button": "लिंक जोड़ें" }, "edit": { - "instructions_placeholder": "शिक्षार्थियों के लिए वैकल्पिक निर्देश", - "helper": "शिक्षार्थी एक या अधिक वैध यूआरएल (http/https) सबमिट कर सकते हैं।" + "instructions_placeholder": "छात्रों के लिए वैकल्पिक निर्देश", + "helper": "छात्र एक या अधिक वैध यूआरएल (http/https) सबमिट कर सकते हैं।" } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "सही मूल्य", - "correct_value_info": "अपेक्षित संख्यात्मक उत्तर शिक्षार्थियों को सही चिह्नित करने के लिए प्रस्तुत करना होगा।", + "correct_value_info": "अपेक्षित संख्यात्मक उत्तर छात्रों को सही चिह्नित करने के लिए प्रस्तुत करना होगा।", "tolerance_label": "सहनशीलता", "tolerance_info": "सही मान से स्वीकार्य अंतर (उदाहरण के लिए, 0.5 +/-0.5 स्वीकार करता है)।", "correct_value_placeholder": "सही मूल्य", @@ -1659,7 +1660,7 @@ "edit": { "template_label": "वाक्य टेम्पलेट", "template_placeholder": "हमारे डेटा का वर्णन करने वाले मापों को ___ कहा जाता है। ___ एक फ़ंक्शन है...", - "template_helper": "प्रत्येक रिक्त स्थान के लिए तीन अंडरस्कोर (___) का प्रयोग करें। शिक्षार्थियों को सही उत्तरों और ध्यान भटकाने वाली सामग्री वाला एक शब्द बैंक दिखाई देगा।", + "template_helper": "प्रत्येक रिक्त स्थान के लिए तीन अंडरस्कोर (___) का प्रयोग करें। छात्रों को सही उत्तरों और ध्यान भटकाने वाली सामग्री वाला एक शब्द बैंक दिखाई देगा।", "no_blanks_warning": "अपने टेम्पलेट में कम से कम एक ___ रिक्त मार्कर जोड़ें।", "correct_answers_heading": "प्रत्येक रिक्त स्थान के लिए सही उत्तर", "blank_label": "रिक्त", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "सही तारा मान", - "correct_value_info": "पूर्ण अंक अर्जित करने के लिए स्टार काउंट सीखने वालों को चयन करना होगा।", + "correct_value_info": "पूरे अंक अर्जित करने के लिए छात्रों को स्टार काउंट का चयन करना होगा।", "max_stars_label": "अधिकतम सितारे", - "max_stars_info": "शिक्षार्थी कितने तारे देखते हैं (1-10)। डिफ़ॉल्ट 5 है.", + "max_stars_info": "छात्र कितने तारे देखते हैं (1-10)। डिफ़ॉल्ट 5 है.", "correct_value_placeholder": "जैसे 3", "max_stars_placeholder": "जैसे 5" } @@ -1698,7 +1699,7 @@ }, "preview": { "max_duration_label": "अधिकतम अवधि", - "manual_grading": "शिक्षार्थी एक लघु वीडियो प्रतिक्रिया रिकॉर्ड करते हैं। मैन्युअल ग्रेडिंग आवश्यक है." + "manual_grading": "छात्र एक लघु वीडियो प्रतिक्रिया रिकॉर्ड करते हैं। मैन्युअल ग्रेडिंग आवश्यक है." }, "take": { "unsupported": "इस ब्राउज़र में वीडियो रिकॉर्डिंग समर्थित नहीं है.", @@ -2039,15 +2040,15 @@ "not_compliance_title": "अनुपालन सक्षम नहीं है", "not_compliance_description": "यह पाठ्यक्रम अनुपालन पाठ्यक्रम के रूप में कॉन्फ़िगर नहीं किया गया है।", "loading": "अनुपालन रिकॉर्ड लोड हो रहा है...", - "learners": "शिक्षार्थी", - "learners_description": "यह तालिका प्रत्येक शिक्षार्थी के लिए नवीनतम चक्र दिखाती है।", + "learners": "छात्र", + "learners_description": "यह तालिका प्रत्येक छात्र के लिए नवीनतम चक्र दिखाती है।", "current_cycle": "वर्तमान चक्र", "current_cycle_description": "आपका सक्रिय अनुपालन चक्र और नवीनीकरण तिथियाँ।", "history": "विगत कल्प", "history_description": "प्रत्येक पंक्ति इस पाठ्यक्रम के लिए एक रिकॉर्ड किया गया अनुपालन चक्र है।", "no_active_cycle": "कोई सक्रिय अनुपालन चक्र नहीं", "empty_history": "अभी तक कोई अनुपालन इतिहास दर्ज नहीं किया गया है।", - "empty_overview": "अभी तक कोई शिक्षार्थी अनुपालन रिकॉर्ड उपलब्ध नहीं है।", + "empty_overview": "अभी तक कोई छात्र अनुपालन रिकॉर्ड उपलब्ध नहीं है।", "not_available": "उपलब्ध नहीं है", "status": { "no_record": "कोई रिकॉर्ड नहीं", @@ -2060,7 +2061,7 @@ "waived": "माफ़ कर दिया गया" }, "summary": { - "total_learners": "कुल शिक्षार्थी", + "total_learners": "कुल छात्र", "no_record": "कोई रिकॉर्ड नहीं", "not_started": "शुरू नहीं हुआ", "in_progress": "प्रगति पर है", @@ -2071,7 +2072,7 @@ "waived": "माफ़ कर दिया गया" }, "fields": { - "learner": "शिक्षार्थी", + "learner": "छात्र", "email": "ईमेल", "status": "स्थिति", "cycle": "साइकिल", @@ -2083,34 +2084,34 @@ }, "bulk_actions": { "title": "थोक क्रियाएं", - "description": "शिक्षार्थियों का चयन करें और उनके वर्तमान चक्र पर अनुपालन कार्रवाई लागू करें।", - "select_all": "सभी दृश्यमान शिक्षार्थियों का चयन करें", + "description": "छात्रों का चयन करें और उनके वर्तमान चक्र पर अनुपालन कार्रवाई लागू करें।", + "select_all": "सभी दृश्यमान विद्यार्थियों का चयन करें", "selected_count": "{count} चयनित", "clear_selection": "स्पष्ट चयन", "due_date_label": "नियत तिथि", "due_date_helper": "कार्यों को रीसेट करने और विस्तारित करने के लिए उपयोग किया जाता है।", "reset_action": "चक्र रीसेट करें", "extend_action": "देय तिथि बढ़ाएँ", - "waive_title": "चयनित शिक्षार्थियों को माफ करें", - "waive_description": "चयनित शिक्षार्थियों के लिए छूट लागू करें। आप ओपन-एंडेड छूट के लिए समाप्ति तिथि को खाली छोड़ सकते हैं।", + "waive_title": "चयनित छात्रों को माफ करें", + "waive_description": "चयनित छात्रों के लिए छूट लागू करें। आप ओपन-एंडेड छूट के लिए समाप्ति तिथि को खाली छोड़ सकते हैं।", "waiver_reason_label": "छूट का कारण", "waiver_reason_helper": "ऑडिट और भविष्य की समीक्षाओं के लिए वैकल्पिक संदर्भ।", "waiver_expires_at_label": "छूट समाप्त हो रही है", "waiver_expires_at_helper": "यदि छूट स्वतः समाप्त नहीं होनी चाहिए तो खाली छोड़ दें।", "waive_action": "छूट लागू करें", "modal": { - "description": "आप चयनित शिक्षार्थियों की {count} अद्यतन कर रहे हैं।", + "description": "आप चयनित विद्यार्थियों की {गिनती} अपडेट कर रहे हैं।", "cancel": "रद्द करें", "apply": "कार्रवाई लागू करें" } }, "tabs": { "overview": "सिंहावलोकन", - "learners": "शिक्षार्थी" + "learners": "छात्र" }, "overview_metrics": { "heading": "कोर्स स्नैपशॉट", - "description": "इस पाठ्यक्रम के लिए शिक्षार्थी की गणना उसकी स्थिति के आधार पर की जाती है।" + "description": "इस पाठ्यक्रम के लिए विद्यार्थी की गणना स्थिति के आधार पर की जाती है।" }, "empty_overview_description": "अपने कर्मचारियों को आज्ञाकारी रखें और ट्रैक करें कि पीछे कौन है।" } @@ -2214,7 +2215,7 @@ "product_name": "उत्पाद का नाम", "product_summary": "उत्पाद क्या करता है?", "audience": "दर्शक कौन है?", - "outcome": "पाठ्यक्रम के बाद शिक्षार्थियों को क्या करने में सक्षम होना चाहिए?", + "outcome": "पाठ्यक्रम के बाद छात्रों को क्या करने में सक्षम होना चाहिए?", "depth": "पाठ्यक्रम कितना गहरा होना चाहिए?", "topic": "विषय या आला", "expertise_level": "लक्ष्य विशेषज्ञता स्तर", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "एक्स पर विशेषज्ञ बनें", - "description": "एक गहन पाठ्यक्रम जो शिक्षार्थियों को किसी विशिष्ट विषय या विषय पर विशेषज्ञों में बदल देता है।", + "description": "एक गहन पाठ्यक्रम जो छात्रों को किसी विशिष्ट विषय या विषय पर विशेषज्ञ बनाता है।", "form_title": "हमें विषय के बारे में बताएं" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "शुभ दोपहर", "evening_heading": "शुभ संध्या", "create_course": "पाठ्यक्रम बनाएं", - "view_site": "साइट देखें", - "visit_site": "वेबसाइट पर जाएँ", + "view_site": "अकादमी खोलें", + "visit_site": "अकादमी खोलें", "current_lesson": "वर्तमान में सीख रहा हूँ", "your_progress": "आपकी प्रगति", "continue": "जारी रखें", @@ -2382,7 +2383,7 @@ "publish_course": "पाठ्यक्रम प्रकाशित करें", "items_completed": "आइटम पूरे हो गए", "currently_learning": "वर्तमान में सीख रहा हूँ", - "learner": "शिक्षार्थी", + "learner": "छात्र", "progress": "प्रगति", "pick_up_where_you_left_off": "वहीं से शुरू करें जहां आपने छोड़ा था", "course_awaits_you": "{title} आपकी प्रतीक्षा कर रहा है", @@ -2402,7 +2403,9 @@ "login_activity_description": "सप्ताह के सर्वाधिक सक्रिय दिन (पिछले 90 दिन)", "login_activity_no_data": "अभी तक कोई लॉगिन गतिविधि नहीं", "login_activity_logins": "लॉगिन", - "open_academy": "अकादमी खोलें" + "open_academy": "अकादमी खोलें", + "explore_more_courses": "अधिक पाठ्यक्रम खोजें", + "view_more": "और देखें" }, "schedule": { "title": "आपका शेड्यूल", @@ -2444,7 +2447,7 @@ "paid_plan_note": "साइन-इन पृष्ठभूमि अनुकूलित करने के लिए अपनी योजना अपग्रेड करें।", "preview_alt": "साइन-इन पृष्ठभूमि पूर्वावलोकन" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "चुनें कि छात्र कौन से टैब, बैनर, पाठ्यक्रम उपकरण और अतिरिक्त चीज़ें देखते हैं।" }, "domains": { "title": "कस्टम डोमेन", @@ -2479,7 +2482,7 @@ "pending_verification_description": "डीएनएस रिकॉर्ड पाए गए. एसएसएल जारी करना या सत्यापन अभी भी जारी है।", "reconnect_description": "इस डोमेन को नए क्लाउडफ़ेयर सेटअप फ़्लो के माध्यम से फिर से कनेक्ट करने की आवश्यकता है।", "error_description": "यह कस्टम डोमेन मौजूद है, लेकिन सत्यापन अभी तक पूरा नहीं हुआ है।", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "अपनी अकादमी अपने वेब पते पर चलाएँ।", "dns_record": "डीएनएस रिकॉर्ड", "record_active": "पता चला", "record_pending": "लंबित", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "संगठन बनाएं", "name": "संगठन का नाम", - "org_sitename": "संगठन साइट का नाम", + "org_sitename": "अकादमी उपडोमेन", "create": "बनाएँ", - "sitename": "साइटनाम पहले से मौजूद है", + "sitename": "अकादमी उपडोमेन पहले से मौजूद है", "error_organization": "इस संगठन को बनाते समय कुछ गलत हो गया. कृपया पुनः लोड करें और पुनः प्रयास करें" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "स्टेट हटाएं", "label_field": "लेबल", "value_field": "मूल्य", - "label_placeholder": "सक्रिय शिक्षार्थी", + "label_placeholder": "सक्रिय छात्र", "value_placeholder": "1,200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "थीम जोड़ें" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "इस संगठन के लिए छात्रों को दिखने वाला नाम, लोगो और थीम सेट करें।" }, "profile": { "heading": "प्रोफाइल", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "एआई ट्यूटर" }, "subheadings": { - "view_site": "साइट देखें" + "view_site": "अकादमी खोलें" }, "auth": { "title": "प्रमाणीकरण", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "सार्वजनिक साइनअप की अनुमति दें", "description": "अक्षम होने पर, केवल आमंत्रण लिंक वाले उपयोगकर्ता ही साइन अप कर सकते हैं। किसी को भी खाता बनाने की अनुमति देने के लिए सक्षम करें." + }, + "internal_enrollment_only": { + "label": "केवल आंतरिक नामांकन", + "description": "सक्षम होने पर, कोई भी प्रकाशित पाठ्यक्रम आपके संगठन के सभी छात्रों के लिए स्व-नामांकन के लिए खुला है। एक बंद, केवल-आमंत्रित अकादमी बनाने के लिए डिसेबल साइनअप के साथ उपयोग करें जहां छात्र प्रति-कोर्स सेटअप के बिना किसी भी प्रकाशित पाठ्यक्रम में शामिल हो सकते हैं।" } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "दोस्त और परिवार", "fullname": "पूरा नाम", "name": "संगठन का नाम", - "organisation_sitename": "संगठन साइट का नाम", + "organisation_sitename": "अकादमी उपडोमेन", "what_brings": "आपको क्या लाता है", "how": "आपने हमारे बारे में कैसे सुना?", "back": "वापस", @@ -3874,7 +3881,7 @@ "created": "लक्ष्य बनाया गया", "updated": "लक्ष्य अद्यतन किया गया", "deleted": "लक्ष्य हटा दिया गया", - "delete_confirm": "यह लक्ष्य हटाएं? प्रति-शिक्षार्थी स्थिति इतिहास हटा दिया जाएगा.", + "delete_confirm": "यह लक्ष्य हटाएं? प्रति-छात्र स्थिति इतिहास हटा दिया जाएगा.", "lms": { "heading": "आपके लक्ष्य", "empty_title": "कोई लक्ष्य नहीं सौंपा गया", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "पूर्ण तिथि", - "relative_to_join": "शिक्षार्थी के शामिल होने के संबंध में", + "relative_to_join": "विद्यार्थियों के शामिल होने के संबंध में", "recurring": "आवर्ती", "none": "कोई समयसीमा नहीं" }, @@ -3922,11 +3929,11 @@ "type_label": "प्रकार", "courses_label": "पाठ्यक्रम", "required_count_label": "आवश्यक पाठ्यक्रमों की संख्या", - "score_threshold_label": "प्रति-शिक्षार्थी पास स्कोर (%)", + "score_threshold_label": "प्रति छात्र उत्तीर्णांक (%)", "team_pass_rate_label": "टीम पास दर (%)", "deadline_label": "समयसीमा", "deadline_date_label": "अंतिम तिथि", - "relative_days_label": "वे दिन जब से शिक्षार्थी शामिल होता है", + "relative_days_label": "छात्र के शामिल होने के दिन से दिन", "recurring_months_label": "प्रत्येक (महीने) दोहराएँ", "reminders_label": "अनुस्मारक (नियत तिथि से कुछ दिन पहले)", "reminders_helper": "अल्पविराम से अलग किया गया. उदाहरण: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "अनुपालन", "subtitle": "अपने संगठन में प्रत्येक अनुपालन पाठ्यक्रम में प्रमाणन स्थिति को ट्रैक करें।", "learners": { - "heading": "शिक्षार्थी", + "heading": "छात्र", "subtitle": "{count, number} मिलान", - "empty": "कोई भी शिक्षार्थी इस फ़िल्टर से मेल नहीं खाता", - "learner": "शिक्षार्थी", + "empty": "कोई भी छात्र इस फ़िल्टर से मेल नहीं खाता", + "learner": "छात्र", "course": "पाठ्यक्रम", "status": "स्थिति", "due_date": "देय", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "पाठ्यक्रम", - "description": "शिक्षार्थी की स्थिति की गणना के साथ अनुपालन पाठ्यक्रम", + "description": "छात्र स्थिति गणना के साथ अनुपालन पाठ्यक्रम", "empty": "अभी तक कोई अनुपालन पाठ्यक्रम नहीं", "course": "पाठ्यक्रम", - "learners": "शिक्षार्थी", + "learners": "छात्र", "completion": "समापन" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "बेशक", - "learners": "शिक्षार्थी" + "learners": "छात्र" }, "summary": { - "heading": "शिक्षार्थी की स्थिति", - "description": "सभी अनुपालन पाठ्यक्रमों में शिक्षार्थियों के बीच गिना जाता है।" + "heading": "छात्र स्थिति", + "description": "सभी अनुपालन पाठ्यक्रमों में छात्रों की गिनती होती है।" } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "यह कार्यस्थान हटाएं?", "delete_confirm_body": "यह कार्यक्षेत्र, उसके सदस्यों और उसके पाठ्यक्रमों को स्थायी रूप से हटा देता है। इसे असंपादित नहीं किया जा सकता है।", "name_label": "कार्यस्थल का नाम", - "site_name_label": "साइट का नाम", + "site_name_label": "अकादमी उपडोमेन", "create_modal_title": "एक नया कार्यक्षेत्र बनाएं", "create_modal_submit": "कार्यक्षेत्र बनाएं", "cancel": "रद्द करें", "read_only_badge": "केवल पढ़ने योग्य", - "usage_banner": "{learners} शिक्षार्थी और {tokens} एआई टोकन इस महीने {workspaces} कार्यस्थानों में उपयोग किए गए", + "usage_banner": "इस महीने {छात्र} छात्र और {टोकन} एआई टोकन का उपयोग सभी कार्यस्थलों में किया गया", "secondary_billing_notice": "बिलिंग का प्रबंधन आपके प्राथमिक कार्यक्षेत्र ({primaryName}) द्वारा किया जाता है।", "go_to_primary": "प्राथमिक कार्यक्षेत्र पर जाएँ" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "एआई ट्यूटर उचित उपयोग", "atCap": "टोपी पर", "approaching": "निकट आ रही टोपी", - "totalActive": "इस महीने सक्रिय शिक्षार्थी", - "learnersHeading": "शिक्षार्थी", - "headerLearner": "शिक्षार्थी", + "totalActive": "इस महीने सक्रिय छात्र", + "learnersHeading": "छात्र", + "headerLearner": "छात्र", "headerMessages": "संदेश", "headerTokens": "टोकन", "headerStatus": "स्थिति", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "केवल संकेत (कोई सीधा उत्तर नहीं)", "direct_answer": "सीधे उत्तर की अनुमति दें", - "block_during_exercise": "जब शिक्षार्थी अभ्यास कर रहा हो तो सहायता रोकें" + "block_during_exercise": "जब छात्र व्यायाम कर रहा हो तो सहायता रोकें" }, "responseLength": { "short": "लघु (1-3 वाक्य)", @@ -4503,11 +4510,11 @@ "welcomeMessage": "स्वागत संदेश", "welcomeMessage_description": "प्रत्येक नई बातचीत में पहले शिक्षक का उत्तर ऊपर दिखाया गया है।", "disclaimerFooter": "अस्वीकरण पाद लेख", - "disclaimerFooter_description": "प्रत्येक ट्यूटर उत्तर के साथ जोड़ा गया ताकि शिक्षार्थियों को याद रहे कि ट्यूटर एक व्यक्ति नहीं है।", + "disclaimerFooter_description": "प्रत्येक ट्यूटर उत्तर के साथ जोड़ा गया ताकि छात्रों को याद रहे कि ट्यूटर कोई व्यक्ति नहीं है।", "thingsToSay": "कहने को बातें", - "thingsToSay_description": "उदाहरण: \"शिक्षार्थियों को हमेशा सप्ताह 3 से पहले पाठ्यक्रम पढ़ने की याद दिलाएँ।\" \"शिक्षार्थियों को पाठों को अपने शब्दों में सारांशित करने के लिए प्रोत्साहित करें।\"", + "thingsToSay_description": "उदाहरण: \"छात्रों को हमेशा सप्ताह 3 से पहले पाठ्यक्रम पढ़ने की याद दिलाएँ।\" \"छात्रों को पाठों को अपने शब्दों में सारांशित करने के लिए प्रोत्साहित करें।\"", "thingsNotToSay": "न कहने लायक बातें", - "thingsNotToSay_description": "उदाहरण: \"अंतिम परीक्षा के उत्तर प्रकट न करें।\" \"शिक्षार्थियों को यह कभी न बताएं कि आपने कौन सी समीक्षा लिखी है।\"", + "thingsNotToSay_description": "उदाहरण: \"अंतिम परीक्षा के उत्तर प्रकट न करें।\" \"छात्रों को यह कभी न बताएं कि आपने कौन सी समीक्षा लिखी है।\"", "forbiddenTopics": "निषिद्ध विषय", "forbiddenTopics_description": "अल्पविराम से अलग की गई सूची. शिक्षक इन पर चर्चा करने से इंकार कर देंगे।", "forbiddenTopics_placeholder": "राजनीति, धर्म, व्यक्तिगत चिकित्सा सलाह", @@ -4525,17 +4532,17 @@ }, "section": { "availability": "उपलब्धता", - "availability_description": "इस कार्यक्षेत्र में शिक्षार्थियों के लिए एआई ट्यूटर को चालू या बंद करें।", + "availability_description": "इस कार्यक्षेत्र में छात्रों के लिए एआई ट्यूटर को चालू या बंद करें।", "personality": "व्यक्तित्व", "personality_description": "ट्यूटर अपना परिचय कैसे देता है और उसके उत्तर कितने लंबे होते हैं।", "guidance": "कहने योग्य बातें · न कहने योग्य बातें", "guidance_description": "ट्यूटर प्रत्येक उत्तर में निःशुल्क-पाठ मार्गदर्शन का पालन करेगा, साथ ही सीमा से बाहर विषयों की एक वैकल्पिक सूची भी।", "assessment": "अभ्यास एवं आकलन", - "assessment_description": "जब कोई शिक्षार्थी किसी अभ्यास में मदद मांगता है तो शिक्षक कैसा व्यवहार करता है।", + "assessment_description": "जब कोई छात्र किसी अभ्यास में मदद मांगता है तो शिक्षक कैसा व्यवहार करता है।", "grounding": "ग्राउंडिंग और उद्धरण", "grounding_description": "इस बात को सीमित करें कि शिक्षक किस बारे में बात कर सकता है और क्या वह पाठ्यक्रम सामग्री का हवाला देता है।", "escalation": "वृद्धि", - "escalation_description": "जब शिक्षार्थियों को एक वास्तविक मानव की आवश्यकता हो तो उन्हें कहाँ इंगित करना चाहिए।", + "escalation_description": "जब छात्रों को एक वास्तविक इंसान की आवश्यकता हो तो उन्हें कहां इंगित करना चाहिए।", "inheritance": "पाठ्यक्रम विरासत", "inheritance_description": "कार्यस्थान डिफ़ॉल्ट को इनहेरिट करें या प्रति-कोर्स ओवरराइड सेट करें।" }, diff --git a/apps/dashboard/src/lib/utils/translations/pl.json b/apps/dashboard/src/lib/utils/translations/pl.json index 1fd2125a..382f9e65 100644 --- a/apps/dashboard/src/lib/utils/translations/pl.json +++ b/apps/dashboard/src/lib/utils/translations/pl.json @@ -104,8 +104,8 @@ "min_char": "Pole musi zawierać 5 lub więcej znaków" }, "site_name": { - "min_char": "Nazwa witryny musi zawierać co najmniej 5 znaków", - "hyphen_rule": "Nazwa witryny nie może zaczynać się ani kończyć łącznikiem" + "min_char": "Subdomena Academy musi zawierać 5 lub więcej znaków", + "hyphen_rule": "Subdomena Academy nie może zaczynać się ani kończyć łącznikiem" }, "organization_name": { "min_char": "Organizacja musi zawierać co najmniej 5 znaków", @@ -457,7 +457,8 @@ "not_in_progress": "Brak kursu w toku", "any_progress": "Tutaj wyświetli się każdy rozpoczęty kurs", "not_completed": "Żaden kurs nie został ukończony", - "any_course": "Tutaj wyświetli się każdy ukończony kurs" + "any_course": "Tutaj wyświetli się każdy ukończony kurs", + "find_courses": "Znajdź kursy" }, "lms_navigation": { "home": "Dom", @@ -538,7 +539,7 @@ "loading_chart": "Ładowanie wykresu...", "no_data_default": "Brak dostępnych danych", "no_data_default_description": "W tej chwili nie ma żadnych danych do wyświetlenia.", - "subtitle": "Dowiedz się, w jaki sposób odwiedzający odkrywają Twoje kursy i przekształcają się w uczniów.", + "subtitle": "Dowiedz się, w jaki sposób odwiedzający odkrywają Twoje kursy i przekształcają się w studentów.", "refresh": "Odśwież", "popularTypes": { "heading": "Popularne typy kursów", @@ -602,7 +603,7 @@ "page_subtitle": "Zapisy, ukończenie lekcji, oceny i postępy poszczególnych uczniów w tym kursie.", "progress_distribution_card_description": "Ilu uczniów mieści się w każdym przedziale ukończenia.", "grade_distribution_card_description": "Ilu uczniów należy do każdego przedziału ocen.", - "students_table_description": "Sortowalny przegląd z linkami do profili uczniów.", + "students_table_description": "Sortowalny przegląd z linkami do profili studentów.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} przypisane do lekcji", "kpi_progress_grade": "{grade}% średniej oceny z ćwiczeń wśród zapisanych uczniów" @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Profil studenta", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -780,7 +781,7 @@ }, "callout": { "legend": "Objaśnienie dotyczące kursu publicznego", - "description": "Wyświetlane na dole każdej lekcji oraz w miejscu zablokowanych elementów. Użyj go, aby przyciągnąć uczniów do swojej witryny lub płatnego kursu.", + "description": "Wyświetlane na dole każdej lekcji oraz w miejscu zablokowanych elementów. Użyj go, aby przyciągnąć uczniów do Twojej witryny lub płatnego kursu.", "title_label": "Tytuł", "title_placeholder": "Chcesz zgłębić ten temat?", "description_label": "Opis", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Natychmiast wysyłaj e-maile z zaproszeniami", "create_email_invites": "Utwórz zaproszenia e-mailowe", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Wybierz uczniów już należących do tej organizacji i przyznaj im bezpośredni dostęp do tego kursu.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Prawidłowa wartość", - "correct_value_info": "Oczekiwana odpowiedź liczbowa, którą uczniowie muszą przesłać, aby została oznaczona jako prawidłowa.", + "correct_value_info": "Oczekiwana odpowiedź numeryczna, którą uczniowie muszą przesłać, aby została oznaczona jako prawidłowa.", "tolerance_label": "Tolerancja", "tolerance_info": "Dopuszczalna różnica od prawidłowej wartości (na przykład 0,5 akceptuje +/-0,5).", "correct_value_placeholder": "Prawidłowa wartość", @@ -1681,7 +1682,7 @@ "correct_value_label": "Prawidłowa wartość gwiazdki", "correct_value_info": "Aby zdobyć pełną liczbę punktów, uczniowie muszą wybrać liczbę gwiazdek.", "max_stars_label": "Maksymalna ilość gwiazdek", - "max_stars_info": "Ile gwiazdek widzą uczniowie (1–10). Wartość domyślna to 5.", + "max_stars_info": "Ile gwiazd widzą uczniowie (1–10). Wartość domyślna to 5.", "correct_value_placeholder": "np. 3", "max_stars_placeholder": "np. 5" } @@ -2039,7 +2040,7 @@ "not_compliance_title": "Zgodność nie jest włączona", "not_compliance_description": "Ten kurs nie jest skonfigurowany jako kurs dotyczący zgodności.", "loading": "Ładowanie rekordów zgodności...", - "learners": "Uczniowie", + "learners": "Studenci", "learners_description": "Ta tabela pokazuje najnowszy cykl dla każdego ucznia.", "current_cycle": "Aktualny cykl", "current_cycle_description": "Twój aktywny cykl zgodności i daty odnowienia.", @@ -2047,7 +2048,7 @@ "history_description": "Każdy wiersz to jeden zarejestrowany cykl zgodności dla tego kursu.", "no_active_cycle": "Brak aktywnego cyklu zgodności", "empty_history": "Nie zarejestrowano jeszcze żadnej historii zgodności.", - "empty_overview": "Nie są jeszcze dostępne żadne zapisy dotyczące przestrzegania zasad przez ucznia.", + "empty_overview": "Nie są jeszcze dostępne żadne zapisy dotyczące przestrzegania zasad przez uczniów.", "not_available": "Niedostępne", "status": { "no_record": "Brak rekordu", @@ -2060,7 +2061,7 @@ "waived": "Zrzeczenie się" }, "summary": { - "total_learners": "Wszystkich uczniów", + "total_learners": "Razem studenci", "no_record": "Brak rekordu", "not_started": "Nie rozpoczęte", "in_progress": "W toku", @@ -2071,7 +2072,7 @@ "waived": "Zrzeczenie się" }, "fields": { - "learner": "Uczeń", + "learner": "Studenta", "email": "E-mail", "status": "Stan", "cycle": "Cykl", @@ -2092,7 +2093,7 @@ "reset_action": "Zresetuj cykl", "extend_action": "Przedłuż termin", "waive_title": "Zrezygnuj z wybranych uczniów", - "waive_description": "Zastosuj zwolnienie do wybranych uczniów. W przypadku zrzeczenia się na czas nieokreślony możesz pozostawić pole wygaśnięcia puste.", + "waive_description": "Zastosuj zwolnienie dla wybranych studentów. W przypadku zrzeczenia się na czas nieokreślony możesz pozostawić pole wygaśnięcia puste.", "waiver_reason_label": "Powód odstąpienia", "waiver_reason_helper": "Opcjonalny kontekst audytów i przyszłych przeglądów.", "waiver_expires_at_label": "Zrzeczenie się wygasa o godz", @@ -2106,11 +2107,11 @@ }, "tabs": { "overview": "Przegląd", - "learners": "Uczniowie" + "learners": "Studenci" }, "overview_metrics": { "heading": "Migawka kursu", - "description": "Uczestnicy są zliczani według statusu tego kursu." + "description": "Studenci liczą się według statusu tego kursu." }, "empty_overview_description": "Dbaj o przestrzeganie zasad przez swoich pracowników i śledź, kto ma zaległości." } @@ -2214,7 +2215,7 @@ "product_name": "Nazwa produktu", "product_summary": "Co robi produkt?", "audience": "Kim jest publiczność?", - "outcome": "Co uczniowie powinni potrafić po ukończeniu kursu?", + "outcome": "Co studenci powinni umieć po ukończeniu kursu?", "depth": "Jak głęboko powinien sięgać kurs?", "topic": "Temat lub nisza", "expertise_level": "Docelowy poziom wiedzy", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Zostań ekspertem w dziedzinie X", - "description": "Głęboki kurs zmieniający uczniów w ekspertów w określonej dziedzinie lub niszy.", + "description": "Głęboki kurs zmieniający studentów w ekspertów w określonej dziedzinie lub niszy.", "form_title": "Opowiedz nam o temacie" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Dzień dobry", "evening_heading": "Dobry wieczór", "create_course": "Utwórz kurs", - "view_site": "Zobacz witrynę", - "visit_site": "Odwiedź stronę internetową", + "view_site": "Otwarta Akademia", + "visit_site": "Otwarta Akademia", "current_lesson": "Aktualnie się uczę", "your_progress": "Twój postęp", "continue": "Kontynuuj", @@ -2382,7 +2383,7 @@ "publish_course": "Publikuj kurs", "items_completed": "Elementy ukończone", "currently_learning": "Aktualnie się uczę", - "learner": "Uczeń", + "learner": "Studenta", "progress": "Postęp", "pick_up_where_you_left_off": "Rozpocznij od miejsca, w którym skończyłeś", "course_awaits_you": "{title} czeka na Ciebie", @@ -2402,7 +2403,9 @@ "login_activity_description": "Najbardziej aktywne dni tygodnia (ostatnie 90 dni)", "login_activity_no_data": "Brak aktywności związanej z logowaniem", "login_activity_logins": "logowania", - "open_academy": "Otwarta Akademia" + "open_academy": "Otwarta Akademia", + "explore_more_courses": "Przeglądaj więcej kursów", + "view_more": "Zobacz więcej" }, "schedule": { "title": "Twój harmonogram", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Ulepsz plan, aby dostosować tło ekranu logowania.", "preview_alt": "Podgląd tła logowania" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Wybierz, które karty, banery, narzędzia kursu i dodatki będą widoczne dla uczniów." }, "domains": { "title": "Domena niestandardowa", @@ -2479,7 +2482,7 @@ "pending_verification_description": "Znaleziono rekordy DNS. Wydanie lub weryfikacja protokołu SSL jest nadal w toku.", "reconnect_description": "Ta domena musi zostać ponownie połączona poprzez nowy proces konfiguracji Cloudflare.", "error_description": "Ta domena niestandardowa istnieje, ale weryfikacja nie została jeszcze ukończona.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Prowadź swoją akademię na posiadanym adresie internetowym.", "dns_record": "Rekord DNS", "record_active": "Wykryto", "record_pending": "Oczekujące", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Utwórz organizację", "name": "Nazwa organizacji", - "org_sitename": "Nazwa witryny organizacji", + "org_sitename": "Subdomena Akademii", "create": "Utwórz", - "sitename": "Nazwa witryny już istnieje", + "sitename": "Subdomena Academy już istnieje", "error_organization": "Coś poszło nie tak podczas tworzenia tej organizacji. Załaduj ponownie i spróbuj ponownie" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "Usuń statystyki", "label_field": "Etykieta", "value_field": "Wartość", - "label_placeholder": "Aktywni uczniowie", + "label_placeholder": "Aktywni studenci", "value_placeholder": "1200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "Dodaj motyw" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Ustaw nazwę, logo i motyw tej organizacji, które będą widzieć uczniowie." }, "profile": { "heading": "Profil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Nauczyciel AI" }, "subheadings": { - "view_site": "Zobacz witrynę" + "view_site": "Otwarta Akademia" }, "auth": { "title": "Uwierzytelnianie", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Zezwalaj na publiczne rejestracje", "description": "Gdy opcja jest wyłączona, rejestrować się mogą tylko użytkownicy posiadający link z zaproszeniem. Włącz, aby pozwolić każdemu na utworzenie konta." + }, + "internal_enrollment_only": { + "label": "Tylko rejestracja wewnętrzna", + "description": "Jeśli ta opcja jest włączona, każdy opublikowany kurs jest dostępny do samodzielnej rejestracji dla wszystkich uczniów w Twojej organizacji. Użyj opcji Wyłącz rejestrację, aby utworzyć zamkniętą akademię dostępną tylko dla zaproszonych, w której uczniowie mogą dołączać do dowolnego opublikowanego kursu bez konieczności konfigurowania poszczególnych kursów." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Przyjaciele i rodzina", "fullname": "Pełne imię i nazwisko", "name": "Nazwa organizacji", - "organisation_sitename": "Nazwa witryny organizacji", + "organisation_sitename": "Subdomena Akademii", "what_brings": "Do czego cię sprowadza", "how": "Jak się o nas dowiedziałeś?", "back": "Powrót", @@ -3874,7 +3881,7 @@ "created": "Cel stworzony", "updated": "Cel zaktualizowany", "deleted": "Cel usunięty", - "delete_confirm": "Usunąć ten cel? Historia statusu każdego ucznia zostanie usunięta.", + "delete_confirm": "Usunąć ten cel? Historia statusu poszczególnych uczniów zostanie usunięta.", "lms": { "heading": "Twoje cele", "empty_title": "Brak przypisanych celów", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "Absolutna data", - "relative_to_join": "Dotyczy dołączenia ucznia", + "relative_to_join": "Dotyczy dołączania uczniów", "recurring": "Powtarzające się", "none": "Brak terminu" }, @@ -3926,7 +3933,7 @@ "team_pass_rate_label": "Wskaźnik zdawalności zespołu (%)", "deadline_label": "Termin", "deadline_date_label": "Termin ostateczny", - "relative_days_label": "Dni od dołączenia ucznia", + "relative_days_label": "Dni od momentu dołączenia ucznia", "recurring_months_label": "Powtarzaj co (miesiące)", "reminders_label": "Przypomnienia (dni przed terminem)", "reminders_helper": "Oddzielone przecinkami. Przykład: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Zgodność", "subtitle": "Śledź status certyfikacji na każdym kursie dotyczącym zgodności w Twojej organizacji.", "learners": { - "heading": "Uczniowie", + "heading": "Studenci", "subtitle": "dopasowanie {count, number}", "empty": "Żaden uczeń nie pasuje do tego filtra", - "learner": "Uczeń", + "learner": "Studenta", "course": "Kurs", "status": "Stan", "due_date": "Termin", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Kursy", - "description": "Liczą się kursy zgodności ze statusem ucznia", + "description": "Liczą się kursy zgodności ze statusem studenta", "empty": "Nie ma jeszcze żadnych kursów dotyczących zgodności", "course": "Kurs", - "learners": "Uczniowie", + "learners": "Studenci", "completion": "Zakończenie" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Oczywiście", - "learners": "Uczniowie" + "learners": "Studenci" }, "summary": { - "heading": "Stan ucznia", - "description": "Dotyczy wszystkich uczestników wszystkich kursów dotyczących zgodności." + "heading": "Status studenta", + "description": "Dotyczy wszystkich uczniów na wszystkich kursach dotyczących zgodności." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Usunąć ten obszar roboczy?", "delete_confirm_body": "Spowoduje to trwałe usunięcie obszaru roboczego, jego członków i kursów. Tego nie można cofnąć.", "name_label": "Nazwa obszaru roboczego", - "site_name_label": "Nazwa witryny", + "site_name_label": "Subdomena Akademii", "create_modal_title": "Utwórz nowy obszar roboczy", "create_modal_submit": "Utwórz obszar roboczy", "cancel": "Anuluj", "read_only_badge": "Tylko do odczytu", - "usage_banner": "{learners} uczniów i {tokens} tokenów AI używanych w obszarach roboczych {workspaces} w tym miesiącu", + "usage_banner": "{students} studentów i {tokens} tokenów AI używanych w obszarach roboczych {workspaces} w tym miesiącu", "secondary_billing_notice": "Rozliczeniami zarządza Twój główny obszar roboczy ({primaryName}).", "go_to_primary": "Przejdź do głównego obszaru roboczego" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "Dozwolony użytek nauczyciela AI", "atCap": "Na czapce", "approaching": "Zbliżamy się do czapki", - "totalActive": "Aktywni uczniowie w tym miesiącu", - "learnersHeading": "Uczniowie", - "headerLearner": "Uczeń", + "totalActive": "Aktywni studenci w tym miesiącu", + "learnersHeading": "Studenci", + "headerLearner": "Studenta", "headerMessages": "Wiadomości", "headerTokens": "Żetony", "headerStatus": "Stan", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "Tylko wskazówki (bez bezpośrednich odpowiedzi)", "direct_answer": "Pozwól na bezpośrednie odpowiedzi", - "block_during_exercise": "Blokuj pomoc, gdy uczeń jest w trakcie ćwiczenia" + "block_during_exercise": "Blokuj pomoc, gdy uczeń wykonuje ćwiczenie" }, "responseLength": { "short": "Krótkie (1–3 zdania)", @@ -4505,7 +4512,7 @@ "disclaimerFooter": "Stopka z zastrzeżeniami", "disclaimerFooter_description": "Dołączane do każdej odpowiedzi nauczyciela, aby uczniowie pamiętali, że nauczyciel nie jest osobą.", "thingsToSay": "Rzeczy do powiedzenia", - "thingsToSay_description": "Przykłady: „Zawsze przypominaj uczniom, aby przeczytali program nauczania przed 3. tygodniem”. „Zachęcaj uczniów do podsumowywania lekcji własnymi słowami.”", + "thingsToSay_description": "Przykłady: „Zawsze przypominaj uczniom, aby przeczytali program nauczania przed 3. tygodniem”. „Zachęcaj uczniów do podsumowywania lekcji własnymi słowami”.", "thingsNotToSay": "Rzeczy, których nie należy mówić", "thingsNotToSay_description": "Przykłady: „Nie ujawniaj odpowiedzi na egzaminie końcowym”. „Nigdy nie mów uczniom, jaką recenzję napisałeś”.", "forbiddenTopics": "Zakazane tematy", @@ -4531,7 +4538,7 @@ "guidance": "Rzeczy do powiedzenia · Rzeczy, których nie należy mówić", "guidance_description": "Wskazówki w postaci dowolnego tekstu, których nauczyciel będzie przestrzegać w każdej odpowiedzi, oraz opcjonalna lista tematów niedostępnych.", "assessment": "Ćwiczenia i oceny", - "assessment_description": "Jak zachowuje się nauczyciel, gdy uczeń prosi o pomoc w ćwiczeniu.", + "assessment_description": "Jak zachowuje się prowadzący, gdy uczeń prosi o pomoc w ćwiczeniu.", "grounding": "Uziemienie i cytaty", "grounding_description": "Ogranicz to, o czym nauczyciel może mówić i czy cytuje materiały kursu.", "escalation": "Eskalacja", diff --git a/apps/dashboard/src/lib/utils/translations/pt.json b/apps/dashboard/src/lib/utils/translations/pt.json index a0ac55bf..f76c3e51 100644 --- a/apps/dashboard/src/lib/utils/translations/pt.json +++ b/apps/dashboard/src/lib/utils/translations/pt.json @@ -104,8 +104,8 @@ "min_char": "O campo deve conter 5 ou mais caracteres" }, "site_name": { - "min_char": "O nome do site deve conter cinco ou mais caracteres", - "hyphen_rule": "O nome do site não pode começar ou terminar com um hífen" + "min_char": "O subdomínio da Academia deve conter 5 ou mais caracteres", + "hyphen_rule": "O subdomínio da Academia não pode começar ou terminar com um hífen" }, "organization_name": { "min_char": "A organização deve conter 5 ou mais caracteres", @@ -457,7 +457,8 @@ "not_in_progress": "Nenhum curso em andamento", "any_progress": "Qualquer curso que você iniciar será exibido aqui", "not_completed": "Nenhum curso concluído", - "any_course": "Qualquer curso que você concluir será exibido aqui" + "any_course": "Qualquer curso que você concluir será exibido aqui", + "find_courses": "Encontre cursos" }, "lms_navigation": { "home": "Página inicial", @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Perfil do aluno", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -1102,7 +1103,7 @@ "send_invite_emails": "Envie e-mails de convite imediatamente", "create_email_invites": "Crie convites por e-mail", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Escolha alunos que já fazem parte desta organização e conceda-lhes acesso direto a este curso.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1679,7 +1680,7 @@ }, "edit": { "correct_value_label": "Valor correto da estrela", - "correct_value_info": "Os alunos da contagem de estrelas devem selecionar para ganhar pontos completos.", + "correct_value_info": "A contagem de estrelas que os alunos devem selecionar para ganhar pontos completos.", "max_stars_label": "Máximo de estrelas", "max_stars_info": "Quantas estrelas os alunos veem (1–10). O padrão é 5.", "correct_value_placeholder": "por exemplo 3", @@ -2040,14 +2041,14 @@ "not_compliance_description": "Este curso não está configurado como um curso de compliance.", "loading": "Carregando registros de conformidade...", "learners": "Alunos", - "learners_description": "Esta tabela mostra o ciclo mais recente de cada aluno.", + "learners_description": "Esta tabela mostra o último ciclo de cada aluno.", "current_cycle": "Ciclo atual", "current_cycle_description": "Seu ciclo de conformidade ativo e datas de renovação.", "history": "Ciclos anteriores", "history_description": "Cada linha é um ciclo de conformidade registrado para este curso.", "no_active_cycle": "Nenhum ciclo de conformidade ativo", "empty_history": "Nenhum histórico de conformidade foi registrado ainda.", - "empty_overview": "Nenhum registro de conformidade do aluno está disponível ainda.", + "empty_overview": "Nenhum registro de conformidade dos alunos está disponível ainda.", "not_available": "Não disponível", "status": { "no_record": "Sem registro", @@ -2071,7 +2072,7 @@ "waived": "Dispensado" }, "fields": { - "learner": "Aluno", + "learner": "Estudante", "email": "E-mail", "status": "Estado", "cycle": "Ciclo", @@ -2083,7 +2084,7 @@ }, "bulk_actions": { "title": "Ações em massa", - "description": "Selecione os alunos e aplique uma ação de conformidade ao seu ciclo atual.", + "description": "Selecione os alunos e aplique uma ação de compliance ao seu ciclo atual.", "select_all": "Selecione todos os alunos visíveis", "selected_count": "{count} selecionados", "clear_selection": "Limpar seleção", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Torne-se um especialista em X", - "description": "Um curso aprofundado que transforma alunos em especialistas em um tópico ou nicho específico.", + "description": "Um curso aprofundado que transforma alunos em especialistas em um tema ou nicho específico.", "form_title": "Conte-nos sobre o tema" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Boa tarde", "evening_heading": "Boa noite", "create_course": "Criar curso", - "view_site": "Ver site", - "visit_site": "Visite o site", + "view_site": "Academia Aberta", + "visit_site": "Academia Aberta", "current_lesson": "Atualmente aprendendo", "your_progress": "Seu progresso", "continue": "Continuar", @@ -2382,7 +2383,7 @@ "publish_course": "Publicar curso", "items_completed": "Itens concluídos", "currently_learning": "Atualmente aprendendo", - "learner": "Aluno", + "learner": "Estudante", "progress": "Progresso", "pick_up_where_you_left_off": "Continue de onde parou", "course_awaits_you": "{title} espera por você", @@ -2402,7 +2403,9 @@ "login_activity_description": "Dias mais ativos da semana (últimos 90 dias)", "login_activity_no_data": "Nenhuma atividade de login ainda", "login_activity_logins": "logins", - "open_academy": "Academia Aberta" + "open_academy": "Academia Aberta", + "explore_more_courses": "Explorar mais cursos", + "view_more": "Ver mais" }, "schedule": { "title": "Sua programação", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Atualize seu plano para personalizar o fundo da tela de login.", "preview_alt": "Prévia do fundo da tela de login" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Escolha quais guias, banners, ferramentas do curso e extras os alunos verão." }, "domains": { "title": "Domínio personalizado", @@ -2479,7 +2482,7 @@ "pending_verification_description": "Registros DNS foram encontrados. A emissão ou validação de SSL ainda está em andamento.", "reconnect_description": "Este domínio precisa ser conectado novamente por meio do novo fluxo de configuração da Cloudflare.", "error_description": "Este domínio personalizado existe, mas a verificação ainda não foi concluída.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Administre sua academia em um endereço da web de sua propriedade.", "dns_record": "Registro DNS", "record_active": "Detectado", "record_pending": "Pendente", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Criar organização", "name": "Nome da Organização", - "org_sitename": "Nome do site da organização", + "org_sitename": "Subdomínio da Academia", "create": "Criar", - "sitename": "O nome do site já existe", + "sitename": "O subdomínio da Academia já existe", "error_organization": "Algo deu errado durante a criação desta organização. Atualize e tente novamente" }, "setup": { @@ -3150,7 +3153,7 @@ "add_theme": "Adicionar tema" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Defina o nome, o logotipo e o tema que os alunos verão para esta organização." }, "profile": { "heading": "Perfil", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Tutor de IA" }, "subheadings": { - "view_site": "Ver site" + "view_site": "Academia Aberta" }, "auth": { "title": "Autenticação", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Permitir inscrições públicas", "description": "Quando desativado, apenas usuários com link de convite poderão se inscrever. Ative para permitir que qualquer pessoa crie uma conta." + }, + "internal_enrollment_only": { + "label": "Somente inscrição interna", + "description": "Quando ativado, qualquer curso publicado fica aberto para autoinscrição para todos os alunos da sua organização. Use com Desativar inscrição para criar uma academia fechada somente para convidados, onde os alunos podem ingressar em qualquer curso publicado sem configuração por curso." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Amigos e família", "fullname": "Nome Completo", "name": "Nome da Organização", - "organisation_sitename": "Nome do site da organização", + "organisation_sitename": "Subdomínio da Academia", "what_brings": "O que leva você a", "how": "Como você ouviu falar de nós?", "back": "Voltar", @@ -4351,7 +4358,7 @@ "heading": "Alunos", "subtitle": "{count, number} correspondente", "empty": "Nenhum aluno corresponde a este filtro", - "learner": "Aluno", + "learner": "Estudante", "course": "Curso", "status": "Estado", "due_date": "Devido", @@ -4359,7 +4366,7 @@ }, "courses": { "heading": "Cursos", - "description": "Cursos de conformidade com contagens de status do aluno", + "description": "Cursos de conformidade com contagens de status de estudante", "empty": "Ainda não há cursos de compliance", "course": "Curso", "learners": "Alunos", @@ -4391,8 +4398,8 @@ "learners": "Alunos" }, "summary": { - "heading": "Status do aluno", - "description": "Conta entre os alunos em todos os cursos de conformidade." + "heading": "Status de estudante", + "description": "Conta entre alunos em todos os cursos de conformidade." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Excluir este espaço de trabalho?", "delete_confirm_body": "Isso remove permanentemente o espaço de trabalho, seus membros e seus cursos. Isto não pode ser desfeito.", "name_label": "Nome do espaço de trabalho", - "site_name_label": "Nome do site", + "site_name_label": "Subdomínio da Academia", "create_modal_title": "Crie um novo espaço de trabalho", "create_modal_submit": "Criar espaço de trabalho", "cancel": "Cancelar", "read_only_badge": "Somente leitura", - "usage_banner": "{learners} alunos e {tokens} tokens de IA usados em {workspaces} espaços de trabalho este mês", + "usage_banner": "{students} alunos e {tokens} tokens de IA usados em {workspaces} espaços de trabalho este mês", "secondary_billing_notice": "A cobrança é gerenciada pelo seu workspace principal ({primaryName}).", "go_to_primary": "Ir para o espaço de trabalho principal" }, @@ -4453,7 +4460,7 @@ "approaching": "Aproximando-se do limite", "totalActive": "Alunos ativos este mês", "learnersHeading": "Alunos", - "headerLearner": "Aluno", + "headerLearner": "Estudante", "headerMessages": "Mensagens", "headerTokens": "Fichas", "headerStatus": "Estado", @@ -4503,11 +4510,11 @@ "welcomeMessage": "Mensagem de boas-vindas", "welcomeMessage_description": "Mostrado acima a primeira resposta do tutor em cada nova conversa.", "disclaimerFooter": "Rodapé de isenção de responsabilidade", - "disclaimerFooter_description": "Anexado a cada resposta do tutor para que os alunos se lembrem de que o tutor não é uma pessoa.", + "disclaimerFooter_description": "Anexado a cada resposta do tutor para que os alunos lembrem que o tutor não é uma pessoa.", "thingsToSay": "Coisas a dizer", - "thingsToSay_description": "Exemplos: \"Sempre lembre os alunos de lerem o plano de estudos antes da semana 3.\" \"Incentive os alunos a resumir as lições com suas próprias palavras.\"", + "thingsToSay_description": "Exemplos: \"Sempre lembre os alunos de lerem o programa antes da semana 3.\" \"Incentive os alunos a resumir as lições com suas próprias palavras.\"", "thingsNotToSay": "Coisas para não dizer", - "thingsNotToSay_description": "Exemplos: “Não revele as respostas do exame final”. \"Nunca diga aos alunos qual avaliação você escreveu.\"", + "thingsNotToSay_description": "Exemplos: “Não revele as respostas do exame final”. \"Nunca diga aos alunos qual resenha você escreveu.\"", "forbiddenTopics": "Tópicos proibidos", "forbiddenTopics_description": "Lista separada por vírgulas. O tutor se recusará a discutir isso.", "forbiddenTopics_placeholder": "política, religião, aconselhamento médico pessoal", diff --git a/apps/dashboard/src/lib/utils/translations/ru.json b/apps/dashboard/src/lib/utils/translations/ru.json index 3b525a7e..ec0bd4a8 100644 --- a/apps/dashboard/src/lib/utils/translations/ru.json +++ b/apps/dashboard/src/lib/utils/translations/ru.json @@ -104,8 +104,8 @@ "min_char": "Поле должно содержать 5 или более символов" }, "site_name": { - "min_char": "Название сайта должно содержать 5 или более символов.", - "hyphen_rule": "Имя сайта не может начинаться или заканчиваться дефисом." + "min_char": "Субдомен Академии должен содержать 5 или более символов.", + "hyphen_rule": "Субдомен Академии не может начинаться или заканчиваться дефисом." }, "organization_name": { "min_char": "Организация должна содержать 5 или более символов.", @@ -457,7 +457,8 @@ "not_in_progress": "Курс не ведется", "any_progress": "Здесь будет отображаться любой курс, который вы начинаете.", "not_completed": "Ни один курс не завершен", - "any_course": "Здесь будут отображаться все пройденные вами курсы." + "any_course": "Здесь будут отображаться все пройденные вами курсы.", + "find_courses": "Найти курсы" }, "lms_navigation": { "home": "Главная", @@ -538,7 +539,7 @@ "loading_chart": "Загрузка диаграммы...", "no_data_default": "Нет доступных данных", "no_data_default_description": "В настоящее время нет данных для отображения.", - "subtitle": "Узнайте, как посетители находят ваши курсы и превращаются в учеников.", + "subtitle": "Узнайте, как посетители находят ваши курсы и превращаются в студентов.", "refresh": "Обновить", "popularTypes": { "heading": "Популярные типы курсов", @@ -600,9 +601,9 @@ }, "course_metrics": { "page_subtitle": "Зачисление, завершение уроков, оценки и прогресс каждого учащегося по этому курсу.", - "progress_distribution_card_description": "Сколько учащихся попадает в каждую группу завершения.", - "grade_distribution_card_description": "Сколько учащихся попадает в каждую группу классов.", - "students_table_description": "Сортируемый обзор со ссылками на профили учащихся.", + "progress_distribution_card_description": "Сколько студентов попадает в каждую группу завершения.", + "grade_distribution_card_description": "Сколько учеников попадает в каждую группу классов.", + "students_table_description": "Сортируемый обзор со ссылками на профили студентов.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} сопоставлено с уроками", "kpi_progress_grade": "{grade} % средняя оценка за упражнения среди зачисленных учащихся" @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Профиль студента", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -780,7 +781,7 @@ }, "callout": { "legend": "Уведомление об общедоступном курсе", - "description": "Отображается внизу каждого урока вместо заблокированных элементов. Используйте его, чтобы привлечь учащихся на ваш сайт или на платный курс.", + "description": "Отображается внизу каждого урока вместо заблокированных элементов. Используйте его, чтобы привлечь студентов на ваш сайт или на платный курс.", "title_label": "Название", "title_placeholder": "Хотите углубиться в это?", "description_label": "Описание", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Отправляйте приглашения по электронной почте немедленно", "create_email_invites": "Создание приглашений по электронной почте", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Выберите студентов, уже обучающихся в этой организации, и предоставьте им прямой доступ к этому курсу.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1505,8 +1506,8 @@ "add_button": "Добавить ссылку" }, "edit": { - "instructions_placeholder": "Дополнительные инструкции для учащихся", - "helper": "Учащиеся могут предоставить один или несколько действительных URL-адресов (http/https)." + "instructions_placeholder": "Дополнительные инструкции для студентов", + "helper": "Студенты могут отправить один или несколько действительных URL-адресов (http/https)." } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Правильное значение", - "correct_value_info": "Ожидаемый числовой ответ должен быть представлен учащимся, чтобы быть отмеченным как правильный.", + "correct_value_info": "Ожидаемый числовой ответ должен быть представлен учащимися, чтобы быть отмеченным как правильный.", "tolerance_label": "Толерантность", "tolerance_info": "Допустимое отклонение от правильного значения (например, 0,5 принимает +/-0,5).", "correct_value_placeholder": "Правильное значение", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "Правильное значение звезды", - "correct_value_info": "Учащиеся со звездным подсчетом должны выбрать, чтобы заработать полные баллы.", + "correct_value_info": "Учащиеся, получившие звездный подсчет, должны выбрать, чтобы заработать полные баллы.", "max_stars_label": "Максимум звезд", - "max_stars_info": "Сколько звезд видят учащиеся (1–10). По умолчанию — 5.", + "max_stars_info": "Сколько звездочек видят ученики (1–10). По умолчанию — 5.", "correct_value_placeholder": "например 3", "max_stars_placeholder": "например 5" } @@ -2039,15 +2040,15 @@ "not_compliance_title": "Соответствие не включено", "not_compliance_description": "Этот курс не настроен как курс соответствия.", "loading": "Загрузка записей о соответствии...", - "learners": "Учащиеся", - "learners_description": "В этой таблице показан последний цикл для каждого учащегося.", + "learners": "Студенты", + "learners_description": "В этой таблице показан последний цикл для каждого студента.", "current_cycle": "Текущий цикл", "current_cycle_description": "Ваш активный цикл соответствия и даты продления.", "history": "Прошлые циклы", "history_description": "Каждая строка представляет собой один записанный цикл соответствия для этого курса.", "no_active_cycle": "Нет активного цикла соответствия", "empty_history": "История соответствия еще не зарегистрирована.", - "empty_overview": "Записей о соблюдении требований учащимися пока нет.", + "empty_overview": "Никаких записей о соблюдении требований студентами пока нет.", "not_available": "Недоступно", "status": { "no_record": "Нет записи", @@ -2060,7 +2061,7 @@ "waived": "Отказано" }, "summary": { - "total_learners": "Всего учащихся", + "total_learners": "Всего студентов", "no_record": "Нет записи", "not_started": "Не запущено", "in_progress": "В процессе", @@ -2071,7 +2072,7 @@ "waived": "Отказано" }, "fields": { - "learner": "Учащийся", + "learner": "Студент", "email": "электронная почта", "status": "Статус", "cycle": "Цикл", @@ -2091,26 +2092,26 @@ "due_date_helper": "Используется для действий сброса и продления.", "reset_action": "Сброс цикла", "extend_action": "Продлить срок выполнения", - "waive_title": "Отказаться от участия выбранных учащихся", - "waive_description": "Примените отказ к выбранным учащимся. Вы можете оставить срок действия пустым для бессрочного отказа.", + "waive_title": "Отказаться от выбранных студентов", + "waive_description": "Применить отказ к выбранным учащимся. Вы можете оставить срок действия пустым для бессрочного отказа.", "waiver_reason_label": "Причина отказа", "waiver_reason_helper": "Дополнительный контекст для аудитов и будущих проверок.", "waiver_expires_at_label": "Отказ истекает в", "waiver_expires_at_helper": "Оставьте пустым, если срок действия отказа не истекает автоматически.", "waive_action": "Применить отказ", "modal": { - "description": "Вы обновляете {count} выбранных учащихся.", + "description": "Вы обновляете выбранных студентов: {count}.", "cancel": "Отмена", "apply": "Применить действие" } }, "tabs": { "overview": "Обзор", - "learners": "Учащиеся" + "learners": "Студенты" }, "overview_metrics": { "heading": "Снимок курса", - "description": "Учащиеся учитываются по статусу для этого курса." + "description": "Студенты учитываются по статусу для этого курса." }, "empty_overview_description": "Следите за тем, чтобы ваши сотрудники соблюдали требования и отслеживали, кто отстает." } @@ -2214,7 +2215,7 @@ "product_name": "Название продукта", "product_summary": "Что делает продукт?", "audience": "Кто аудитория?", - "outcome": "Что должны уметь учащиеся после курса?", + "outcome": "Что должны уметь студенты после курса?", "depth": "Насколько глубоким должен быть курс?", "topic": "Тема или ниша", "expertise_level": "Целевой уровень экспертизы", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Станьте экспертом по X", - "description": "Углубленный курс, превращающий учащихся в экспертов по определенной теме или нише.", + "description": "Углубленный курс, превращающий студентов в экспертов по определенной теме или нише.", "form_title": "Расскажите нам о теме" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Добрый день", "evening_heading": "Добрый вечер", "create_course": "Создать курс", - "view_site": "Посмотреть сайт", - "visit_site": "Посетите веб-сайт", + "view_site": "Открытая Академия", + "visit_site": "Открытая Академия", "current_lesson": "В настоящее время учусь", "your_progress": "Ваш прогресс", "continue": "Продолжить", @@ -2382,7 +2383,7 @@ "publish_course": "Опубликовать курс", "items_completed": "Объекты завершены", "currently_learning": "В настоящее время учусь", - "learner": "Учащийся", + "learner": "Студент", "progress": "Прогресс", "pick_up_where_you_left_off": "Продолжайте с того места, где вы остановились", "course_awaits_you": "{title} ждет вас", @@ -2402,7 +2403,9 @@ "login_activity_description": "Самые активные дни недели (последние 90 дней)", "login_activity_no_data": "Пока нет активности входа", "login_activity_logins": "логины", - "open_academy": "Открытая Академия" + "open_academy": "Открытая Академия", + "explore_more_courses": "Ознакомьтесь с другими курсами", + "view_more": "Посмотреть больше" }, "schedule": { "title": "Ваше расписание", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Обновите тарифный план, чтобы настроить фон экрана входа.", "preview_alt": "Предпросмотр фона экрана входа" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Выбирайте, какие вкладки, баннеры, инструменты курса и дополнительные материалы будут видеть учащиеся." }, "domains": { "title": "Пользовательский домен", @@ -2479,7 +2482,7 @@ "pending_verification_description": "DNS-записи были найдены. Выдача или проверка SSL все еще продолжается.", "reconnect_description": "Этот домен необходимо снова подключить с помощью нового процесса настройки Cloudflare.", "error_description": "Этот личный домен существует, но проверка еще не завершена.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Управляйте своей академией на принадлежащем вам веб-адресе.", "dns_record": "DNS-запись", "record_active": "Обнаружено", "record_pending": "Ожидается", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Создать организацию", "name": "Название организации", - "org_sitename": "Название сайта организации", + "org_sitename": "Поддомен Академии", "create": "Создать", - "sitename": "Название сайта уже существует", + "sitename": "Поддомен Академии уже существует", "error_organization": "Что-то пошло не так при создании этой организации. Пожалуйста, перезагрузите компьютер и попробуйте еще раз" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "Удалить статистику", "label_field": "Этикетка", "value_field": "Значение", - "label_placeholder": "Активные ученики", + "label_placeholder": "Активные студенты", "value_placeholder": "1200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "Добавить тему" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Установите название, логотип и тему этой организации, которую будут видеть учащиеся." }, "profile": { "heading": "Профиль", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Репетитор по искусственному интеллекту" }, "subheadings": { - "view_site": "Посмотреть сайт" + "view_site": "Открытая Академия" }, "auth": { "title": "Аутентификация", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Разрешить публичную регистрацию", "description": "Если этот параметр отключен, зарегистрироваться смогут только пользователи, у которых есть ссылка для приглашения. Включите, чтобы любой мог создать учетную запись." + }, + "internal_enrollment_only": { + "label": "Только внутренняя регистрация", + "description": "Если этот параметр включен, любой опубликованный курс открыт для самостоятельного зачисления всем учащимся в вашей организации. Используйте с отключением регистрации, чтобы создать закрытую академию, доступную только по приглашению, где учащиеся могут присоединиться к любому опубликованному курсу без настройки для каждого курса." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Друзья и семья", "fullname": "Полное имя", "name": "Название организации", - "organisation_sitename": "Название сайта организации", + "organisation_sitename": "Поддомен Академии", "what_brings": "Что привело вас к", "how": "Как вы узнали о нас?", "back": "Назад", @@ -3874,7 +3881,7 @@ "created": "Цель создана", "updated": "Цель обновлена", "deleted": "Цель удалена", - "delete_confirm": "Удалить эту цель? История статусов каждого учащегося будет удалена.", + "delete_confirm": "Удалить эту цель? История статуса каждого учащегося будет удалена.", "lms": { "heading": "Ваши цели", "empty_title": "Цели не назначены", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "Абсолютная дата", - "relative_to_join": "Относительно присоединения учащегося", + "relative_to_join": "Относительно присоединения студента", "recurring": "повторяющийся", "none": "Нет срока" }, @@ -3926,7 +3933,7 @@ "team_pass_rate_label": "Процент проходов команды (%)", "deadline_label": "Крайний срок", "deadline_date_label": "Крайний срок", - "relative_days_label": "Дни с момента присоединения учащегося", + "relative_days_label": "Дни с момента присоединения студента", "recurring_months_label": "Повторять каждые (месяцев)", "reminders_label": "Напоминания (за несколько дней до наступления срока)", "reminders_helper": "Через запятую. Пример: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Соответствие", "subtitle": "Отслеживайте статус сертификации по каждому курсу соответствия в вашей организации.", "learners": { - "heading": "Учащиеся", + "heading": "Студенты", "subtitle": "{count, number} совпадение", - "empty": "Ни один учащийся не соответствует этому фильтру", - "learner": "Учащийся", + "empty": "Нет студентов, соответствующих этому фильтру", + "learner": "Студент", "course": "Курс", "status": "Статус", "due_date": "Срок погашения", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Курсы", - "description": "Курсы соответствия с подсчетом статуса учащегося", + "description": "Курсы соответствия с подсчетом статуса студента", "empty": "Курсов соответствия пока нет", "course": "Курс", - "learners": "Учащиеся", + "learners": "Студенты", "completion": "Завершение" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "По курсу", - "learners": "Учащиеся" + "learners": "Студенты" }, "summary": { - "heading": "Статус учащегося", - "description": "Имеет значение для учащихся на всех курсах по соблюдению требований." + "heading": "Статус студента", + "description": "Учитывается среди студентов на всех курсах соответствия." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Удалить это рабочее пространство?", "delete_confirm_body": "При этом рабочая область, ее участники и курсы будут удалены без возможности восстановления. Это невозможно отменить.", "name_label": "Имя рабочей области", - "site_name_label": "Название сайта", + "site_name_label": "Поддомен Академии", "create_modal_title": "Создать новое рабочее пространство", "create_modal_submit": "Создать рабочую область", "cancel": "Отмена", "read_only_badge": "Только чтение", - "usage_banner": "Учащиеся: {learners} и токены AI ({tokens}), использованные в рабочих пространствах {workspaces} в этом месяце", + "usage_banner": "Учащиеся: {students} и токены искусственного интеллекта ({tokens}) использовались в рабочих пространствах {workspaces} в этом месяце.", "secondary_billing_notice": "Платежи управляются вашим основным рабочим пространством ({primaryName}).", "go_to_primary": "Перейти в основное рабочее пространство" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "Репетитор по искусственному интеллекту, добросовестное использование", "atCap": "В кепке", "approaching": "Приближаемся к шапке", - "totalActive": "Активные ученики в этом месяце", - "learnersHeading": "Учащиеся", - "headerLearner": "Учащийся", + "totalActive": "Активные студенты в этом месяце", + "learnersHeading": "Студенты", + "headerLearner": "Студент", "headerMessages": "Сообщения", "headerTokens": "Токены", "headerStatus": "Статус", @@ -4505,9 +4512,9 @@ "disclaimerFooter": "Нижний колонтитул об отказе от ответственности", "disclaimerFooter_description": "Прилагается к каждому ответу репетитора, чтобы учащиеся помнили, что репетитор — не человек.", "thingsToSay": "Что сказать", - "thingsToSay_description": "Примеры: «Всегда напоминайте учащимся, чтобы они прочитали учебную программу до третьей недели». «Поощряйте учащихся обобщать уроки своими словами».", + "thingsToSay_description": "Примеры: «Всегда напоминайте учащимся, чтобы они прочитали учебную программу до третьей недели». «Поощряйте учащихся подводить итоги урока своими словами».", "thingsNotToSay": "Вещи, которые не следует говорить", - "thingsNotToSay_description": "Примеры: «Не раскрывайте ответы на выпускном экзамене». «Никогда не сообщайте учащимся, какой отзыв вы написали».", + "thingsNotToSay_description": "Примеры: «Не раскрывайте ответы на выпускном экзамене». «Никогда не сообщайте студентам, какой отзыв вы написали».", "forbiddenTopics": "Запрещенные темы", "forbiddenTopics_description": "Список, разделенный запятыми. Преподаватель откажется обсуждать это.", "forbiddenTopics_placeholder": "политика, религия, персональные медицинские консультации", @@ -4535,7 +4542,7 @@ "grounding": "Обоснование и цитаты", "grounding_description": "Ограничьте то, о чем может говорить преподаватель и цитирует ли он материалы курса.", "escalation": "Эскалация", - "escalation_description": "Куда указать учащимся, когда им нужен настоящий человек.", + "escalation_description": "Куда указать ученикам, когда им нужен настоящий человек.", "inheritance": "Наследование курса", "inheritance_description": "Наследуйте настройки рабочей области по умолчанию или установите переопределения для каждого курса." }, diff --git a/apps/dashboard/src/lib/utils/translations/vi.json b/apps/dashboard/src/lib/utils/translations/vi.json index cc3dfea8..ec7e40bb 100644 --- a/apps/dashboard/src/lib/utils/translations/vi.json +++ b/apps/dashboard/src/lib/utils/translations/vi.json @@ -104,8 +104,8 @@ "min_char": "Trường phải chứa 5 ký tự trở lên" }, "site_name": { - "min_char": "Tên trang web phải chứa 5 ký tự trở lên", - "hyphen_rule": "Tên trang web không thể bắt đầu hoặc kết thúc bằng dấu gạch nối" + "min_char": "Tên miền phụ của Học viện phải chứa 5 ký tự trở lên", + "hyphen_rule": "Tên miền phụ của Học viện không thể bắt đầu hoặc kết thúc bằng dấu gạch nối" }, "organization_name": { "min_char": "Tổ chức phải chứa 5 ký tự trở lên", @@ -457,7 +457,8 @@ "not_in_progress": "Không có khóa học nào đang diễn ra", "any_progress": "Bất kỳ khóa học nào bạn bắt đầu sẽ được hiển thị ở đây", "not_completed": "Không có khóa học nào hoàn thành", - "any_course": "Bất kỳ khóa học nào bạn hoàn thành sẽ được hiển thị ở đây" + "any_course": "Bất kỳ khóa học nào bạn hoàn thành sẽ được hiển thị ở đây", + "find_courses": "Tìm khóa học" }, "lms_navigation": { "home": "Trang chủ", @@ -538,7 +539,7 @@ "loading_chart": "Đang tải biểu đồ...", "no_data_default": "Không có sẵn dữ liệu", "no_data_default_description": "Không có dữ liệu để hiển thị tại thời điểm này.", - "subtitle": "Hiểu cách khách truy cập khám phá các khóa học của bạn và chuyển đổi thành người học.", + "subtitle": "Hiểu cách khách truy cập khám phá các khóa học của bạn và chuyển đổi thành sinh viên.", "refresh": "Làm mới", "popularTypes": { "heading": "Các loại khóa học phổ biến", @@ -599,13 +600,13 @@ "course_types": "Các loại khóa học" }, "course_metrics": { - "page_subtitle": "Việc đăng ký, hoàn thành bài học, điểm số và tiến độ của mỗi người học đối với khóa học này.", - "progress_distribution_card_description": "Có bao nhiêu người học rơi vào từng mức độ hoàn thành.", + "page_subtitle": "Việc ghi danh, hoàn thành bài học, điểm số và sự tiến bộ của mỗi học sinh đối với khóa học này.", + "progress_distribution_card_description": "Có bao nhiêu học sinh rơi vào mỗi mức độ hoàn thành.", "grade_distribution_card_description": "Có bao nhiêu học sinh rơi vào từng nhóm lớp.", - "students_table_description": "Tổng quan có thể sắp xếp với các liên kết đến hồ sơ người học.", + "students_table_description": "Tổng quan có thể sắp xếp với các liên kết đến hồ sơ sinh viên.", "kpi_team_tutors": "{count, plural, one {# tutor on the course team} other {# tutors on the course team}}", "kpi_lessons_exercises": "{count, plural, one {# exercise} other {# exercises}} được ánh xạ tới bài học", - "kpi_progress_grade": "{grade}% điểm bài tập trung bình của những người học đã đăng ký" + "kpi_progress_grade": "{grade}% điểm bài tập trung bình của các học sinh đã đăng ký" } }, "audience": { @@ -672,7 +673,7 @@ }, "page_subtitle": "See who belongs to your org, who is learning, who is invited, and how to reach them.", "user_analytics": { - "title": "Learner profile", + "title": "Hồ sơ sinh viên", "page_subtitle": "Progress, grades, and activity across their courses." } }, @@ -762,7 +763,7 @@ "save": "Lưu thay đổi", "tags": { "title": "Thẻ", - "description": "Gán thẻ để người học có thể khám phá khóa học này bằng các bộ lọc.", + "description": "Gán thẻ để sinh viên có thể khám phá khóa học này bằng các bộ lọc.", "empty": "Không có thẻ nào được chọn", "add": "Thêm thẻ", "popover_title": "Chọn thẻ", @@ -780,7 +781,7 @@ }, "callout": { "legend": "Chú thích khóa học công khai", - "description": "Hiển thị ở cuối mỗi bài học và thay cho các đồ vật bị khóa. Sử dụng nó để thu hút người học đến trang web của bạn hoặc một khóa học trả phí.", + "description": "Hiển thị ở cuối mỗi bài học và thay cho các đồ vật bị khóa. Sử dụng nó để thu hút sinh viên đến trang web của bạn hoặc một khóa học trả phí.", "title_label": "Tiêu đề", "title_placeholder": "Bạn muốn đi sâu hơn về điều này?", "description_label": "Mô tả", @@ -1102,7 +1103,7 @@ "send_invite_emails": "Gửi email mời ngay lập tức", "create_email_invites": "Tạo lời mời qua email", "existing_students_title": "Add existing org students", - "existing_students_description": "Choose student members already in this organization and grant them direct access to this course.", + "existing_students_description": "Chọn những sinh viên đã tham gia tổ chức này và cấp cho họ quyền truy cập trực tiếp vào khóa học này.", "existing_students_search": "Search organization students", "loading_existing_students": "Loading organization students...", "no_existing_students": "No organization students are available to add.", @@ -1442,7 +1443,7 @@ "range_error": "Answer must be between {min} and {max} characters." }, "edit": { - "placeholder": "Người học sẽ trả lời bằng văn bản dài", + "placeholder": "Học sinh sẽ trả lời bằng văn bản dài", "min_characters_label": "Minimum characters", "min_characters_placeholder": "Minimum characters", "max_characters_label": "Maximum characters", @@ -1505,8 +1506,8 @@ "add_button": "Thêm liên kết" }, "edit": { - "instructions_placeholder": "Hướng dẫn tùy chọn cho người học", - "helper": "Người học có thể gửi một hoặc nhiều URL hợp lệ (http/https)." + "instructions_placeholder": "Hướng dẫn tùy chọn cho học sinh", + "helper": "Học sinh có thể gửi một hoặc nhiều URL hợp lệ (http/https)." } }, "file_upload": { @@ -1551,7 +1552,7 @@ }, "edit": { "correct_value_label": "Giá trị đúng", - "correct_value_info": "Câu trả lời bằng số dự kiến người học phải nộp để được đánh dấu là đúng.", + "correct_value_info": "Câu trả lời bằng số dự kiến ​​mà học sinh phải nộp để được đánh dấu là đúng.", "tolerance_label": "Dung sai", "tolerance_info": "Chênh lệch được phép so với giá trị chính xác (ví dụ: 0,5 chấp nhận +/- 0,5).", "correct_value_placeholder": "Giá trị đúng", @@ -1659,7 +1660,7 @@ "edit": { "template_label": "Mẫu câu", "template_placeholder": "Các phép đo để mô tả dữ liệu của chúng tôi được gọi là ___. ___ là một hàm...", - "template_helper": "Sử dụng ba dấu gạch dưới (___) cho mỗi chỗ trống. Người học sẽ thấy một ngân hàng từ có câu trả lời đúng và các từ gây phân tâm.", + "template_helper": "Sử dụng ba dấu gạch dưới (___) cho mỗi chỗ trống. Học sinh sẽ thấy một ngân hàng từ có câu trả lời đúng và các từ gây phân tâm.", "no_blanks_warning": "Thêm ít nhất một điểm đánh dấu trống ___ vào mẫu của bạn.", "correct_answers_heading": "Câu trả lời đúng cho mỗi chỗ trống", "blank_label": "trống", @@ -1679,9 +1680,9 @@ }, "edit": { "correct_value_label": "Giá trị sao chính xác", - "correct_value_info": "Người học đếm sao phải chọn để đạt được điểm tối đa.", + "correct_value_info": "Số sao mà học sinh phải chọn để đạt được điểm tối đa.", "max_stars_label": "Số sao tối đa", - "max_stars_info": "Người học nhìn thấy bao nhiêu ngôi sao (1–10). Mặc định là 5.", + "max_stars_info": "Học sinh nhìn thấy bao nhiêu ngôi sao (1–10). Mặc định là 5.", "correct_value_placeholder": "ví dụ: 3", "max_stars_placeholder": "ví dụ: 5" } @@ -1698,7 +1699,7 @@ }, "preview": { "max_duration_label": "Thời lượng tối đa", - "manual_grading": "Người học ghi lại một đoạn video ngắn phản hồi. Yêu cầu phân loại thủ công." + "manual_grading": "Học sinh ghi lại một đoạn video ngắn phản hồi. Yêu cầu phân loại thủ công." }, "take": { "unsupported": "Quay video không được hỗ trợ trong trình duyệt này.", @@ -2039,15 +2040,15 @@ "not_compliance_title": "Tuân thủ chưa được kích hoạt", "not_compliance_description": "Khóa học này không được cấu hình như một khóa học tuân thủ.", "loading": "Đang tải hồ sơ tuân thủ...", - "learners": "Người học", - "learners_description": "Bảng này hiển thị chu kỳ mới nhất cho mỗi người học.", + "learners": "Sinh viên", + "learners_description": "Bảng này hiển thị chu kỳ mới nhất cho mỗi học sinh.", "current_cycle": "Chu kỳ hiện tại", "current_cycle_description": "Chu kỳ tuân thủ hiện hoạt và ngày gia hạn của bạn.", "history": "Chu kỳ trước", "history_description": "Mỗi hàng là một chu kỳ tuân thủ được ghi lại cho khóa học này.", "no_active_cycle": "Không có chu kỳ tuân thủ tích cực", "empty_history": "Chưa có lịch sử tuân thủ nào được ghi lại.", - "empty_overview": "Chưa có hồ sơ tuân thủ của người học.", + "empty_overview": "Chưa có hồ sơ tuân thủ của học sinh.", "not_available": "Không có sẵn", "status": { "no_record": "Không có hồ sơ", @@ -2060,7 +2061,7 @@ "waived": "Miễn trừ" }, "summary": { - "total_learners": "Tổng số người học", + "total_learners": "Tổng số học sinh", "no_record": "Không có hồ sơ", "not_started": "Chưa bắt đầu", "in_progress": "Đang tiến hành", @@ -2071,7 +2072,7 @@ "waived": "Miễn trừ" }, "fields": { - "learner": "Người học", + "learner": "sinh viên", "email": "Email", "status": "Trạng thái", "cycle": "chu kỳ", @@ -2083,34 +2084,34 @@ }, "bulk_actions": { "title": "Hành động hàng loạt", - "description": "Chọn người học và áp dụng hành động tuân thủ cho chu kỳ hiện tại của họ.", - "select_all": "Chọn tất cả những người học có thể nhìn thấy", + "description": "Chọn sinh viên và áp dụng hành động tuân thủ cho chu kỳ hiện tại của họ.", + "select_all": "Chọn tất cả học sinh có thể nhìn thấy", "selected_count": "đã chọn {count}", "clear_selection": "Xóa lựa chọn", "due_date_label": "Ngày đến hạn", "due_date_helper": "Được sử dụng để thiết lập lại và mở rộng hành động.", "reset_action": "Đặt lại chu kỳ", "extend_action": "Gia hạn ngày đáo hạn", - "waive_title": "Từ bỏ những người học đã chọn", - "waive_description": "Áp dụng sự miễn trừ cho những người học đã chọn. Bạn có thể để trống thời hạn hết hạn đối với quyền miễn trừ có thời hạn.", + "waive_title": "Từ bỏ những học sinh được chọn", + "waive_description": "Áp dụng sự miễn trừ cho các sinh viên được chọn. Bạn có thể để trống thời hạn hết hạn đối với quyền miễn trừ có thời hạn.", "waiver_reason_label": "Lý do miễn trừ", "waiver_reason_helper": "Bối cảnh tùy chọn cho việc kiểm tra và xem xét trong tương lai.", "waiver_expires_at_label": "Miễn trừ hết hạn vào", "waiver_expires_at_helper": "Để trống nếu quyền miễn trừ không tự động hết hạn.", "waive_action": "Áp dụng miễn trừ", "modal": { - "description": "Bạn đang cập nhật {count} học viên đã chọn.", + "description": "Bạn đang cập nhật {count} học sinh đã chọn.", "cancel": "Hủy bỏ", "apply": "Áp dụng hành động" } }, "tabs": { "overview": "Tổng quan", - "learners": "Người học" + "learners": "Sinh viên" }, "overview_metrics": { "heading": "Ảnh chụp nhanh khóa học", - "description": "Người học đếm theo trạng thái cho khóa học này." + "description": "Số lượng sinh viên theo trạng thái cho khóa học này." }, "empty_overview_description": "Giúp nhân viên của bạn luôn tuân thủ và theo dõi xem ai đứng sau." } @@ -2214,7 +2215,7 @@ "product_name": "Tên sản phẩm", "product_summary": "Sản phẩm có tác dụng gì?", "audience": "Khán giả là ai?", - "outcome": "Người học có thể làm được gì sau khóa học?", + "outcome": "Học viên có thể làm được gì sau khóa học?", "depth": "Khóa học nên đi sâu đến mức nào?", "topic": "Chủ đề hoặc niche", "expertise_level": "Mục tiêu trình độ chuyên môn", @@ -2225,7 +2226,7 @@ }, "expert_on_x": { "title": "Trở thành chuyên gia về X", - "description": "Một khóa học chuyên sâu biến người học thành chuyên gia về một chủ đề hoặc lĩnh vực cụ thể.", + "description": "Một khóa học chuyên sâu biến sinh viên thành chuyên gia về một chủ đề hoặc lĩnh vực cụ thể.", "form_title": "Hãy cho chúng tôi biết về chủ đề" }, "product_onboarding": { @@ -2348,8 +2349,8 @@ "afternoon_heading": "Chào buổi chiều", "evening_heading": "Chào buổi tối", "create_course": "Tạo khóa học", - "view_site": "Xem trang web", - "visit_site": "Truy cập trang web", + "view_site": "Học viện mở", + "visit_site": "Học viện mở", "current_lesson": "Hiện đang học", "your_progress": "Sự tiến bộ của bạn", "continue": "Tiếp tục", @@ -2382,7 +2383,7 @@ "publish_course": "Xuất bản khóa học", "items_completed": "Các hạng mục đã hoàn thành", "currently_learning": "Hiện đang học", - "learner": "Người học", + "learner": "sinh viên", "progress": "Tiến độ", "pick_up_where_you_left_off": "Tiếp tục nơi bạn đã dừng lại", "course_awaits_you": "{title} đang chờ bạn", @@ -2402,7 +2403,9 @@ "login_activity_description": "Những ngày hoạt động tích cực nhất trong tuần (90 ngày qua)", "login_activity_no_data": "Chưa có hoạt động đăng nhập", "login_activity_logins": "thông tin đăng nhập", - "open_academy": "Học viện mở" + "open_academy": "Học viện mở", + "explore_more_courses": "Khám phá thêm các khóa học", + "view_more": "Xem thêm" }, "schedule": { "title": "Lịch trình của bạn", @@ -2444,7 +2447,7 @@ "paid_plan_note": "Nâng cấp gói để tùy chỉnh nền màn hình đăng nhập.", "preview_alt": "Xem trước nền màn hình đăng nhập" }, - "page_subtitle": "Choose which tabs, banners, course tools, and extras learners see." + "page_subtitle": "Chọn các tab, biểu ngữ, công cụ khóa học và các tính năng bổ sung mà học viên sẽ thấy." }, "domains": { "title": "Miền tùy chỉnh", @@ -2479,7 +2482,7 @@ "pending_verification_description": "Bản ghi DNS đã được tìm thấy. Việc cấp hoặc xác thực SSL vẫn đang được tiến hành.", "reconnect_description": "Miền này cần được kết nối lại thông qua quy trình thiết lập Cloudflare mới.", "error_description": "Miền tùy chỉnh này tồn tại nhưng quá trình xác minh chưa hoàn tất.", - "page_subtitle": "Run your public learning site on a web address you own.", + "page_subtitle": "Điều hành học viện của bạn trên địa chỉ web mà bạn sở hữu.", "dns_record": "bản ghi DNS", "record_active": "Đã phát hiện", "record_pending": "Đang chờ xử lý", @@ -2544,9 +2547,9 @@ "add_org": { "create_org": "Tạo tổ chức", "name": "Tên tổ chức", - "org_sitename": "Tên trang web của tổ chức", + "org_sitename": "Tên miền phụ của học viện", "create": "Tạo", - "sitename": "Tên trang web đã tồn tại", + "sitename": "Tên miền phụ của học viện đã tồn tại", "error_organization": "Đã xảy ra lỗi khi tạo tổ chức này. Vui lòng tải lại và thử lại" }, "setup": { @@ -2985,7 +2988,7 @@ "remove": "Xóa chỉ số", "label_field": "Nhãn", "value_field": "Giá trị", - "label_placeholder": "Người học tích cực", + "label_placeholder": "Sinh viên năng động", "value_placeholder": "1.200" } }, @@ -3150,7 +3153,7 @@ "add_theme": "Thêm chủ đề" } }, - "page_subtitle": "Set the name, logo, and theme learners see for this organization." + "page_subtitle": "Đặt tên, logo và chủ đề mà học sinh thấy cho tổ chức này." }, "profile": { "heading": "Hồ sơ", @@ -3192,7 +3195,7 @@ "ai_tutor_tab": "Gia sư AI" }, "subheadings": { - "view_site": "Xem trang web" + "view_site": "Học viện mở" }, "auth": { "title": "Xác thực", @@ -3278,6 +3281,10 @@ "allow_public_signups": { "label": "Cho phép đăng ký công khai", "description": "Khi bị tắt, chỉ những người dùng có liên kết mời mới có thể đăng ký. Enable để cho phép mọi người tạo tài khoản." + }, + "internal_enrollment_only": { + "label": "Chỉ đăng ký nội bộ", + "description": "Khi được bật, mọi khóa học đã xuất bản đều có thể tự đăng ký cho tất cả sinh viên trong tổ chức của bạn. Sử dụng tính năng Tắt đăng ký để tạo học viện khép kín, chỉ dành cho người được mời, nơi sinh viên có thể tham gia bất kỳ khóa học đã xuất bản nào mà không cần thiết lập mỗi khóa học." } }, "login": { @@ -3459,7 +3466,7 @@ "friends": "Bạn bè và gia đình", "fullname": "Tên đầy đủ", "name": "Tên tổ chức", - "organisation_sitename": "Tên trang web của tổ chức", + "organisation_sitename": "Tên miền phụ của học viện", "what_brings": "Điều gì đưa bạn đến", "how": "Bạn biết đến chúng tôi bằng cách nào?", "back": "Quay lại", @@ -3874,7 +3881,7 @@ "created": "Đã tạo mục tiêu", "updated": "Đã cập nhật mục tiêu", "deleted": "Đã xóa mục tiêu", - "delete_confirm": "Xóa mục tiêu này? Lịch sử trạng thái của mỗi người học sẽ bị xóa.", + "delete_confirm": "Xóa mục tiêu này? Lịch sử trạng thái của mỗi học sinh sẽ bị xóa.", "lms": { "heading": "Mục tiêu của bạn", "empty_title": "Không có mục tiêu nào được giao", @@ -3901,7 +3908,7 @@ }, "deadline_kind": { "absolute": "Ngày tuyệt đối", - "relative_to_join": "Liên quan đến việc người học tham gia", + "relative_to_join": "Liên quan đến việc sinh viên tham gia", "recurring": "Định kỳ", "none": "Không có thời hạn" }, @@ -3922,11 +3929,11 @@ "type_label": "loại", "courses_label": "Khóa học", "required_count_label": "Số lượng khóa học yêu cầu", - "score_threshold_label": "Điểm đậu của mỗi học viên (%)", + "score_threshold_label": "Điểm đậu của mỗi học sinh (%)", "team_pass_rate_label": "Tỷ lệ vượt qua của đội (%)", "deadline_label": "thời hạn", "deadline_date_label": "Ngày hết hạn", - "relative_days_label": "Ngày kể từ khi người học tham gia", + "relative_days_label": "Ngày kể từ khi học viên tham gia", "recurring_months_label": "Lặp lại mỗi (tháng)", "reminders_label": "Lời nhắc (ngày trước hạn)", "reminders_helper": "Được phân tách bằng dấu phẩy. Ví dụ: 7, 3, 1", @@ -4348,10 +4355,10 @@ "title": "Tuân thủ", "subtitle": "Theo dõi trạng thái chứng nhận trên mọi khóa học tuân thủ trong tổ chức của bạn.", "learners": { - "heading": "Người học", + "heading": "Sinh viên", "subtitle": "{count, number} khớp", - "empty": "Không có người học nào phù hợp với bộ lọc này", - "learner": "Người học", + "empty": "Không có học sinh nào phù hợp với bộ lọc này", + "learner": "sinh viên", "course": "Khóa học", "status": "Trạng thái", "due_date": "Đến hạn", @@ -4359,10 +4366,10 @@ }, "courses": { "heading": "Khóa học", - "description": "Các khóa học tuân thủ với số lượng trạng thái người học", + "description": "Các khóa học tuân thủ về số lượng tình trạng sinh viên", "empty": "Chưa có khóa học tuân thủ nào", "course": "Khóa học", - "learners": "Người học", + "learners": "Sinh viên", "completion": "Hoàn thành" }, "filter": { @@ -4388,11 +4395,11 @@ }, "tabs": { "courses": "Theo khóa học", - "learners": "Người học" + "learners": "Sinh viên" }, "summary": { - "heading": "Tình trạng người học", - "description": "Tính trên số người học trong tất cả các khóa học tuân thủ." + "heading": "Tình trạng sinh viên", + "description": "Đếm số học sinh trong tất cả các khóa học tuân thủ." } }, "public_course": { @@ -4432,12 +4439,12 @@ "delete_confirm_title": "Xóa không gian làm việc này?", "delete_confirm_body": "Thao tác này sẽ xóa vĩnh viễn không gian làm việc, các thành viên và khóa học của không gian làm việc đó. Điều này không thể hoàn tác được.", "name_label": "Tên không gian làm việc", - "site_name_label": "Tên trang web", + "site_name_label": "Tên miền phụ của học viện", "create_modal_title": "Tạo không gian làm việc mới", "create_modal_submit": "Tạo không gian làm việc", "cancel": "Hủy bỏ", "read_only_badge": "Chỉ đọc", - "usage_banner": "{learners} người học và {tokens} Mã thông báo AI được sử dụng trên các không gian làm việc của {workspaces} trong tháng này", + "usage_banner": "{students} sinh viên và {tokens} Mã thông báo AI được sử dụng trên các không gian làm việc của {workspaces} trong tháng này", "secondary_billing_notice": "Việc thanh toán được quản lý bởi không gian làm việc chính của bạn ({primaryName}).", "go_to_primary": "Chuyển đến không gian làm việc chính" }, @@ -4451,9 +4458,9 @@ "tutorSummaryTitle": "Gia sư AI sử dụng hợp lý", "atCap": "Ở mức tối đa", "approaching": "Đang đến gần nắp", - "totalActive": "Người học tích cực trong tháng này", - "learnersHeading": "Người học", - "headerLearner": "Người học", + "totalActive": "Sinh viên năng động trong tháng này", + "learnersHeading": "Sinh viên", + "headerLearner": "sinh viên", "headerMessages": "Tin nhắn", "headerTokens": "Mã thông báo", "headerStatus": "Trạng thái", @@ -4480,7 +4487,7 @@ "assessmentMode": { "hint_only": "Chỉ gợi ý (không có câu trả lời trực tiếp)", "direct_answer": "Cho phép trả lời trực tiếp", - "block_during_exercise": "Chặn trợ giúp khi người học đang làm bài tập" + "block_during_exercise": "Chặn trợ giúp khi học sinh đang làm bài tập" }, "responseLength": { "short": "Ngắn (1–3 câu)", @@ -4503,11 +4510,11 @@ "welcomeMessage": "Tin nhắn chào mừng", "welcomeMessage_description": "Hiển thị ở trên câu trả lời của gia sư đầu tiên trong mỗi cuộc trò chuyện mới.", "disclaimerFooter": "Chân trang từ chối trách nhiệm", - "disclaimerFooter_description": "Được thêm vào mỗi câu trả lời của gia sư để người học nhớ rằng gia sư không phải là một con người.", + "disclaimerFooter_description": "Được thêm vào mỗi câu trả lời của gia sư để học sinh nhớ rằng gia sư không phải là một con người.", "thingsToSay": "Những điều cần nói", - "thingsToSay_description": "Ví dụ: “Luôn nhắc nhở người học đọc giáo trình trước tuần thứ 3”. \"Khuyến khích người học tóm tắt bài học bằng lời lẽ của mình.\"", + "thingsToSay_description": "Ví dụ: “Luôn nhắc học sinh đọc giáo trình trước tuần thứ 3”. “Khuyến khích học sinh tóm tắt bài học bằng lời lẽ của mình.”", "thingsNotToSay": "Những điều không nên nói", - "thingsNotToSay_description": "Ví dụ: \"Đừng tiết lộ câu trả lời cho bài kiểm tra cuối kỳ.\" \"Đừng bao giờ nói cho người học biết bạn đã viết bài đánh giá nào.\"", + "thingsNotToSay_description": "Ví dụ: \"Đừng tiết lộ câu trả lời cho bài kiểm tra cuối kỳ.\" \"Đừng bao giờ nói với học sinh bạn đã viết bài đánh giá nào.\"", "forbiddenTopics": "Chủ đề bị cấm", "forbiddenTopics_description": "Danh sách được phân tách bằng dấu phẩy. Gia sư sẽ từ chối thảo luận về những điều này.", "forbiddenTopics_placeholder": "chính trị, tôn giáo, tư vấn y tế cá nhân", @@ -4525,17 +4532,17 @@ }, "section": { "availability": "sẵn có", - "availability_description": "Bật hoặc tắt gia sư AI cho người học trong không gian làm việc này.", + "availability_description": "Bật hoặc tắt gia sư AI cho học sinh trong không gian làm việc này.", "personality": "Tính cách", "personality_description": "Gia sư giới thiệu bản thân như thế nào và trả lời trong bao lâu.", "guidance": "Điều nên nói · điều không nên nói", "guidance_description": "Hướng dẫn bằng văn bản tự do mà gia sư sẽ tuân theo trong mỗi câu trả lời, cùng với danh sách tùy chọn các chủ đề không được phép.", "assessment": "Bài tập và đánh giá", - "assessment_description": "Cách gia sư cư xử khi học viên yêu cầu giúp đỡ làm một bài tập.", + "assessment_description": "Cách gia sư cư xử khi học sinh yêu cầu giúp đỡ làm bài tập.", "grounding": "Căn cứ & trích dẫn", "grounding_description": "Giới hạn những gì gia sư có thể nói và liệu nó có trích dẫn tài liệu khóa học hay không.", "escalation": "Leo thang", - "escalation_description": "Nơi chỉ điểm cho người học khi họ cần một con người thực sự.", + "escalation_description": "Nơi chỉ điểm cho học sinh khi họ cần một con người thực sự.", "inheritance": "Kế thừa khóa học", "inheritance_description": "Kế thừa các giá trị mặc định của không gian làm việc hoặc đặt phần ghi đè cho mỗi khóa học." }, diff --git a/apps/docs/content/docs/course.mdx b/apps/docs/content/docs/course.mdx index aaf89b16..049525b3 100644 --- a/apps/docs/content/docs/course.mdx +++ b/apps/docs/content/docs/course.mdx @@ -1,10 +1,64 @@ --- title: Course -description: Learn about courses in ClassroomIO. +description: Overview of courses in ClassroomIO — lifecycle, settings, admin areas, and links to detailed guides. --- import { Callout } from 'fumadocs-ui/components/callout'; - - This page is a work in progress. Help us expand it by contributing! +A **course** in ClassroomIO is a container for lessons, exercises, people, and settings. Students enroll into a course to access its content in the LMS. This page summarizes how courses work for admins. For step-by-step setup, start with [Creating Your First Course](/docs/how-to-guides/create-first-course). + +## Course lifecycle + +| State | Meaning | +| --- | --- | +| **Draft / unpublished** | Not visible in Explore or on the public landing page; open self-enrollment is blocked, but invite links still work | +| **Published** | Live on your academy; visible in Explore and on the public landing page | +| **Deleted** | Soft-deleted; no longer appears anywhere in the app | + +Publishing makes a course discoverable. Combine publish state with **Allow New Students**, price, and invites to control who can actually join. See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment). + +## Key settings + +| Setting | Where | Effect | +| --- | --- | --- | +| **Published** | Course **Settings** | Turns the course on for your academy | +| **Allow New Students** | Course **Settings** | Public **Enroll** on the landing page | +| **Price** | **Landing page** editor | Free vs paid enrollment | +| **Course type** | Course **Settings** | Changes nav, compliance, and public access behavior | + + + Self-paced, Live class, Compliance, and Public types change what admins and students see in the app. See [Course Types](/docs/how-to-guides/course-types) for when to use each. + +## Admin areas inside a course + +When you open a course from the **Courses** list, the sidebar gives you: + +| Area | Purpose | +| --- | --- | +| **Content** | Lessons, sections, exercises, media | +| **People** | Members, invites, pending students | +| **Settings** | Publish, Allow New Students, course type, links | +| **Landing page** | Public page prospects see before enrolling | +| **Compliance** | Appears for **Compliance** courses; tracking and bulk actions | +| **Marks** | Appears for **Live class** courses; grading | + +## People and enrollment + +The **People** tab lists everyone in the course group. Members appear when they enroll or when you add them from **Add people**. Email-only invites show as **Pending** until the student signs in. + +Enrollment paths (public, invite link, admin assignment, paid) are documented in [How Course Enrollment Works](/docs/how-to-guides/course-enrollment). For sending invites, see [How to Invite Students](/docs/how-to-guides/invite-students). + +## What students see + +After enrolling, students open the course from **Home** or **My Learning** in the [Student Dashboard](/docs/student-dashboard). Published courses they have not joined yet may appear in **Explore**. + +## Related guides + +- [Creating Your First Course](/docs/how-to-guides/create-first-course) +- [Course Types](/docs/how-to-guides/course-types) +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) +- [How to Invite Students](/docs/how-to-guides/invite-students) +- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) +- [Student Dashboard](/docs/student-dashboard) + \ No newline at end of file diff --git a/apps/docs/content/docs/enterprise-sso.mdx b/apps/docs/content/docs/enterprise-sso.mdx index cc8d3254..1349a35c 100644 --- a/apps/docs/content/docs/enterprise-sso.mdx +++ b/apps/docs/content/docs/enterprise-sso.mdx @@ -35,7 +35,7 @@ We support OIDC-based SSO with the following identity providers: ## How It Works -### Org-Site Login +### Academy Login When users visit your organization's custom domain (e.g., `yourorg.classroomio.com`), SSO is automatically detected and they can sign in directly with your IdP. ### Shared App Login diff --git a/apps/docs/content/docs/how-to-guides/course-enrollment.mdx b/apps/docs/content/docs/how-to-guides/course-enrollment.mdx index b5e1b68d..3025de38 100644 --- a/apps/docs/content/docs/how-to-guides/course-enrollment.mdx +++ b/apps/docs/content/docs/how-to-guides/course-enrollment.mdx @@ -13,26 +13,26 @@ Enrollment is how a student becomes a member of a course group and gets access t | Path | Who initiates it | Typical use | | --- | --- | --- | | **Public self-enrollment** | Student | Open free courses on your landing page | -| **Course invite link** | You (admin) | Send a secure link to specific people | -| **Admin assignment** | You (admin) | Add org members directly from **People** | +| **Email invite** | You (admin) | Enter email addresses; ClassroomIO sends each recipient a unique enrollment link | +| **Direct add** | You (admin) | Pick existing students from a list; they are enrolled instantly with no action needed from them | | **Paid enrollment** | Student (after payment) or invite | Courses with a price set | All paths end at the same place: the student is added to the course **group** and can open the course in the LMS. ## What students need before they can enroll -For any self-service path (landing page or invite link), the course must be: +For **public** self-service paths (landing page, Explore), the course must be: -- **Published** — unpublished courses do not accept new enrollments from the public site -- **Active** — archived or inactive courses are blocked +- **Published** — unpublished courses are not listed in Explore and do not accept open enrollment from the public site +- **Active** — deleted courses are blocked in all paths -The student must also have (or create) a ClassroomIO account and belong to your organization when they complete enrollment. +**Email invites are an exception:** a valid invite token lets a student join a course even if it is unpublished. This lets you pre-enroll students before a course goes live. The course must still not be deleted. ## Public self-enrollment (free courses) On a **free** course (`cost` is 0) with **Allow New Students** enabled, anyone who finds your course landing page can enroll: -1. They open the course landing page on your org site +1. They open the course landing page on your academy 2. They click **Enroll** 3. They sign in or sign up 4. They land on `/course/[slug]/enroll` and click **Join course** @@ -44,41 +44,29 @@ No invite token is required. This is the default for free, published courses. In the course dashboard, go to **Settings** and find **Allow New Students**. When enabled, anyone can self-enroll from the course landing page. When disabled, the public **Enroll** button is hidden and open self-enrollment is blocked — but **course invite links** and **People → Add people** still work. -## Course invite links +## Email invites -Invite links let you give specific people a URL to join a course. Each invite can have: +From **People → Add people**, you enter one or more email addresses and ClassroomIO sends each recipient a unique enrollment link. Each invite can have: - An **expiry** (e.g. 24 hours, 7 days) - A **max use** count (one-time or reusable) - **Allowed emails** or domains (optional restriction) -The path is always `/course//enroll?invite_token=...` on your **org site** (not the admin app at `app.classroomio.com`). The host depends on how your organization is set up: +When a student opens the link, they sign in (or sign up) and click **Join course**. ClassroomIO validates the token, expiry, and usage limit before enrolling them. -- **Default tenant site:** `https://.myclassroomio.com/course/your-course-slug/enroll?invite_token=...` - Example: if your org site name is `ciodevs`, the link starts with `https://ciodevs.myclassroomio.com/...` -- **Custom domain (verified):** `https://learn.yourcompany.com/course/your-course-slug/enroll?invite_token=...` +For step-by-step instructions, see [How to Invite Students](/docs/how-to-guides/invite-students). -ClassroomIO picks the verified custom domain when you have one; otherwise it uses your `.myclassroomio.com` subdomain. Invite emails and the **People** flow generate the correct URL for your org automatically. - -When a student opens a valid invite, they sign in (or sign up) and click **Join course**. ClassroomIO validates the token, expiry, usage limit, and email restrictions before enrolling them. - -For step-by-step instructions on creating and managing invites, see [How to Invite Students](/docs/how-to-guides/invite-students). - - - **Allow New Students** can be off and invite links still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited. + + **Allow New Students** can be off and email invites still work. The toggle only blocks unsolicited self-enrollment from the landing page; it does not block people you explicitly invited. Invites also work on **unpublished** courses, so you can pre-enroll students before a course goes live. -## Admin assignment (People) +## Direct add (People) -You can add students without them using the landing page or an invite link. From the course dashboard: +If a student already has an account, you can add them to the course directly — no email, no link, no action needed from them. They appear in the course immediately. -1. Open **People** -2. Click **Add people** -3. Use **Invite Students** to either: - - **Grant access** to students who already exist in your organization, or - - **Invite by email** — import new recipients into your org and pre-assign them to this course +From the course dashboard, open **People → Add people**, select the students you want, and confirm. They are enrolled right away. -Admin assignment does **not** require **Allow New Students** to be on. Use this when you want a closed course where only people you add manually can access content. +This does **not** require **Allow New Students** to be on. Use it for closed courses where you control exactly who gets access. Revoking an invite or turning off public enrollment does not remove students who have already joined. It only blocks future enrollments through that path. @@ -95,15 +83,61 @@ Paid courses are useful when you want to prevent casual sign-ups on a free landi | Goal | Suggested setup | | --- | --- | | Anyone can join | Free course, published, **Allow New Students** on | -| Only people with invite links | **Allow New Students** off (optional), send [course invites](/docs/how-to-guides/invite-students) | -| Only people you add manually | **Allow New Students** off, use **People → Add people** (no invite link needed) | +| Only people you email invites to | **Allow New Students** off (optional), send [email invites](/docs/how-to-guides/invite-students) | +| Only people you add manually | **Allow New Students** off, use **People → Add people** to directly enroll existing students | | Paywall + optional invites | Set a price, send invites to buyers who should skip or supplement checkout | +| Visible in catalog, enrollment closed | Published course, **Allow New Students** off, use invites or **People** to add members | +| All students in your org can join any published course | Enable **Internal Enrollment Only** in **Settings → Authentication → General**; students bypass per-course **Allow New Students** | -## Organization-level signup (separate from course enrollment) +## Enrollment vs visibility -Course enrollment is different from **organization signup**. In **Organization settings**, you can disable public signups so that only users with an **organization invite link** can create an account on your site. +Restricting who can **join** a course is not the same as hiding it from every student view. -That setting controls who can join your **org**, not who can join a specific **course**. A student might be in your org but not enrolled in any course until you assign them or they self-enroll on a published course. +| Control | What it affects | +| --- | --- | +| **Published** | Whether the course is live on your academy and eligible for Explore | +| **Allow New Students** | Whether the public **Enroll** button works on the landing page | +| **Email invites** | Who can join via a link sent to their email (works even on unpublished or closed courses) | +| **People → Add people** | Who you add directly, with or without an invite link | +| **Price** | Whether open self-enrollment requires payment | +| **Internal Enrollment Only** (org-wide) | When on, any student in your organization can self-enroll in any published course, bypassing per-course **Allow New Students** | + + + **Explore** in the student LMS lists published courses the student has not enrolled in yet. Turning off **Allow New Students** blocks open enrollment from the landing page. It does **not** remove the course from Explore. ClassroomIO does not support hiding a published course from specific people in Explore today. + + +**Workarounds:** + +- Keep the course **unpublished** until you are ready for students to discover it. +- Use **Allow New Students** off plus invites or **People** so only the people you choose can actually join. +- Accept that enrolled students may see the course in Explore even when they cannot self-enroll. + +For where students see enrolled vs available courses, see [Student Dashboard](/docs/student-dashboard). + +## People and membership + +When a student enrolls or you add them from **People**, they become a member of the course **group** right away. They do not need to open a lesson first. + +| State | What it means | +| --- | --- | +| **Active member** | Linked to a profile; appears in **People** with full details | +| **Pending** | Added by email before they sign in or finish onboarding | + +The **People** tab in the course dashboard is the source of truth for course membership. + + + **Compliance** courses also track completion status (for example **not started**). That is separate from membership. A student can appear in **People** as soon as they are enrolled while still showing **not started** on the Compliance dashboard until they begin the course. + + +## Organization-level access settings (separate from course enrollment) + +Course enrollment is different from **organization signup**. In **Settings → Authentication → General**, you have two org-level controls that work together: + +**Disable Signup / Allow Public Signups** — controls who can create an account on your academy. When signup is disabled (invite-only), only people you invite can register. This controls who can sign up, not which courses they can join. + +**Internal Enrollment Only** — when enabled, any student in your organization can self-enroll in any published course without needing the course to have **Allow New Students** turned on. This is useful for internal academies: disable public signup, add employees via course invite links (which creates their account as a student in your organization), and they can then discover and join any other published course themselves without per-course admin work. + +A student might be in your org but not enrolled in any course until you assign them, they self-enroll on a course with **Allow New Students** on, or **Internal Enrollment Only** is enabled org-wide. ## What students see after enrolling @@ -129,7 +163,7 @@ Turn **Allow New Students** off to hide public enrollment. From **People**, send ### Staff-only or hand-picked list -Turn **Allow New Students** off. Add each student from **People → Add people** (existing org members or email import). No public self-enrollment; use direct assignment or invite links as needed. +Turn **Allow New Students** off. Use **People → Add people** to directly enroll existing students, or send email invites to people who do not have an account yet. No one can self-enroll. @@ -137,10 +171,19 @@ Turn **Allow New Students** off. Add each student from **People → Add people** Set the course price on the landing page. Students pay to enroll, or you send invites to people who should receive complimentary access. + + +### Closed org academy — any student can join any course + +Enable **Disable Signup** and **Internal Enrollment Only** in **Settings → Authentication → General**. Add employees by sending them course invite links from **People → Add people** — accepting a course invite creates their account as a student in your organization. Once they are students in your org, they can discover and self-enroll in any other published course from Explore without per-course setup. **Allow New Students** on individual courses is bypassed for students when this setting is on. + ## Related guides - [How to Invite Students](/docs/how-to-guides/invite-students) — create, send, and revoke course invite links +- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can create courses and access the admin dashboard +- [Student Dashboard](/docs/student-dashboard) — Home, My Learning, Explore, and Programs +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — org URLs used in enrollment links - [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — pricing, publish state, and what prospects see before enrolling - [Creating Your First Course](/docs/how-to-guides/create-first-course) — create and publish a course diff --git a/apps/docs/content/docs/how-to-guides/course-landingpage.mdx b/apps/docs/content/docs/how-to-guides/course-landingpage.mdx index 18ef416d..258b5190 100644 --- a/apps/docs/content/docs/how-to-guides/course-landingpage.mdx +++ b/apps/docs/content/docs/how-to-guides/course-landingpage.mdx @@ -1,26 +1,95 @@ --- title: Create a Course Landing Page -description: Learn how to create a course landing page. +description: Build and edit a course landing page, including pricing, hero buttons, preview, and publish settings. --- -ClassroomIO empowers you to design a course landing page, enabling you to showcase your courses to prospective students. On this page, students can explore course details, enrollment statistics, fees (if applicable), and course availability, enabling them to make informed choices. To access this, from your admin dashboard, navigate to **Settings** > **Landing Page.** +import { Callout } from 'fumadocs-ui/components/callout'; +import { Step, Steps } from 'fumadocs-ui/components/steps'; -## Steps +A **course landing page** is the public page for one course. Prospects read the description, see pricing, and click **Enroll** if enrollment is open. This is separate from your [academy landing page](/docs/how-to-guides/org-landing-page), which is the academy homepage. -### 1. Go to the Courses page +## Open the editor -Once you are logged in, click on **Courses** on the left sidebar, you will be taken to your course list page where you can access the courses you have created. For this tutorial, we will focus on the **Intro to Javascript** course displayed in the image below. Click on the desired course to proceed to its respective dashboard. + + +### Select a course -![ClassroomIO Landing Page](/course-landing-page.webp) +From the admin dashboard, open **Courses** and click the course you want. + -### 2. Open the Landing page editor + +### Open Landing page -Select the "**Landing page**" option from the sidebar, which will lead you to the settings for your landing page. Here, you can customize various aspects of your course, including the course title, fees (if applicable), requirements, description, and more. +In the course sidebar, click **Landing page** to open the editor. + -![ClassroomIO Course Page](/course-page.png) + +### Edit sections -### 3. Edit and Save your changes +Update sections such as hero, description, requirements, pricing, instructors, and footer. Click **Save** when finished. + -After making the desired adjustments, ensure to save your changes by clicking on the "**Save**" button located at the top-left corner of the screen. Then, to preview the updated landing page, click on the arrow button situated to the right of the "**Save**" button. + +### Preview -![ClassroomIO Course Page Settings](/landing-page.png) +Use the preview control next to **Save** to see the page. Confirm behavior on the live academy for links and enroll buttons. + + + +## Editor sections + +| Section | What you configure | +| --- | --- | +| **Hero** | Title, subtitle, primary CTA (e.g. Enroll, Get Started) | +| **Description** | Course overview for prospects | +| **Requirements** | Prerequisites or audience notes | +| **Pricing** | Price and currency | +| **Instructors** | Instructor cards | +| **Footer** | Supporting links and copy | + +Hero and pricing interact with [course enrollment](/docs/how-to-guides/course-enrollment): a free course with **Allow New Students** on shows an open **Enroll** button; paid or closed courses route visitors through payment or invites. + +## Pricing and currency + +Set the course price in the **Pricing** section. ClassroomIO supports these currencies today: + +| Currency | Code | +| --- | --- | +| US Dollar | USD | +| Nigerian Naira | NGN | + + + If you need a currency outside USD and NGN, that requires product support today. Pick the closest supported currency or keep the course free and handle payment outside ClassroomIO. + + +## Publish and Allow New Students + +Landing page content can be ready before you open enrollment: + +| Course **Settings** | Effect on landing page | +| --- | --- | +| **Published** | Page is live on your academy | +| **Allow New Students** | Public **Enroll** works (for free courses) | +| **Price > 0** | Enrollment requires payment or a valid invite | + +See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) for closed cohorts and invite-only access. + +## Preview vs live site + +The in-app preview shows layout and copy. Test **Enroll**, external links, and payment on your live academy URL (subdomain or [custom domain](/docs/how-to-guides/custom-domain)) before sharing publicly. + + + The org homepage preview in **Settings → Landing Page** disables link clicks. Course landing previews should still be checked on the live site for enrollment flows. + + +## What students see after enrolling + +After a successful enroll, students land in the [Student Dashboard](/docs/student-dashboard) (**Home** / **My Learning**). The course may disappear from **Explore** once they are a member. + +## Related guides + +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — who can join and how Explore relates to publish settings +- [How to Invite Students](/docs/how-to-guides/invite-students) — invite links when public enroll is off +- [Course Types](/docs/how-to-guides/course-types) — how type affects public vs LMS access +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — host for your landing page URL +- [Creating Your First Course](/docs/how-to-guides/create-first-course) diff --git a/apps/docs/content/docs/how-to-guides/course-types.mdx b/apps/docs/content/docs/how-to-guides/course-types.mdx new file mode 100644 index 00000000..9ecab2bb --- /dev/null +++ b/apps/docs/content/docs/how-to-guides/course-types.mdx @@ -0,0 +1,73 @@ +--- +title: Course Types +description: Learn what Self-paced, Live class, Compliance, and Public course types do in ClassroomIO and when to use each. +--- + +import { Callout } from 'fumadocs-ui/components/callout'; + +Course **type** is set in each course's **Settings**. It is easy to miss because the dropdown alone does not show every change. Types mainly affect admin navigation, compliance tracking, grading, and whether the course uses the normal enroll-and-LMS flow. + +## Types at a glance + +| Type | Best for | Main differences | +| --- | --- | --- | +| **Self-paced** | Default online courses | Standard LMS; students progress at their own pace | +| **Live class** | Instructor-led with grading | **Marks** nav for grading exercises | +| **Compliance** | Required training with deadlines | **Compliance** dashboard, due dates, retakes, bulk actions | +| **Public** | Open content without login | Anonymous lesson access; no normal enrollment flow | + +## Self-paced + +**Self-paced** is the default. Students enroll, open lessons in the LMS, and complete exercises on their schedule. Auto-grading applies to many exercise types in self-paced and compliance courses. + +Use self-paced for standard training, onboarding content, and evergreen material. + +## Live class + +**Live class** adds instructor grading workflows. Admins and tutors see a **Marks** section in the course sidebar to review and grade student work. + +Use live class when an instructor scores assignments and you need a dedicated grading view. + +## Compliance + +**Compliance** turns on compliance-specific tooling: + +- **Compliance** nav in the course sidebar +- Passing scores, due dates, and retake rules +- Bulk actions on student status +- Completion tracking (including **not started** before a student opens content) +- Certificate rules tied to compliance settings + +Use compliance for mandatory training where you must track who completed requirements by a deadline. + + + A student can appear in **People** as soon as they enroll while still showing **not started** on the Compliance dashboard. Membership and completion status are separate. + + +## Public + +**Public** courses skip the normal enroll-and-LMS path. Visitors can access lesson content anonymously. The landing page routes toward lesson content rather than a **Join course** flow. + +Use public when you want open educational content without requiring accounts. Public courses are not a substitute for private cohort enrollment. + + + Switching type after launch can change which sidebar items appear and how completion is tracked. Pick the type that matches your delivery model before students enroll when possible. + + +## Why types can feel identical in Settings + +If you only flip the type dropdown, the course title and content look the same. The differences show up in: + +- Which sidebar items appear (**Marks**, **Compliance**) +- How exercises are graded +- Whether anonymous public access is used +- How completion and certificates are evaluated + +Open the course sidebar after changing type to confirm the right tools are available. + +## Related guides + +- [Course](/docs/course) — course overview and admin areas +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment (not used for Public in the same way) +- [Student Dashboard](/docs/student-dashboard) — student LMS views +- [Creating Your First Course](/docs/how-to-guides/create-first-course) diff --git a/apps/docs/content/docs/how-to-guides/custom-domain.mdx b/apps/docs/content/docs/how-to-guides/custom-domain.mdx new file mode 100644 index 00000000..de70532e --- /dev/null +++ b/apps/docs/content/docs/how-to-guides/custom-domain.mdx @@ -0,0 +1,80 @@ +--- +title: Set Up a Custom Domain +description: Connect and verify a custom domain for your ClassroomIO academy and learn which links use your org URL. +--- + +import { Callout } from 'fumadocs-ui/components/callout'; +import { Step, Steps } from 'fumadocs-ui/components/steps'; + +Every organization gets a default site at `https://.myclassroomio.com`. You can connect your own domain (for example `https://learn.yourcompany.com`) so students see your brand in the browser bar and in links. + +## How ClassroomIO picks a base URL + +When ClassroomIO builds a link for your organization, it resolves the host in this order: + +1. **Verified custom domain** → `https://` +2. **Self-hosted override** (`DASHBOARD_ORIGIN` env var, if set) +3. **Development** → `http://localhost:5173` +4. **Academy URL** → `https://.myclassroomio.com` +5. **Fallback** → `https://app.classroomio.com` + +Most customer-facing course links use your org context and stop at step 1 or 4. The `app.classroomio.com` fallback applies when no academy URL is available. + +## Set up your domain + + + +### Open domain settings + +From the admin dashboard, go to **Settings → Organization**, then click **Edit domain** in the Custom Domain section. + + + +### Enter your domain + +Add the hostname you want (for example `learn.yourcompany.com`). Follow the DNS instructions ClassroomIO shows to verify ownership. + + + +### Wait for verification + +Verification can take time while DNS propagates. The domain must show as verified before links use it. + + + +### Test on the live site + +Open your custom domain in a browser. Sign in, open a course landing page, and confirm URLs stay on your domain. + + + + + An unverified custom domain is not used for generated links. Until verification succeeds, ClassroomIO keeps using `.myclassroomio.com`. + + +## Which links use your org URL + +| Link type | Uses org domain when verified? | +| --- | --- | +| Course enrollment (`/course/.../enroll`) | Yes | +| Course invite emails from **People** | Yes | +| Org site landing page and course catalog | Yes | +| Organization team invite (some flows) | May still use platform URL until fully aligned | + +Course invites are documented in [How to Invite Students](/docs/how-to-guides/invite-students). Those links should point at your academy, not `app.classroomio.com`, when your domain is verified. + +## Email sender address + +Invite and notification emails may still send from the ClassroomIO platform mail address. Your **organization name** appears in the message body; the sender inbox is not fully white-labeled today. + +## Student login and redirects + +Students should sign in on your academy so sessions and redirects stay on your academy URL. If login sends users to `app.classroomio.com` unexpectedly, check that the custom domain is verified and that you are sharing academy links (not the generic app URL). + +## Related guides + +- [Customize Your Organization](/docs/how-to-guides/customize-organization) — org profile and default subdomain +- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) — public homepage on your domain +- [How to Invite Students](/docs/how-to-guides/invite-students) — enrollment links on your academy +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment paths and org signup +- [Organization](/docs/organization) — org settings overview diff --git a/apps/docs/content/docs/how-to-guides/customize-organization.mdx b/apps/docs/content/docs/how-to-guides/customize-organization.mdx index 06d9cf28..4b14a57e 100644 --- a/apps/docs/content/docs/how-to-guides/customize-organization.mdx +++ b/apps/docs/content/docs/how-to-guides/customize-organization.mdx @@ -91,8 +91,17 @@ Click on Update Domain to save the changes. -Organizations can also integrate existing domain names. +For full custom domain setup (DNS, verification, which links use your domain), see [Set Up a Custom Domain](/docs/how-to-guides/custom-domain). + +For the public homepage (hero, nav, footer), see [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page). ## Set Brand Color We understand that every organization has a preferred color that suits their brand, hence we offer organizations the flexibility to choose a theme for their brand from a variety of colors like **blue**, **green**, **orange**, and more. To select a brand color for your organization simply click on any of the provided color theme and this would be automatically applied across your entire application. + +## Related guides + +- [Organization](/docs/organization) — org settings overview +- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) — public homepage +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — your own hostname +- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — team access diff --git a/apps/docs/content/docs/how-to-guides/invite-students.mdx b/apps/docs/content/docs/how-to-guides/invite-students.mdx index cc79552a..2884519b 100644 --- a/apps/docs/content/docs/how-to-guides/invite-students.mdx +++ b/apps/docs/content/docs/how-to-guides/invite-students.mdx @@ -12,13 +12,13 @@ For a full overview of enrollment paths (public enroll, invites, admin assignmen ## How course invitations work - **Email-based invites:** You enter one or more email addresses (or paste a list). ClassroomIO creates a unique invite per recipient and can send the enrollment link by email. -- **Enrollment link:** Each invite link points to an **enrollment page** on your org site (not `app.classroomio.com`). The path is `/course/your-course-slug/enroll?invite_token=...` on either `https://.myclassroomio.com` (e.g. `https://ciodevs.myclassroomio.com/...`) or your verified custom domain (e.g. `https://learn.yourcompany.com/...`). When a student opens the link, they see the course details and a **Join course** button. -- **One link per invite:** Invite links are tied to the course and (for paid or restricted courses) to the invite’s rules (expiry, max uses, allowed emails). Students sign in or sign up when they click **Join course**, then they’re enrolled and redirected to the learning dashboard. +- **Enrollment link:** Each invite link points to an **enrollment page** on your academy (not `app.classroomio.com`). The path is `/course/your-course-slug/enroll?invite_token=...` on either `https://.myclassroomio.com` (e.g. `https://ciodevs.myclassroomio.com/...`) or your verified custom domain (e.g. `https://learn.yourcompany.com/...`). When a student opens the link, they see the course details and a **Join course** button. +- **One link per invite:** Invite links are tied to the course and (for paid or restricted courses) to the invite's rules (expiry, max uses, allowed emails). Students sign in or sign up when they click **Join course**, then they're enrolled and redirected to the learning dashboard. ## Free vs paid courses - **Free courses:** Students can enroll without an invite. From the course landing page they click **Enroll** and are taken to the same enrollment page (`/course/:slug/enroll`) with no token; they sign in or sign up and are enrolled immediately. -- **Paid or invite-only courses:** Students need either to pay (if you’ve set up payment) or to use a valid invite link. If they open the enrollment page without a valid invite or payment, they’ll see a message that they need to pay or be invited. +- **Paid or invite-only courses:** Students need either to pay (if you've set up payment) or to use a valid invite link. If they open the enrollment page without a valid invite or payment, they'll see a message that they need to pay or be invited. ## Sending email invites @@ -59,21 +59,28 @@ Each recipient gets a unique link to the course enrollment page with their invit 1. **Email:** If you sent invite emails, the student receives an email containing the course name, your organization name, and a link to the enrollment page. 2. **Enrollment page:** Opening the link takes them to `/course/[course-slug]/enroll?invite_token=...`. They see the course title and description and a **Join course** button. -3. **Sign in or sign up:** If they’re not signed in, clicking **Join course** sends them to sign in or create an account. After that, they’re returned to the enrollment page (the redirect is preserved). -4. **Enrolled:** Once they’re signed in and click **Join course**, they’re enrolled in the course and redirected to the learning dashboard (e.g. **LMS** or **Home**). +3. **Sign in or sign up:** If they're not signed in, clicking **Join course** sends them to sign in or create an account. After that, they're returned to the enrollment page (the redirect is preserved). +4. **Enrolled:** Once they're signed in and click **Join course**, they're enrolled in the course and redirected to the learning dashboard (e.g. **LMS** or **Home**). ## Managing invites From the same **People** > **Invite** flow, use the **Existing invites** (or **History**) tab to: -- See invites you’ve created, their expiry and usage. +- See invites you've created, their expiry and usage. - **Revoke** an invite so its link can no longer be used. Revoking does not remove students who have already joined; it only invalidates the invite link for future use. ## Tips -- **Free courses:** You don’t need to create invites for free courses; students can enroll directly from the course landing page. +- **Free courses:** You don't need to create invites for free courses; students can enroll directly from the course landing page. - **Paid courses:** Use email invites (or payment) so only the right people can enroll. - **Expiry and uses:** Use short expiry and one-time use for sensitive or limited spots; use longer expiry and multiple uses for open cohorts or self-paced courses. -- **Redirect after login:** If a student follows an invite link while logged out, they’re sent to sign in or sign up and then back to the same enrollment page so they can complete joining. +- **Redirect after login:** If a student follows an invite link while logged out, they're sent to sign in or sign up and then back to the same enrollment page so they can complete joining. + +## Related guides + +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — enrollment paths, Allow New Students, and Explore visibility +- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can manage courses vs learn in the LMS +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — which host appears in invite links +- [Student Dashboard](/docs/student-dashboard) — where students land after joining diff --git a/apps/docs/content/docs/how-to-guides/meta.json b/apps/docs/content/docs/how-to-guides/meta.json index a4c042ba..a73b6394 100644 --- a/apps/docs/content/docs/how-to-guides/meta.json +++ b/apps/docs/content/docs/how-to-guides/meta.json @@ -4,11 +4,14 @@ "customize-organization": "Customize Your Organization", "course-landingpage": "Create a Course Landing Page", "course-enrollment": "How Course Enrollment Works", - "setup-profile": "Setup Profile", + "course-types": "Course Types", "certificates": "How to Create Certificates", "grade-exercise": "How to Grade an Exercise", "invite-students": "How to Invite Students", "invite-team-member": "Inviting a Team Member", "take-attendance": "How to Take Attendance", - "use-math-in-editor": "Use Math in the Editor" + "use-math-in-editor": "Use Math in the Editor", + "roles-and-permissions": "Roles and Permissions", + "org-landing-page": "Customize Your Academy Landing Page", + "custom-domain": "Set Up a Custom Domain" } diff --git a/apps/docs/content/docs/how-to-guides/org-landing-page.mdx b/apps/docs/content/docs/how-to-guides/org-landing-page.mdx new file mode 100644 index 00000000..8bf6042c --- /dev/null +++ b/apps/docs/content/docs/how-to-guides/org-landing-page.mdx @@ -0,0 +1,77 @@ +--- +title: Customize Your Academy Landing Page +description: Edit your academy landing page, including nav, hero buttons, footer, preview mode, and what the summary labels mean. +--- + +import { Callout } from 'fumadocs-ui/components/callout'; +import { Step, Steps } from 'fumadocs-ui/components/steps'; + +Your **academy landing page** is the public homepage for your academy (for example `https://ciodevs.myclassroomio.com` or your custom domain). Students and prospects see it before they sign in. This guide covers the editor in **Settings → Landing Page**. + +For org profile and subdomain setup, see [Customize Your Organization](/docs/how-to-guides/customize-organization) and [Set Up a Custom Domain](/docs/how-to-guides/custom-domain). + +## Open the landing page settings + + + +### Go to Settings + +From the admin dashboard, open **Settings**, then select **Landing Page**. + + + +### Review the summary card + +The right-hand card shows your current theme, hero heading, and nav link count. Click **Customize** to open the full editor. + + + +## What "2 links" next to Nav means + +On the summary card, **Nav** may show a label like **2 links**. That is a **count of navigation items** you configured in the landing page editor. It is not a separate setting named "2 links." + +| Label | Meaning | +| --- | --- | +| **1 link** | One item in the top navigation | +| **2 links** | Two items in the top navigation | + +Edit the actual links in the customize flow (labels and URLs for each nav item). + +## Hero buttons + +The hero section supports a primary and optional secondary action. + +| Button | Typical default | What to configure | +| --- | --- | --- | +| **Primary** (e.g. Get Started, Start Learning) | Often points to `/login` | Label and destination URL | +| **Secondary** (e.g. View Programs) | Optional second CTA | Label and destination URL | + +Use your academy paths (for example `/login` or `/courses`) so visitors stay on your academy domain. After you verify a [custom domain](/docs/how-to-guides/custom-domain), test buttons on the live site, not only in preview. + + + The thumbnail preview on the Landing Page settings screen renders with links disabled. Use **Open Academy** or open your live academy URL to test buttons like **Get Started** and **View Programs**. + + +## Footer + +The footer editor lets you set brand text, link columns, social links, and bottom bar copy. Save changes in the editor, then check the live site. If footer text looks wrong in preview, confirm on the published page. + +## Themes + +ClassroomIO ships multiple landing themes. Some themes require a paid plan. If customize is locked, upgrade or pick a theme included in your plan. + +## Preview vs live site + +| Mode | Behavior | +| --- | --- | +| **Settings preview** | Scaled thumbnail; course and nav links do not navigate | +| **Live academy** | Full behavior; use this to validate CTAs and footer | + +Always validate hero and footer links on the live site before sharing the URL externally. + +## Related guides + +- [Customize Your Organization](/docs/how-to-guides/customize-organization) — org name, logo, brand color +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) — use your own domain on the landing page +- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — per-course public pages (separate from the org homepage) +- [Student Dashboard](/docs/student-dashboard) — where students go after signing in diff --git a/apps/docs/content/docs/how-to-guides/roles-and-permissions.mdx b/apps/docs/content/docs/how-to-guides/roles-and-permissions.mdx new file mode 100644 index 00000000..be575b39 --- /dev/null +++ b/apps/docs/content/docs/how-to-guides/roles-and-permissions.mdx @@ -0,0 +1,62 @@ +--- +title: Roles and Permissions +description: Understand org roles in ClassroomIO, who can create courses, and how admin access differs from the student LMS. +--- + +import { Callout } from 'fumadocs-ui/components/callout'; + +ClassroomIO uses organization roles to control what each person can do. This guide covers the three built-in roles, who can create courses, and how that relates to course enrollment (which is controlled separately per course). + +## Organization roles + +| Role | Typical use | Admin dashboard | Create courses | Edit course content | +| --- | --- | --- | --- | --- | +| **Admin** | Org owners, lead instructors | Yes | Yes | Yes (all org courses) | +| **Tutor** | Instructors, content authors | Yes | No | Yes (courses they teach) | +| **Student** | Learners | No (LMS only) | No | No | + +Admins have full control over organization settings, billing, domains, and all courses. Tutors can manage content for courses they are assigned to but cannot create new courses or change org-wide settings. Students use the [Student Dashboard](/docs/student-dashboard) to learn. + + + ClassroomIO does not support per-person flags like "this user can create courses but that user cannot." Access is set by role. To limit who joins a **course**, use course settings, invites, and **People** instead. See [How Course Enrollment Works](/docs/how-to-guides/course-enrollment). + + +## Who can create courses + +Only **Admins** can create new courses. The create-course action requires admin permissions on the API. + +Tutors and students cannot create courses. If someone needs to author content, assign them as a **Tutor** on the course or promote them to **Admin** if they also need org-level access. + +## Admin dashboard vs student LMS + +| Area | Who sees it | URL pattern | +| --- | --- | --- | +| **Admin dashboard** | Admins and Tutors | Course management, org settings, analytics | +| **Student LMS** | All signed-in users | `/lms` and related paths | + +Students sign in on your academy and land in the LMS. Admins and tutors can switch to the admin dashboard to manage courses and settings. + +## Inviting team members + +To add Admins or Tutors, use [Inviting a Team Member](/docs/how-to-guides/invite-team-member). Team invites are separate from [student course invites](/docs/how-to-guides/invite-students). + +## Organization signup vs course enrollment + +Two different gates often get mixed up: + +| Setting | Controls | +| --- | --- | +| **Organization signup** | Who can create an account on your academy | +| **Course enrollment** | Who can join a specific course | + +A person can be in your organization (org signup) without being enrolled in any course. Likewise, course **Allow New Students**, invites, and **People** only affect that course. + +Configure org signup under **Settings → Organization**. Configure per-course access under each course's **Settings** and **People** tabs. + +## Related guides + +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — restrict who can join each course +- [How to Invite Students](/docs/how-to-guides/invite-students) — course enrollment links +- [Inviting a Team Member](/docs/how-to-guides/invite-team-member) — add admins and tutors +- [Student Dashboard](/docs/student-dashboard) — what students see in the LMS +- [Organization](/docs/organization) — org settings overview diff --git a/apps/docs/content/docs/how-to-guides/setup-profile.mdx b/apps/docs/content/docs/how-to-guides/setup-profile.mdx deleted file mode 100644 index 8f4361c8..00000000 --- a/apps/docs/content/docs/how-to-guides/setup-profile.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Setup Profile -description: Learn how to setup your profile on ClassroomIO. ---- - -import { Step, Steps } from 'fumadocs-ui/components/steps'; - - - - -### Go to ClassroomIO - -Go to [app.classroomio.com](https://app.classroomio.com). Click on the "Login" button on the top right to take you to the Login page. - -![ClassroomIO Page](/classroomio.webp) - - - - -### Sign In - -Sign in with your email & password. - -![ClassroomIO Page](/login-page.webp) - - - - -### Go to the Settings page - -Click on the "Settings" button on the lower left corner on your dashboard page and you'll be routed to the profile page. - -![Unedited Profile Page](/unedited-profile-page.webp) - - - - -### Make Changes - -Upload a profile picture and edit any input field you want to then click "Update Profile". - -![Edited Profile Page](/edited-profile-page.webp) - - - diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json index cedbff24..ca62b538 100644 --- a/apps/docs/content/docs/meta.json +++ b/apps/docs/content/docs/meta.json @@ -3,6 +3,7 @@ "---Introduction---", "home", "what-is-classroomio", + "terminology", "quickstart", "---Core Features---", diff --git a/apps/docs/content/docs/organization.mdx b/apps/docs/content/docs/organization.mdx index 735fa123..5e723e30 100644 --- a/apps/docs/content/docs/organization.mdx +++ b/apps/docs/content/docs/organization.mdx @@ -1,12 +1,42 @@ --- title: Organization -description: Learn about organizations in ClassroomIO. +description: Overview of organizations in ClassroomIO — settings, branding, domains, roles, and related guides. --- import { Callout } from 'fumadocs-ui/components/callout'; - - This page is a work in progress. Help us expand it by contributing! +An **organization** in ClassroomIO holds courses, people, branding, and your academy. Every admin and student belongs to an organization. This page points you to the right guides for setup and day-to-day management. + +## What you configure at org level + +| Area | Where | Guide | +| --- | --- | --- | +| Name, logo, brand color | **Settings → Organization** | [Customize Your Organization](/docs/how-to-guides/customize-organization) | +| Public homepage | **Settings → Landing Page** | [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) | +| Custom domain | **Settings → Organization** | [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) | +| Team roles | **Settings → Organization** | [Roles and Permissions](/docs/how-to-guides/roles-and-permissions), [Inviting a Team Member](/docs/how-to-guides/invite-team-member) | +| Signup rules, Internal Enrollment Only | **Settings → Authentication → General** | [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) (org access section) | + +## Default URL + +On creation, each org gets `https://.myclassroomio.com` as its academy URL. You can connect a [custom domain](/docs/how-to-guides/custom-domain) so students use your own hostname. + + + Share your academy URL with students. The generic `app.classroomio.com` host is for platform access when no org subdomain applies. Course and enroll links should use your academy when possible. -We will write about organizations here. +## Courses and programs inside an org + +- **Courses** are individual learning containers. See [Course](/docs/course). +- **Programs** group courses with shared goals. See [Programs](/docs/programs). +- **Students** use the [Student Dashboard](/docs/student-dashboard) after they sign in. + +## Related guides + +- [Customize Your Organization](/docs/how-to-guides/customize-organization) +- [Customize Your Academy Landing Page](/docs/how-to-guides/org-landing-page) +- [Set Up a Custom Domain](/docs/how-to-guides/custom-domain) +- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) +- [Course](/docs/course) +- [Programs](/docs/programs) diff --git a/apps/docs/content/docs/programs.mdx b/apps/docs/content/docs/programs.mdx index a66ef250..5bbcb5fd 100644 --- a/apps/docs/content/docs/programs.mdx +++ b/apps/docs/content/docs/programs.mdx @@ -1,10 +1,67 @@ --- title: Programs -description: Learn when to use Programs in ClassroomIO, the kinds of training they support, and how they work for both admins and learners. +description: Learn what Programs are in ClassroomIO, how goals work, and what students see in the Programs view. --- import { Callout } from 'fumadocs-ui/components/callout'; - - Full customer documentation for Programs is still being prepared. For now, this page is a placeholder and the draft content has been moved into the product PRD. +**Programs** group multiple courses into a structured learning path. Use them when students need to complete a set of courses toward a shared outcome (onboarding, certification prep, role-based training). Individual courses still live in the LMS; programs add goals and a dedicated **Programs** view for students. + +## Programs vs courses + +| Concept | Scope | Student view | +| --- | --- | --- | +| **Course** | Single content container with lessons | **Home**, **My Learning**, **Explore** | +| **Program** | Multiple courses with shared goals | **Programs** in the LMS | + +A student can be enrolled in courses without belonging to a program, and in a program that references several courses. See [Student Dashboard](/docs/student-dashboard) for how those views fit together. + +## Admin workflow + +From the admin dashboard: + +1. Create a program and add courses to it. +2. Configure program **Settings** (metadata, visibility, assignments). +3. Add **Goals** that define what success looks like. +4. Assign students to the program (existing students or by email invite). + +Students assigned to a program see it under **Programs** in the LMS. + +## Program goal types + +When you add a goal in **Programs → Settings → Goals**, you pick a **type**. Each type measures progress differently. + +| Type | Label in the app | What it measures | +| --- | --- | --- | +| `complete_all` | Complete all selected courses | Every selected course must be finished | +| `n_of_m` | Complete N of M selected courses | Student must finish a required count from the courses you select | +| `score` | Score above threshold on every course | Minimum score on each selected course | +| `pass_rate` | Team pass-rate threshold | Aggregate pass rate across the group | +| `readiness` | Readiness (no deadline) | Readiness tracking without a fixed deadline | + +### Complete N of M selected courses (`n_of_m`) + +This type asks: "finish at least **N** courses from the list I picked." You select the courses, then set **required count** (N). N cannot be larger than the number of courses selected. + +If you see wording like "N of M" in the dropdown, **M** is the number of courses you selected, not a separate field called "cells." + + + Goals can also have deadline settings (absolute date, relative to join, recurring, or none). Configure these in the same goal form when creating or editing a goal. + +## What students see + +Students who belong to a program open **Programs** in the LMS to see their tracks and goal progress. Individual course lessons still open from enrolled courses in **Home** or **My Learning**. + +| Need | Where to look | +| --- | --- | +| Progress on a program track | **Programs** | +| Lessons inside one course | **Home** or **My Learning** | +| Optional courses not yet joined | **Explore** | + +## Related guides + +- [Student Dashboard](/docs/student-dashboard) — Programs vs My Learning vs Explore +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — how students join courses inside a program +- [Course](/docs/course) — single-course overview +- [Roles and Permissions](/docs/how-to-guides/roles-and-permissions) — who can manage programs and courses diff --git a/apps/docs/content/docs/student-dashboard.mdx b/apps/docs/content/docs/student-dashboard.mdx index e382d470..4a4dd7f1 100644 --- a/apps/docs/content/docs/student-dashboard.mdx +++ b/apps/docs/content/docs/student-dashboard.mdx @@ -1,10 +1,88 @@ --- title: Student Dashboard -description: Learn about the student dashboard. +description: Learn how students navigate the LMS, including Home, My Learning, Programs, and Explore. --- import { Callout } from 'fumadocs-ui/components/callout'; - - This page is a work in progress. Help us expand it by contributing! +The student dashboard (LMS) is where students open courses, track progress, and discover new content. If you are an admin, this page helps you explain what students see after they join your organization. + +Students reach the LMS after they sign in on your academy. The left sidebar lists the main areas below. **Exercise** and **Community** only appear when your organization has those features enabled. + +## LMS navigation at a glance + +| Area | Path | What it shows | +| --- | --- | --- | +| **Home** | `/lms` | Enrolled courses with progress | +| **My Learning** | `/lms/mylearning` | Enrolled courses only, grouped by status | +| **Programs** | `/lms/programs` | Programs the student belongs to | +| **Explore** | `/lms/explore` | Published courses they are not enrolled in yet | +| **Exercise** | `/lms/exercises` | Exercises (if enabled for your org) | +| **Community** | `/lms/community` | Community (if enabled for your org) | +| **Settings** | `/lms/settings` | Profile and integrations | + +## Home + +**Home** is the default landing page after a student signs in. It shows courses they are already enrolled in, along with progress indicators so they can pick up where they left off. + +Use Home when you want a quick overview of everything the student is actively taking. + +## My Learning + +**My Learning** focuses only on enrolled courses. Students can switch between tabs such as **In progress** and **Complete** to filter their list. + +| View | Best for | +| --- | --- | +| **Home** | Progress at a glance across enrolled courses | +| **My Learning** | Browsing and filtering enrolled courses by completion status | + +Both show enrolled courses. My Learning adds clearer filtering for students managing a longer list. + +## Explore + +**Explore** lists **published, active courses** in your organization that the student has **not** enrolled in yet. Each card links to the course landing page so they can read details and enroll (if enrollment is open). + + + A course can appear in Explore even when public self-enrollment is turned off. **Allow New Students** controls whether someone can join from the landing page, not whether the course is visible in Explore. To restrict who can join, see [How Course Enrollment Works](/docs/how-to-guides/course-enrollment). + +Explore is useful when you want students to discover optional or elective courses without assigning them manually. + +## Programs + +**Programs** are separate from individual courses. A program groups courses under shared goals (for example, complete all courses in an onboarding track). Students who belong to a program see it under **Programs** in the LMS. + +| Concept | Where students see it | +| --- | --- | +| Individual enrolled courses | Home, My Learning | +| Courses not yet joined | Explore | +| Multi-course tracks with goals | Programs | + +For how admins create programs and set goals, see [Programs](/docs/programs). + +## What students see right after enrolling + +When a student enrolls in a course (from a landing page, invite link, or admin assignment): + +1. They are added to the course **group** immediately. +2. The course appears on **Home** and **My Learning**. +3. It no longer appears in **Explore** (because they are enrolled). +4. They can open lessons, exercises, and materials from the course sidebar. + +If you added them from **People** but they have not signed in yet, they may show as **Pending** in the admin People list until they accept the invite or create an account. + +## Courses vs programs: quick comparison + +| Question | Answer | +| --- | --- | +| Where do I see courses I am taking? | **Home** or **My Learning** | +| Where do I find courses I have not joined? | **Explore** | +| Where do I see structured learning paths? | **Programs** | +| Can one student use all three views? | Yes. They work together. | + +## Related guides + +- [How Course Enrollment Works](/docs/how-to-guides/course-enrollment) — how students join courses and what settings control access +- [How to Invite Students](/docs/how-to-guides/invite-students) — send enrollment links by email +- [Programs](/docs/programs) — multi-course tracks and goals for admins +- [Create a Course Landing Page](/docs/how-to-guides/course-landingpage) — what prospects see before enrolling diff --git a/apps/docs/content/docs/tags.mdx b/apps/docs/content/docs/tags.mdx index 720ddb11..16af90ba 100644 --- a/apps/docs/content/docs/tags.mdx +++ b/apps/docs/content/docs/tags.mdx @@ -6,7 +6,7 @@ description: Organize and filter courses with organization-scoped tags in Classr import { Callout } from 'fumadocs-ui/components/callout'; Tags in ClassroomIO help teams structure course catalogs and improve discovery across admin -and learner experiences. +and student experiences. ## Scope and Ownership @@ -38,7 +38,7 @@ and learner experiences. - Org Courses: - Supports URL-based filtering with `?tags=`. -- Public `/courses` (org site/custom domain): +- Public `/courses` (your academy/custom domain): - Displays published courses. - Supports tag filtering with URL query params. diff --git a/apps/docs/content/docs/terminology.mdx b/apps/docs/content/docs/terminology.mdx new file mode 100644 index 00000000..dc1205d3 --- /dev/null +++ b/apps/docs/content/docs/terminology.mdx @@ -0,0 +1,18 @@ +--- +title: Terminology +description: Key terms used throughout ClassroomIO and what they refer to in the product. +--- + +| Term | What it means | +| --- | --- | +| **Academy** | Your public-facing site — the org homepage, course landing pages, and Explore. Students land here before and after signing in. URL: `.myclassroomio.com` or your custom domain. | +| **LMS** | The authenticated learning area students enter after signing in. Contains Home, My Learning, Explore, Programs, and Settings. Reached via **Open Academy** or **Go to LMS** in the admin dashboard. | +| **Organization** | Your admin workspace — holds courses, people, settings, and branding. Each organization maps to one academy. | +| **Explore** | The course discovery tab inside the LMS. Shows published courses the student has not enrolled in yet. | +| **Academy landing page** | The public homepage for your academy. Editable in **Settings → Landing Page**. | +| **Course landing page** | The public page for a single course — description, price, and Enroll button. Editable from the course sidebar. | +| **Student** | A user enrolled in one or more courses. Has access to the LMS but not the admin dashboard. | +| **Course** | The primary learning container — holds lessons, exercises, people, and settings. | +| **Program** | A group of courses with a shared completion goal (complete all, pass rate, score). | +| **Enrollment** | Joining a course. Can happen via public self-enrollment, invite link, admin assignment, or payment. | +| **Invite** | An email sent to a specific person containing a unique enrollment link for a course or organization. | diff --git a/packages/db/src/queries/course/course.ts b/packages/db/src/queries/course/course.ts index bc9f069c..1446fb12 100644 --- a/packages/db/src/queries/course/course.ts +++ b/packages/db/src/queries/course/course.ts @@ -370,7 +370,8 @@ export async function getCourseWithRelations( siteName: schema.organization.siteName, customDomain: schema.organization.customDomain, isCustomDomainVerified: schema.organization.isCustomDomainVerified, - theme: schema.organization.theme + theme: schema.organization.theme, + settings: schema.organization.settings } }) .from(schema.group) @@ -992,7 +993,6 @@ export const getEnrolledCourses = async ({ and( eq(schema.group.organizationId, orgId), eq(schema.course.status, 'ACTIVE'), - eq(schema.course.isPublished, true), or(isNotNull(schema.groupmember.id), isNotNull(schema.programMember.id)) ) ) @@ -1019,6 +1019,7 @@ export const getEnrolledCourses = async ({ interface GetExploreCoursesOptions { orgId: string; profileId: string; + limit?: number; } /** @@ -1026,11 +1027,16 @@ interface GetExploreCoursesOptions { * * @param options.orgId Organization ID * @param options.profileId Profile ID to exclude enrolled courses + * @param options.limit Optional max number of courses to return * @returns Array of courses with explore-level data */ -export const getExploreCourses = async ({ orgId, profileId }: GetExploreCoursesOptions): Promise => { +export const getExploreCourses = async ({ + orgId, + profileId, + limit +}: GetExploreCoursesOptions): Promise => { try { - const result = await db + const baseQuery = db .select({ course: schema.course, lessonCount: sql`COUNT(DISTINCT ${schema.lesson.id})`.as('total_lessons'), @@ -1059,6 +1065,8 @@ export const getExploreCourses = async ({ orgId, profileId }: GetExploreCoursesO .groupBy(schema.course.id, schema.group.id) .orderBy(desc(schema.course.createdAt)); + const result = limit ? await baseQuery.limit(limit) : await baseQuery; + return result.map((row) => ({ ...row.course, lessonCount: Number(row.lessonCount), diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts index 385bc267..0f7dfc3e 100644 --- a/packages/db/src/schema.ts +++ b/packages/db/src/schema.ts @@ -1960,6 +1960,7 @@ export const organization = pgTable( signup?: { inviteOnly?: boolean; }; + internalEnrollmentOnly?: boolean; }>(), landingpage: jsonb().default({}).$type<{ header?: { diff --git a/packages/utils/src/validation/organization/organization.ts b/packages/utils/src/validation/organization/organization.ts index 1033c5ba..c1965f2c 100644 --- a/packages/utils/src/validation/organization/organization.ts +++ b/packages/utils/src/validation/organization/organization.ts @@ -110,7 +110,8 @@ export const ZUpdateOrganization = z.object({ .object({ inviteOnly: z.boolean().optional() }) - .optional() + .optional(), + internalEnrollmentOnly: z.boolean().optional() }) .optional() });