From 79d4b727803de2d325eb05385921258e962ca9f4 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Wed, 19 May 2021 13:12:59 +0200 Subject: [PATCH] chore: ensure translations are sensible Also fix some translations --- .../uniworx/categories/I18n/de-de-formal.msg | 6 +- .../uniworx/categories/admin/de-de-formal.msg | 14 ++-- .../courses/allocation/de-de-formal.msg | 16 ++-- .../courses/application/de-de-formal.msg | 4 +- .../courses/courses/de-de-formal.msg | 10 +-- .../courses/courses/event/de-de-formal.msg | 2 +- .../courses/courses/news/de-de-formal.msg | 2 +- .../courses/exam/exam/de-de-formal.msg | 20 ++--- .../courses/exam/exam_office/de-de-formal.msg | 2 +- .../exam/external_exam/de-de-formal.msg | 20 ++--- .../courses/material/de-de-formal.msg | 14 ++-- .../courses/participants/de-de-formal.msg | 2 +- .../categories/courses/sheet/de-de-formal.msg | 8 +- .../courses/submission/de-de-formal.msg | 14 ++-- .../uniworx/categories/help/de-de-formal.msg | 2 +- .../categories/jobs_handler/de-de-formal.msg | 2 +- .../categories/metrics/de-de-formal.msg | 2 +- .../categories/model_types/de-de-formal.msg | 29 ++++--- .../uniworx/categories/model_types/en-eu.msg | 5 +- .../uniworx/categories/news/de-de-formal.msg | 2 +- .../categories/school/de-de-formal.msg | 4 +- messages/uniworx/categories/school/en-eu.msg | 2 +- .../settings/csv_options/de-de-formal.msg | 14 ++-- .../uniworx/categories/settings/en-eu.msg | 6 +- .../personal_settings/de-de-formal.msg | 2 +- .../system_message/de-de-formal.msg | 2 +- .../uniworx/categories/term/de-de-formal.msg | 2 +- .../uniworx/categories/user/de-de-formal.msg | 6 +- messages/uniworx/categories/user/en-eu.msg | 2 +- .../categories/workflows/de-de-formal.msg | 28 +++---- messages/uniworx/misc/de-de-formal.msg | 4 +- messages/uniworx/test/de-de-formal.msg | 2 +- .../uniworx/utils/buttons/de-de-formal.msg | 4 +- .../handler_form/massinput/de-de-formal.msg | 4 +- .../navigation/breadcrumbs/de-de-formal.msg | 31 ++++--- .../utils/navigation/breadcrumbs/en-eu.msg | 3 +- .../utils/navigation/menu/de-de-formal.msg | 18 ++--- .../uniworx/utils/navigation/menu/en-eu.msg | 2 +- .../utils/site_layout/de-de-formal.msg | 2 +- .../utils/table_column/de-de-formal.msg | 18 ++--- .../utils/table_pagination/de-de-formal.msg | 2 +- messages/uniworx/utils/utils/de-de-formal.msg | 24 +++--- src/Foundation/I18n/TH.hs | 80 +++++++++++++++++-- 43 files changed, 254 insertions(+), 184 deletions(-) diff --git a/messages/uniworx/categories/I18n/de-de-formal.msg b/messages/uniworx/categories/I18n/de-de-formal.msg index cbcb6d8bd..280fbf7a0 100644 --- a/messages/uniworx/categories/I18n/de-de-formal.msg +++ b/messages/uniworx/categories/I18n/de-de-formal.msg @@ -19,14 +19,14 @@ ValueRequiredLabeledSimple fieldLabel@Text: #{fieldLabel} wird benötigt ValueRequiredLabeledMultiWord fieldLabel@Text: „#{fieldLabel}“ wird benötigt UnsupportedAuthPredicate authTagT@Text shownRoute@Text: „#{authTagT}“ wurde auf eine Route angewandt, die dies nicht unterstützt: „#{shownRoute}“ WorkflowScopeGlobal: Systemweit -WorkflowScopeTermSchool tid@TermId ssh@SchoolId: #{tid} #{ssh} -WorkflowScopeCourse tid@TermId ssh@SchoolId csh@CourseShorthand: #{tid} #{ssh} #{csh} +WorkflowScopeTermSchool tid@TermId ssh@SchoolId !ident-ok: #{tid} #{ssh} +WorkflowScopeCourse tid@TermId ssh@SchoolId csh@CourseShorthand !ident-ok: #{tid} #{ssh} #{csh} SecretJSONFieldDecryptFailure: Konnte versteckte vertrauliche Daten nicht entschlüsseln German: Deutsch GermanGermany: Deutsch (Deutschland) English: Englisch EnglishEurope: Englisch (Europa) ShortSexNotKnown: unb. -ShortSexMale: m +ShortSexMale !ident-ok: m ShortSexFemale: w ShortSexNotApplicable: k.A. diff --git a/messages/uniworx/categories/admin/de-de-formal.msg b/messages/uniworx/categories/admin/de-de-formal.msg index d5d5a280a..19d7f9465 100644 --- a/messages/uniworx/categories/admin/de-de-formal.msg +++ b/messages/uniworx/categories/admin/de-de-formal.msg @@ -1,9 +1,9 @@ TestDownloadMaxSize: Maximale Dateigröße TestDownloadMode: Modus -HeadingAdminCrontab: Crontab -AdminInstanceId: Instanz-Nummer:in +HeadingAdminCrontab !ident-ok: Crontab +AdminInstanceId: Instanz-Nummer AdminCrontabNotGenerated: (Noch) keine Crontab generiert -CronMatchAsap: ASAP +CronMatchAsap !ident-ok: ASAP CronMatchNone: Nie ErrMsgCiphertext: Verschlüsselte Fehlermeldung AmbiguousNameCandidatesRemoved n@Int: #{show n} #{pluralDE n "uneindeutiger Kandidat/uneindeutige Kandidatin" "uneindeutige Kandiat:innen"} entfernt @@ -22,7 +22,7 @@ NoParentCandidatesInferred: Keine neuen Unterstudiengänge inferiert StudyDegreeChangeSuccess: Zuordnung Abschlüsse aktualisiert StudyTermsShort: Studiengangkürzel StudyTermsChangeSuccess: Zuordnung Studiengänge aktualisiert -StudyCandidateIncidence: Synchronisation +StudyCandidateIncidence !ident-ok: Synchronisation StudyTermIsNew: Neu AdminFeaturesHeading: Studiengänge StudyTermsParentMissing: Elternteil wird benötigt @@ -52,7 +52,7 @@ BearerTokenRoutesTip: Wenn die Token-Validität nach Routen eingeschränkt und k BearerTokenRouteMissing: Route wird benötigt BearerTokenRestrictions: Routen-spezifische Einschränkungen BearerTokenRestrictRoutes: Token-Validität nach Routen einschränken -BearerTokenRestrictRoute: Route +BearerTokenRestrictRoute !ident-ok: Route BearerTokenRestrictValue: Einschränkung BearerTokenAdditionalAuth: Zusätzliche Authorisierung BearerTokenAdditionalAuthTip: Wird hier nichts angegeben, werden keine Einschränkungen daran gesetzt, wer das Token verwenden kann. Es reicht dann der Besitz. @@ -74,7 +74,7 @@ StudyFeatureParentInference: Unterstudiengang-Inferenz StudyFeatureInferenceNoNameConflicts: Keine Konflikte beobachtet StudyFeatureInferenceNameConflictsHeading: Studiengangseinträge mit beobachteten Konflikten -AdminHeading: Administration +AdminHeading !ident-ok: Administration AdminPageEmpty: Diese Seite soll eine Übersichtsseite für Administrator:innen werden. Aktuell finden sich hier nur Links zu wichtigen Administrator-Funktionalitäten. BearerTokenImpersonate: Auftreten als BearerTokenImpersonateNone: Keine Änderung @@ -85,7 +85,7 @@ BearerTokenImpersonateRandomNegative: Anzahl muss positiv sein BearerTokenImpersonateRandomCount: Anzahl BearerTokenImpersonateUnknownUser email@UserEmail: Ein Nutzer/Eine Nutzerin mit E-Mail #{email} ist dem System nicht bekannt BearerTokenImpersonateRandomWeightActivity: Nach Aktivität gewichten -BearerTokenArchiveName: tokens.zip +BearerTokenArchiveName !ident-ok: tokens.zip TestDownloadDirect: Direkte Generierung TestDownloadInTransaction: Generierung während Datenbank-Transaktion diff --git a/messages/uniworx/categories/courses/allocation/de-de-formal.msg b/messages/uniworx/categories/courses/allocation/de-de-formal.msg index bdea74b50..c26a91771 100644 --- a/messages/uniworx/categories/courses/allocation/de-de-formal.msg +++ b/messages/uniworx/categories/courses/allocation/de-de-formal.msg @@ -22,7 +22,7 @@ CourseApplication: Bewerbung AllocationCoursePriority i@Natural: #{i}. Wahl AllocationCourseNoApplication: Keine Bewerbung ApplicationPriority: Priorität -ApplicationVeto: Veto +ApplicationVeto !ident-ok: Veto ApplicationVetoTip: Bewerber:in mit Veto werden garantiert nicht dem Kurs zugeteilt ApplicationRatingPoints: Bewertung ApplicationRatingPointsTip: Bewerber:in mit 5.0 werden garantiert nicht dem Kurs zugeteilt @@ -66,8 +66,8 @@ AllocationTotalCourses: Gewünschte Anzahl von Kursen AllocationTotalCoursesTip: Sie werden im Laufe dieser Zentralanmeldung maximal so vielen Kursen zugeteilt, wie Sie hier angeben AllocationRegistered: Teilnahme an der Zentralanmeldung erfolgreich registriert AllocationRegistrationEdited: Einstellungen zur Teilnahme an der Zentralanmeldung erfolgreich angepasst -AllocationTitle termText@Text ssh'@SchoolShorthand allocation@AllocationName: #{termText} - #{ssh'}: #{allocation} -AllocationShortTitle termText@Text ssh'@SchoolShorthand ash@AllocationShorthand: #{termText} - #{ssh'} - #{ash} +AllocationTitle termText@Text ssh'@SchoolShorthand allocation@AllocationName !ident-ok: #{termText} - #{ssh'}: #{allocation} +AllocationShortTitle termText@Text ssh'@SchoolShorthand ash@AllocationShorthand !ident-ok: #{termText} - #{ssh'} - #{ash} AllocationNotificationNewCourse: Benachrichtigung bei neuen Kursen AllocationNotificationNewCourseTip: Wollen Sie per E-Mail benachrichtigt werden, wenn für diese Zentralanmeldung ein neuer Kurs eingetragen wird? Dies überschreibt die systemweite Einstellung in "Anpassen". AllocationNotificationNewCourseSuccessForceOn: Sie werden benachrichtigt, wenn ein neuer Kurs eingetragen wird @@ -93,8 +93,8 @@ AllocationUsersTitle tid@TermId ssh@SchoolId ash@AllocationShorthand: #{tid}-#{s #templates allocation/show/course AllocationNoApplication: Keine Bewerbung CourseAllocationCourseParticipants: Teilnehmer:innen -CourseMembersCount n@Int: #{n} -CourseMembersCountLimited n@Int max@Int: #{n}/#{max} +CourseMembersCount n@Int !ident-ok: #{n} +CourseMembersCountLimited n@Int max@Int !ident-ok: #{n}/#{max} #templates allocation/accept ComputedAllocation: Berechnete Vergabe @@ -110,7 +110,7 @@ AllocationMatchedUsers: Neu zugeteilt #templates allocation/show AllocationSchool: Institut -AllocationSemester: Semester +AllocationSemester !ident-ok: Semester AllocationDescription: Beschreibung AllocationStaffDescription: Beschreibung für Dozierende AllocationStaffRegisterFrom: Eintragung der Kurse ab @@ -145,12 +145,12 @@ AllocationCourseRestrictionDontRestrict: Nicht einschränken AllocationCourseRestrictionSubstitutes: Kurse, die aktuell Nachrücker akzeptieren AllocationCourseRestrictionCustom: Benutzerdefiniert -AllocationName: Name +AllocationName !ident-ok: Name Allocation: Zentralanmeldung AllocationActive: Aktiv AllocationUsersApplied: Bewerbungen AllocationUsersAssigned: Zuweisungen -AllocationUsersVetoed: Vetos +AllocationUsersVetoed !ident-ok: Vetos AllocationUsersRequested: Angefragte Plätze AllocationUsersPriority: Zentrale Dringlichkeit diff --git a/messages/uniworx/categories/courses/courses/application/de-de-formal.msg b/messages/uniworx/categories/courses/courses/application/de-de-formal.msg index ea810eaf2..90052d046 100644 --- a/messages/uniworx/categories/courses/courses/application/de-de-formal.msg +++ b/messages/uniworx/categories/courses/courses/application/de-de-formal.msg @@ -1,5 +1,5 @@ CourseApplicationTitle displayName@Text csh@CourseShorthand: Bewerbung für #{csh}: #{displayName} -CourseApplicationArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand appId@CryptoFileNameCourseApplication displayName@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase (toPathPiece appId)}-#{foldCase displayName} +CourseApplicationArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand appId@CryptoFileNameCourseApplication displayName@Text !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase (toPathPiece appId)}-#{foldCase displayName} CourseApplicationsAllocatedDirectory: zentral CourseApplicationsNotAllocatedDirectory: direkt CsvColumnApplicationsAllocation: Zentralanmeldung über die die Bewerbung eingegangen ist @@ -18,7 +18,7 @@ ApplicationUserColumns: Bewerbung ApplicationRatingColumns: Bewertung ApplicationGeneratedColumns: Stammdaten ApplicationGeneratedColumnsTip: Stammdaten eines/einer Bewerbers/Bewerberin sind Daten, welche dem System zu diesem/dieser Benutzer/Benutzerin bekannt sind und welche der/die Benutzer/Benutzerin im Zuge der Bewerbung nicht beeinflussen kann. -CourseApplicationVeto: Veto +CourseApplicationVeto !ident-ok: Veto CourseApplicationNoVeto: Kein Veto CourseApplicationNoRatingPoints: Keine Bewertung CourseApplicationNoRatingComment: Kein Kommentar diff --git a/messages/uniworx/categories/courses/courses/de-de-formal.msg b/messages/uniworx/categories/courses/courses/de-de-formal.msg index 729c25f05..7995196d3 100644 --- a/messages/uniworx/categories/courses/courses/de-de-formal.msg +++ b/messages/uniworx/categories/courses/courses/de-de-formal.msg @@ -1,6 +1,6 @@ FilterCourse: Kurs FilterCourseShort: Kürzel -FilterTerm: Semester +FilterTerm !ident-ok: Semester FilterCourseSchoolShort: Institut FilterRegistered: Angemeldet FilterCourseSearch: Volltext-Suche @@ -16,7 +16,7 @@ CourseLecturerAlreadyAdded: Diese:r Nutzer:in ist bereits als Kursverwalter:in e CourseLecturerType: Rolle LecturerType: Rolle CourseLecturerRightsIdentical: Alle Sorten von Kursverwalter:innen haben identische Rechte. -CourseAllocationOption term@Text name@Text: #{name} (#{term}) +CourseAllocationOption term@Text name@Text !ident-ok: #{name} (#{term}) CourseAllocationParticipate: Teilnahme an Zentralanmeldung CourseAllocationParticipateTip: Wird an einer Zentralanmeldung teilgenommen, kann es sein, dass Sie bestimmte Rechte, die Sie normalerweise bzgl. Ihres Kurses hätten, nicht ausüben können (z.B. Studierende direkt zum Kurs anmelden, Studierende abmelden, ...). CourseNoAllocationsAvailable: Es sind aktuell keine Zentralanmeldungen verfügbar @@ -33,7 +33,7 @@ CourseSchoolMultipleTip: Es stehen für Sie mehrere Institute zur Auswahl. Stell CourseName: Kurstitel CourseShorthand: Kürzel CourseShorthandUnique: Muss nur innerhalb Institut und Semester eindeutig sein. Wird verbatim in die Url der Kursseite übernommen. -CourseSemester: Semester +CourseSemester !ident-ok: Semester CourseDescriptionPlaceholder: Bitte mindestens die Modulbeschreibung angeben CourseHomepageExternal: Externe Homepage CourseSemesterMultipleTip: Es stehen für Sie aktuell mehrere Semester zur Auswahl. Stellen Sie bitte sicher, dass Sie das für den Kurs korrekte Semester wählen. @@ -188,7 +188,7 @@ AssistantsFor: Assistent:innen TutorsFor n@Int: #{pluralDE n "Tutor:in" "Tutor:innen"} CorrectorsFor n@Int: #{pluralDE n "Korrektor:in" "Korrektor:innen"} CourseParticipantsHeading: Kursteilnehmer:innen -CourseParticipantsCount n@Int: #{n} +CourseParticipantsCount n@Int !ident-ok: #{n} CourseParticipantsCountOf n@Int m@Int: #{n} von #{m} CourseVisibility: Sichtbarkeit CourseInvisible: Dieser Kurs ist momentan nur für Dozierende, Assistent:innen, Tutor:innen, Korrektor:innen, angemeldete Teilnehmer:innen und Bewerber:innen sichtbar. @@ -202,7 +202,7 @@ CourseApplicationTemplateApplication: Bewerbungsvorlage(n) CourseApplicationTemplateRegistration: Anmeldungsvorlage(n) NotRegistered: Sie sind zu diesem Kurs nicht angemeldet. CourseApplicationDeleteToEdit: Um Ihre Bewerbung zu editieren müssen Sie sie zunächst zurückziehen und sich erneut bewerben. -CourseMaterial: Material +CourseMaterial !ident-ok: Material CourseMaterialNotFree: Das Kursmaterial ist nur für Mitglieder des Kurses einsehbar, also z.B. für Teilnehmer:innen, Tutor:innen, Korrektor:innen und Verwalter:innen. CourseMaterialsFoundHere: Material zum Kurs finden Sie hier CourseMaterialsNoneVisible: Aktuell gibt es zu diesem Kurs kein Material, oder nur Material auf das Sie keinen Zugriff haben (z.B. aufgrund von Fristen bzgl. der Sichtbarkeit). diff --git a/messages/uniworx/categories/courses/courses/event/de-de-formal.msg b/messages/uniworx/categories/courses/courses/event/de-de-formal.msg index 174b3a6d3..45a8de903 100644 --- a/messages/uniworx/categories/courses/courses/event/de-de-formal.msg +++ b/messages/uniworx/categories/courses/courses/event/de-de-formal.msg @@ -5,7 +5,7 @@ CourseEventTime: Zeit CourseEventRoom: Regulärer Raum CourseEventRoomHidden: Raum nur für Teilnehmer:innen CourseEventRoomHiddenTip: Soll der Raum nur angemeldeten Kursteilnehmer:innen angezeigt werden? -CourseEventRoomIsUnset: — +CourseEventRoomIsUnset !ident-ok: — CourseEventRoomIsHidden: Raum wird nur Kurs-assoziierten Personen (Teilnehmer:innen, Tutor:innen, Korrektor:innen, etc.) angezeigt CourseEventNote: Notiz CourseEventActions: Aktionen diff --git a/messages/uniworx/categories/courses/courses/news/de-de-formal.msg b/messages/uniworx/categories/courses/courses/news/de-de-formal.msg index 85bee4c56..f9394379f 100644 --- a/messages/uniworx/categories/courses/courses/news/de-de-formal.msg +++ b/messages/uniworx/categories/courses/courses/news/de-de-formal.msg @@ -1,5 +1,5 @@ CourseNews: Aktuelles -CourseNewsArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand newsTitle@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase newsTitle} +CourseNewsArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand newsTitle@Text !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase newsTitle} CourseNewsFiles: Dateien CourseNewsLastEdited time@Text: Zuletzt verändert: #{time} CourseNewsActionEdit: Bearbeiten diff --git a/messages/uniworx/categories/courses/exam/exam/de-de-formal.msg b/messages/uniworx/categories/courses/exam/exam/de-de-formal.msg index 9d0d9d378..32713c799 100644 --- a/messages/uniworx/categories/courses/exam/exam/de-de-formal.msg +++ b/messages/uniworx/categories/courses/exam/exam/de-de-formal.msg @@ -12,8 +12,8 @@ ExamAutoOccurrenceMinimizeRooms: Verwendete Räume/Termine minimieren ExamAutoOccurrenceMinimizeRoomsTip: Soll, für die Aufteilung, die Liste an Räumen/Terminen zunächst reduziert werden, sodass nur so wenige Räume verwendet werden, wie nötig (größte zuerst)? ExamAutoOccurrenceOccurrencesChangedInFlight: Raumliste wurde verändert ExamAutoOccurrenceParticipantsAssigned num@Int64: Verteilungstabelle erfolgreich gespeichert und #{num} #{pluralDE num "Teilnehmer:in" "Teilnehmer:innen"} zugewiesen -Proportion c@Text of'@Text prop@Rational: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) -ProportionNoRatio c@Text of'@Text: #{c}/#{of'} +Proportion c@Text of'@Text prop@Rational !ident-ok: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) +ProportionNoRatio c@Text of'@Text !ident-ok: #{c}/#{of'} ExamCorrectHeading examname@Text: Prüfungsergebnisse für #{examname} eintragen ExamCorrectErrorNeedleTooShort: Dieser Identifikator ist zu kurz. ExamCorrectErrorMultipleMatchingParticipants: Dem Identifikator konnten mehrere Prüfungsteilnehmer:innen zugeordnet werden. @@ -119,7 +119,7 @@ ExamOccurrenceStartMustBeAfterExamStart eoName@ExamOccurrenceName: Beginn des Te ExamOccurrenceEndMustBeBeforeExamEnd eoName@ExamOccurrenceName: Ende des Termins #{eoName} liegt nach dem Ende der Prüfung ExamOccurrenceDuplicate eoRoom@Text eoRange@Text: Raum #{eoRoom}, Termin #{eoRange} kommt mehrfach mit der selben Beschreibung vor ExamOccurrenceDuplicateName eoName@ExamOccurrenceName: Interne Terminbezeichnung #{eoName} kommt mehrfach vor -ExamOccurrenceRoomIsUnset: — +ExamOccurrenceRoomIsUnset !ident-ok: — ExamOccurrenceRoomIsHidden: Raum wird nur Teilnehmer:innen angezeigt ExamOccurrenceCannotBeDeletedDueToRegistrations eoName@ExamOccurrenceName: Termin #{eoName} kann nicht gelöscht werden, da noch Teilnehmer:innen diesem Termin zugewiesen sind. Über die Liste von Prüfungsteilnehmern können Sie zunächst die entsprechenden Terminzuweisungen entfernen. ExamRegistrationMustFollowSchoolSeparationFromStart dayCount@Int: Nach Regeln des Instituts #{pluralDE dayCount "muss" "müssen"} zwischen "Anmeldung ab" und "Beginn" mindestens #{dayCount} #{pluralDE dayCount "Tag" "Tage"} liegen. @@ -183,8 +183,8 @@ ExamUsersResultSet count@Int64: Prüfungsergebnis für #{show count} #{pluralDE ExamUsersHeading: Prüfungsteilnehmer:innen ExamCorrectHeadDate: Zeit ExamCorrectHeadParticipant: Teilnehmer:in -ExamCorrectHeadPart exampartnum@ExamPartNumber: #{exampartnum} -ExamCorrectHeadStatus: Status +ExamCorrectHeadPart exampartnum@ExamPartNumber !ident-ok: #{exampartnum} +ExamCorrectHeadStatus !ident-ok: Status ExamCorrectUserCandidatesMore: und weitere ExamCorrectExamResultDelete: Prüfungsergebnis löschen ExamCorrectExamResultNone: Keine Änderung @@ -199,7 +199,7 @@ ExamCloseHeading: Prüfung abschließen ExamAutoOccurrenceHeading: Automatische Raum-/Terminverteilung #templates /exam-show -ExamShowOnline: Online/Offline +ExamShowOnline !ident-ok: Online/Offline ExamShowSynchronicity: Synchron/Asynchron ExamNever: Nie ExamShowAids: Erlaubte Hilfsmittel @@ -211,7 +211,7 @@ ExamBonusRule: Prüfungsbonus aus Übungsbetrieb ExamOccurrenceRule: Verfahren ExamOccurrenceRuleParticipant: Termin- bzw. Raumzuteilungsverfahren ExamRegisteredCount: Anmeldungen -ExamRegisteredCountOf num@Int64 count@Int64: #{num}/#{count} +ExamRegisteredCountOf num@Int64 count@Int64 !ident-ok: #{num}/#{count} ExamOccurrences: Termine GradingFrom: Ab ExamNoShow: Nicht erschienen @@ -247,7 +247,7 @@ PointsMustBeMonotonic: Punktegrenzen müssen aufsteigend sein ExamModeFormNone: Keine Angabe ExamModeFormCustom: Benutzerdefiniert ExamModeFormAids: Erlaubte Hilfsmittel -ExamModeFormOnline: Online/Offline +ExamModeFormOnline !ident-ok: Online/Offline ExamModeFormSynchronicity: Synchron/Asynchron ExamModeFormRequiredEquipment: Erforderliche Hilfsmittel ExamModeFormRequiredEquipmentIdentificationTip: Es wird stets ein Hinweis angezeigt, dass Teilnehmer sich ausweisen können müssen. @@ -271,8 +271,8 @@ ExamRegistrationRegisteredWithoutField n@Int: #{n} #{pluralDE n "Teilnehmer:in w ExamRegistrationParticipantsRegistered n@Int: #{n} #{pluralDE n "Teilnehmer:in wurde" "Teilnehmer:innen wurden"} zur Prüfung angemeldet ExamOpenBook: Open Book ExamClosedBook: Closed Book -ExamOnline: Online -ExamOffline: Offline +ExamOnline !ident-ok: Online +ExamOffline !ident-ok: Offline ExamSynchronous: Synchron ExamAsynchronous: Asynchron ExamRequiredEquipmentNone: Nichts diff --git a/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg b/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg index ecdfd7ecb..ee5a84a00 100644 --- a/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg +++ b/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg @@ -43,7 +43,7 @@ ExamFinishedSince time@Text: Prüfungsergebnisse sichtbar seit #{time} #templates exam-office/* -ExamUserSyncOfficeName: Name +ExamUserSyncOfficeName !ident-ok: Name ExamUserSyncTime: Zeitpunkt ExamUserSyncSchools: Institute ExamUserSyncLastChange: Zuletzt geändert diff --git a/messages/uniworx/categories/courses/exam/external_exam/de-de-formal.msg b/messages/uniworx/categories/courses/exam/external_exam/de-de-formal.msg index efa287106..e1190592e 100644 --- a/messages/uniworx/categories/courses/exam/external_exam/de-de-formal.msg +++ b/messages/uniworx/categories/courses/exam/external_exam/de-de-formal.msg @@ -14,7 +14,7 @@ ExternalExamCorrectErrorNoMatchingUsers: Dem Identifikator konnte kein Studieren ExternalExamEdited coursen@CourseName examn@ExamName: Prüfung „#{examn}“ für Kurs „#{coursen}“ erfolgreich bearbeitet. ExternalExamExists coursen@CourseName examn@ExamName: Prüfung „#{examn}“ für Kurs „#{coursen}“ existiert bereits. ExternalExamEdit coursen@CourseName examn@ExamName: Bearbeiten: #{coursen}, #{examn} -ExternalExamSemester: Semester +ExternalExamSemester !ident-ok: Semester ExternalExamSchool: Institut ExternalExamCourseName: Veranstaltung ExternalExamCourseNameTip: Muss nur innerhalb von Semester und Institut eindeutig sein. @@ -55,15 +55,15 @@ ExternalExamUserMarkSynchronisedCsvTip: Sollen beim CSV-Export automatisch alle ExternalExamUserCsvName tid@TermId ssh@SchoolId coursen@CourseName examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase coursen}-#{foldedCase examn}-teilnehmer ExternalExamUserSynchronised: Synchronisiert ExternalExamAction: Aktion -ExampleUser1FirstName: Max ZweiterName -ExampleUser1Surname: Mustermann -ExampleUser1DisplayName: Max Mustermann -ExampleUser2FirstName: Martha -ExampleUser2Surname: Musterstudent -ExampleUser2DisplayName: Musterstudent Martha -ExampleUser3FirstName: Maria -ExampleUser3Surname: Beispiel -ExampleUser3DisplayName: Beispiel +ExampleUser1FirstName !ident-ok: Max ZweiterName +ExampleUser1Surname !ident-ok: Mustermann +ExampleUser1DisplayName !ident-ok: Max Mustermann +ExampleUser2FirstName !ident-ok: Martha +ExampleUser2Surname !ident-ok: Musterstudent +ExampleUser2DisplayName !ident-ok: Musterstudent Martha +ExampleUser3FirstName !ident-ok: Maria +ExampleUser3Surname !ident-ok: Beispiel +ExampleUser3DisplayName !ident-ok: Beispiel ExternalExamUserCsvSheetName tid@TermId ssh@SchoolId coursen@CourseName examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase coursen}-#{foldedCase examn} Teilnehmer ExternalExamUserMarkSynchronised: Prüfungsleistung als synchronisiert markieren diff --git a/messages/uniworx/categories/courses/material/de-de-formal.msg b/messages/uniworx/categories/courses/material/de-de-formal.msg index f60733335..63311eb1d 100644 --- a/messages/uniworx/categories/courses/material/de-de-formal.msg +++ b/messages/uniworx/categories/courses/material/de-de-formal.msg @@ -1,9 +1,9 @@ -MaterialList: Material -MaterialName: Name +MaterialList !ident-ok: Material +MaterialName !ident-ok: Name MaterialType: Art MaterialTypePlaceholder: Folien, Code, Beispiel, ... MaterialTypeSlides: Folien -MaterialTypeCode: Code +MaterialTypeCode !ident-ok: Code MaterialTypeExample: Beispiel MaterialDescription: Beschreibung MaterialVisibleFrom: Sichtbar für Teilnehmer:innen ab @@ -11,8 +11,8 @@ MaterialVisibleFromTip: Ohne Datum nie sichtbar für Teilnehmer:innen; leer lass MaterialVisibleFromEditWarning: Das Datum der Veröffentlichung liegt in der Vergangenheit und sollte nicht mehr verändert werden, da dies die Benutzer:innen verwirren könnte. MaterialInvisible: Dieses Material ist für Teilnehmer:innen momentan unsichtbar! MaterialFiles: Dateien -MaterialHeading materialName@MaterialName: #{materialName} -MaterialListHeading: Materialien +MaterialHeading materialName@MaterialName !ident-ok: #{materialName} +MaterialListHeading !ident-ok: Material MaterialNewHeading: Neues Material veröffentlichen MaterialNewTitle: Neues Material MaterialEditHeading materialName@MaterialName: Material "#{materialName}" editieren @@ -23,8 +23,8 @@ MaterialDeleteCaption: Wollen Sie das unten aufgeführte Material wirklich lösc MaterialDelHasFiles count@Int64: inklusive #{count} #{pluralDE count "Datei" "Dateien"} MaterialIsVisible: Achtung, dieses Material wurde bereits veröffentlicht. MaterialDeleted materialName@MaterialName: Material "#{materialName}" gelöscht -MaterialArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand materialName@MaterialName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase materialName} -MaterialVideo materialName@MaterialName: #{materialName} - Video +MaterialArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand materialName@MaterialName !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase materialName} +MaterialVideo materialName@MaterialName !ident-ok: #{materialName} - Video MaterialVideoUnsupported: Ihr Browser scheint keine eingebetten Videos zu unterstützen MaterialVideoDownload: Herunterladen MaterialFree: Kursmaterialien ohne Anmeldung zugänglich diff --git a/messages/uniworx/categories/courses/participants/de-de-formal.msg b/messages/uniworx/categories/courses/participants/de-de-formal.msg index a8c5dfafb..ae957c977 100644 --- a/messages/uniworx/categories/courses/participants/de-de-formal.msg +++ b/messages/uniworx/categories/courses/participants/de-de-formal.msg @@ -1,7 +1,7 @@ ParticipantsList: Kursteilnehmerlisten ParticipantsIntersect: Überschneidung von Kursteilnehmer:innen ParticipantsCsvName tid@TermId ssh@SchoolId: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-kursteilnehmer:innen -ParticipantsIntersectCourseOption tid@TermId ssh@SchoolId coursen@CourseName: #{tid} - #{ssh} - #{coursen} +ParticipantsIntersectCourseOption tid@TermId ssh@SchoolId coursen@CourseName !ident-ok: #{tid} - #{ssh} - #{coursen} ParticipantsIntersectCourses: Kurse CourseParticipantsRegisteredWithoutField n@Int: #{n} #{pluralDE n "Teilnehmeri:in wurde ohne assoziiertes Studienfach" "Teilnehmer:innen wurden ohne assoziierte Studienfächer"} angemeldet, da #{pluralDE n "kein eindeutiges Hauptfach bestimmt werden konnte" "keine eindeutigen Hauptfächer bestimmt werden konnten"} ParticipantsCsvSheetName tid@TermId ssh@SchoolId: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)} Kursteilnehmer:innen diff --git a/messages/uniworx/categories/courses/sheet/de-de-formal.msg b/messages/uniworx/categories/courses/sheet/de-de-formal.msg index 699191285..c6d9e7959 100644 --- a/messages/uniworx/categories/courses/sheet/de-de-formal.msg +++ b/messages/uniworx/categories/courses/sheet/de-de-formal.msg @@ -7,8 +7,8 @@ SheetNoOldUnassigned: Alle Abgaben inaktiver Blätter sind bereits einem Korrekt SheetDelHasSubmissions objs@Int: Inkl. #{objs} #{pluralDE objs "Abgabe" "Abgaben"}! SheetDeleteQuestion: Wollen Sie das unten aufgeführte Übungsblatt und alle zugehörigen Abgaben wirklich löschen? SheetDeleted: Übungsblatt gelöscht -SheetArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn} -SheetTypeArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName renderedSft@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-#{foldCase renderedSft} +SheetArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn} +SheetTypeArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName renderedSft@Text !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-#{foldCase renderedSft} SheetEditOk tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName: Übungsblatt #{sheetName} wurde gespeichert in Kurs #{tid}-#{ssh}-#{csh} SheetNameDup tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName: Es gibt bereits ein Übungsblatt #{sheetName} in diesem Kurs #{tid}-#{ssh}-#{csh} SheetVisibleFrom: Sichtbar für Teilnehmer:innen ab @@ -17,7 +17,7 @@ SheetActiveFrom: Aktiv ab/Beginn Abgabezeitraum SheetActiveTo: Aktiv bis/Ende Abgabezeitraum SheetSolutionFrom: Lösung ab SheetSolutionFromTip: Ohne Datum nie für Teilnehmer:innen sichtbar, Korrektor:innen können diese Dateien immer herunterladen -SheetName: Name +SheetName !ident-ok: Name SheetDescription: Hinweise für Teilnehmer:innen SheetRequireExam: Anmeldung zu einer Prüfung voraussetzen? SheetRequireExamTip: Wenn die Anmeldung zu einer Prüfung vorausgesetzt wird, können nur Kursteilnehmer:innen abgeben, die zum Zeitpunkt der Abgabe auch zur gewählten Prüfung angemeldet sind. Auch der Download von Übungsblatt-Dateien wird nur zur Prüfung angemeldeten Kursteilnehmer:innen erlaubt. @@ -142,7 +142,7 @@ PersonalisedSheetFilesDownloadSurnames: Mit Nachnamen PersonalisedSheetFilesDownloadMatriculations: Mit Matrikelnummern PersonalisedSheetFilesDownloadGroups: Mit festen Abgabegruppen -SheetCorrectorNormal: Normal +SheetCorrectorNormal !ident-ok: Normal SheetCorrectorMissing: Abwesend SheetCorrectorExcused: Entschuldigt SheetGradingPoints maxPoints@Points: #{maxPoints} #{pluralDE maxPoints "Punkt" "Punkte"} diff --git a/messages/uniworx/categories/courses/submission/de-de-formal.msg b/messages/uniworx/categories/courses/submission/de-de-formal.msg index 5ede7c3f5..d869d66fe 100644 --- a/messages/uniworx/categories/courses/submission/de-de-formal.msg +++ b/messages/uniworx/categories/courses/submission/de-de-formal.msg @@ -24,7 +24,7 @@ SubmissionCorrectionHead tid@TermId ssh@SchoolId csh@CourseShorthand sheetNa CorrectionPseudonyms: Abgaben-Pseudonyme CorrectionPseudonymsTip: Eine Abgabe pro Zeile, bei Gruppenabgaben mehrere Pseudonyme (komma-separiert) innerhalb einer Zeile. Kleine Schreibfehler werden u.U. automatisch korrigiert. PseudonymSheet: Übungsblatt -CorrectionPseudonymSheet termDesc@Text csh@CourseShorthand shn@SheetName: #{termDesc} » #{csh} » #{shn} +CorrectionPseudonymSheet termDesc@Text csh@CourseShorthand shn@SheetName !ident-ok: #{termDesc} » #{csh} » #{shn} SubmissionPseudonyms: Pseudonyme UnknownPseudonym pseudonym@Text: Unbekanntes Pseudonym "#{pseudonym}" SheetGroupTooLarge sheetGroupDesc@Text: Abgabegruppe zu groß: #{sheetGroupDesc} @@ -34,7 +34,7 @@ SheetNoGroupSubmission sheetGroupDesc@Text: Gruppenabgabe ist für dieses Blatt SheetDuplicatePseudonym: Folgende Pseudonyme kamen mehrfach vor; alle Vorkommen außer dem Ersten wurden ignoriert: SheetCreateExisting: Folgende Pseudonyme haben bereits abgegeben: SubmissionCorrCreate: Abgaben registrieren -SubmissionTypeArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName subId@CryptoFileNameSubmission renderedSfType@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-#{foldCase (toPathPiece subId)}-#{foldCase renderedSfType} +SubmissionTypeArchiveName tid@TermId ssh@SchoolId csh@CourseShorthand shn@SheetName subId@CryptoFileNameSubmission renderedSfType@Text !ident-ok: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-#{foldCase (toPathPiece subId)}-#{foldCase renderedSfType} NoOpenSubmissions: Keine unkorrigierten Abgaben vorhanden ColumnRatingPoints: Punktzahl RatingComment: Kommentar @@ -98,7 +98,7 @@ SubmissionSheetMarking: Hinweise für Korrektor:innen SubmissionGradingSummaryTitle intgr@Integer: #{intgr} #{pluralDE intgr "Abgabe" "Abgaben"} SubmissionNoUploadExpected: Es ist keine Abgabe von Dateien vorgesehen. SubmissionFilesCorrected: Abgegebene & Korrigierte Dateien -SubmissionOriginal: Original +SubmissionOriginal !ident-ok: Original EditedBy name@Text time@Text: #{time} durch #{name} SubmissionReplace: Abgabe ersetzen @@ -135,10 +135,10 @@ SubmissionDeleteCosubmittorsWarning n@Int: Bei #{pluralDE n "der oben aufgeführ GenericShort: Kürzel GenericBack: Zurück GenericChange: Änderung -GenericNumChange: +/- -GenericMin: Min -GenericAvg: Avg -GenericMax: Max +GenericNumChange !ident-ok: +/- +GenericMin !ident-ok: Min +GenericAvg !ident-ok: Avg +GenericMax !ident-ok: Max GenericAll: Insgesamt SubmissionFilesUnchanged: Abgabedateien beibehalten SubmissionFilesUnchangedTip: Sollen die bestehenden Abgabedateien beim Ersetzen der Abgabe unverändert übernommen werden? diff --git a/messages/uniworx/categories/help/de-de-formal.msg b/messages/uniworx/categories/help/de-de-formal.msg index 2ef2741dc..76e0dea5c 100644 --- a/messages/uniworx/categories/help/de-de-formal.msg +++ b/messages/uniworx/categories/help/de-de-formal.msg @@ -10,7 +10,7 @@ HelpSubject: Betreff HelpRequest: Supportanfrage/Verbesserungsvorschlag HelpSent: Ihre Supportanfrage wurde weitergeleitet. AdditionalFaqs: Weitere häufig gestellte Fragen -HelpName: Name +HelpName !ident-ok: Name HelpTitle : Hilfe HelpSendLastError: Letzte Fehlermeldung anhängen HelpError: Letzte Fehlermeldung diff --git a/messages/uniworx/categories/jobs_handler/de-de-formal.msg b/messages/uniworx/categories/jobs_handler/de-de-formal.msg index c43201c72..9486409fa 100644 --- a/messages/uniworx/categories/jobs_handler/de-de-formal.msg +++ b/messages/uniworx/categories/jobs_handler/de-de-formal.msg @@ -2,7 +2,7 @@ MailTestSubject: Uni2work Test-E-Mail MailTestContent: Dies ist eine Test-E-Mail versandt von Uni2work. Von Ihrer Seite ist keine Handlung notwendig. MailTestDateTime: Test der Datumsformattierung: MailSubjectSupport: Supportanfrage -MailSubjectSupportCustom customSubject@Text: [Support] #{customSubject} +MailSubjectSupportCustom customSubject@Text !ident-ok: [Support] #{customSubject} MailSubjectPasswordReset: Uni2work-Passwort ändern bzw. setzen CommUndisclosedRecipients: Verborgene Empfänger:innen CommAllRecipients: alle-empfaenger diff --git a/messages/uniworx/categories/metrics/de-de-formal.msg b/messages/uniworx/categories/metrics/de-de-formal.msg index b60f5fad6..6b9cc6300 100644 --- a/messages/uniworx/categories/metrics/de-de-formal.msg +++ b/messages/uniworx/categories/metrics/de-de-formal.msg @@ -1,4 +1,4 @@ TitleMetrics: Metriken MetricNoSamples: Keine Messwerte -MetricName: Name +MetricName !ident-ok: Name MetricValue: Wert diff --git a/messages/uniworx/categories/model_types/de-de-formal.msg b/messages/uniworx/categories/model_types/de-de-formal.msg index 115e96b4c..a3fd04ca8 100644 --- a/messages/uniworx/categories/model_types/de-de-formal.msg +++ b/messages/uniworx/categories/model_types/de-de-formal.msg @@ -1,13 +1,16 @@ -ChangelogItemFeature: Feature -ChangelogItemBugfix: Bugfix -SexNotKnown: Unknown -SexMale: Male -SexFemale: Female -SexNotApplicable: Not applicable -NoSubmissions: No submission -CorrectorSubmissions: External submission via pseudonym -UserSubmissions: Direct submission in Uni2work -SystemExamOffice: Exam office -SystemFaculty: Faculty member -SystemStudent: Student -BothSubmissions: Submission either directly in Uni2work or externally via pseudonym +ChangelogItemFeature !ident-ok: Feature +ChangelogItemBugfix !ident-ok: Bugfix + +SexNotKnown: Unbekannt +SexMale: Männlich +SexFemale: Weiblich +SexNotApplicable: Keine Angabe + +NoSubmissions: Keine Abgabe +CorrectorSubmissions: Abgabe extern mit Pseudonym +UserSubmissions: Direkte Abgabe in Uni2work +BothSubmissions: Abgabe direkt in Uni2work oder extern mit Pseudonym + +SystemExamOffice: Prüfungsverwaltung +SystemFaculty: Fakultätsmitglied +SystemStudent: Student:in diff --git a/messages/uniworx/categories/model_types/en-eu.msg b/messages/uniworx/categories/model_types/en-eu.msg index 115e96b4c..2bbb34a44 100644 --- a/messages/uniworx/categories/model_types/en-eu.msg +++ b/messages/uniworx/categories/model_types/en-eu.msg @@ -1,13 +1,16 @@ ChangelogItemFeature: Feature ChangelogItemBugfix: Bugfix + SexNotKnown: Unknown SexMale: Male SexFemale: Female SexNotApplicable: Not applicable + NoSubmissions: No submission CorrectorSubmissions: External submission via pseudonym UserSubmissions: Direct submission in Uni2work +BothSubmissions: Submission either directly in Uni2work or externally via pseudonym + SystemExamOffice: Exam office SystemFaculty: Faculty member SystemStudent: Student -BothSubmissions: Submission either directly in Uni2work or externally via pseudonym diff --git a/messages/uniworx/categories/news/de-de-formal.msg b/messages/uniworx/categories/news/de-de-formal.msg index c603bf28f..948693369 100644 --- a/messages/uniworx/categories/news/de-de-formal.msg +++ b/messages/uniworx/categories/news/de-de-formal.msg @@ -4,7 +4,7 @@ NewsUpcomingSheets: Anstehende Übungsblätter NewsUpcomingExams: Bevorstehende Prüfungen NewsHideHiddenSystemMessages: Versteckte Nachrichten nicht mehr anzeigen NewsShowHiddenSystemMessages: Versteckte Nachrichten anzeigen -NewsExamOccurrenceRoomIsUnset: — +NewsExamOccurrenceRoomIsUnset !ident-ok: — NewsExamOccurrenceRoomIsHidden: Raum wird nur Teilnehmer:innen angezeigt NewsExamRegistered: Zur Prüfung angemeldet NewsExamNotRegistered: Nicht zur Prüfung angemeldet diff --git a/messages/uniworx/categories/school/de-de-formal.msg b/messages/uniworx/categories/school/de-de-formal.msg index c4f20ae47..28cf19c0e 100644 --- a/messages/uniworx/categories/school/de-de-formal.msg +++ b/messages/uniworx/categories/school/de-de-formal.msg @@ -1,6 +1,6 @@ HeadingSchoolList: Institute SchoolShort: Kürzel -SchoolName: Name +SchoolName !ident-ok: Name SchoolLdapOrganisations: Assoziierte LDAP-Fragmente SchoolLdapOrganisationsTip: Beim Login via LDAP werden dem Nutzer/der Nutzerin alle Institute zugeordnet deren assoziierte LDAP-Fragmente im Eintrag des Nutzer/der Nutzerin gefunden werden SchoolLdapOrganisationMissing: LDAP-Fragment wird benötigt @@ -21,4 +21,4 @@ SchoolLecturer: Dozent:in SchoolEvaluation: Kursumfragenverwaltung SchoolExamOffice: Prüfungsverwaltung SchoolAllocation: Zentralanmeldungs-Administration -SchoolAdmin: Admin \ No newline at end of file +SchoolAdmin !ident-ok: Admin \ No newline at end of file diff --git a/messages/uniworx/categories/school/en-eu.msg b/messages/uniworx/categories/school/en-eu.msg index 4824a54ca..c15e02e7a 100644 --- a/messages/uniworx/categories/school/en-eu.msg +++ b/messages/uniworx/categories/school/en-eu.msg @@ -14,7 +14,7 @@ SchoolExamDiscouragedModes: Exam designs to warn against ExamCloseMode: Exam closure SchoolUpdated ssh: Successfully edited #{ssh} SchoolTitle ssh: Department „#{ssh}“ -TitleSchoolNew: Neues Institut anlegen +TitleSchoolNew: Create new department SchoolCreated ssh: Successfully created #{ssh} SchoolExists ssh: A department named „#{ssh}“ already exists SchoolAdmin: Admin diff --git a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg index 2377a9e92..5041a5918 100644 --- a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg +++ b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg @@ -8,12 +8,12 @@ CsvPresetExcel: Excel-Kompatibel CsvCustom: Benutzerdefiniert CsvDelimiter: Trennzeichen CsvUseCrLf: Zeilenumbrüche -CsvQuoting: Quoting +CsvQuoting !ident-ok: Quoting CsvQuotingTip: Wann sollen Anführungszeichen (") um Felder platziert werden, um Interpretation von im Feld enthaltenen Zeichen als Trennzeichen zu verhindern? -CsvEncoding: Encoding +CsvEncoding !ident-ok: Encoding CsvEncodingTip: CSV-Dateien können in einer anderen Zeichenkodierung als dem vom System standardmäßig verwendeten UTF-8 exportiert werden. Beachten Sie dass es bei nicht-UTF-8 Zeichenkodierungen wmgl. zu Darstellungsproblemen mit Sonderzeichen kommt. -CsvUTF8: UTF-8 (Unicode) -CsvCP1252: Windows CP-1252 ("ANSI") +CsvUTF8 !ident-ok: UTF-8 (Unicode) +CsvCP1252 !ident-ok: Windows CP-1252 ("ANSI") CsvDelimiterNull: Null-Byte CsvDelimiterTab: Tabulator CsvDelimiterComma: Komma @@ -22,8 +22,8 @@ CsvDelimiterSemicolon: Strichpunkt CsvDelimiterBar: Senkrechter Strich CsvDelimiterSpace: Leerzeichen CsvDelimiterUnitSep: Teilgruppentrennzeichen -CsvCrLf: DOS (CRLF) -CsvLf: Unix (LF) +CsvCrLf !ident-ok: DOS (CRLF) +CsvLf !ident-ok: Unix (LF) CsvQuoteNone: Nie CsvQuoteMinimal: Nur wenn nötig CsvQuoteAll: Immer @@ -32,4 +32,4 @@ CsvChangeOptionsLabel: Export-Optionen CsvPresetXlsx: .xlsx Dateien (ECMA-376; Excel ≥2010) CsvFormatField: Dateiformat CsvFormatCsv: .csv (Comma-Separated Values) -CsvFormatXlsx: .xlsx (Office Open XML) +CsvFormatXlsx !ident-ok: .xlsx (Office Open XML) diff --git a/messages/uniworx/categories/settings/en-eu.msg b/messages/uniworx/categories/settings/en-eu.msg index 21311b101..fe8374754 100644 --- a/messages/uniworx/categories/settings/en-eu.msg +++ b/messages/uniworx/categories/settings/en-eu.msg @@ -109,7 +109,7 @@ SubmissionGroupName: Group name TitleChangeUserDisplayEmail: Set display email LanguageChanged: Language changed successfully -AllocNotifyNewCourseDefault: Systemweite Einstellung -AllocNotifyNewCourseForceOff: Nein -AllocNotifyNewCourseForceOn: Ja +AllocNotifyNewCourseDefault: System-wide setting +AllocNotifyNewCourseForceOff: No +AllocNotifyNewCourseForceOn: Yes Settings: Settings \ No newline at end of file diff --git a/messages/uniworx/categories/settings/personal_settings/de-de-formal.msg b/messages/uniworx/categories/settings/personal_settings/de-de-formal.msg index 5e4689621..6e15f8c6d 100644 --- a/messages/uniworx/categories/settings/personal_settings/de-de-formal.msg +++ b/messages/uniworx/categories/settings/personal_settings/de-de-formal.msg @@ -1,6 +1,6 @@ Ident: Identifikation AuthModeSet: Authentifizierung -NameSet: Name +NameSet !ident-ok: Name UserCreated: Account erstellt LastLogin: Letzter Login diff --git a/messages/uniworx/categories/system_message/de-de-formal.msg b/messages/uniworx/categories/system_message/de-de-formal.msg index 1a557c3a2..f17673b8d 100644 --- a/messages/uniworx/categories/system_message/de-de-formal.msg +++ b/messages/uniworx/categories/system_message/de-de-formal.msg @@ -12,7 +12,7 @@ SystemMessageAuthenticatedOnly: Nur angemeldet SystemMessageSeverity: Schwere SystemMessagePriority: Priorität SystemMessagePriorityNegative: Priorität darf nicht negativ sein -SystemMessageId: Id +SystemMessageId !ident-ok: Id SystemMessageSummaryContent: Zusammenfassung / Inhalt SystemMessageSummary: Zusammenfassung SystemMessageContent: Inhalt diff --git a/messages/uniworx/categories/term/de-de-formal.msg b/messages/uniworx/categories/term/de-de-formal.msg index 47f8b740c..445f3c9cf 100644 --- a/messages/uniworx/categories/term/de-de-formal.msg +++ b/messages/uniworx/categories/term/de-de-formal.msg @@ -11,7 +11,7 @@ LectureStart: Beginn Vorlesungen TermEdited tid@TermId: Semester #{tid} erfolgreich editiert. TermNewTitle: Semester editieren/anlegen. InvalidInput: Eingaben bitte korrigieren. -Term: Semester +Term !ident-ok: Semester TermPlaceholder: W/S + vierstellige Jahreszahl TermStartDay: Erster Tag TermStartDayTooltip: Üblicherweise immer 1. April oder 1. Oktober diff --git a/messages/uniworx/categories/user/de-de-formal.msg b/messages/uniworx/categories/user/de-de-formal.msg index 3c0f5db8a..919f49587 100644 --- a/messages/uniworx/categories/user/de-de-formal.msg +++ b/messages/uniworx/categories/user/de-de-formal.msg @@ -18,7 +18,7 @@ LdapSyncedBefore: Letzte LDAP-Synchronisation vor UserSystemFunctions: Systemweite Rollen UserSystemFunctionsSaved: Systemweite Rollen gespeichert UserSystemFunctionsNotChanged: Es wurden keine systemweiten Rollen angepasst -AuthPWHash pwHash@Text: Uni2work +AuthPWHash pwHash@Text !ident-ok: Uni2work AuthPWHashAlreadyConfigured: Nutzer:in meldet sich bereits per Uni2work-Kennung an AuthPWHashConfigured: Nutzer:in meldet sich nun per Uni2work-Kennung an UsersCourseSchool: Institut @@ -32,7 +32,7 @@ AuthLDAPLookupFailed: Nutzer:in konnte aufgrund eines LDAP-Fehlers nicht nachges AuthLDAPInvalidLookup: Bestehender Nutzer/Bestehende Nutzerin konnte nicht eindeutig einem LDAP-Eintrag zugeordnet werden AuthLDAPAlreadyConfigured: Nutzer:in meldet sich bereits per Campus-Kennung in Uni2work an AuthLDAPConfigured: Nutzer:in meldet sich nun per Campus-Kennung in Uni2work an -AuthLDAP: Campus +AuthLDAP !ident-ok: LMU-Account PasswordResetQueued: Link zum Passwort-Zurücksetzen versandt UserAssimilateUser: Benutzer:in AssimilateUserNotFound: E-Mail Adresse konnte keinem Benutzer/keiner Benutzerin zugeordnet werden @@ -76,4 +76,4 @@ AllUsersLdapSync: Alle LDAP-Synchronisieren UserHijack: Sitzung übernehmen AuthKindLDAP: Campus-Kennung AuthKindPWHash: Uni2work-Kennung -Name: Name \ No newline at end of file +Name !ident-ok: Name \ No newline at end of file diff --git a/messages/uniworx/categories/user/en-eu.msg b/messages/uniworx/categories/user/en-eu.msg index b3707b164..09bccc500 100644 --- a/messages/uniworx/categories/user/en-eu.msg +++ b/messages/uniworx/categories/user/en-eu.msg @@ -32,7 +32,7 @@ AuthLDAPLookupFailed: User could not be looked up due to a LDAP error AuthLDAPInvalidLookup: Existing user could not be uniquely matched with a LDAP entry AuthLDAPAlreadyConfigured: User already logs in using their campus account AuthLDAPConfigured: User now logs in using their campus account -AuthLDAP: Campus +AuthLDAP: LMU-Account PasswordResetQueued: Sent link to reset password UserAssimilateUser: User AssimilateUserNotFound: Email could not be resolved to an user diff --git a/messages/uniworx/categories/workflows/de-de-formal.msg b/messages/uniworx/categories/workflows/de-de-formal.msg index 1b4d1dcd1..9d5156471 100644 --- a/messages/uniworx/categories/workflows/de-de-formal.msg +++ b/messages/uniworx/categories/workflows/de-de-formal.msg @@ -4,7 +4,7 @@ WorkflowScopeKindSchool: Pro Institut WorkflowScopeKindTermSchool: Pro Institut & Semester WorkflowScopeKindCourse: Pro Veranstaltung WorkflowDefinitionScope: Bereich -WorkflowDefinitionName: Name +WorkflowDefinitionName !ident-ok: Name WorkflowDefinitionDescriptions: Beschreibung WorkflowDefinitionDescriptionsLanguageExists: Eine Beschreibung in dieser Sprache existiert bereits WorkflowDefinitionGraph: Spezifikation @@ -26,7 +26,7 @@ WorkflowDefinitionWarningLinterIssues: Es sind folgende Linter issues aufgetrete WorkflowDefinitionListTitle: Workflow-Definitionen WorkflowDefinitionInstanceCount: Instanzen -WorkflowDefinitionWorkflowCount: Workflows +WorkflowDefinitionWorkflowCount !ident-ok: Workflows WorkflowDefinitionConcreteInstanceCount num@Int64: #{num} Instanzen WorkflowDefinitionConcreteWorkflowCount num@Int64: #{num} Workflows WorkflowDefinitionDeleteQuestion: Wollen Sie die unten aufgeführte Workflow-Definition wirklich löschen? @@ -35,7 +35,7 @@ WorkflowDefinitionInstantiateTitle: Workflow-Definition instanziieren WorkflowDefinitionInstantiated: Instanz angelegt WorkflowScope: Bereich -WorkflowInstanceName: Name +WorkflowInstanceName !ident-ok: Name WorkflowInstanceCategory: Kategorie WorkflowInstanceCollision: Es existiert bereits eine Workflow-Instanz mit diesem Namen und Bereich WorkflowInstanceListTitle: Workflow-Instanzen @@ -44,7 +44,7 @@ WorkflowInstanceDescriptions: Instanz-Beschreibung WorkflowInstanceDescriptionsLanguageExists: Eine Instanz-Beschreibung in dieser Sprache existiert bereits WorkflowInstanceCreated: Instanz angelegt WorkflowInstanceDescriptionTitle: Instanz-Titel -WorkflowInstanceWorkflowCount: Workflows +WorkflowInstanceWorkflowCount !ident-ok: Workflows WorkflowInstanceInitiateSuccess: Workflow erfolgreich initiiert @@ -58,8 +58,8 @@ GlobalWorkflowInstancesTitle: Workflows (Systemweit) GlobalWorkflowInstanceInitiateHeading workflowInstanceTitle@Text: Worklow initiieren: #{workflowInstanceTitle} GlobalWorkflowInstanceInitiateTitle: Worklow initiieren -SchoolWorkflowInstancesHeading ssh@SchoolId: Workflows (#{ssh}) -SchoolWorkflowInstancesTitle ssh@SchoolId: Workflows (#{ssh}) +SchoolWorkflowInstancesHeading ssh@SchoolId !ident-ok: Workflows (#{ssh}) +SchoolWorkflowInstancesTitle ssh@SchoolId !ident-ok: Workflows (#{ssh}) SchoolWorkflowInstanceInitiateHeading ssh@SchoolId workflowInstanceTitle@Text: Worklow initiieren: #{ssh}, #{workflowInstanceTitle} SchoolWorkflowInstanceInitiateTitle ssh@SchoolId: Worklow initiieren: #{ssh} @@ -89,7 +89,7 @@ WorkflowWorkflowWorkflowHistoryActionLabel: Aktion WorkflowWorkflowWorkflowHistoryFromLabel: Vorheriger Zustand WorkflowWorkflowWorkflowHistoryToLabel: Neuer Zustand WorkflowWorkflowWorkflowHistoryPayloadLabel: Datensatz-Änderungen -WorkflowWorkflowFilesArchiveName wwCID@CryptoFileNameWorkflowWorkflow wpl@WorkflowPayloadLabel stCID@CryptoUUIDWorkflowStateIndex: #{foldCase (toPathPiece wwCID)}-#{foldCase (toPathPiece stCID)}-#{foldCase (foldMap unidecode (toPathPiece wpl))}.zip +WorkflowWorkflowFilesArchiveName wwCID@CryptoFileNameWorkflowWorkflow wpl@WorkflowPayloadLabel stCID@CryptoUUIDWorkflowStateIndex !ident-ok: #{foldCase (toPathPiece wwCID)}-#{foldCase (toPathPiece stCID)}-#{foldCase (foldMap unidecode (toPathPiece wpl))}.zip WorkflowWorkflowWorkflowStateHeading: Zustand/Daten WorkflowWorkflowWorkflowPayloadHeading: Aktueller Datensatz WorkflowWorkflowWorkflowStateStateLabel: Aktueller Zustand @@ -102,14 +102,14 @@ WorkflowPayloadBoolTrue: Ja WorkflowPayloadBoolFalse: Nein WorkflowPayloadUserGone: Gelöschte:r Benutzer:in -TopWorkflowInstancesHeading: Workflows -TopWorkflowInstancesTitle: Workflows +TopWorkflowInstancesHeading !ident-ok: Workflows +TopWorkflowInstancesTitle !ident-ok: Workflows -GlobalWorkflowWorkflowWorkflowHeading workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{toPathPiece workflowWorkflowId} -GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{toPathPiece workflowWorkflowId} +GlobalWorkflowWorkflowWorkflowHeading workflowWorkflowId@CryptoFileNameWorkflowWorkflow !ident-ok: Workflow #{toPathPiece workflowWorkflowId} +GlobalWorkflowWorkflowWorkflowTitle workflowWorkflowId@CryptoFileNameWorkflowWorkflow !ident-ok: Workflow #{toPathPiece workflowWorkflowId} -SchoolWorkflowWorkflowWorkflowHeading ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId} -SchoolWorkflowWorkflowWorkflowTitle ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow: Workflow #{ssh}, #{toPathPiece workflowWorkflowId} +SchoolWorkflowWorkflowWorkflowHeading ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow !ident-ok: Workflow #{ssh}, #{toPathPiece workflowWorkflowId} +SchoolWorkflowWorkflowWorkflowTitle ssh@SchoolId workflowWorkflowId@CryptoFileNameWorkflowWorkflow !ident-ok: Workflow #{ssh}, #{toPathPiece workflowWorkflowId} WorkflowWorkflowListScopeTitle rScope@Text: Laufende Workflows - #{rScope} WorkflowWorkflowListScopeHeading rScope@Text: Laufende Workflows (#{rScope}) @@ -132,7 +132,7 @@ WorkflowWorkflowListIsFinal: Abgeschlossen? WorkflowGraphFormUploadIsDirectory: Upload ist Verzeichnis WorkflowGraphFormInvalidNumberOfFiles: Es muss genau eine Datei hochgeladen werden -WorkflowCourseOption tid@TermId ssh@SchoolId coursen@CourseName: #{tid} - #{ssh} - #{coursen} +WorkflowCourseOption tid@TermId ssh@SchoolId coursen@CourseName !ident-ok: #{tid} - #{ssh} - #{coursen} YAMLFieldDecodeFailure yamlFailure@String: Konnte YAML nicht parsen: #{yamlFailure} WGFTextInput: Textfeld diff --git a/messages/uniworx/misc/de-de-formal.msg b/messages/uniworx/misc/de-de-formal.msg index 1a22b42b2..570b2fd19 100644 --- a/messages/uniworx/misc/de-de-formal.msg +++ b/messages/uniworx/misc/de-de-formal.msg @@ -1,8 +1,8 @@ #messages or constructors that are used all over the code -Logo: Uni2work +Logo !ident-ok: Uni2work EmailInvitationWarning: Diese Adresse konnte keinem Uni2work-Benutzer/keiner Uni2work-Benutzerin zugeordnet werden. Es wird eine Einladung per E-Mail versandt. -BoolIrrelevant: — +BoolIrrelevant !ident-ok: — FieldPrimary: Hauptfach FieldSecondary: Nebenfach MultiEmailFieldTip: Es sind mehrere, Komma-separierte, E-Mail-Adressen möglich diff --git a/messages/uniworx/test/de-de-formal.msg b/messages/uniworx/test/de-de-formal.msg index 001e9a1cf..0325325df 100644 --- a/messages/uniworx/test/de-de-formal.msg +++ b/messages/uniworx/test/de-de-formal.msg @@ -1 +1 @@ -PrintDebugForStupid name@Text: Debug message "#{name}" +PrintDebugForStupid name@Text !ident-ok: Debug message "#{name}" diff --git a/messages/uniworx/utils/buttons/de-de-formal.msg b/messages/uniworx/utils/buttons/de-de-formal.msg index c2417442e..f53dcdee9 100644 --- a/messages/uniworx/utils/buttons/de-de-formal.msg +++ b/messages/uniworx/utils/buttons/de-de-formal.msg @@ -44,8 +44,8 @@ BtnAcceptApplications: Bewerbungen akzeptieren BtnAcceptApplicationsTip: Mit dem untigen Knopf können Sie den Kurs (höchstens bis zur angegeben Maximalkapazität, falls eingestellt) mit Bewerbern auffüllen. Die Bewertungen der Bewerbungen werden dabei berücksichtigt (Unbewertet wird behandelt wie eine Note zwischen 2.3 und 2.7). Bewerber mit Veto oder 5.0 werden nicht angemeldet. BtnExamAutoOccurrenceCalculate: Verteilungstabelle berechnen BtnExamAutoOccurrenceAccept: Verteilung akzeptieren -BtnExamAutoOccurrenceNudgeUp: + -BtnExamAutoOccurrenceNudgeDown: - +BtnExamAutoOccurrenceNudgeUp !ident-ok: + +BtnExamAutoOccurrenceNudgeDown !ident-ok: - BtnSetDisplayEmail: E-Mail-Adresse setzen BtnAuthLDAP: Auf Campus-Kennung umstellen BtnAuthPWHash: Auf Uni2work-Kennung umstellen diff --git a/messages/uniworx/utils/handler_form/massinput/de-de-formal.msg b/messages/uniworx/utils/handler_form/massinput/de-de-formal.msg index e82d7e505..09202f713 100644 --- a/messages/uniworx/utils/handler_form/massinput/de-de-formal.msg +++ b/messages/uniworx/utils/handler_form/massinput/de-de-formal.msg @@ -1,2 +1,2 @@ -MassInputAddDimension: + -MassInputDeleteCell: - +MassInputAddDimension !ident-ok: + +MassInputDeleteCell !ident-ok: - diff --git a/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg b/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg index f30bc42f1..2910b508b 100644 --- a/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg +++ b/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg @@ -5,7 +5,7 @@ BreadcrumbCryptoIDDispatch: CryptoID-Weiterleitung BreadcrumbCourseAppsFiles: Bewerbungsdateien BreadcrumbCourseNotes: Kursnotizen BreadcrumbHiWis: Korrektor:innen -BreadcrumbMaterial: Material +BreadcrumbMaterial !ident-ok: Material BreadcrumbSheet: Übungsblatt BreadcrumbTutorial: Tutorium BreadcrumbExam: Prüfung @@ -16,7 +16,7 @@ BreadcrumbCourseFavourite: Favorisieren BreadcrumbCourse: Kurs BreadcrumbAllocationRegister: Teilnahme registrieren BreadcrumbAllocation: Zentralanmeldung -BreadcrumbTerm: Semester +BreadcrumbTerm !ident-ok: Semester BreadcrumbSchool: Institut BreadcrumbUser: Benutzer:in BreadcrumbStatic: Statische Resource @@ -37,10 +37,10 @@ BreadcrumbAllocationInfo: Ablauf einer Zentralanmeldung BreadcrumbCourseParticipantInvitation: Einladung als Kursteilnehmer:in BreadcrumbMaterialArchive: Archiv BreadcrumbMaterialFile: Datei -BreadcrumbMaterialVideo: Video +BreadcrumbMaterialVideo !ident-ok: Video BreadcrumbSheetArchive: Dateien BreadcrumbSheetIsCorrector: Korrektor:in-Überprüfung -BreadcrumbSheetPseudonym: Pseudonym +BreadcrumbSheetPseudonym !ident-ok: Pseudonym BreadcrumbSheetCorrectorInvite: Einladung als Korrektor:in BreadcrumbSheetFile: Datei BreadcrumbTutorialRegister: Anmelden @@ -54,7 +54,7 @@ BreadcrumbCourseNewsFile: Datei BreadcrumbExternalExam: Externe Prüfung BreadcrumbExternalExamList: Externe Prüfungen BreadcrumbExternalExamNew: Neue externe Prüfung -BreadcrumbExternalExamShow coursen@CourseName examn@ExamName: #{coursen}, #{examn} +BreadcrumbExternalExamShow coursen@CourseName examn@ExamName !ident-ok: #{coursen}, #{examn} BreadcrumbExternalExamEdit: Editieren BreadcrumbExternalExamUsers: Teilnehmer:in BreadcrumbExternalExamGrades: Prüfungsleistungen @@ -70,13 +70,13 @@ BreadcrumbAllocationCompute: Platzvergabe berechnen BreadcrumbAllocationAccept: Platzvergabe akzeptieren BreadcrumbAllocationAddUser: Bewerber:in hinzufügen BreadcrumbMessageHide: Verstecken -BreadcrumbFaq: FAQ +BreadcrumbFaq !ident-ok: FAQ BreadcrumbSheetPersonalisedFiles: Personalisierte Dateien herunterladen BreadcrumbCourseSheetPersonalisedFiles: Vorlage für personalisierte Übungsblatt-Dateien herunterladen -BreadcrumbAdminCrontab: Crontab +BreadcrumbAdminCrontab !ident-ok: Crontab BreadcrumbAdminWorkflowDefinitionList: Workflow-Definitionen BreadcrumbAdminWorkflowDefinitionNew: Neue Workflow-Definition -BreadcrumbAdminWorkflowDefinitionEdit renderedWorkflowScope'@Text wfdn@WorkflowDefinitionName: #{wfdn} (#{renderedWorkflowScope'}) +BreadcrumbAdminWorkflowDefinitionEdit renderedWorkflowScope'@Text wfdn@WorkflowDefinitionName !ident-ok: #{wfdn} (#{renderedWorkflowScope'}) BreadcrumbAdminWorkflowDefinitionDelete: Löschen BreadcrumbAdminWorkflowDefinitionInstantiate: Instanziieren BreadcrumbAdminWorkflowInstanceList: Workflow-Instanzen @@ -84,26 +84,25 @@ BreadcrumbAdminWorkflowInstanceNew: Neue Workflow-Instanz BreadcrumbAdminWorkflowInstanceEdit: Instanz bearbeiten BreadcrumbAdminWorkflowWorkflowList: Initiierte Workflows BreadcrumbAdminWorkflowWorkflowNew: Workflow initiieren -BreadcrumbWorkflowInstanceEdit win@WorkflowInstanceName: #{win} +BreadcrumbWorkflowInstanceEdit win@WorkflowInstanceName !ident-ok: #{win} BreadcrumbWorkflowInstanceDelete: Löschen BreadcrumbWorkflowInstanceWorkflowList: Laufende Workflows BreadcrumbWorkflowInstanceInitiate: Workflow starten -BreadcrumbWorkflowInstanceList: Workflows +BreadcrumbWorkflowInstanceList !ident-ok: Workflows BreadcrumbWorkflowInstanceNew: Neuer Workflow BreadcrumbWorkflowWorkflowList: Laufende Workflows -BreadcrumbWorkflowWorkflow workflow@CryptoFileNameWorkflowWorkflow: #{toPathPiece workflow} +BreadcrumbWorkflowWorkflow workflow@CryptoFileNameWorkflowWorkflow !ident-ok: #{toPathPiece workflow} BreadcrumbWorkflowWorkflowFiles: Dateien BreadcrumbWorkflowWorkflowEdit: Editieren BreadcrumbWorkflowWorkflowDelete: Löschen BreadcrumbGlobalWorkflowInstanceList: Systemweite Workflows -BreadcrumbTopWorkflowInstanceList: Workflows +BreadcrumbTopWorkflowInstanceList !ident-ok: Workflows BreadcrumbTopWorkflowWorkflowList: Laufende Workflows BreadcrumbError: Fehler -BreadcrumbMenu: Login BreadcrumbUserAdd: Benutzer:in anlegen BreadcrumbUserNotifications: Benachrichtigungs-Einstellungen BreadcrumbUserPassword: Passwort -BreadcrumbAdminHeading: Administration +BreadcrumbAdminHeading !ident-ok: Administration BreadcrumbAdminFeaturesHeading: Studiengänge BreadcrumbAdminTest: Admin-Demo BreadcrumbAdminErrMsg: Fehlermeldung entschlüsseln @@ -167,7 +166,7 @@ BreadcrumbSubmissionOwn: Abgabe BreadcrumbCorrection: Korrektur BreadcrumbSubmissionDelete: Abgabe löschen BreadcrumbCorrectorAssignTitle: Korrektor:in zuweisen -BreadcrumbMaterialList: Material +BreadcrumbMaterialList !ident-ok: Material BreadcrumbMaterialNew: Neues Material veröffentlichen BreadcrumbMaterialEdit: Material bearbeiten BreadcrumbMaterialDelete: Material löschen @@ -178,5 +177,5 @@ BreadcrumbCorrectionsCreate: Abgaben registrieren BreadcrumbCorrectionsGrade: Korrekturen eintragen BreadcrumbMessageList: Systemnachrichten BreadcrumbGlossary: Begriffsverzeichnis -BreadcrumbLogin: Login +BreadcrumbLogin !ident-ok: Login BreadcrumbNews: Aktuell \ No newline at end of file diff --git a/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg b/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg index 51d374f50..03b0fcc13 100644 --- a/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg +++ b/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg @@ -99,7 +99,6 @@ BreadcrumbGlobalWorkflowInstanceList: System-wide workflows BreadcrumbTopWorkflowInstanceList: Workflows BreadcrumbTopWorkflowWorkflowList: Running workflows BreadcrumbError: Error -BreadcrumbMenu: Login BreadcrumbUserAdd: Add user BreadcrumbUserNotifications: Notification settings BreadcrumbUserPassword: Password @@ -161,7 +160,7 @@ BreadcrumbSheetDelete: Delete exercise sheet BreadcrumbSubmissions: Submissions BreadcrumbSubmissionNew: Create submission BreadcrumbSubmissionOwn: Submission -BreadcrumbCorrection: Korrektur +BreadcrumbCorrection: Correction BreadcrumbSubmissionDelete: Delete submission BreadcrumbCorrectorAssignTitle: Assign corrector BreadcrumbMaterialList: Material diff --git a/messages/uniworx/utils/navigation/menu/de-de-formal.msg b/messages/uniworx/utils/navigation/menu/de-de-formal.msg index eebab4d17..38f5e5972 100644 --- a/messages/uniworx/utils/navigation/menu/de-de-formal.msg +++ b/messages/uniworx/utils/navigation/menu/de-de-formal.msg @@ -1,4 +1,4 @@ -MenuAdminHeading: Administration +MenuAdminHeading !ident-ok: Administration MenuAdminFeaturesHeading: Studiengänge MenuInfoLecturerTitle: Hinweise für Veranstalter:innen MenuInfoLecturerCourses: Veranstaltungen @@ -22,8 +22,8 @@ MenuInstance: Instanz-Identifikation MenuHealth: Instanz-Zustand MenuHelp: Hilfe MenuProfile: Anpassen -MenuLogin: Login -MenuLogout: Logout +MenuLogin !ident-ok: Login +MenuLogout !ident-ok: Logout MenuAllocationList: Zentralanmeldungen MenuCourseList: Kurse MenuCourseMembers: Kursteilnehmer:innen @@ -51,7 +51,7 @@ MenuCorrections: Korrekturen MenuCorrectionsOwn: Meine Korrekturen MenuSubmissions: Abgaben MenuSheetList: Übungsblätter -MenuMaterialList: Material +MenuMaterialList !ident-ok: Material MenuMaterialNew: Neues Material veröffentlichen MenuMaterialEdit: Material bearbeiten MenuMaterialDelete: Material löschen @@ -107,11 +107,11 @@ MenuAllocationPriorities: Zentrale Dringlichkeiten MenuAllocationCompute: Platzvergabe berechnen MenuAllocationAddUser: Bewerber:in hinzufügen -MenuFaq: FAQ +MenuFaq !ident-ok: FAQ MenuSheetPersonalisedFiles: Personalisierte Dateien herunterladen MenuCourseSheetPersonalisedFiles: Vorlage für personalisierte Übungsblatt-Dateien herunterladen -MenuAdminCrontab: Crontab -MenuAdminWorkflowDefinitionList: Workflows +MenuAdminCrontab !ident-ok: Crontab +MenuAdminWorkflowDefinitionList !ident-ok: Workflows MenuAdminWorkflowDefinitionNew: Neue Workflow-Definition MenuAdminWorkflowDefinitionDelete: Löschen MenuAdminWorkflowInstanceList: Workflow-Instanzen @@ -125,9 +125,9 @@ MenuWorkflowWorkflowList: Laufende Workflows MenuWorkflowWorkflowEdit: Editieren MenuWorkflowWorkflowDelete: Löschen MenuGlobalWorkflowInstanceList: Systemweite Workflows -MenuTopWorkflowInstanceList: Workflows +MenuTopWorkflowInstanceList !ident-ok: Workflows MenuTopWorkflowWorkflowList: Laufende Workflows -MenuTopWorkflowWorkflowListHeader: Workflows +MenuTopWorkflowWorkflowListHeader !ident-ok: Workflows MenuGlossary: Begriffsverzeichnis MenuVersion: Versionsgeschichte MenuCourseNewsNew: Neue Kursnachricht diff --git a/messages/uniworx/utils/navigation/menu/en-eu.msg b/messages/uniworx/utils/navigation/menu/en-eu.msg index 6414ad07c..da0cebf85 100644 --- a/messages/uniworx/utils/navigation/menu/en-eu.msg +++ b/messages/uniworx/utils/navigation/menu/en-eu.msg @@ -46,7 +46,7 @@ MenuTermCreate: Create new semester MenuCourseNew: Create new course MenuTermEdit: Edit semester MenuTermCurrent: Current semester -MenuCorrection: Korrektur +MenuCorrection: Correction MenuCorrections: Corrections MenuCorrectionsOwn: My corrections MenuSubmissions: Submissions diff --git a/messages/uniworx/utils/site_layout/de-de-formal.msg b/messages/uniworx/utils/site_layout/de-de-formal.msg index 2c7dbc301..2364d17e2 100644 --- a/messages/uniworx/utils/site_layout/de-de-formal.msg +++ b/messages/uniworx/utils/site_layout/de-de-formal.msg @@ -31,7 +31,7 @@ SubmissionsCourse tid@TermId ssh@SchoolId csh@CourseShorthand: Alle Abgaben Kurs SubmissionsSheet sheetName@SheetName: Abgaben für #{sheetName} SheetList tid@TermId ssh@SchoolId csh@CourseShorthand: #{tid}-#{ssh}-#{csh} Übersicht Übungsblätter SheetNewHeading tid@TermId ssh@SchoolId csh@CourseShorthand: #{tid}-#{ssh}-#{csh} Neues Übungsblatt anlegen -SheetTitle tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName: #{tid}-#{ssh}-#{csh} #{sheetName} +SheetTitle tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName !ident-ok: #{tid}-#{ssh}-#{csh} #{sheetName} SheetTitleNew tid@TermId ssh@SchoolId csh@CourseShorthand : #{tid}-#{ssh}-#{csh}: Neues Übungsblatt SheetEditHead tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName: #{tid}-#{ssh}-#{csh} #{sheetName} editieren SheetDelHead tid@TermId ssh@SchoolId csh@CourseShorthand sheetName@SheetName: #{sheetName} wirklich aus Kurs #{tid}-#{ssh}-#{csh} herauslöschen? Alle assoziierten Abgaben und Korrekturen gehen ebenfalls verloren! diff --git a/messages/uniworx/utils/table_column/de-de-formal.msg b/messages/uniworx/utils/table_column/de-de-formal.msg index 715ff6d11..e91267835 100644 --- a/messages/uniworx/utils/table_column/de-de-formal.msg +++ b/messages/uniworx/utils/table_column/de-de-formal.msg @@ -1,14 +1,14 @@ ExamOccurrenceStart: Prüfungsbeginn #general table-discriptions -TableEmail: Email +TableEmail: E-Mail TableStudyTerm: Studiengang TableStudyFeatureAge: Fachsemester TableStudyFeatureDegree: Abschluss -TableStudyFeatureType: +TableStudyFeatureType !empty-ok: TableStudyFeatureValid: Aktiv TableStudyFeatureUpdate: Abgeglichen -TableHeadingFilter: Filter -TableTerm: Semester +TableHeadingFilter !ident-ok: Filter +TableTerm !ident-ok: Semester TableCourseSchool: Institut TableSubmissionGroup: Feste Abgabegruppe TableNoSubmissionGroup: Keine feste Abgabegruppe @@ -18,7 +18,7 @@ TableSchool: Institut TableCourse: Kurs TableCourseMembers: Teilnehmer:innen TableExamOccurrence: Termin/Raum -TableExamName: Name +TableExamName !ident-ok: Name TableExamTime: Termin TableExamRegistration: Prüfungsanmeldung TableExamResult: Prüfungsergebnis @@ -44,7 +44,7 @@ TableTutorialName: Bezeichnung TableTutorialType: Art TableTutorialRoom: Regulärer Raum TableTutorialRoomHidden: Raum nur für Teilnehmer -TableTutorialRoomIsUnset: — +TableTutorialRoomIsUnset !ident-ok: — TableTutorialRoomIsHidden: Raum wird nur Teilnehmern angezeigt TableTutorialTime: Zeit TableTutorialDeregisterUntil: Abmeldungen bis @@ -53,12 +53,12 @@ TableNoFilter: Keine Einschränkung TableUserMatriculation: Matrikelnummer TableColumnStudyFeatures: Studiendaten TableSchoolShort: Kürzel -TableSchoolName: Name +TableSchoolName !ident-ok: Name TableExamRegisterFrom: Anmeldung ab TableExamRegisterTo: Anmeldung bis TableAction: Aktion SelectColumn: Auswahl CsvExport: CSV-Export -TableProportion c@Text of'@Text prop@Rational: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) -TableProportionNoRatio c@Text of'@Text: #{c}/#{of'} +TableProportion c@Text of'@Text prop@Rational !ident-ok: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) +TableProportionNoRatio c@Text of'@Text !ident-ok: #{c}/#{of'} TableExamFinished: Ergebnisse sichtbar ab \ No newline at end of file diff --git a/messages/uniworx/utils/table_pagination/de-de-formal.msg b/messages/uniworx/utils/table_pagination/de-de-formal.msg index cfd7dd29e..292fc4be0 100644 --- a/messages/uniworx/utils/table_pagination/de-de-formal.msg +++ b/messages/uniworx/utils/table_pagination/de-de-formal.msg @@ -30,4 +30,4 @@ TableCourseDescription: Beschreibung RowCount count@Int64: #{count} #{pluralDE count "passender Eintrag" "passende Einträge"} insgesamt JSONFieldDecodeFailure aesonFailure@String: Konnte JSON nicht parsen: #{aesonFailure} DBTIRowsMissing n@Int: #{pluralDE n "Eine Zeile ist" "Einige Zeilen sind"} aus der Datenbank verschwunden, seit das Formular für Sie generiert wurde -Page num@Int64: #{num} +Page num@Int64 !ident-ok: #{num} diff --git a/messages/uniworx/utils/utils/de-de-formal.msg b/messages/uniworx/utils/utils/de-de-formal.msg index 0541c6707..1464f36ae 100644 --- a/messages/uniworx/utils/utils/de-de-formal.msg +++ b/messages/uniworx/utils/utils/de-de-formal.msg @@ -6,7 +6,7 @@ RGCourseCorrectors: Korrektor:innen RGCourseTutors: Tutor:innen RGCourseUnacceptedApplicants: Nicht akzeptierte Bewerber:innen RecipientToggleAll: Alle/Keine -CommCourseTestSubject customSubject@Text: [TEST] #{customSubject} +CommCourseTestSubject customSubject@Text !ident-ok: [TEST] #{customSubject} UtilCommCourseSubject: Kursmitteilung CommRecipients: Empfänger:innen CommRecipientsTip: Sie selbst erhalten immer eine Kopie der Nachricht @@ -73,14 +73,14 @@ UtilExamResultGrade: Note UtilExamResultPass: Bestanden/Nicht Bestanden UtilExamResultNoShow: Nicht erschienen UtilExamResultVoided: Entwertet -CourseOption tid@TermId ssh@SchoolId csh@CourseShorthand coursen@CourseName: #{tid} - #{ssh} - #{csh}: #{coursen} -RoomReferenceNone: — -RoomReferenceSimple: Text +CourseOption tid@TermId ssh@SchoolId csh@CourseShorthand coursen@CourseName !ident-ok: #{tid} - #{ssh} - #{csh}: #{coursen} +RoomReferenceNone !ident-ok: — +RoomReferenceSimple !ident-ok: Text RoomReferenceLink: Link & Anweisungen RoomReferenceSimpleText: Raum RoomReferenceSimpleTextPlaceholder: Raum -RoomReferenceLinkLink: Link -RoomReferenceLinkLinkPlaceholder: URL +RoomReferenceLinkLink !ident-ok: Link +RoomReferenceLinkLinkPlaceholder !ident-ok: URL RoomReferenceLinkInstructions: Anweisungen RoomReferenceLinkInstructionsPlaceholder: Anweisungen @@ -92,8 +92,8 @@ InvitationCollision: Einladung konnte nicht angenommen werden da ein derartiger InvitationDeclined: Einladung wurde abgelehnt #sheetType.hs -SheetTypeBonus': Bonus -SheetTypeNormal': Normal +SheetTypeBonus' !ident-ok: Bonus +SheetTypeNormal' !ident-ok: Normal SheetTypeInformational': Ohne Anrechung SheetTypeNotGraded: Keine Korrektur SheetGradingBonusIncluded: Erzielte Bonuspunkte wurden hier bereits zu den erreichten normalen Punkten hinzugezählt. @@ -124,19 +124,19 @@ CorrectionInvisibleRatingNotDone: Die Bewertung ist nicht als „Abgeschlossen CorrectionInvisibleWarning: Die Bewertung dieser Abgabe ist aktuell für mindestens eine an der Abgabe beteiligte Person nicht sichtbar! CorrectionInvisibleReasons: Mögliche Gründe hierfür: -Plugin: Plugin +Plugin !ident-ok: Plugin PreviouslyUploadedInfo: Bereits hochgeladene Dateien PreviouslyUploadedDeletionInfo: Nur ausgewählte und unten hinzugefügte Dateien werden erneut hochgeladen AddMoreFiles: Weitere Dateien hinzufügen: MessageError: Fehler MessageWarning: Warnung -MessageInfo: Information +MessageInfo !ident-ok: Information MessageSuccess: Erfolg ShortFieldPrimary: HF ShortFieldSecondary: NF SheetGradingPassPoints': Bestehen nach Punkten SheetGradingPassBinary': Bestanden/Nicht bestanden SheetGradingPassAlways': Automatisch bestanden, sobald korrigiert -SheetTypeNormal: Normal -SheetTypeBonus: Bonus \ No newline at end of file +SheetTypeNormal !ident-ok: Normal +SheetTypeBonus !ident-ok: Bonus \ No newline at end of file diff --git a/src/Foundation/I18n/TH.hs b/src/Foundation/I18n/TH.hs index 991d43e5d..dc7ebb781 100644 --- a/src/Foundation/I18n/TH.hs +++ b/src/Foundation/I18n/TH.hs @@ -18,6 +18,7 @@ import qualified Data.Foldable as F import qualified Data.HashMap.Strict as HashMap import qualified Data.HashSet as HashSet import qualified Data.Map.Strict as Map +import qualified Data.Set as Set import qualified Text.Parsec as P import qualified Text.Parsec.Text.Lazy as P @@ -28,6 +29,8 @@ import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Text as Text +import qualified Data.Char as Char + import Utils.TH.AlphaConversion (alphaConvE) @@ -46,6 +49,7 @@ instance Semigroup (f (MsgDef f g)) => Semigroup (MsgFile f g) where data MsgDef f g = MsgDef { msgDefVars :: InsOrdHashMap String (f (g TH.Type)) , msgDefContent :: [MsgDefContent] + , msgDefAnnotations :: Set MsgDefAnnotation } deriving (Generic, Typeable) deriving stock instance Eq (f (g TH.Type)) => Eq (MsgDef f g) @@ -55,6 +59,23 @@ data MsgDefContent = MsgDefContentLiteral String | MsgDefContentSplice Bool {- Recurse? -} TH.Exp deriving (Eq, Ord, Show, Generic, Typeable) +data MsgDefAnnotation = MsgDefIdenticalOk + | MsgDefEmptyOk + deriving (Eq, Ord, Read, Show, Generic, Typeable) + +makePrisms ''MsgDefContent +makePrisms ''MsgDefAnnotation +makeLenses_ ''MsgDef + +_msgDefAnnotation :: MsgDefAnnotation -> Lens' (MsgDef f g) Bool +_msgDefAnnotation ann = _msgDefAnnotations . at ann . _Maybe + +_msgDefIdenticalOk :: Lens' (MsgDef f g) Bool +_msgDefIdenticalOk = _msgDefAnnotation MsgDefIdenticalOk + +_msgDefEmptyOk :: Lens' (MsgDef f g) Bool +_msgDefEmptyOk = _msgDefAnnotation MsgDefEmptyOk + disambiguateMsgFile :: MsgFile NonEmpty Maybe -> Either (InsOrdHashSet String, InsOrdHashMap String (InsOrdHashSet String)) (MsgFile Identity Maybe) disambiguateMsgFile MsgFile{..} @@ -105,8 +126,8 @@ unionsInsOrdHashMap :: (Foldable f, Eq k, Hashable k) -> InsOrdHashMap k (NonEmpty v) unionsInsOrdHashMap = F.foldl' (InsOrdHashMap.unionWith (<>)) InsOrdHashMap.empty -insOrdHashMapKeysSet :: InsOrdHashMap k v -> HashSet k -insOrdHashMapKeysSet = HashMap.keysSet . InsOrdHashMap.toHashMap +insOrdHashMapKeysSet :: (Eq k, Hashable k) => InsOrdHashMap k v -> InsOrdHashSet k +insOrdHashMapKeysSet = InsOrdHashSet.fromList . map (view _1) . InsOrdHashMap.toList mkMessage :: TH.Name -- ^ Foundation type @@ -168,10 +189,48 @@ mkMessageCommon genType prefix master datName folder defLang = do Just x -> return x let allDefns = insOrdHashMapKeysSet $ msgFileContent defMsgFile - extraDefns = flip HashMap.mapMaybe disambiguated $ \MsgFile{..} -> assertM' (not . HashSet.null) $ insOrdHashMapKeysSet msgFileContent `HashSet.difference` allDefns - extraDefnsErrs = flip map (HashMap.toList extraDefns) $ \(lang, extra) -> "Language " <> unpack lang <> ":\n" <> indent 1 (intercalate ", " $ HashSet.toList extra) + extraDefns = flip HashMap.mapMaybe disambiguated $ \MsgFile{..} -> assertM' (not . InsOrdHashSet.null) $ insOrdHashMapKeysSet msgFileContent `InsOrdHashSet.difference` allDefns + extraDefnsErrs = flip map (HashMap.toList extraDefns) $ \(lang, extra) -> "Language " <> unpack lang <> ":\n" <> indent 1 (intercalate ", " $ InsOrdHashSet.toList extra) unless (null extraDefns) . fail $ "Extraneous message definitions:\n" <> indent 2 (unlines extraDefnsErrs) + let identical = filter isNonOkIdentical $ InsOrdHashSet.toList allDefns + where + isNonOkIdentical :: String -> Bool + isNonOkIdentical defnName = not identicalOk && superSingular defns && allEqual defns + where defns :: [[MsgDefContent]] + defns = mapMaybe (fmap (msgDefContent . runIdentity) . InsOrdHashMap.lookup defnName . msgFileContent) $ HashMap.elems disambiguated + + superSingular :: forall a. [a] -> Bool + superSingular = \case + _ : _ : _ -> True + _other -> False + + allEqual :: [[MsgDefContent]] -> Bool + allEqual [] = True + allEqual (x:xs) = all (roughEq x) xs + + roughEq :: [MsgDefContent] -> [MsgDefContent] -> Bool + roughEq xs ys = not (null xs && null ys) && xs == ys + -- roughEq xs ys = fromMaybe False $ do + -- let xs' = mapMaybe (^? _MsgDefContentLiteral) xs + -- ys' = mapMaybe (^? _MsgDefContentLiteral) ys + -- guard . not $ null xs' && null ys' + -- return $ xs' == ys' + + identicalOk = any (maybe False (view _msgDefIdenticalOk . runIdentity) . InsOrdHashMap.lookup defnName . msgFileContent) $ HashMap.elems disambiguated + unless (null identical) . TH.reportWarning . indent' 2 $ "Message definitions identical for all languages:\n" <> indent 1 (intercalate ", " identical) + + let empties = InsOrdHashMap.fromList . mapMaybe (\defn -> fmap (defn, ) . assertM' (not . HashSet.null) $ nonOkEmpties defn) $ InsOrdHashSet.toList allDefns + where + nonOkEmpties :: String -> HashSet Lang + nonOkEmpties defnName | emptyOk = HashSet.empty + | otherwise = HashMap.keysSet $ HashMap.filter (maybe False (isEmpty . msgDefContent . runIdentity) . InsOrdHashMap.lookup defnName . msgFileContent) disambiguated + where isEmpty :: [MsgDefContent] -> Bool + isEmpty = (&&) <$> all (is _MsgDefContentLiteral) <*> allOf (folded . _MsgDefContentLiteral . folded) Char.isSpace + + emptyOk = any (maybe False (view _msgDefEmptyOk . runIdentity) . InsOrdHashMap.lookup defnName . msgFileContent) $ HashMap.elems disambiguated + unless (InsOrdHashMap.null empties) . TH.reportWarning . indent' 2 $ "Message definitions empty for any language:\n" <> indent 1 (unlines . map (\(defn, langs) -> defn <> " (" <> intercalate ", " (map unpack $ HashSet.toList langs) <> ")") $ InsOrdHashMap.toList empties) + let defnName defn = TH.mkName $ prefix <> defn execWriterT @_ @[TH.Dec] $ do @@ -189,10 +248,11 @@ mkMessageCommon genType prefix master datName folder defLang = do tellMPoint $ TH.dataD (TH.cxt []) datName [] Nothing datCons [] renderLangs <- iforM disambiguated $ \lang MsgFile{..} -> do - let missing = allDefns `HashSet.difference` insOrdHashMapKeysSet msgFileContent - complete = HashSet.null missing + let missing = allDefns `InsOrdHashSet.difference` insOrdHashMapKeysSet msgFileContent + complete = InsOrdHashSet.null missing unless complete $ - lift . TH.reportWarning $ "Language " <> unpack lang <> " is not complete, missing:\n" <> indent 2 (unlines $ HashSet.toList missing) + lift . TH.reportWarning $ "Language " <> unpack lang <> " is not complete, missing:\n" <> indent 2 (unlines $ InsOrdHashSet.toList missing) + funName <- lift $ newUniqueName "renderLang" tellMPoint $ TH.sigD funName [t| $(TH.conT master) -> [Lang] -> $(TH.conT datName) -> $(bool [t|Maybe Text|] [t|Text|] complete) |] masterN <- lift $ TH.newName "_master" @@ -262,12 +322,18 @@ pMsgLine = flip P.label ".msg line" $ do P.skipMany1 P.space accumInsOrdHashMap <$> P.sepEndBy pMsgDefVar (P.many1 P.space) spaces + let pAnnotations = Set.fromList <$> P.sepBy1 (P.char '!' *> pMsgDefAnnotation) spaces + msgDefAnnotations <- P.option Set.empty pAnnotations void $ P.char ':' spaces msgDefContent <- P.manyTill pMsgDefContent . P.lookAhead . P.try $ void P.endOfLine <|> P.eof return . InsOrdHashMap.singleton constrBase $ (NonEmpty.:| []) MsgDef{..} ] +pMsgDefAnnotation :: P.Parser MsgDefAnnotation +pMsgDefAnnotation = (MsgDefIdenticalOk <$ P.string "ident-ok") + <|> (MsgDefEmptyOk <$ P.string "empty-ok") + pMsgDefVar :: P.Parser (String, Maybe TH.Type) pMsgDefVar = do varBase <- (:) <$> P.lower <*> P.many (P.upper <|> P.lower <|> P.digit <|> P.char '\'')