diff --git a/.woodpecker/prod.yml b/.woodpecker/prod.yml index 02544252..bf87646a 100644 --- a/.woodpecker/prod.yml +++ b/.woodpecker/prod.yml @@ -24,11 +24,22 @@ steps: playbook: "release" pre_up: # Fixes issue with 'Drupal\mysql\Driver\Database\mysql\Connection' not found - - itkdev-docker-compose-server run --rm phpfpm composer2 dump-autoload + - itkdev-docker-compose-server run --rm phpfpm composer dump-autoload - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes deploy + + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:check - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:update - - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import da ../translations/strings/ai-screening.da.po --override=all - - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes config_translation_po:import da ../translations/config/ai-screening-config.da.po + + # Cf. task translation:import + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import --type=not-customized --override=not-customized da ../translations/contrib-translations.da.po + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes config_translation_po:import --type=not-customized --override=not-customized da ../config/translations/config.da.po + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_project/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_project_track/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_reports/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/themes/custom/itkdev/itkdev_base_theme/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/themes/custom/itkdev/itkdev_project_theme/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes cache:rebuild - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes browse --no-browser cron: diff --git a/.woodpecker/stg.yml b/.woodpecker/stg.yml index 3e31a8ca..a51304fc 100644 --- a/.woodpecker/stg.yml +++ b/.woodpecker/stg.yml @@ -39,13 +39,22 @@ steps: # Cleanup theme building - rm -rf web/themes/custom/itkdev/*/node_modules # Deploy site. - - itkdev-docker-compose-server exec phpfpm composer install --no-dev -o --classmap-authoritative - # Fixes issue with 'Drupal\mysql\Driver\Database\mysql\Connection' not found - - itkdev-docker-compose-server exec phpfpm composer2 dump-autoload + - itkdev-docker-compose-server exec phpfpm composer install --no-dev --optimize-autoloader - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes deploy + + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:check - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:update - - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import da ../translations/strings/ai-screening.da.po --override=all - - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes config_translation_po:import da ../translations/config/ai-screening-config.da.po + + # Cf. task translation:import + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import --type=not-customized --override=not-customized da ../translations/contrib-translations.da.po + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes config_translation_po:import --type=not-customized --override=not-customized da ../config/translations/config.da.po + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_project/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_project_track/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/modules/custom/ai_screening_reports/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/themes/custom/itkdev/itkdev_base_theme/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes locale:import-all --type=not-customized --override=not-customized ../web/themes/custom/itkdev/itkdev_project_theme/translations/ + - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes cache:rebuild - itkdev-docker-compose-server exec phpfpm vendor/bin/drush --yes browse --no-browser cron: diff --git a/CHANGELOG.md b/CHANGELOG.md index aadf58df..3554eb54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning]. ## [Unreleased] +## [0.4.0] - 2026-01-29 + - [PR-126](https://github.com/itk-dev/ai-screening/pull/126) Updated translation files - [PR-127](https://github.com/itk-dev/ai-screening/pull/127) @@ -286,5 +288,6 @@ and this project adheres to [Semantic Versioning]. [Keep a Changelog]: https://keepachangelog.com/en/1.1.0/ [Semantic Versioning]: https://semver.org/spec/v2.0.0.html -[Unreleased]: https://github.com/itk-dev/ai-screening/compare/0.1.0...HEAD +[Unreleased]: https://github.com/itk-dev/ai-screening/compare/0.4.0...HEAD +[0.4.0]: https://github.com/itk-dev/ai-screening/compare/0.3.4...0.4.0 [0.1.0]: https://github.com/itk-dev/ai-screening/releases/tag/0.1.0 diff --git a/config/sync/config_ignore.settings.yml b/config/sync/config_ignore.settings.yml index 1edd9c66..be0597b0 100644 --- a/config/sync/config_ignore.settings.yml +++ b/config/sync/config_ignore.settings.yml @@ -2,6 +2,5 @@ _core: default_config_hash: IgOVnECx6lbVt6JVFnadoEEugneDf3UblPZnOzov43Q mode: intermediate ignored_config_entities: - import: - - "webform.webform.*" + import: {} export: {} diff --git a/config/sync/core.base_field_override.node.project.title.yml b/config/sync/core.base_field_override.node.project.title.yml index 10f2d182..d1196341 100644 --- a/config/sync/core.base_field_override.node.project.title.yml +++ b/config/sync/core.base_field_override.node.project.title.yml @@ -8,7 +8,7 @@ id: node.project.title field_name: title entity_type: node bundle: project -label: Title +label: Name description: "" required: true translatable: true diff --git a/config/sync/core.entity_form_display.node.project.default.yml b/config/sync/core.entity_form_display.node.project.default.yml index 036826f1..c1424c36 100644 --- a/config/sync/core.entity_form_display.node.project.default.yml +++ b/config/sync/core.entity_form_display.node.project.default.yml @@ -17,7 +17,7 @@ third_party_settings: - title - field_description - field_department - label: Screeningsinformation + label: Projektinformation region: content parent_name: "" weight: 0 diff --git a/config/sync/field.field.node.project.field_department.yml b/config/sync/field.field.node.project.field_department.yml index aad23bef..fb629f3d 100644 --- a/config/sync/field.field.node.project.field_department.yml +++ b/config/sync/field.field.node.project.field_department.yml @@ -11,7 +11,7 @@ field_name: field_department entity_type: node bundle: project label: Department -description: "Hvilke magistratsafdelinger screeningen hører under" +description: "Hvilke magistratsafdelinger projektet hører under" required: true translatable: false default_value: {} diff --git a/config/sync/field.field.node.project.field_project_state.yml b/config/sync/field.field.node.project.field_project_state.yml index 1f4322ce..faae7ed0 100644 --- a/config/sync/field.field.node.project.field_project_state.yml +++ b/config/sync/field.field.node.project.field_project_state.yml @@ -11,7 +11,7 @@ id: node.project.field_project_state field_name: field_project_state entity_type: node bundle: project -label: "Screening state" +label: "Project state" description: "" required: false translatable: false diff --git a/config/sync/group.type.project_group.yml b/config/sync/group.type.project_group.yml index 2c03b1fc..7c7f75e6 100644 --- a/config/sync/group.type.project_group.yml +++ b/config/sync/group.type.project_group.yml @@ -3,8 +3,8 @@ langcode: en status: true dependencies: {} id: project_group -label: "Screening group" -description: "A group that works on a screening." +label: "Project group" +description: "A group that works on a project." new_revision: false creator_membership: true creator_wizard: false diff --git a/config/sync/language/da/core.entity_form_display.node.project.default.yml b/config/sync/language/da/core.entity_form_display.node.project.default.yml index 5d5eba8e..dee83386 100644 --- a/config/sync/language/da/core.entity_form_display.node.project.default.yml +++ b/config/sync/language/da/core.entity_form_display.node.project.default.yml @@ -1,6 +1,6 @@ third_party_settings: field_group: group_project_information: - label: Screeningsinformation + label: Projektinformation group_state: label: Tilstand diff --git a/config/sync/language/da/field.field.node.project.field_department.yml b/config/sync/language/da/field.field.node.project.field_department.yml index 2f0c9a51..3fcd3f37 100644 --- a/config/sync/language/da/field.field.node.project.field_department.yml +++ b/config/sync/language/da/field.field.node.project.field_department.yml @@ -1,2 +1,2 @@ label: Magistrat -description: "Hvilken magistratsafdeling hører screeningen under" +description: "Hvilken magistratsafdeling hører projektet under" diff --git a/config/sync/language/da/field.field.node.project.field_project_state.yml b/config/sync/language/da/field.field.node.project.field_project_state.yml index 0bd2b5b0..94fbbffe 100644 --- a/config/sync/language/da/field.field.node.project.field_project_state.yml +++ b/config/sync/language/da/field.field.node.project.field_project_state.yml @@ -1 +1 @@ -label: Screeningstilstand +label: Projekttilstand diff --git a/config/sync/language/da/group.type.project_group.yml b/config/sync/language/da/group.type.project_group.yml index 1e13825a..88bd0976 100644 --- a/config/sync/language/da/group.type.project_group.yml +++ b/config/sync/language/da/group.type.project_group.yml @@ -1,2 +1,2 @@ -label: Screeninggruppe -description: "A group that works on a screening." +label: Projectgruppe +description: "A group that works on a project." diff --git a/config/sync/language/da/node.type.project.yml b/config/sync/language/da/node.type.project.yml index ce57d4a7..d9fb7f20 100644 --- a/config/sync/language/da/node.type.project.yml +++ b/config/sync/language/da/node.type.project.yml @@ -1 +1,3 @@ -name: Screening +name: Projekt +description: "" +help: "" diff --git a/config/sync/language/da/taxonomy.vocabulary.project_track_type.yml b/config/sync/language/da/taxonomy.vocabulary.project_track_type.yml index 5790a05d..ddb8c2ed 100644 --- a/config/sync/language/da/taxonomy.vocabulary.project_track_type.yml +++ b/config/sync/language/da/taxonomy.vocabulary.project_track_type.yml @@ -1,2 +1,2 @@ -name: "Screeningsspor type" -description: "Screening tracks are used to group tools to represent a unified evaluation of part of a screening" +name: "Projektspor type" +description: "Project tracks are used to group tools to represent a unified evaluation of part of a project" diff --git a/config/sync/language/da/views.view.projects.yml b/config/sync/language/da/views.view.projects.yml index ca746b32..80439092 100644 --- a/config/sync/language/da/views.view.projects.yml +++ b/config/sync/language/da/views.view.projects.yml @@ -1,9 +1,9 @@ -label: Screeninger +label: Projekter display: default: display_title: Default display_options: - title: Screeninger + title: Projekter fields: nid: label: ID @@ -25,10 +25,10 @@ display: alter: text: "{% set project_status = project_track_evaluation(nid.__toString()) %}\r\n{{ include('@itkdev_project_theme/components/project-status.html.twig') }}" field_department: - label: Magistrat + label: Magistratsafdeling separator: ", " name: - label: Screeningsejer + label: Projektejer separator: ", " pager: options: @@ -57,15 +57,15 @@ display: combine: expose: label: Søg - description: "Filtrér på screeningstitel, beskrivelse eller screeningsejer" + description: "Filtrér på projekttitel, beskrivelse eller projektejer" field_department_target_id: expose: - label: Magistrat + label: Magistratsafdeling uid_current: expose: label: "Er brugeren som er logget ind" group_info: - label: "Begræns listen til:" + label: "Begræns listen til" group_items: 1: title: Mine @@ -76,4 +76,4 @@ display: display_title: Side display_options: menu: - title: Screeninger + title: Projekter diff --git a/config/sync/language/da/webform.webform.complexity_uncertainty_default.yml b/config/sync/language/da/webform.webform.complexity_uncertainty_default.yml index 85712551..6b16b712 100644 --- a/config/sync/language/da/webform.webform.complexity_uncertainty_default.yml +++ b/config/sync/language/da/webform.webform.complexity_uncertainty_default.yml @@ -5,7 +5,7 @@ elements: |- '#title': Kompleksitet hvor_stor_er_projektorganisationen: '#type': ai_screening_weighted_radios - '#title': 'Hvor stor er screeningsorganisationen?' + '#title': 'Hvor stor er projektorganisationen?' '#options': '10,0': '1-5 personer' '7,0': '6-10 personer' @@ -15,7 +15,7 @@ elements: |- '#options__properties': '' hvor_stor_er_projektets_indflydelse_paa_forretningsstrategiske_m: '#type': ai_screening_weighted_radios - '#title': 'Hvor stor er screeningens indflydelse på forretningsstrategiske mål?' + '#title': 'Hvor stor er projektets indflydelse på forretningsstrategiske mål?' '#options': '10,0': Uvæsentlig '7,0': 'Rar at have' @@ -25,7 +25,7 @@ elements: |- '#options__properties': '' hvad_er_den_geografiske_distribution_af_projektorganisationen: '#type': ai_screening_weighted_radios - '#title': 'Hvad er den geografiske distribution af screeningsorganisationen?' + '#title': 'Hvad er den geografiske distribution af projektorganisationen?' '#options': '10,0': 'Samme bygning' '7,0': 'Samme magistratsafdeling' @@ -35,17 +35,17 @@ elements: |- '#options__properties': '' har_projektorganisationen_erfaring_med_de_involverede_teknologie: '#type': ai_screening_weighted_radios - '#title': 'Har screeningsorganisationen erfaring med de involverede teknologier?' + '#title': 'Har projektorganisationen erfaring med de involverede teknologier?' '#options': '10,0': 'Etablerede eksperter' - '7,0': 'Har gennemført screeninger med samme teknologi med ekstern bistand' + '7,0': 'Har gennemført projekter med samme teknologi med ekstern bistand' '5,0': 'Har gennemført pilotforløb med teknologien' '3,0': 'Har arbejdet med lignende teknologier' '1,0': 'Ingen erfaring med teknologien' '#options__properties': '' hvilke_organisatoriske_afhaengigheder_er_der_i_projektafviklinge: '#type': ai_screening_weighted_radios - '#title': 'Hvilke organisatoriske afhængigheder er der i screeningsafviklingen?' + '#title': 'Hvilke organisatoriske afhængigheder er der i projektafviklingen?' '#options': '10,0': Ingen '7,0': 'Fordrer koordination med andre indsatser' @@ -55,13 +55,13 @@ elements: |- '#options__properties': '' hvilke_tekniske_afhaengigheder_er_der_i_projektafviklingen: '#type': ai_screening_weighted_radios - '#title': 'Hvilke tekniske afhængigheder er der i screeningsafviklingen?' + '#title': 'Hvilke tekniske afhængigheder er der i projektafviklingen?' '#options': '10,0': Ingen '7,0': 'Mindre tilretninger af etablerede platforme' '5,0': 'Større ændringer i etablerede platforme' - '3,0': 'Flere essentielle leverancer fra anden screening' - '1,0': 'Flere essentielle leverancer til/fra andre screeninger' + '3,0': 'Flere essentielle leverancer fra andet projekt' + '1,0': 'Flere essentielle leverancer til/fra andre projekter' '#options__properties': '' usikkerhed: '#type': webform_wizard_page @@ -88,7 +88,7 @@ elements: |- '#options__properties': '' hvor_lang_tid_vil_projektet_formodentligt_straekke_sig_over: '#type': ai_screening_weighted_radios - '#title': 'Hvor lang tid vil screeningen formodentligt strække sig over?' + '#title': 'Hvor lang tid vil projektet formodentligt strække sig over?' '#options': '0,10': '0-6 uger' '0,7': '7-12 uger' @@ -98,7 +98,7 @@ elements: |- '#options__properties': '' hvordan_er_projektet_scopet: '#type': ai_screening_weighted_radios - '#title': 'Hvordan er screeningen scopet?' + '#title': 'Hvordan er projektet scopet?' '#options': '0,10': 'Klar og velstruktureret tidsplan, veldefineret omfang.' '0,7': 'Tidsplan kræver afklaring, omfang løst defineret' diff --git a/config/sync/language/da/webform.webform.ethics_default.yml b/config/sync/language/da/webform.webform.ethics_default.yml index 23ab03de..27775bd8 100644 --- a/config/sync/language/da/webform.webform.ethics_default.yml +++ b/config/sync/language/da/webform.webform.ethics_default.yml @@ -32,7 +32,7 @@ elements: |- 1_3_mulighed_for_menneskelig_kontrol: '#type': text_format '#title': '1.3 Mulighed for menneskelig kontrol' - '#help': '

En væsentlig kilde til transparens og tillid i forhold til AI-løsninger er borgernes mulighed for at kontrollere løsningens bidrag til et samlet output og korrigere for mulige fejlantagelser eller fejl-output. Borgere skal i den forbindelse have mulighed for at gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given AI-løsning, og den måde nået frem til et resultat.

I svaret skal der redegøres for, om og hvordan løsningen har indbygget muligheden for menneskelig verififikation af output.

' + '#help': '

En væsentlig kilde til transparens og tillid i forhold til AI-løsninger er borgernes mulighed for at kontrollere løsningens bidrag til et samlet output og korrigere for mulige fejlantagelser eller fejl-output. Borgere skal i den forbindelse have mulighed for at gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given AI-løsning, og den måde nået frem til et resultat.

I svaret skal der redegøres for, om og hvordan løsningen har indbygget muligheden for menneskelig verifikation af output.

' '#help_display': element_before '#allowed_formats': simple_editor: simple_editor @@ -129,7 +129,7 @@ elements: |- 3_1_ressourceforbrug: '#type': text_format '#title': '3.1 Ressourceforbrug' - '#help': '

AI-løsninger bruger strøm, ikke mindst under træning, og vand til køling. Det er derfor vigtigt, at løsningernes ressourceforbrug står mål med de forventede udbytter, og at løsningerne i øvrigt er tilrettelagt ud fra en ressourceoptimerende tilgang (eks. krav til grøn strøm og genanvendelse af varmeudledning).

I svaret skal der redegøres for, om det er overvejet at anvende mindre ressourcekrævende løsinger end AI til indfrielse af screeningens formål.

' + '#help': '

AI-løsninger bruger strøm, ikke mindst under træning, og vand til køling. Det er derfor vigtigt, at løsningernes ressourceforbrug står mål med de forventede udbytter, og at løsningerne i øvrigt er tilrettelagt ud fra en ressourceoptimerende tilgang (f.eks. krav til grøn strøm og genanvendelse af varmeudledning).

I svaret skal der redegøres for, om det er overvejet at anvende mindre ressourcekrævende løsinger end AI til indfrielse af projektets formål.

' '#help_display': element_before '#allowed_formats': simple_editor: simple_editor diff --git a/config/sync/language/da/webform.webform.law_default.yml b/config/sync/language/da/webform.webform.law_default.yml index df7d7a81..4106156b 100644 --- a/config/sync/language/da/webform.webform.law_default.yml +++ b/config/sync/language/da/webform.webform.law_default.yml @@ -108,7 +108,7 @@ elements: |- benytter_ai_systemet_kun_almindelige_personoplysninger: '#type': ai_screening_yes_no_stop '#title': 'Benytter AI-systemet kun almindelige personoplysninger?' - '#text_no': '

Overvejelse

Selv hvis der ikke indgår artikel 9/10 oplysninger i en AI-behandling, skal vi være særligt opmærksomme på at output ikke medfører, at man (med en høj grad af sikkerhed) kan udlede artikel 9/10 oplysninger om de registrerede . Hvis man kan udlede særlige personoplysninger, så skal løsningen (trods den kun behandler almindelige personoplysninger) betragtes som behandlende særlige kategorier. Det øger kravene til hjemmel, jf. grundlæggende behandlingsforbud for artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal findes

' + '#text_no': '

Overvejelse

Selv hvis der ikke indgår artikel 9/10 oplysninger i en AI-behandling, skal vi være særligt opmærksomme på at output ikke medfører, at man (med en høj grad af sikkerhed) kan udlede artikel 9/10 oplysninger om de registrerede. Hvis man kan udlede særlige personoplysninger, så skal løsningen (trods den kun behandler almindelige personoplysninger) betragtes som behandlende særlige kategorier. Det øger kravene til hjemmel, jf. grundlæggende behandlingsforbud for artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal findes.

' '#states': visible: ':input[name="indgaar_der_personoplysninger_i_loesning"]': @@ -121,11 +121,11 @@ elements: |- indgaar_der_sundhedsjournaloplysninger: '#type': ai_screening_yes_no_stop '#title': 'Indgår der sundhedsjournaloplysninger?' - '#text_yes': '

Opgave

Såfremt oplysninger fra patientjournaler skal anvendes til AI, skal dette ske på baggrund af enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 eller §46 (kun til forskning ). Anvendelse af journaloplysninger skal juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf sundhedsloven). Journaloplysninger må ikke anvendes til AI i forbindelse med aktuel behandling af patienten, og formål der ikke er rummet af kvalitetssikring eller -udvikling af behandlingsforløb og arbejdsgange for det faglige område.

' + '#text_yes': '

Opgave

Såfremt oplysninger fra patientjournaler skal anvendes til AI, skal dette ske på baggrund af enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 eller §46 (kun til forskning). Anvendelse af journaloplysninger skal juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf sundhedsloven). Journaloplysninger må ikke anvendes til AI i forbindelse med aktuel behandling af patienten, og formål der ikke er rummet af kvalitetssikring eller -udvikling af behandlingsforløb og arbejdsgange for det faglige område.

' udgoer_ai_systemet_en_hoej_risiko_for_fysiske_personers_sundhed: '#type': ai_screening_yes_no_stop '#title': 'Udgør AI-systemet en høj risiko for fysiske personers sundhed og sikkerhed eller grundlæggende rettigheder (højrisiko AI-systemer)?' - '#text_yes': '

Opgave

  1. Der skal sikres, at der
    oprettes og løbende evalueres via et risikostyringssystem
  2. foretages datastyring i forbindelse trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes teknisk dokumentation forinden ibrugtagning
  4. foretages logning
  5. sikres en passende gennemsigtighed med henblik på opfyldelse af de relevante bruger- og udbyderforpligtelser
  6. udføres menneskeligt tilsyn i hele AI-systemets levetid
  7. oplyses om nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske redundansløsninger (backupplaner)
  9. sikres modstandsdygtige over for uautoriserede tredjeparters forsøg på at ændre systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, iterativ proces igennem hele systemets levetid
  11. sikres oplysningspligt til nationale kompetente myndigheder og samarbejde med nationalt kompetente myndigheder
' + '#text_yes': '

Opgave

  1. Der skal sikres, at der oprettes og løbende evalueres via et risikostyringssystem
  2. foretages datastyring i forbindelse trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes teknisk dokumentation forinden ibrugtagning
  4. foretages logning
  5. sikres en passende gennemsigtighed med henblik på opfyldelse af de relevante bruger- og udbyderforpligtelser
  6. udføres menneskeligt tilsyn i hele AI-systemets levetid
  7. oplyses om nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske redundansløsninger (backupplaner)
  9. sikres modstandsdygtige over for uautoriserede tredjeparters forsøg på at ændre systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, iterativ proces igennem hele systemets levetid
  11. sikres oplysningspligt til nationale kompetente myndigheder og samarbejde med nationalt kompetente myndigheder
' skaber_ai_systemet_video_lyd_eller_billeder_som_efterligner_virk: '#type': ai_screening_yes_no_stop '#title': 'Skaber AI-systemet video, lyd eller billeder, som efterligner virkelige objekter?' diff --git a/config/sync/node.type.project.yml b/config/sync/node.type.project.yml index 18a95281..077c51fe 100644 --- a/config/sync/node.type.project.yml +++ b/config/sync/node.type.project.yml @@ -2,7 +2,7 @@ uuid: d299813b-c037-45a7-9a4b-c0738e8e08de langcode: en status: true dependencies: {} -name: Screening +name: Project type: project description: null help: null diff --git a/config/sync/taxonomy.vocabulary.project_track_type.yml b/config/sync/taxonomy.vocabulary.project_track_type.yml index d94c2e03..cfc6b6c3 100644 --- a/config/sync/taxonomy.vocabulary.project_track_type.yml +++ b/config/sync/taxonomy.vocabulary.project_track_type.yml @@ -2,8 +2,8 @@ uuid: 4196ab15-1d8d-4aa1-8a15-e83539d6ab1f langcode: en status: true dependencies: {} -name: "Screening track type" +name: "Project track type" vid: project_track_type -description: "Screening tracks are used to group tools to represent a unified evaluation of part of a screening" +description: "Project tracks are used to group tools to represent a unified evaluation of part of a project" weight: 0 new_revision: false diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 4579bd95..5a54569d 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -4,15 +4,10 @@ status: true dependencies: config: - node.type.project - - taxonomy.vocabulary.department - - taxonomy.vocabulary.project_track_type module: - - ai_screening - content_moderation - - navigation - node - publishcontent - - system - taxonomy - webform id: administrator @@ -20,28 +15,13 @@ label: Administrator weight: 3 is_admin: null permissions: - - "access administration pages" - - "access navigation" - - "access site in maintenance mode" - - "access site reports" - - "access site setup" - - "access taxonomy overview" - - "access webform overview" - "create project content" - - "create terms in department" - - "create terms in project_track_type" - - "create webform" - - "delete terms in department" - - "delete terms in project_track_type" - "edit any project content" - "edit any webform" - - "edit terms in department" - - "edit terms in project_track_type" - "publish editable node type project" - "publish own node type project" - "unpublish editable node type project" - "unpublish own node type project" - "view any unpublished content" - "view own unpublished content" - - "view the administration theme" - "view vocabulary labels" diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index e053882e..4b312829 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -15,7 +15,6 @@ label: Editor weight: 2 is_admin: null permissions: - - "access webform help" - "create project content" - "edit any project content" - "edit any webform" diff --git a/config/sync/views.view.projects.yml b/config/sync/views.view.projects.yml index 537c7d14..c7017c22 100644 --- a/config/sync/views.view.projects.yml +++ b/config/sync/views.view.projects.yml @@ -18,7 +18,7 @@ dependencies: - text - user id: projects -label: Screeninger +label: Projekter module: views description: "" tag: "" @@ -31,7 +31,7 @@ display: display_plugin: default position: 0 display_options: - title: Screeninger + title: Projekter fields: nid: id: nid @@ -477,7 +477,7 @@ display: entity_type: user entity_field: name plugin_id: field - label: "Screening owner" + label: "Project owner" exclude: false alter: alter_text: false @@ -838,7 +838,7 @@ display: expose: operator_id: combine_op label: Search - description: "Filter on screening title, description or screening owner" + description: "Filter on project title, description or project owner" use_operator: false operator: combine_op operator_limit_selection: false @@ -1182,7 +1182,7 @@ display: path: projects menu: type: normal - title: Screeninger + title: Projekter description: "" weight: 0 expanded: false diff --git a/config/sync/webform.webform.complexity_uncertainty_default.yml b/config/sync/webform.webform.complexity_uncertainty_default.yml index 1cf6517d..d34d65be 100644 --- a/config/sync/webform.webform.complexity_uncertainty_default.yml +++ b/config/sync/webform.webform.complexity_uncertainty_default.yml @@ -18,7 +18,7 @@ elements: |- '#title': Kompleksitet hvor_stor_er_projektorganisationen: '#type': ai_screening_weighted_radios - '#title': 'Hvor stor er screeningsorganisationen?' + '#title': 'Hvor stor er projektorganisationen?' '#options': '10,0': '1-5 personer' '7,0': '6-10 personer' @@ -28,7 +28,7 @@ elements: |- '#options__properties': '' hvor_stor_er_projektets_indflydelse_paa_forretningsstrategiske_m: '#type': ai_screening_weighted_radios - '#title': 'Hvor stor er screeningens indflydelse på forretningsstrategiske mål?' + '#title': 'Hvor stor er projektets indflydelse på forretningsstrategiske mål?' '#options': '10,0': Uvæsentlig '7,0': 'Rar at have' @@ -38,7 +38,7 @@ elements: |- '#options__properties': '' hvad_er_den_geografiske_distribution_af_projektorganisationen: '#type': ai_screening_weighted_radios - '#title': 'Hvad er den geografiske distribution af screeningsorganisationen?' + '#title': 'Hvad er den geografiske distribution af projektorganisationen?' '#options': '10,0': 'Samme bygning' '7,0': 'Samme magistratsafdeling' @@ -48,17 +48,17 @@ elements: |- '#options__properties': '' har_projektorganisationen_erfaring_med_de_involverede_teknologie: '#type': ai_screening_weighted_radios - '#title': 'Har screeningsorganisationen erfaring med de involverede teknologier?' + '#title': 'Har projektorganisationen erfaring med de involverede teknologier?' '#options': '10,0': 'Etablerede eksperter' - '7,0': 'Har gennemført screeninger med samme teknologi med ekstern bistand' + '7,0': 'Har gennemført projekter med samme teknologi med ekstern bistand' '5,0': 'Har gennemført pilotforløb med teknologien' '3,0': 'Har arbejdet med lignende teknologier' '1,0': 'Ingen erfaring med teknologien' '#options__properties': '' hvilke_organisatoriske_afhaengigheder_er_der_i_projektafviklinge: '#type': ai_screening_weighted_radios - '#title': 'Hvilke organisatoriske afhængigheder er der i screeningsafviklingen?' + '#title': 'Hvilke organisatoriske afhængigheder er der i projektafviklingen?' '#options': '10,0': Ingen '7,0': 'Fordrer koordination med andre indsatser' @@ -68,13 +68,13 @@ elements: |- '#options__properties': '' hvilke_tekniske_afhaengigheder_er_der_i_projektafviklingen: '#type': ai_screening_weighted_radios - '#title': 'Hvilke tekniske afhængigheder er der i screeningsafviklingen?' + '#title': 'Hvilke tekniske afhængigheder er der i projektafviklingen?' '#options': '10,0': Ingen '7,0': 'Mindre tilretninger af etablerede platforme' '5,0': 'Større ændringer i etablerede platforme' - '3,0': 'Flere essentielle leverancer fra anden screening' - '1,0': 'Flere essentielle leverancer til/fra andre screeninger' + '3,0': 'Flere essentielle leverancer fra andet projekt' + '1,0': 'Flere essentielle leverancer til/fra andre projekter' '#options__properties': '' usikkerhed: '#type': webform_wizard_page @@ -101,7 +101,7 @@ elements: |- '#options__properties': '' hvor_lang_tid_vil_projektet_formodentligt_straekke_sig_over: '#type': ai_screening_weighted_radios - '#title': 'Hvor lang tid vil screeningen formodentligt strække sig over?' + '#title': 'Hvor lang tid vil projektet formodentligt strække sig over?' '#options': '0,10': '0-6 uger' '0,7': '7-12 uger' @@ -111,7 +111,7 @@ elements: |- '#options__properties': '' hvordan_er_projektet_scopet: '#type': ai_screening_weighted_radios - '#title': 'Hvordan er screeningen scopet?' + '#title': 'Hvordan er projektet scopet?' '#options': '0,10': 'Klar og velstruktureret tidsplan, veldefineret omfang.' '0,7': 'Tidsplan kræver afklaring, omfang løst defineret' diff --git a/config/sync/webform.webform.ethics_default.yml b/config/sync/webform.webform.ethics_default.yml index 346e7343..fdb9121a 100644 --- a/config/sync/webform.webform.ethics_default.yml +++ b/config/sync/webform.webform.ethics_default.yml @@ -45,7 +45,7 @@ elements: |- 1_3_mulighed_for_menneskelig_kontrol: '#type': text_format '#title': '1.3 Mulighed for menneskelig kontrol' - '#help': '

En væsentlig kilde til transparens og tillid i forhold til AI-løsninger er borgernes mulighed for at kontrollere løsningens bidrag til et samlet output og korrigere for mulige fejlantagelser eller fejl-output. Borgere skal i den forbindelse have mulighed for at gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given AI-løsning, og den måde nået frem til et resultat.

I svaret skal der redegøres for, om og hvordan løsningen har indbygget muligheden for menneskelig verififikation af output.

' + '#help': '

En væsentlig kilde til transparens og tillid i forhold til AI-løsninger er borgernes mulighed for at kontrollere løsningens bidrag til et samlet output og korrigere for mulige fejlantagelser eller fejl-output. Borgere skal i den forbindelse have mulighed for at gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given AI-løsning, og den måde nået frem til et resultat.

I svaret skal der redegøres for, om og hvordan løsningen har indbygget muligheden for menneskelig verifikation af output.

' '#help_display': element_before '#allowed_formats': simple_editor: simple_editor @@ -142,7 +142,7 @@ elements: |- 3_1_ressourceforbrug: '#type': text_format '#title': '3.1 Ressourceforbrug' - '#help': '

AI-løsninger bruger strøm, ikke mindst under træning, og vand til køling. Det er derfor vigtigt, at løsningernes ressourceforbrug står mål med de forventede udbytter, og at løsningerne i øvrigt er tilrettelagt ud fra en ressourceoptimerende tilgang (eks. krav til grøn strøm og genanvendelse af varmeudledning).

I svaret skal der redegøres for, om det er overvejet at anvende mindre ressourcekrævende løsinger end AI til indfrielse af screeningens formål.

' + '#help': '

AI-løsninger bruger strøm, ikke mindst under træning, og vand til køling. Det er derfor vigtigt, at løsningernes ressourceforbrug står mål med de forventede udbytter, og at løsningerne i øvrigt er tilrettelagt ud fra en ressourceoptimerende tilgang (f.eks. krav til grøn strøm og genanvendelse af varmeudledning).

I svaret skal der redegøres for, om det er overvejet at anvende mindre ressourcekrævende løsinger end AI til indfrielse af projektets formål.

' '#help_display': element_before '#allowed_formats': simple_editor: simple_editor diff --git a/config/sync/webform.webform.law_default.yml b/config/sync/webform.webform.law_default.yml index d4d54f74..7a738087 100644 --- a/config/sync/webform.webform.law_default.yml +++ b/config/sync/webform.webform.law_default.yml @@ -121,7 +121,7 @@ elements: |- benytter_ai_systemet_kun_almindelige_personoplysninger: '#type': ai_screening_yes_no_stop '#title': 'Benytter AI-systemet kun almindelige personoplysninger?' - '#text_no': '

Overvejelse

Selv hvis der ikke indgår artikel 9/10 oplysninger i en AI-behandling, skal vi være særligt opmærksomme på at output ikke medfører, at man (med en høj grad af sikkerhed) kan udlede artikel 9/10 oplysninger om de registrerede . Hvis man kan udlede særlige personoplysninger, så skal løsningen (trods den kun behandler almindelige personoplysninger) betragtes som behandlende særlige kategorier. Det øger kravene til hjemmel, jf. grundlæggende behandlingsforbud for artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal findes

' + '#text_no': '

Overvejelse

Selv hvis der ikke indgår artikel 9/10 oplysninger i en AI-behandling, skal vi være særligt opmærksomme på at output ikke medfører, at man (med en høj grad af sikkerhed) kan udlede artikel 9/10 oplysninger om de registrerede. Hvis man kan udlede særlige personoplysninger, så skal løsningen (trods den kun behandler almindelige personoplysninger) betragtes som behandlende særlige kategorier. Det øger kravene til hjemmel, jf. grundlæggende behandlingsforbud for artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal findes.

' '#states': visible: ':input[name="indgaar_der_personoplysninger_i_loesning"]': @@ -134,11 +134,11 @@ elements: |- indgaar_der_sundhedsjournaloplysninger: '#type': ai_screening_yes_no_stop '#title': 'Indgår der sundhedsjournaloplysninger?' - '#text_yes': '

Opgave

Såfremt oplysninger fra patientjournaler skal anvendes til AI, skal dette ske på baggrund af enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 eller §46 (kun til forskning ). Anvendelse af journaloplysninger skal juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf sundhedsloven). Journaloplysninger må ikke anvendes til AI i forbindelse med aktuel behandling af patienten, og formål der ikke er rummet af kvalitetssikring eller -udvikling af behandlingsforløb og arbejdsgange for det faglige område.

' + '#text_yes': '

Opgave

Såfremt oplysninger fra patientjournaler skal anvendes til AI, skal dette ske på baggrund af enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 eller §46 (kun til forskning). Anvendelse af journaloplysninger skal juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf sundhedsloven). Journaloplysninger må ikke anvendes til AI i forbindelse med aktuel behandling af patienten, og formål der ikke er rummet af kvalitetssikring eller -udvikling af behandlingsforløb og arbejdsgange for det faglige område.

' udgoer_ai_systemet_en_hoej_risiko_for_fysiske_personers_sundhed: '#type': ai_screening_yes_no_stop '#title': 'Udgør AI-systemet en høj risiko for fysiske personers sundhed og sikkerhed eller grundlæggende rettigheder (højrisiko AI-systemer)?' - '#text_yes': '

Opgave

  1. Der skal sikres, at der
    oprettes og løbende evalueres via et risikostyringssystem
  2. foretages datastyring i forbindelse trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes teknisk dokumentation forinden ibrugtagning
  4. foretages logning
  5. sikres en passende gennemsigtighed med henblik på opfyldelse af de relevante bruger- og udbyderforpligtelser
  6. udføres menneskeligt tilsyn i hele AI-systemets levetid
  7. oplyses om nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske redundansløsninger (backupplaner)
  9. sikres modstandsdygtige over for uautoriserede tredjeparters forsøg på at ændre systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, iterativ proces igennem hele systemets levetid
  11. sikres oplysningspligt til nationale kompetente myndigheder og samarbejde med nationalt kompetente myndigheder
' + '#text_yes': '

Opgave

  1. Der skal sikres, at der oprettes og løbende evalueres via et risikostyringssystem
  2. foretages datastyring i forbindelse trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes teknisk dokumentation forinden ibrugtagning
  4. foretages logning
  5. sikres en passende gennemsigtighed med henblik på opfyldelse af de relevante bruger- og udbyderforpligtelser
  6. udføres menneskeligt tilsyn i hele AI-systemets levetid
  7. oplyses om nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske redundansløsninger (backupplaner)
  9. sikres modstandsdygtige over for uautoriserede tredjeparters forsøg på at ændre systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, iterativ proces igennem hele systemets levetid
  11. sikres oplysningspligt til nationale kompetente myndigheder og samarbejde med nationalt kompetente myndigheder
' skaber_ai_systemet_video_lyd_eller_billeder_som_efterligner_virk: '#type': ai_screening_yes_no_stop '#title': 'Skaber AI-systemet video, lyd eller billeder, som efterligner virkelige objekter?' diff --git a/config/translations/config.da.po b/config/translations/config.da.po index 7eaaf482..2d87c1fb 100644 --- a/config/translations/config.da.po +++ b/config/translations/config.da.po @@ -3,14 +3,16 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-01-28 14:12+0100\n" -"PO-Revision-Date: 2026-01-28 14:12+0100\n" +"POT-Creation-Date: 2026-02-18 10:50+0100\n" +"PO-Revision-Date: 2026-02-19 09:44+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" +"Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.8\n" msgctxt "block.block.claro_breadcrumbs:settings:label" msgid "Breadcrumbs" @@ -109,8 +111,8 @@ msgid "Off" msgstr "" msgctxt "core.base_field_override.node.project.title:label" -msgid "Title" -msgstr "" +msgid "Name" +msgstr "Navn" msgctxt "core.base_field_override.node.static.promote:label" msgid "Forfremmet til forside" @@ -193,7 +195,7 @@ msgid "d/m/Y" msgstr "" msgctxt "core.entity_form_display.node.project.default:third_party_settings:field_group:group_project_information:label" -msgid "Screeningsinformation" +msgid "Projektinformation" msgstr "" msgctxt "core.entity_form_display.node.project.default:third_party_settings:field_group:group_state:label" @@ -266,10 +268,10 @@ msgstr "Roller" msgctxt "field.field.node.project.field_department:label" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "field.field.node.project.field_department:description" -msgid "Hvilke magistratsafdelinger screeningen hører under" +msgid "Hvilke magistratsafdelinger projektet hører under" msgstr "" msgctxt "field.field.node.project.field_description:label" @@ -277,8 +279,8 @@ msgid "Description" msgstr "Beskrivelse" msgctxt "field.field.node.project.field_project_state:label" -msgid "Screening state" -msgstr "" +msgid "Project state" +msgstr "Projekttilstand" msgctxt "field.field.node.static.field_text:label" msgid "Tekst" @@ -290,23 +292,18 @@ msgstr "" msgctxt "field.field.taxonomy_term.project_track_type.field_configuration:description" msgid "" -"Configuration for tracks created from the term. Must be a valid YAML structure with a " -"dimensions key, " -"e.g.\r\n" +"Configuration for tracks created from the term. Must be a valid YAML " +"structure with a dimensions key, e.g.\r\n" "\r\n" "
\r\n"
 "dimensions:\r\n"
 "  - Usikkerhed \r\n"
-"  - "
-"Nyttighed\r\n"
+"  - Nyttighed\r\n"
 "
" msgstr "" msgctxt "field.field.taxonomy_term.project_track_type.field_configuration:default_value:0:value" -msgid "" -"dimensions:\r\n" -"" +msgid "dimensions:\r\n" msgstr "" msgctxt "field.field.taxonomy_term.project_track_type.field_report_type:label" @@ -319,7 +316,7 @@ msgstr "" msgctxt "field.field.user.user.field_department:label" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "field.field.user.user.field_image:label" msgid "Image" @@ -374,11 +371,11 @@ msgid "Member" msgstr "Medlem" msgctxt "group.type.project_group:label" -msgid "Screening group" +msgid "Project group" msgstr "" msgctxt "group.type.project_group:description" -msgid "A group that works on a screening." +msgid "A group that works on a project." msgstr "" msgctxt "image.style.large:label" @@ -430,8 +427,8 @@ msgid "User" msgstr "" msgctxt "node.type.project:name" -msgid "Screening" -msgstr "" +msgid "Project" +msgstr "Projekt" msgctxt "node.type.static:name" msgid "Static" @@ -554,9 +551,7 @@ msgid "Restore webform" msgstr "Gendan webform" msgctxt "system.maintenance:message" -msgid "" -"@site is currently under maintenance. We should be back shortly. Thank " -"you for your patience." +msgid "@site is currently under maintenance. We should be back shortly. Thank you for your patience." msgstr "" msgctxt "system.menu.account:label" @@ -613,20 +608,18 @@ msgstr "" msgctxt "taxonomy.vocabulary.department:name" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "taxonomy.vocabulary.department:description" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "taxonomy.vocabulary.project_track_type:name" -msgid "Screening track type" +msgid "Project track type" msgstr "" msgctxt "taxonomy.vocabulary.project_track_type:description" -msgid "" -"Screening tracks are used to group tools to represent a unified " -"evaluation of part of a screening" +msgid "Project tracks are used to group tools to represent a unified evaluation of part of a project" msgstr "" msgctxt "user.mail:cancel_confirm:subject" @@ -637,20 +630,15 @@ msgctxt "user.mail:cancel_confirm:body" msgid "" "[user:display-name]\n" "\n" -"A request to cancel your account has been " -"made at [site:name].\n" +"A request to cancel your account has been made at [site:name].\n" "\n" -"You may now cancel your account on " -"[site:url-brief] by clicking this link or copying and pasting it into " -"your browser:\n" +"You may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:\n" "\n" "[user:cancel-url]\n" "\n" -"NOTE: The cancellation of " -"your account is not reversible.\n" +"NOTE: The cancellation of your account is not reversible.\n" "\n" -"This link expires in one day and " -"nothing will happen if it is not used.\n" +"This link expires in one day and nothing will happen if it is not used.\n" "\n" "-- [site:name] team" msgstr "" @@ -663,19 +651,14 @@ msgctxt "user.mail:password_reset:body" msgid "" "[user:display-name],\n" "\n" -"A request to reset the password for your " -"account has been made at [site:name].\n" +"A request to reset the password for your account has been made at [site:name].\n" "\n" -"You may now log in by " -"clicking this link or copying and pasting it into your " -"browser:\n" +"You may now log in by clicking this link or copying and pasting it into your browser:\n" "\n" "[user:one-time-login-url]\n" "\n" -"This link can only be " -"used once to log in and will lead you to a page where you can set your " -"password. It expires after one day and nothing will happen if it's not " -"used.\n" +"This link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day " +"and nothing will happen if it's not used.\n" "\n" "-- [site:name] team" msgstr "" @@ -688,22 +671,16 @@ msgctxt "user.mail:register_admin_created:body" msgid "" "[user:display-name],\n" "\n" -"A site administrator at [site:name] has " -"created an account for you. You may now log in by clicking this link " -"or copying and pasting it into your " -"browser:\n" +"A site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and " +"pasting it into your browser:\n" "\n" "[user:one-time-login-url]\n" "\n" -"This link can only be " -"used once to log in and will lead you to a page where you can set your " -"password.\n" +"This link can only be used once to log in and will lead you to a page where you can set your password.\n" "\n" -"After setting your password, you will be able to log in " -"at [site:login-url] in the future using:\n" +"After setting your password, you will be able to log in at [site:login-url] in the future using:\n" "\n" -"username: " -"[user:name]\n" +"username: [user:name]\n" "password: Your password\n" "\n" "-- [site:name] team" @@ -717,49 +694,37 @@ msgctxt "user.mail:register_no_approval_required:body" msgid "" "[user:display-name],\n" "\n" -"Thank you for registering at [site:name]. " -"You may now log in by clicking this link or copying and pasting it " -"into your browser:\n" +"Thank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it into your " +"browser:\n" "\n" "[user:one-time-login-url]\n" "\n" -"This link can " -"only be used once to log in and will lead you to a page where you can " -"set your password.\n" +"This link can only be used once to log in and will lead you to a page where you can set your password.\n" "\n" -"After setting your password, you will be able " -"to log in at [site:login-url] in the future using:\n" +"After setting your password, you will be able to log in at [site:login-url] in the future using:\n" "\n" -"username: " -"[user:name]\n" +"username: [user:name]\n" "password: Your password\n" "\n" "-- [site:name] team" msgstr "" msgctxt "user.mail:register_pending_approval:subject" -msgid "" -"Account details for [user:display-name] at [site:name] (pending admin " -"approval)" +msgid "Account details for [user:display-name] at [site:name] (pending admin approval)" msgstr "" msgctxt "user.mail:register_pending_approval:body" msgid "" "[user:display-name],\n" "\n" -"Thank you for registering at [site:name]. " -"Your application for an account is currently pending approval. Once it " -"has been approved, you will receive another email containing " -"information about how to log in, set your password, and other " -"details.\n" +"Thank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been " +"approved, you will receive another email containing information about how to log in, set your password, and other details.\n" "\n" "-- [site:name] team" msgstr "" msgctxt "user.mail:register_pending_approval_admin:subject" -msgid "" -"Account details for [user:display-name] at [site:name] (pending admin " -"approval)" +msgid "Account details for [user:display-name] at [site:name] (pending admin approval)" msgstr "" msgctxt "user.mail:register_pending_approval_admin:body" @@ -777,28 +742,20 @@ msgctxt "user.mail:status_activated:body" msgid "" "[user:display-name],\n" "\n" -"Your account at [site:name] has been " -"activated.\n" +"Your account at [site:name] has been activated.\n" "\n" -"You may now log in by clicking this link or copying " -"and pasting it into your " -"browser:\n" +"You may now log in by clicking this link or copying and pasting it into your browser:\n" "\n" "[user:one-time-login-url]\n" "\n" -"This link can only be " -"used once to log in and will lead you to a page where you can set your " -"password.\n" +"This link can only be used once to log in and will lead you to a page where you can set your password.\n" "\n" -"After setting your password, you will be able to log in " -"at [site:login-url] in the future using:\n" +"After setting your password, you will be able to log in at [site:login-url] in the future using:\n" "\n" -"username: " -"[user:account-name]\n" +"username: [user:account-name]\n" "password: Your password\n" "\n" -"-- [site:name] " -"team" +"-- [site:name] team" msgstr "" msgctxt "user.mail:status_blocked:subject" @@ -809,8 +766,7 @@ msgctxt "user.mail:status_blocked:body" msgid "" "[user:display-name],\n" "\n" -"Your account on [site:name] has been " -"blocked.\n" +"Your account on [site:name] has been blocked.\n" "\n" "-- [site:name] team" msgstr "" @@ -823,8 +779,7 @@ msgctxt "user.mail:status_canceled:body" msgid "" "[user:display-name],\n" "\n" -"Your account on [site:name] has been " -"canceled.\n" +"Your account on [site:name] has been canceled.\n" "\n" "-- [site:name] team" msgstr "" @@ -938,7 +893,7 @@ msgid "Drupal User ID" msgstr "" msgctxt "views.view.authmap:display:default:display_options:fields:uid:format_plural_string" -msgid "1\003@count" +msgid "1\\003@count" msgstr "" msgctxt "views.view.authmap:display:default:display_options:fields:name:label" @@ -1258,7 +1213,7 @@ msgid "admin/content/files/usage/{{ fid }}" msgstr "" msgctxt "views.view.files:display:default:display_options:fields:count:format_plural_string" -msgid "1 place\003@count places" +msgid "1 place\\003@count places" msgstr "" msgctxt "views.view.files:display:default:display_options:fields:operations:label" @@ -1354,7 +1309,7 @@ msgid "Use count" msgstr "" msgctxt "views.view.files:display:page_2:display_options:fields:count:format_plural_string" -msgid "1\003@count" +msgid "1\\003@count" msgstr "" msgctxt "views.view.files:display:page_2:display_options:pager:options:tags:next" @@ -1408,23 +1363,17 @@ msgstr "" msgctxt "views.view.front:display:default:display_options:fields:title:alter:text" msgid "" "
\r\n" -"{% include " -"'@itkdev_project_theme/components/badge.html.twig' with { label: " -"status != '1' ? 'Not published'|trans(options: {context: 'project'}), " -"additional_class_names: 'mr-3' } %}\r\n" -"

{{ title " -"}}

\r\n" +"{% include '@itkdev_project_theme/components/badge.html.twig' with { label: status != '1' ? 'Not published'|trans(options: " +"{context: 'project'}), additional_class_names: 'mr-3' } %}\r\n" +"

{{ title }}

\r\n" "
\r\n" "{{ field_description }}" msgstr "" msgctxt "views.view.front:display:default:display_options:fields:nothing:alter:text" msgid "" -"{% set project_status = project_track_evaluation(nid.__toString()) " -"%}\r\n" -"{{ " -"include('@itkdev_project_theme/components/project-status.html.twig') " -"}}" +"{% set project_status = project_track_evaluation(nid.__toString()) %}\r\n" +"{{ include('@itkdev_project_theme/components/project-status.html.twig') }}" msgstr "" msgctxt "views.view.front:display:default:display_options:exposed_form:options:submit_button" @@ -1513,10 +1462,8 @@ msgstr "" msgctxt "views.view.frontpage:display:default:display_options:empty:area_text_custom:content" msgid "" -"No front page content has been created yet.
Follow the User " -"Guide to start building your site." +"No front page content has been created yet.
Follow the User Guide to start building your site." msgstr "" msgctxt "views.view.frontpage:display:default:display_options:empty:title:title" @@ -1988,9 +1935,7 @@ msgid "Desc" msgstr "" msgctxt "views.view.moderated_content:display:default:display_options:empty:area_text_custom:content" -msgid "" -"No moderated content available. Only pending versions of content, such " -"as drafts, are listed here." +msgid "No moderated content available. Only pending versions of content, such as drafts, are listed here." msgstr "" msgctxt "views.view.moderated_content:display:default:display_options:filters:title:expose:label" @@ -2014,7 +1959,7 @@ msgid "Moderated content" msgstr "" msgctxt "views.view.projects:label" -msgid "Screeninger" +msgid "Projekter" msgstr "" msgctxt "views.view.projects:display:default:display_title" @@ -2022,7 +1967,7 @@ msgid "Default" msgstr "" msgctxt "views.view.projects:display:default:display_options:title" -msgid "Screeninger" +msgid "Projekter" msgstr "" msgctxt "views.view.projects:display:default:display_options:fields:nid:label" @@ -2044,12 +1989,9 @@ msgstr "Navn" msgctxt "views.view.projects:display:default:display_options:fields:title:alter:text" msgid "" "
\r\n" -"{% include " -"'@itkdev_project_theme/components/badge.html.twig' with { label: " -"status != '1' ? 'Not published'|trans(options: {context: 'project'}), " -"additional_class_names: 'mr-3' } %}\r\n" -"

{{ title " -"}}

\r\n" +"{% include '@itkdev_project_theme/components/badge.html.twig' with { label: status != '1' ? 'Not published'|trans(options: " +"{context: 'project'}), additional_class_names: 'mr-3' } %}\r\n" +"

{{ title }}

\r\n" "
\r\n" "{{ field_description }}" msgstr "" @@ -2068,20 +2010,17 @@ msgstr "" msgctxt "views.view.projects:display:default:display_options:fields:nothing:alter:text" msgid "" -"{% set project_status = project_track_evaluation(nid.__toString()) " -"%}\r\n" -"{{ " -"include('@itkdev_project_theme/components/project-status.html.twig') " -"}}" +"{% set project_status = project_track_evaluation(nid.__toString()) %}\r\n" +"{{ include('@itkdev_project_theme/components/project-status.html.twig') }}" msgstr "" msgctxt "views.view.projects:display:default:display_options:fields:field_department:label" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "views.view.projects:display:default:display_options:fields:name:label" -msgid "Screening owner" -msgstr "" +msgid "Project owner" +msgstr "Projektejer" msgctxt "views.view.projects:display:default:display_options:fields:created:label" msgid "Oprettet" @@ -2148,12 +2087,12 @@ msgid "Search" msgstr "Søg" msgctxt "views.view.projects:display:default:display_options:filters:combine:expose:description" -msgid "Filter on screening title, description or screening owner" -msgstr "" +msgid "Filter on project title, description or project owner" +msgstr "Søg på navn, beskrivelse, ejer og bidragsyder" msgctxt "views.view.projects:display:default:display_options:filters:field_department_target_id:expose:label" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "views.view.projects:display:default:display_options:filters:uid_current:expose:label" msgid "Er brugeren som er logget ind" @@ -2161,7 +2100,7 @@ msgstr "" msgctxt "views.view.projects:display:default:display_options:filters:uid_current:group_info:label" msgid "Limit list to" -msgstr "Begræns listen til:" +msgstr "Begræns listen til" msgctxt "views.view.projects:display:default:display_options:filters:uid_current:group_info:group_items:1:title" msgid "Mine" @@ -2176,7 +2115,7 @@ msgid "Page" msgstr "Side" msgctxt "views.view.projects:display:page_1:display_options:menu:title" -msgid "Screeninger" +msgid "Projekter" msgstr "" msgctxt "views.view.taxonomy_term:label" @@ -2269,7 +2208,7 @@ msgstr "Navn" msgctxt "views.view.user_admin_people:display:default:display_options:fields:field_department:label" msgid "Department" -msgstr "Magistrat" +msgstr "Magistratsafdeling" msgctxt "views.view.user_admin_people:display:default:display_options:fields:status:label" msgid "Status" @@ -2868,9 +2807,7 @@ msgid "Who's online block" msgstr "" msgctxt "views.view.who_s_online:description" -msgid "" -"Shows the user names of the most recently active users, and the total " -"number of active users." +msgid "Shows the user names of the most recently active users, and the total number of active users." msgstr "" msgctxt "views.view.who_s_online:display:default:display_title" @@ -2910,9 +2847,7 @@ msgid "Last access" msgstr "" msgctxt "views.view.who_s_online:display:default:display_options:filters:access:expose:description" -msgid "" -"A user is considered online for this long after they have last viewed " -"a page." +msgid "A user is considered online for this long after they have last viewed a page." msgstr "" msgctxt "views.view.who_s_online:display:default:display_options:header:result:content" @@ -2957,9 +2892,8 @@ msgstr "" msgctxt "webform.settings:settings:default_form_confidential_message" msgid "" -"This form is confidential. You must Log " -"out to submit it." +"This form is confidential. You must Log out to " +"submit it." msgstr "" msgctxt "webform.settings:settings:default_form_access_denied_message" @@ -3011,38 +2945,28 @@ msgid "[webform:title]: Preview" msgstr "" msgctxt "webform.settings:settings:default_preview_message" -msgid "" -"Please review your submission. Your submission is not complete until " -"you press the \"Submit\" button!" +msgid "Please review your submission. Your submission is not complete until you press the \"Submit\" button!" msgstr "" msgctxt "webform.settings:settings:default_draft_button_label" msgid "Save Draft" -msgstr "" +msgstr "Gem kladde" msgctxt "webform.settings:settings:default_draft_saved_message" -msgid "" -"Submission saved. You may return to this form later and it will " -"restore the current values." -msgstr "" +msgid "Submission saved. You may return to this form later and it will restore the current values." +msgstr "Kladde gemt." msgctxt "webform.settings:settings:default_draft_loaded_message" -msgid "" -"A partially-completed form was found. Please complete the remaining " -"portions." -msgstr "" +msgid "A partially-completed form was found. Please complete the remaining portions." +msgstr "Kladde indlæst." msgctxt "webform.settings:settings:default_draft_pending_single_message" -msgid "" -"You have a pending draft for this webform. Load your " -"pending draft." -msgstr "" +msgid "You have a pending draft for this webform. Load your pending draft." +msgstr "Du har en kladde for denne formular. Indlæs kladde." msgctxt "webform.settings:settings:default_draft_pending_multiple_message" -msgid "" -"You have pending drafts for this webform. View your " -"pending drafts." -msgstr "" +msgid "You have pending drafts for this webform. View your pending drafts." +msgstr "Du har kladder for denne formular. Se dine kladder." msgctxt "webform.settings:settings:default_confirmation_message" msgid "New submission added to [webform:title]." @@ -3061,9 +2985,7 @@ msgid "No more submissions are permitted." msgstr "" msgctxt "webform.settings:settings:default_submission_label" -msgid "" -"[webform_submission:submitted-to]: Submission " -"#[webform_submission:serial]" +msgid "[webform_submission:submitted-to]: Submission #[webform_submission:serial]" msgstr "" msgctxt "webform.settings:settings:default_submission_access_denied_message" @@ -3071,9 +2993,7 @@ msgid "Please log in to access this submission." msgstr "" msgctxt "webform.settings:settings:default_submission_exception_message" -msgid "" -"Unable to process this submission. Please contact the site " -"administrator." +msgid "Unable to process this submission. Please contact the site administrator." msgstr "" msgctxt "webform.settings:settings:default_submission_locked_message" @@ -3081,15 +3001,11 @@ msgid "This submission has been locked." msgstr "" msgctxt "webform.settings:settings:default_previous_submission_message" -msgid "" -"You have already submitted this webform. View your " -"previous submission." +msgid "You have already submitted this webform. View your previous submission." msgstr "" msgctxt "webform.settings:settings:default_previous_submissions_message" -msgid "" -"You have already submitted this webform. View your " -"previous submissions." +msgid "You have already submitted this webform. View your previous submissions." msgstr "" msgctxt "webform.settings:settings:default_autofill_message" @@ -3135,24 +3051,18 @@ msgstr "" msgctxt "webform.settings:mail:default_body_text" msgid "" "Submitted on [webform_submission:created]\n" -"Submitted by: " -"[webform_submission:user]\n" +"Submitted by: [webform_submission:user]\n" "\n" -"Submitted values " -"are:\n" +"Submitted values are:\n" "[webform_submission:values]\n" -"" msgstr "" msgctxt "webform.settings:mail:default_body_html" msgid "" "

Submitted on [webform_submission:created]

\n" -"

Submitted by: " -"[webform_submission:user]

\n" -"

Submitted values " -"are:

\n" +"

Submitted by: [webform_submission:user]

\n" +"

Submitted values are:

\n" "[webform_submission:values]\n" -"" msgstr "" msgctxt "webform.settings:test:types" @@ -3162,93 +3072,60 @@ msgid "" "color:\n" " - '#ffffcc'\n" " - '#ffffcc'\n" -" - " -"'#ccffff'\n" +" - '#ccffff'\n" "email:\n" " - 'example@example.com'\n" -" - " -"'test@test.com'\n" +" - 'test@test.com'\n" " - 'random@random.com'\n" "language_select:\n" -" - " -"en\n" +" - en\n" "machine_name:\n" " - 'loremipsum'\n" " - 'oratione'\n" -" - " -"'dixisset'\n" +" - 'dixisset'\n" "tel:\n" " - '123-456-7890'\n" -" - " -"'098-765-4321'\n" +" - '098-765-4321'\n" "textarea:\n" -" - 'Lorem ipsum dolor sit amet, " -"consectetur adipiscing elit. Negat esse eam, inquit, propter se " -"expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi " -"magnum videtur. Itaque mihi non satis videmini considerare quod iter " -"sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis " -"hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis " -"audacter sua decreta defendere.'\n" -" - 'Huius, Lyco, oratione " -"locuples, rebus ipsis ielunior. Duo Reges: constructio interrete. Sed " -"haec in pueris; Sed utrum hortandus es nobis, Luci, inquit, an etiam " -"tua sponte propensus es? Sapiens autem semper beatus est et est " -"aliquando in dolore; Immo videri fortasse. Paulum, cum regem Persem " -"captum adduceret, eodem flumine invectio? Et ille ridens: Video, " -"inquit, quid agas;'\n" -" - 'Quae cum dixisset, finem ille. Quamquam non " -"negatis nos intellegere quid sit voluptas, sed quid ille dicat. " -"Progredientibus autem aetatibus sensim tardeve potius quasi nosmet " -"ipsos cognoscimus. Gloriosa ostentatio in constituendo summo bono. " -"Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Duarum " -"enim vitarum nobis erunt instituta capienda. Comprehensum, quod " -"cognitum non habet? Qui enim existimabit posse se miserum esse beatus " -"non erit. Causa autem fuit huc veniendi ut quosdam hinc libros " -"promerem. Nunc omni virtuti vitium contrario nomine " -"opponitur.'\n" +" - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum " +"Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit " +"naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi " +"tamque nobilis audacter sua decreta defendere.'\n" +" - 'Huius, Lyco, oratione locuples, rebus ipsis ielunior. Duo Reges: constructio interrete. Sed haec in pueris; Sed utrum " +"hortandus es nobis, Luci, inquit, an etiam tua sponte propensus es? Sapiens autem semper beatus est et est aliquando in dolore; " +"Immo videri fortasse. Paulum, cum regem Persem captum adduceret, eodem flumine invectio? Et ille ridens: Video, inquit, quid " +"agas;'\n" +" - 'Quae cum dixisset, finem ille. Quamquam non negatis nos intellegere quid sit voluptas, sed quid ille dicat. " +"Progredientibus autem aetatibus sensim tardeve potius quasi nosmet ipsos cognoscimus. Gloriosa ostentatio in constituendo summo " +"bono. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Duarum enim vitarum nobis erunt instituta capienda. " +"Comprehensum, quod cognitum non habet? Qui enim existimabit posse se miserum esse beatus non erit. Causa autem fuit huc " +"veniendi ut quosdam hinc libros promerem. Nunc omni virtuti vitium contrario nomine opponitur.'\n" "text_format:\n" -" - value: '

Lorem ipsum dolor sit " -"amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se " -"expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi " -"magnum videtur. Itaque mihi non satis videmini considerare quod iter " -"sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis " -"hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis " -"audacter sua decreta defendere.

'\n" -" - value: '

Huius, Lyco, " -"oratione locuples, rebus ipsis ielunior. Duo Reges: constructio " -"interrete. Sed haec in pueris; Sed utrum hortandus es nobis, Luci, " -"inquit, an etiam tua sponte propensus es? Sapiens autem semper beatus " -"est et est aliquando in dolore; Immo videri fortasse. Paulum, cum " -"regem Persem captum adduceret, eodem flumine invectio? Et ille ridens: " -"Video, inquit, quid agas;

'\n" -" - value: '

Quae cum dixisset, " -"finem ille. Quamquam non negatis nos intellegere quid sit voluptas, " -"sed quid ille dicat. Progredientibus autem aetatibus sensim tardeve " -"potius quasi nosmet ipsos cognoscimus. Gloriosa ostentatio in " -"constituendo summo bono. Qui-vere falsone, quaerere mittimus-dicitur " -"oculis se privasse; Duarum enim vitarum nobis erunt instituta " -"capienda. Comprehensum, quod cognitum non habet? Qui enim existimabit " -"posse se miserum esse beatus non erit. Causa autem fuit huc veniendi " -"ut quosdam hinc libros promerem. Nunc omni virtuti vitium contrario " -"nomine opponitur.

'\n" +" - value: '

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum " +"Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit " +"naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi " +"tamque nobilis audacter sua decreta defendere.

'\n" +" - value: '

Huius, Lyco, oratione locuples, rebus ipsis ielunior. Duo Reges: constructio interrete. Sed haec in pueris; Sed " +"utrum hortandus es nobis, Luci, inquit, an etiam tua sponte propensus es? Sapiens autem semper beatus est et est aliquando in " +"dolore; Immo videri fortasse. Paulum, cum regem Persem captum adduceret, eodem flumine invectio? Et ille ridens: Video, inquit, " +"quid agas;

'\n" +" - value: '

Quae cum dixisset, finem ille. Quamquam non negatis nos intellegere quid sit voluptas, sed quid ille dicat. " +"Progredientibus autem aetatibus sensim tardeve potius quasi nosmet ipsos cognoscimus. Gloriosa ostentatio in constituendo summo " +"bono. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Duarum enim vitarum nobis erunt instituta capienda. " +"Comprehensum, quod cognitum non habet? Qui enim existimabit posse se miserum esse beatus non erit. Causa autem fuit huc " +"veniendi ut quosdam hinc libros promerem. Nunc omni virtuti vitium contrario nomine opponitur.

'\n" "url:\n" " - 'http://example.com'\n" -" - " -"'http://test.com'\n" +" - 'http://test.com'\n" "webform_email_confirm:\n" -" - " -"'example@example.com'\n" +" - 'example@example.com'\n" " - 'test@test.com'\n" -" - " -"'random@random.com'\n" +" - 'random@random.com'\n" "webform_email_multiple:\n" -" - " -"'example@example.com, test@test.com, " -"random@random.com'\n" +" - 'example@example.com, test@test.com, random@random.com'\n" "webform_time:\n" " - '09:00'\n" " - '17:00'\n" -"" msgstr "" msgctxt "webform.settings:test:names" @@ -3257,51 +3134,40 @@ msgid "" " - 'John'\n" " - 'Paul'\n" " - 'Ringo'\n" -" - " -"'George'\n" +" - 'George'\n" "last_name:\n" " - 'Lennon'\n" " - 'McCartney'\n" -" - " -"'Starr'\n" +" - 'Starr'\n" " - 'Harrison'\n" "address:\n" " - '10 Main Street'\n" -" - '11 " -"Brook Alley Road. APT 1'\n" +" - '11 Brook Alley Road. APT 1'\n" "zip:\n" " - '11111'\n" " - '12345'\n" -" - " -"'12345-6789'\n" +" - '12345-6789'\n" "postal_code:\n" " - '11111'\n" " - '12345'\n" -" - " -"'12345-6789'\n" +" - '12345-6789'\n" "phone:\n" " - '123-456-7890'\n" -" - " -"'098-765-4321'\n" +" - '098-765-4321'\n" "fax:\n" " - '123-456-7890'\n" -" - " -"'098-765-4321'\n" +" - '098-765-4321'\n" "city:\n" " - 'Springfield'\n" " - 'Pleasantville'\n" -" - " -"'Hill Valley'\n" +" - 'Hill Valley'\n" "url:\n" " - 'http://example.com'\n" -" - " -"'http://test.com'\n" +" - 'http://test.com'\n" "default:\n" " - 'Loremipsum'\n" " - 'Oratione'\n" -" - " -"'Dixisset'\n" -"" +" - 'Dixisset'\n" msgstr "" msgctxt "webform.webform.complexity_uncertainty_default:title" @@ -3312,191 +3178,112 @@ msgctxt "webform.webform.complexity_uncertainty_default:elements" msgid "" "kompleksitet:\n" " '#type': webform_wizard_page\n" -" '#title': " -"Kompleksitet\n" +" '#title': Kompleksitet\n" " hvor_stor_er_projektorganisationen:\n" -" '#type': " -"ai_screening_weighted_radios\n" -" '#title': 'Hvor stor er " -"screeningsorganisationen?'\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvor stor er projektorganisationen?'\n" " '#options':\n" -" '10,0': '1-5 " -"personer'\n" +" '10,0': '1-5 personer'\n" " '7,0': '6-10 personer'\n" -" '5,0': '11-15 " -"personer'\n" +" '5,0': '11-15 personer'\n" " '3,0': '16-20 personer'\n" -" '1,0': '21+ " -"personer'\n" +" '1,0': '21+ personer'\n" " '#options__properties': ''\n" -" " -"hvor_stor_er_projektets_indflydelse_paa_forretningsstrategiske_m:\n" -" " -" '#type': ai_screening_weighted_radios\n" -" '#title': 'Hvor stor er " -"screeningens indflydelse på forretningsstrategiske mål?'\n" -" " -"'#options':\n" +" hvor_stor_er_projektets_indflydelse_paa_forretningsstrategiske_m:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvor stor er projektets indflydelse på forretningsstrategiske mål?'\n" +" '#options':\n" " '10,0': Uvæsentlig\n" -" '7,0': 'Rar at " -"have'\n" -" '5,0': 'Vil få en vis betydning for dele af " -"forretningen'\n" +" '7,0': 'Rar at have'\n" +" '5,0': 'Vil få en vis betydning for dele af forretningen'\n" " '3,0': 'Ganske betydningsfuld for alle'\n" -" " -"'1,0': Afgørende\n" +" '1,0': Afgørende\n" " '#options__properties': ''\n" -" " -"hvad_er_den_geografiske_distribution_af_projektorganisationen:\n" -" " -"'#type': ai_screening_weighted_radios\n" -" '#title': 'Hvad er den " -"geografiske distribution af screeningsorganisationen?'\n" -" " -"'#options':\n" +" hvad_er_den_geografiske_distribution_af_projektorganisationen:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvad er den geografiske distribution af projektorganisationen?'\n" +" '#options':\n" " '10,0': 'Samme bygning'\n" -" '7,0': 'Samme " -"magistratsafdeling'\n" +" '7,0': 'Samme magistratsafdeling'\n" " '5,0': 'Samme kommune'\n" -" '3,0': " -"'Samme region'\n" +" '3,0': 'Samme region'\n" " '1,0': National\n" -" '#options__properties': " -"''\n" -" " -"har_projektorganisationen_erfaring_med_de_involverede_teknologie:\n" -" " -" '#type': ai_screening_weighted_radios\n" -" '#title': 'Har " -"screeningsorganisationen erfaring med de involverede teknologier?'\n" -" " -" '#options':\n" +" '#options__properties': ''\n" +" har_projektorganisationen_erfaring_med_de_involverede_teknologie:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Har projektorganisationen erfaring med de involverede teknologier?'\n" +" '#options':\n" " '10,0': 'Etablerede eksperter'\n" -" '7,0': " -"'Har gennemført screeninger med samme teknologi med ekstern " -"bistand'\n" -" '5,0': 'Har gennemført pilotforløb med " -"teknologien'\n" +" '7,0': 'Har gennemført projekter med samme teknologi med ekstern bistand'\n" +" '5,0': 'Har gennemført pilotforløb med teknologien'\n" " '3,0': 'Har arbejdet med lignende teknologier'\n" -" " -" '1,0': 'Ingen erfaring med teknologien'\n" -" " -"'#options__properties': ''\n" -" " -"hvilke_organisatoriske_afhaengigheder_er_der_i_projektafviklinge:\n" -" " -" '#type': ai_screening_weighted_radios\n" -" '#title': 'Hvilke " -"organisatoriske afhængigheder er der i screeningsafviklingen?'\n" -" " -"'#options':\n" +" '1,0': 'Ingen erfaring med teknologien'\n" +" '#options__properties': ''\n" +" hvilke_organisatoriske_afhaengigheder_er_der_i_projektafviklinge:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvilke organisatoriske afhængigheder er der i projektafviklingen?'\n" +" '#options':\n" " '10,0': Ingen\n" -" '7,0': 'Fordrer koordination " -"med andre indsatser'\n" +" '7,0': 'Fordrer koordination med andre indsatser'\n" " '5,0': 'Fordrer intern styregruppe'\n" -" " -" '3,0': 'Fordrer styregruppe på tværs af organisationer'\n" -" " -"'1,0': 'Skal være del af et program'\n" -" '#options__properties': " -"''\n" +" '3,0': 'Fordrer styregruppe på tværs af organisationer'\n" +" '1,0': 'Skal være del af et program'\n" +" '#options__properties': ''\n" " hvilke_tekniske_afhaengigheder_er_der_i_projektafviklingen:\n" -" " -" '#type': ai_screening_weighted_radios\n" -" '#title': 'Hvilke " -"tekniske afhængigheder er der i screeningsafviklingen?'\n" -" " -"'#options':\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvilke tekniske afhængigheder er der i projektafviklingen?'\n" +" '#options':\n" " '10,0': Ingen\n" -" '7,0': 'Mindre tilretninger " -"af etablerede platforme'\n" -" '5,0': 'Større ændringer i " -"etablerede platforme'\n" -" '3,0': 'Flere essentielle leverancer fra " -"anden screening'\n" -" '1,0': 'Flere essentielle leverancer til/fra " -"andre screeninger'\n" +" '7,0': 'Mindre tilretninger af etablerede platforme'\n" +" '5,0': 'Større ændringer i etablerede platforme'\n" +" '3,0': 'Flere essentielle leverancer fra andet projekt'\n" +" '1,0': 'Flere essentielle leverancer til/fra andre projekter'\n" " '#options__properties': ''\n" "usikkerhed:\n" -" " -"'#type': webform_wizard_page\n" +" '#type': webform_wizard_page\n" " '#title': Usikkerhed\n" -" " -"hvordan_er_loesningen_leverandoeren_etableret_i_markedet:\n" -" " -"'#type': ai_screening_weighted_radios\n" -" '#title': 'Hvordan er " -"løsningen/leverandøren etableret i markedet?'\n" +" hvordan_er_loesningen_leverandoeren_etableret_i_markedet:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvordan er løsningen/leverandøren etableret i markedet?'\n" " '#options':\n" -" " -" '0,10': 'Kendt løsning/leverandør samt juridiske " -"krav/governance.'\n" -" '0,7': 'Løsning indført, men ikke " -"evalueret andre steder. Antagelse om, at der ikke er problematiske " -"krav til jura/governance'\n" -" '0,5': 'Ny løsning, der indføres " -"sammen med andre. Jura/governance antages uproblematiske'\n" -" " -"'0,3': 'Ny løsning med kendt og velestimeret leverandør. Der er " -"behov for afklaring af visse spørgsmål til jura/governance'\n" -" " -"'0,1': 'Ny løsning/leverandør, ingen erfaring med de juridiske " -"krav/governance'\n" +" '0,10': 'Kendt løsning/leverandør samt juridiske krav/governance.'\n" +" '0,7': 'Løsning indført, men ikke evalueret andre steder. Antagelse om, at der ikke er problematiske krav til jura/" +"governance'\n" +" '0,5': 'Ny løsning, der indføres sammen med andre. Jura/governance antages uproblematiske'\n" +" '0,3': 'Ny løsning med kendt og velestimeret leverandør. Der er behov for afklaring af visse spørgsmål til jura/" +"governance'\n" +" '0,1': 'Ny løsning/leverandør, ingen erfaring med de juridiske krav/governance'\n" +" '#options__properties': ''\n" +" hvor_kompliceret_er_den_tekniske_integration_af_loesningen:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvor kompliceret er den tekniske integration af løsningen?'\n" +" '#options':\n" +" '0,10': 'Kendte og indfriede krav – løsningen fordrer ikke yderligere tilretning'\n" +" '0,7': \"Løsningen leveres med velbeskrevne API'er, der dog skal undersøges nærmere\"\n" +" '0,5': 'Integrationer fordrer en mindre og ikke-kompleks udviklingsindsats'\n" +" '0,3': 'Leverandøren har omfattende, men kendte, krav til teknisk integration – nogle af disse fordrer " +"udviklingsindsats'\n" +" '0,1': 'Ukendte krav, skal kortlægges gennem udviklingsindsats'\n" " '#options__properties': ''\n" -" " -"hvor_kompliceret_er_den_tekniske_integration_af_loesningen:\n" -" " -"'#type': ai_screening_weighted_radios\n" -" '#title': 'Hvor " -"kompliceret er den tekniske integration af løsningen?'\n" -" " -"'#options':\n" -" '0,10': 'Kendte og indfriede krav – løsningen " -"fordrer ikke yderligere tilretning'\n" -" '0,7': \"Løsningen " -"leveres med velbeskrevne API'er, der dog skal undersøges " -"nærmere\"\n" -" '0,5': 'Integrationer fordrer en mindre og " -"ikke-kompleks udviklingsindsats'\n" -" '0,3': 'Leverandøren har " -"omfattende, men kendte, krav til teknisk integration – nogle af " -"disse fordrer udviklingsindsats'\n" -" '0,1': 'Ukendte krav, skal " -"kortlægges gennem udviklingsindsats'\n" -" '#options__properties': " -"''\n" " hvor_lang_tid_vil_projektet_formodentligt_straekke_sig_over:\n" -" " -" '#type': ai_screening_weighted_radios\n" -" '#title': 'Hvor lang " -"tid vil screeningen formodentligt strække sig over?'\n" -" " -"'#options':\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvor lang tid vil projektet formodentligt strække sig over?'\n" +" '#options':\n" " '0,10': '0-6 uger'\n" " '0,7': '7-12 uger'\n" -" " -" '0,5': '13-18 uger'\n" +" '0,5': '13-18 uger'\n" " '0,3': '19-24 uger'\n" -" '0,1': '25+ " -"uger'\n" +" '0,1': '25+ uger'\n" " '#options__properties': ''\n" -" " -"hvordan_er_projektet_scopet:\n" -" '#type': " -"ai_screening_weighted_radios\n" -" '#title': 'Hvordan er screeningen " -"scopet?'\n" +" hvordan_er_projektet_scopet:\n" +" '#type': ai_screening_weighted_radios\n" +" '#title': 'Hvordan er projektet scopet?'\n" " '#options':\n" -" '0,10': 'Klar og velstruktureret " -"tidsplan, veldefineret omfang.'\n" -" '0,7': 'Tidsplan kræver " -"afklaring, omfang løst defineret'\n" -" '0,5': 'Løst defineret " -"tidsplan, omfang løst defineret'\n" -" '0,3': 'Løst defineret " -"tidsplan, omfang kræver afklaring'\n" -" '0,1': 'Tidsplan og omfang " -"ikke defineret'\n" +" '0,10': 'Klar og velstruktureret tidsplan, veldefineret omfang.'\n" +" '0,7': 'Tidsplan kræver afklaring, omfang løst defineret'\n" +" '0,5': 'Løst defineret tidsplan, omfang løst defineret'\n" +" '0,3': 'Løst defineret tidsplan, omfang kræver afklaring'\n" +" '0,1': 'Tidsplan og omfang ikke defineret'\n" " '#options__properties': ''" msgstr "" @@ -3508,430 +3295,255 @@ msgctxt "webform.webform.ethics_default:elements" msgid "" "borger_page:\n" " '#type': webform_wizard_page\n" -" '#title': '1. " -"Borger'\n" -" " -"1_1_gennemsigtighed_i_anvendelsen_af_kunstig_intelligens:\n" -" " -"'#type': text_format\n" -" '#title': '1.1 Gennemsigtighed i " -"anvendelsen af kunstig intelligens'\n" -" '#help': '

Aarhus Kommune " -"ønsker at gøre det tydeligt, hvordan en kunstig intelligens har " -"medvirket i bearbejdningen af borgernes data eller i udformningen af " -"et svar til borgeren.

I svaret skal der redegøres for, om og " -"hvordan dette hensyn imødekommes.

'\n" -" '#help_display': " -"element_before\n" +" '#title': '1. Borger'\n" +" 1_1_gennemsigtighed_i_anvendelsen_af_kunstig_intelligens:\n" +" '#type': text_format\n" +" '#title': '1.1 Gennemsigtighed i anvendelsen af kunstig intelligens'\n" +" '#help': '

Aarhus Kommune ønsker at gøre det tydeligt, hvordan en kunstig intelligens har medvirket i bearbejdningen af " +"borgernes data eller i udformningen af et svar til borgeren.

I svaret skal der redegøres for, om og hvordan dette hensyn " +"imødekommes.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" simple_editor: " -"simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" " evaluation_1_1:\n" -" " -"'#type': ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" " -"'#help': '

\"Høj\" betyder, at dette hensyn er fuldstændigt " -"imødekommet. \"Middel\", at hensynet forventes at kunne imødekommes, " -"\"Lav\", at hensynet ikke på nuværende tidspunkt forventes at kunne " -"imødekommes.

'\n" +" '#help': '

\"Høj\" betyder, at dette hensyn er fuldstændigt imødekommet. \"Middel\", at hensynet forventes at kunne " +"imødekommes, \"Lav\", at hensynet ikke på nuværende tidspunkt forventes at kunne imødekommes.

'\n" " '#help_display': element_after\n" -" " -"1_2_imoedegaaelse_af_risiko_for_diskrimination:\n" -" '#type': " -"text_format\n" -" '#title': '1.2 Imødegåelse af risiko for " -"diskrimination'\n" -" '#help': '

Kunstig intelligens bruger " -"eksisterende data i udarbejdelse af svar og datagrundlag til " -"medarbejderne. Hvis datagrundlaget ikke er velbeskrevet, stiger " -"risikoen for bias i løsningen, hvilket blandt andet kan føre til " -"diskrimination af borgere.

I svaret skal der redegøres for, om og " -"hvordan løsningen forebygger muligheden for diskrimination.

'\n" -" " -" '#help_display': element_before\n" +" 1_2_imoedegaaelse_af_risiko_for_diskrimination:\n" +" '#type': text_format\n" +" '#title': '1.2 Imødegåelse af risiko for diskrimination'\n" +" '#help': '

Kunstig intelligens bruger eksisterende data i udarbejdelse af svar og datagrundlag til medarbejderne. Hvis " +"datagrundlaget ikke er velbeskrevet, stiger risikoen for bias i løsningen, hvilket blandt andet kan føre til diskrimination af " +"borgere.

I svaret skal der redegøres for, om og hvordan " +"løsningen forebygger muligheden for diskrimination.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" " -"simple_editor: simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" -" " -"evaluation_1_2:\n" +" evaluation_1_2:\n" " '#type': ai_screening_static_select\n" -" " -"'#title': Vurdering\n" -" '#help': '

\"Høj\" betyder, at " -"diskrimination kan i meget høj grad kan udelukkes, eller forebygges " -"gennem menneskelig kontrol. \"Middel\", at diskrimination forventes at " -"kunne udelukkes eller forebygges, eller at spørgsmålet ikke er " -"relevant, \"Lav\", at det ikke på nuværende tidspunkt forventes at " -"kunne udelukkes og/eller at der mangler det fornødne overblik over " +" '#title': Vurdering\n" +" '#help': '

\"Høj\" betyder, at diskrimination kan i meget høj grad kan udelukkes, eller forebygges gennem menneskelig " +"kontrol. \"Middel\", at diskrimination forventes at kunne udelukkes eller forebygges, eller at spørgsmålet ikke er relevant, " +"\"Lav\", at det ikke på nuværende tidspunkt forventes at kunne udelukkes og/eller at der mangler det fornødne overblik over " "data.

'\n" " '#help_display': element_after\n" -" " -"1_3_mulighed_for_menneskelig_kontrol:\n" +" 1_3_mulighed_for_menneskelig_kontrol:\n" " '#type': text_format\n" -" " -"'#title': '1.3 Mulighed for menneskelig kontrol'\n" -" '#help': '

En " -"væsentlig kilde til transparens og tillid i forhold til AI-løsninger " -"er borgernes mulighed for at kontrollere løsningens bidrag til et " -"samlet output og korrigere for mulige fejlantagelser eller " -"fejl-output. Borgere skal i den forbindelse have mulighed for at " -"gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given " -"AI-løsning, og den måde nået frem til et resultat.

I svaret " -"skal der redegøres for, om og hvordan løsningen har indbygget " -"muligheden for menneskelig verififikation af output.

'\n" -" " -"'#help_display': element_before\n" +" '#title': '1.3 Mulighed for menneskelig kontrol'\n" +" '#help': '

En væsentlig kilde til transparens og tillid i forhold til AI-løsninger er borgernes mulighed for at " +"kontrollere løsningens bidrag til et samlet output og korrigere for mulige fejlantagelser eller fejl-output. Borgere skal i den " +"forbindelse have mulighed for at gennemskue, hvordan medarbejdere i Aarhus Kommune har anvendt en given AI-løsning, og den måde " +"nået frem til et resultat.

I svaret skal der redegøres for, om og hvordan løsningen har indbygget muligheden for " +"menneskelig verifikation af output.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" " -"simple_editor: simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" -" " -"evaluation_1_3:\n" +" evaluation_1_3:\n" " '#type': ai_screening_static_select\n" -" " -"'#title': Vurdering\n" -" '#help': '

\"Høj\" betyder, at borgeren " -"har mulighed for at kontrollere såvel behandling som output. " -"\"Middel\" betyder, at det forventes, at borgeren kan kontrollere " -"såvel behandling som output, eller at spørgsmålet ikke er relevant, " -"\"Lav\" betyder, at borgeren ikke på nuværende tidspunkt har " -"mulighed for at kontrollere behandling eller output.

'\n" -" " -"'#help_display': element_after\n" +" '#title': Vurdering\n" +" '#help': '

\"Høj\" betyder, at borgeren har mulighed for at kontrollere såvel behandling som output. \"Middel\" betyder, " +"at det forventes, at borgeren kan kontrollere såvel behandling som output, eller at spørgsmålet ikke er relevant, \"Lav\" " +"betyder, at borgeren ikke på nuværende tidspunkt har mulighed for at kontrollere behandling eller output.

'\n" +" '#help_display': element_after\n" " 1_4_ansvarlighed:\n" -" '#type': " -"text_format\n" +" '#type': text_format\n" " '#title': '1.4 Ansvarlighed'\n" -" '#help': " -"'

Borgerne skal have mulighed for at drage kommunen til ansvar for " -"de beslutninger, der træffes og de svar, borgeren modtager. Der skal " -"derfor altid være en tydelig afsender på AI-løsninger og mulighed " -"for at gøre et ansvar gældende i forhold til konkrete personer " -"og/eller afdelinger i kommunen. Dette indebærer også, at " -"ansvarsforholdet er tydeliggjort internt i kommunen.

I svaret " -"skal der redegøres for, om løsningen synliggør afsender- og " -"ansvarsforhold i forhold til databehandlinger og svar, også " -"internt.

'\n" +" '#help': '

Borgerne skal have mulighed for at drage kommunen til ansvar for de beslutninger, der træffes og de svar, " +"borgeren modtager. Der skal derfor altid være en tydelig afsender på AI-løsninger og mulighed for at gøre et ansvar gældende i " +"forhold til konkrete personer og/eller afdelinger i kommunen. Dette indebærer også, at ansvarsforholdet er tydeliggjort internt " +"i kommunen.

I svaret skal der redegøres for, om løsningen synliggør afsender- og ansvarsforhold i forhold til " +"databehandlinger og svar, også internt.

'\n" " '#help_display': element_before\n" -" " -"'#allowed_formats':\n" +" '#allowed_formats':\n" " simple_editor: simple_editor\n" -" " -"'#hide_help': true\n" +" '#hide_help': true\n" " evaluation_1_4:\n" -" '#type': " -"ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" '#help': " -"'

\"Høj\" betyder, at borgeren har mulighed for at gøre et " -"ansvarsforhold gældende i forhold til databehandling og/eller svar " -"\"Middel\" betyder, at det forventes, at borgeren vil kunne gøre et " -"ansvarsforhold gældende, eller at spørgsmålet ikke er relevant. " -"\"Lav\" betyder, at borgeren ikke på nuværende tidspunkt har " -"mulighed for at gøre ansvarsforhold gældende.

'\n" -" " -"'#help_display': element_after\n" -" " -"1_5_digital_eksklusion_inklusion:\n" +" '#help': '

\"Høj\" betyder, at borgeren har mulighed for at gøre et ansvarsforhold gældende i forhold til databehandling " +"og/eller svar \"Middel\" betyder, at det forventes, at borgeren vil kunne gøre et ansvarsforhold gældende, eller at spørgsmålet " +"ikke er relevant. \"Lav\" betyder, at borgeren ikke på nuværende tidspunkt har mulighed for at gøre ansvarsforhold gældende.'\n" +" '#help_display': element_after\n" +" 1_5_digital_eksklusion_inklusion:\n" " '#type': text_format\n" -" " -"'#title': '1.5 Digital eksklusion / inklusion'\n" -" '#help': '

Når " -"AI bruges i kommunale opgaver, kan det føre til digital eksklusion, " -"hvis borgerne ikke har de nødvendige færdigheder til at forstå " -"eller bruge AI. Dette kan blive værre, hvis det ikke er klart, hvor " -"de kan få hjælp eller finde alternativer.

I svaret skal der " -"redegøres for, om der er risiko for, at løsningen øger den digitale " -"eksklusion, og hvordan dette imødegås.

'\n" -" '#help_display': " -"element_before\n" +" '#title': '1.5 Digital eksklusion / inklusion'\n" +" '#help': '

Når AI bruges i kommunale opgaver, kan det føre til digital eksklusion, hvis borgerne ikke har de nødvendige " +"færdigheder til at forstå eller bruge AI. Dette kan blive værre, hvis det ikke er klart, hvor de kan få hjælp eller finde " +"alternativer.

I svaret skal der redegøres for, om der er risiko for, at løsningen øger den digitale eksklusion, og " +"hvordan dette imødegås.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" simple_editor: " -"simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" " evaluation_1_5:\n" -" " -"'#type': ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" " -"'#help': '\"Høj\" betyder, at det ikke forventes, at løsningen vil " -"kunne øge den digitale eksklusion, eller at løsningen måske endda " -"kan mindske eksklusion. Alternativt, at der er lagt planer for at " -"forebygge digital eksklusion. \"Middel\" betyder, at det forventes, " -"at løsningen kan øge den digitale eksklusion, og at der ikke for " -"nuværende er lagt planer for at modvirke dette. \"Middel kan også " -"betyde, at spørgsmålet ikke er relevant. \"Lav\" betyder, at " -"løsningen forventes at øge den digitale eksklusion, og at dette ikke " -"kan eller vil blive modvirket.'\n" -" '#help_display': " -"element_after\n" +" '#help': '\"Høj\" betyder, at det ikke forventes, at løsningen vil kunne øge den digitale eksklusion, eller at løsningen " +"måske endda kan mindske eksklusion. Alternativt, at der er lagt planer for at forebygge digital eksklusion. \"Middel\" " +"betyder, at det forventes, at løsningen kan øge den digitale eksklusion, og at der ikke for nuværende er lagt planer for at " +"modvirke dette. \"Middel kan også betyde, at spørgsmålet ikke er relevant. \"Lav\" betyder, at løsningen forventes at øge den " +"digitale eksklusion, og at dette ikke kan eller vil blive modvirket.'\n" +" '#help_display': element_after\n" "medarbejder_page:\n" " '#type': webform_wizard_page\n" -" " -"'#title': '2. Medarbejder'\n" +" '#title': '2. Medarbejder'\n" " 2_1_traening:\n" -" '#type': " -"text_format\n" +" '#type': text_format\n" " '#title': '2.1 Træning'\n" -" '#help': " -"'

Medarbejdere skal forstå de AI-løsninger, de arbejder sammen " -"med. Dette betyder, at medarbejderne dels skal forstå, hvordan " -"AI-løsninger i det hele taget fungerer, dels skal forstå de " -"specifikke, AI-relaterede arbejdsgange og outputs, som den konkrete " -"løsning rummer.

I svaret skal der redegøres for, om og hvordan " -"træningsbehovet imødekommes.

'\n" -" '#help_display': " -"element_before\n" +" '#help': '

Medarbejdere skal forstå de AI-løsninger, de arbejder sammen med. Dette betyder, at medarbejderne dels skal " +"forstå, hvordan AI-løsninger i det hele taget fungerer, dels skal forstå de specifikke, AI-relaterede arbejdsgange og outputs, " +"som den konkrete løsning rummer.

I svaret skal der redegøres for, om og hvordan træningsbehovet imødekommes.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" simple_editor: " -"simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" " evaluation_2_1:\n" -" " -"'#type': ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" " -"'#help': '\"Høj\" betyder, at træningsbehovet er fuldstændigt " -"imødekommet, eller at spørgsmålet ikke er relevant. \"Middel\", at " -"træningsbehovet forventes at kunne imødekommes, f.eks. i forbindelse " -"med implementering, \"Lav\", at træningsbehovet ikke på nuværende " -"tidspunkt forventes at kunne imødekommes.'\n" -" '#help_display': " -"element_after\n" +" '#help': '\"Høj\" betyder, at træningsbehovet er fuldstændigt imødekommet, eller at spørgsmålet ikke er relevant. " +"\"Middel\", at træningsbehovet forventes at kunne imødekommes, f.eks. i forbindelse med implementering, \"Lav\", at " +"træningsbehovet ikke på nuværende tidspunkt forventes at kunne imødekommes.'\n" +" '#help_display': element_after\n" " 2_2_bortfald_af_opgaver:\n" -" '#type': " -"text_format\n" +" '#type': text_format\n" " '#title': '2.2 Ændring af opgaver'\n" -" '#help': " -"'

De fleste AI-løsninger medfører ændringer af del-opgaver, der " -"medvirker til en samlet opgaveløsning. For at sikre medarbejderes " -"ejerskab og tryghed ved en AI-løsning er det derfor vigtigt at der er " -"overblik over hvilke opgaver, der ændrer sig som følge af " -"indførelse af løsningen – og hvordan de i givet fald ændrer " -"sig.

I svaret skal der redegøres for, om og i hvor høj grad, " -"der er overblik over ændrede opgaver.

'\n" -" '#help_display': " -"element_before\n" +" '#help': '

De fleste AI-løsninger medfører ændringer af del-opgaver, der medvirker til en samlet opgaveløsning. For at " +"sikre medarbejderes ejerskab og tryghed ved en AI-løsning er det derfor vigtigt at der er overblik over hvilke opgaver, der " +"ændrer sig som følge af indførelse af løsningen – og hvordan de i givet fald ændrer sig.

I svaret skal der redegøres for, " +"om og i hvor høj grad, der er overblik over ændrede opgaver.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" simple_editor: " -"simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" " evaluation_2_2:\n" -" " -"'#type': ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" " -"'#help': '\"Høj\" betyder, at der er et fuldstændigt overblik, eller " -"at spørgsmålet ikke er relevant. \"Middel\", at overblikket " -"forventes at kunne udarbejdes, \"Lav\", at overblikket ikke på " -"nuværende tidspunkt forventes at kunne etableres.'\n" -" " -"'#help_display': element_after\n" -" " -"2_3_medarbejderes_tilsyn_med_opgaveloesningen:\n" -" '#type': " -"text_format\n" -" '#title': '2.3 Medarbejderes tilsyn med " -"opgaveløsningen'\n" -" '#help': '

Da kommunen og / eller dens " -"medarbejdere skal kunne drages til ansvar for databehandling og svar " -"til borgere, skal det sikres at medarbejderne har mulighed for at " -"føre tilsyn med AI-løsninger, så såvel databehandlinger som output " -"løbende monitoreres, og medarbejderne har mulighed for at " -"korrigere.

I svaret skal der redegøres for, hvordan, " -"medarbejderne har mulighed for tilsyn med AI’ens " -"opgaveløsning.

'\n" +" '#help': '\"Høj\" betyder, at der er et fuldstændigt overblik, eller at spørgsmålet ikke er relevant. \"Middel\", at " +"overblikket forventes at kunne udarbejdes, \"Lav\", at overblikket ikke på nuværende tidspunkt forventes at kunne etableres.'\n" +" '#help_display': element_after\n" +" 2_3_medarbejderes_tilsyn_med_opgaveloesningen:\n" +" '#type': text_format\n" +" '#title': '2.3 Medarbejderes tilsyn med opgaveløsningen'\n" +" '#help': '

Da kommunen og / eller dens medarbejdere skal kunne drages til ansvar for databehandling og svar til borgere, " +"skal det sikres at medarbejderne har mulighed for at føre tilsyn med AI-løsninger, så såvel databehandlinger som output løbende " +"monitoreres, og medarbejderne har mulighed for at korrigere.

I svaret skal der redegøres for, hvordan, medarbejderne har " +"mulighed for tilsyn med AI’ens opgaveløsning.

'\n" " '#help_display': element_before\n" -" " -"'#allowed_formats':\n" +" '#allowed_formats':\n" " simple_editor: simple_editor\n" -" " -"'#hide_help': true\n" +" '#hide_help': true\n" " evaluation_2_3:\n" -" '#type': " -"ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" '#help': " -"'\"Høj\" betyder, at der er tryghed ved medarbejdernes mulighed " -"tilsyn og indgriben ved fejl \"Middel\", at mulighed for fuldt tilsyn " -"og indgriben forventes at kunne udarbejdes, eller at spørgsmålet " -"ikke er relevant. \"Lav\", at muligheden ikke på nuværende tidspunkt " -"forventes at kunne etableres.'\n" +" '#help': '\"Høj\" betyder, at der er tryghed ved medarbejdernes mulighed tilsyn og indgriben ved fejl \"Middel\", at " +"mulighed for fuldt tilsyn og indgriben forventes at kunne udarbejdes, eller at spørgsmålet ikke er relevant. \"Lav\", at " +"muligheden ikke på nuværende tidspunkt forventes at kunne etableres.'\n" " '#help_display': element_after\n" -" " -" 2_4_dekvalificering:\n" +" 2_4_dekvalificering:\n" " '#type': text_format\n" -" '#title': '2.4 " -"Dekvalificering'\n" -" '#help': '

Jo større dele af en samlet " -"opgaveløsning, der overdrages til AI, jo større er risikoen for at " -"medarbejdergrupper på et tidspunkt ikke længere kan gennemskue, " -"hvordan AI’en når frem til sine resultater, eller at de ikke " -"længere kan udføre arbejdet selv (dekvalificering).

I svaret " -"skal der redegøres for, om risiko for dekvalificering er kortlagt, og " -"hvordan dette imødegås på såvel kort som længere sigt.

'\n" -" " -"'#help_display': element_before\n" +" '#title': '2.4 Dekvalificering'\n" +" '#help': '

Jo større dele af en samlet opgaveløsning, der overdrages til AI, jo større er risikoen for at " +"medarbejdergrupper på et tidspunkt ikke længere kan gennemskue, hvordan AI’en når frem til sine resultater, eller at de ikke " +"længere kan udføre arbejdet selv (dekvalificering).

I svaret skal der redegøres for, om risiko for dekvalificering er " +"kortlagt, og hvordan dette imødegås på såvel kort som længere sigt.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" " -"simple_editor: simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" -" " -"evaluation_2_4:\n" +" evaluation_2_4:\n" " '#type': ai_screening_static_select\n" -" " -"'#title': Vurdering\n" -" '#help': '\"Høj\" betyder, at risikoen for " -"dekvalificering er kortlagt, og at der er lagt planer for forebyggelse " -"på såvel kort som mellemlangt sigt. \"Middel\" betyder, at risikoen " -"for dekvalificering ikke er kortlagt og/eller at der ikke er lagt " -"planer for forebyggelse på nuværende tidspunkt, eller at " -"spørgsmålet ikke er relevant. \"Lav\" betyder, at det ikke " -"forventes, at en sådan kortlægning kan foretages, eller at det ikke " -"er muligt at forebygge dekvalificering på kort eller langt sigt.'\n" -" " -" '#help_display': element_after\n" +" '#title': Vurdering\n" +" '#help': '\"Høj\" betyder, at risikoen for dekvalificering er kortlagt, og at der er lagt planer for forebyggelse på såvel " +"kort som mellemlangt sigt. \"Middel\" betyder, at risikoen for dekvalificering ikke er kortlagt og/eller at der ikke er lagt " +"planer for forebyggelse på nuværende tidspunkt, eller at spørgsmålet ikke er relevant. \"Lav\" betyder, at det ikke forventes, " +"at en sådan kortlægning kan foretages, eller at det ikke er muligt at forebygge dekvalificering på kort eller langt sigt.'\n" +" '#help_display': element_after\n" "kommune_og_samfund_page:\n" -" " -"'#type': webform_wizard_page\n" +" '#type': webform_wizard_page\n" " '#title': '3. Kommune og samfund'\n" -" " -"3_1_ressourceforbrug:\n" +" 3_1_ressourceforbrug:\n" " '#type': text_format\n" -" '#title': '3.1 " -"Ressourceforbrug'\n" -" '#help': '

AI-løsninger bruger strøm, ikke " -"mindst under træning, og vand til køling. Det er derfor vigtigt, at " -"løsningernes ressourceforbrug står mål med de forventede udbytter, " -"og at løsningerne i øvrigt er tilrettelagt ud fra en " -"ressourceoptimerende tilgang (eks. krav til grøn strøm og " -"genanvendelse af varmeudledning).

I svaret skal der redegøres " -"for, om det er overvejet at anvende mindre ressourcekrævende " -"løsinger end AI til indfrielse af screeningens formål.

'\n" -" " -"'#help_display': element_before\n" +" '#title': '3.1 Ressourceforbrug'\n" +" '#help': '

AI-løsninger bruger strøm, ikke mindst under træning, og vand til køling. Det er derfor vigtigt, at " +"løsningernes ressourceforbrug står mål med de forventede udbytter, og at løsningerne i øvrigt er tilrettelagt ud fra en " +"ressourceoptimerende tilgang (f.eks. krav til grøn strøm og genanvendelse af varmeudledning).

I svaret skal der redegøres " +"for, om det er overvejet at anvende mindre ressourcekrævende løsinger end AI til indfrielse af projektets formål.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" " -"simple_editor: simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" -" " -"evaluation_3_1:\n" +" evaluation_3_1:\n" " '#type': ai_screening_static_select\n" -" " -"'#title': Vurdering\n" -" '#help': '\"Høj\" betyder, at der er " -"afsøgt muligheder for anvendelse af mindre ressourcekrævende " -"teknologier, men at dette ikke har været muligt af finde. \"Middel\" " -"betyder, at kortlægningen af muligt anvendelse af mindre " -"ressourcekrævende teknologier er påtænkt, men ikke udført. " -"\"Middel\" kan også betyde, at spørgsmålet ikke er relevant. " -"\"Lav\" betyder, at det ikke påtænkes at gennemføre en analyse af " -"alternative muligheder.'\n" +" '#title': Vurdering\n" +" '#help': '\"Høj\" betyder, at der er afsøgt muligheder for anvendelse af mindre ressourcekrævende teknologier, men at dette " +"ikke har været muligt af finde. \"Middel\" betyder, at kortlægningen af muligt anvendelse af mindre ressourcekrævende " +"teknologier er påtænkt, men ikke udført. \"Middel\" kan også betyde, at spørgsmålet ikke er relevant. \"Lav\" betyder, at det " +"ikke påtænkes at gennemføre en analyse af alternative muligheder.'\n" " '#help_display': element_after\n" -" " -"3_2_betydning_for_omverdenens_opfattelse_af_aarhus_kommune:\n" -" " -"'#type': text_format\n" -" '#title': '3.2 Betydning for omverdenens " -"opfattelse af Aarhus Kommune'\n" -" '#help': '

I nogle tilfælde kan " -"introduktionen af en AI-løsning betyde, at borgere og virksomheder " -"oplever, at de føler sig distancerede fra kommunen, der kan opfattes " -"som for teknokratisk orienteret.

Det er derfor vigtigt at " -"vurdere, hvorvidt indførelsen af en given AI-løsning kan medføre, " -"at Aarhus Kommunes omdømme påvirkes negativt, og om denne effekt kan " +" 3_2_betydning_for_omverdenens_opfattelse_af_aarhus_kommune:\n" +" '#type': text_format\n" +" '#title': '3.2 Betydning for omverdenens opfattelse af Aarhus Kommune'\n" +" '#help': '

I nogle tilfælde kan introduktionen af en AI-løsning betyde, at borgere og virksomheder oplever, at de føler " +"sig distancerede fra kommunen, der kan opfattes som for teknokratisk orienteret.

Det er derfor vigtigt at vurdere, " +"hvorvidt indførelsen af en given AI-løsning kan medføre, at Aarhus Kommunes omdømme påvirkes negativt, og om denne effekt kan " "modvirkes.

'\n" " '#help_display': element_before\n" -" " -"'#allowed_formats':\n" +" '#allowed_formats':\n" " simple_editor: simple_editor\n" -" " -"'#hide_help': true\n" +" '#hide_help': true\n" " evaluation_3_2:\n" -" '#type': " -"ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" '#help': " -"'\"Høj\" betyder, at effekten af løsningens indførelse på " -"kommunens relation til borgerne vurderes at være neutralt eller " -"positivt. \"Middel\" betyder, at omdømmepåvirkningen endnu ikke er " -"kortlagt, og/eller at der endnu ikke er lagt planer for at modvirke " -"omdømmepåvirkningen. \"Middel kan også betyde, at spørgsmålet " -"ikke er relevant. \"Lav\" betyder, at omdømmepåvirkningen vurderes " -"at være stærkt negativ.'\n" +" '#help': '\"Høj\" betyder, at effekten af løsningens indførelse på kommunens relation til borgerne vurderes at være " +"neutralt eller positivt. \"Middel\" betyder, at omdømmepåvirkningen endnu ikke er kortlagt, og/eller at der endnu ikke er lagt " +"planer for at modvirke omdømmepåvirkningen. \"Middel kan også betyde, at spørgsmålet ikke er relevant. \"Lav\" betyder, at " +"omdømmepåvirkningen vurderes at være stærkt negativ.'\n" " '#help_display': element_after\n" -" " -"3_3_modstridende_maalsaetninger:\n" +" 3_3_modstridende_maalsaetninger:\n" " '#type': text_format\n" -" " -"'#title': '3.3 Modstridende målsætninger'\n" -" '#help': " -"'

Formålet med at introducere AI i den kommunale opgaveløsning kan " -"være bedring af arbejdsmiljø, bedre borgerservice, frigørelse af " -"tid, stærkere lovmedholdelighed og øget kvalitet.

Ofte vil " -"løsningerne medvirke til indfrielse af kombinationer af disse mål. I " -"nogle tilfælde kan der dog være en risiko for, at målene " -"modarbejder hinanden. Det er derfor vigtigt at vurdere den samlede " -"effekt af en AI-løsning på tværs af målsætningerne for dens " -"indførelse.

'\n" +" '#title': '3.3 Modstridende målsætninger'\n" +" '#help': '

Formålet med at introducere AI i den kommunale opgaveløsning kan være bedring af arbejdsmiljø, bedre " +"borgerservice, frigørelse af tid, stærkere lovmedholdelighed og øget kvalitet.

Ofte vil løsningerne medvirke til " +"indfrielse af kombinationer af disse mål. I nogle tilfælde kan der dog være en risiko for, at målene modarbejder hinanden. Det " +"er derfor vigtigt at vurdere den samlede effekt af en AI-løsning på tværs af målsætningerne for dens indførelse.

'\n" " '#help_display': element_before\n" -" " -"'#allowed_formats':\n" +" '#allowed_formats':\n" " simple_editor: simple_editor\n" -" " -"'#hide_help': true\n" +" '#hide_help': true\n" " evaluation_3_3:\n" -" '#type': " -"ai_screening_static_select\n" +" '#type': ai_screening_static_select\n" " '#title': Vurdering\n" -" '#help': " -"'\"Høj\" betyder, at der ikke er et konfliktende målhierarki " -"forbundet med løsningen. \"Middel\" betyder, at der kan være " -"konfliktende mål, men at dette vurrderes at have et begrænset " -"omfang. \"Middel\" kan også betyde, at spørgsmålet ikke er " -"relevant. \"Lav\" betyder, at der er stærk konflikt mellem " -"målsætninger, og at ledelse og / eller det politiske niveau skal " +" '#help': '\"Høj\" betyder, at der ikke er et konfliktende målhierarki forbundet med løsningen. \"Middel\" betyder, at der " +"kan være konfliktende mål, men at dette vurrderes at have et begrænset omfang. \"Middel\" kan også betyde, at spørgsmålet ikke " +"er relevant. \"Lav\" betyder, at der er stærk konflikt mellem målsætninger, og at ledelse og / eller det politiske niveau skal " "konsulteres for at sætte retning.'\n" -" '#help_display': " -"element_after\n" +" '#help_display': element_after\n" " 3_4_overordnet_etisk_vurdering:\n" -" '#type': " -"text_format\n" +" '#type': text_format\n" " '#title': '3.4 Overordnet etisk vurdering'\n" -" " -"'#help': '

AI-løsninger kan bidrage til at påvirke fundamentale " -"samfundsudfordringer, eks. (digital) eksklusion, klimaforandringer, " -"dyrevelfærd, demokratisk deltagelse, mistrivsel mv. I nogle tilfælde " -"er denne påvirkning positiv, i andre negativ.

'\n" -" " -"'#help_display': element_before\n" +" '#help': '

AI-løsninger kan bidrage til at påvirke fundamentale samfundsudfordringer, eks. (digital) eksklusion, " +"klimaforandringer, dyrevelfærd, demokratisk deltagelse, mistrivsel mv. I nogle tilfælde er denne påvirkning positiv, i andre " +"negativ.

'\n" +" '#help_display': element_before\n" " '#allowed_formats':\n" -" " -"simple_editor: simple_editor\n" +" simple_editor: simple_editor\n" " '#hide_help': true\n" -" " -"evaluation_3_4:\n" +" evaluation_3_4:\n" " '#type': ai_screening_static_select\n" -" " -"'#title': Vurdering\n" -" '#help': '\"Høj\" betyder, at løsningen " -"vurderes at bidrage positivt i forhold til en eller flere fundamentale " -"samfundsudfordringer. \"Middel\" betyder, at løsningen hverken " -"påvirker positivt eller negativt, eller at spørgsmålet ikke er " -"relevant. \"Lav\" betyder, at løsningen vurderes at bidrage negativt " -"til en eller flere fundamentale samfundsudfordringer.'\n" -" " -"'#help_display': element_after" +" '#title': Vurdering\n" +" '#help': '\"Høj\" betyder, at løsningen vurderes at bidrage positivt i forhold til en eller flere fundamentale " +"samfundsudfordringer. \"Middel\" betyder, at løsningen hverken påvirker positivt eller negativt, eller at spørgsmålet ikke er " +"relevant. \"Lav\" betyder, at løsningen vurderes at bidrage negativt til en eller flere fundamentale samfundsudfordringer.'\n" +" '#help_display': element_after" msgstr "" msgctxt "webform.webform.law_default:title" @@ -3943,417 +3555,224 @@ msgid "" "maa_vi:\n" " '#type': webform_wizard_page\n" " '#title': 'Må vi'\n" -" " -"indgaar_der_personoplysninger_i_loesning:\n" -" '#type': " -"ai_screening_yes_no_stop\n" -" '#title': 'Indgår der " -"personoplysninger i løsning?'\n" -" '#text_yes': '
Overvejelse

Husk fra start at " -"indtænke databeskyttelse gennem design og standardindstillinger, " -"herunder også løbende opfølgning derpå efter udviklingen, for at " -"sikre passende sikkerhed.

Opgave

Der skal gennemføres en GDPR-mæssig " -"risikovurdering og GDPR-mæssig konsekvensanalyse " -"(DPIA).

Opgave

De registrerede " -"skal både ved udvikling og drift, i en oplysningstekst, informeres om " -"de nye formål (AI træning) vi vil anvende allerede indsamlede " -"personoplysninger til, og ligeledes hvis vi indsamler oplysninger " -"direkte til formålet. Alle andre krav vedr. oplysningstekst skal " -"også efterleves jf. databeskyttelsesforordningens artikel 13 eller " -"artikel 14.

Opgave

Der skal " -"oprettes en intern anmeldelse jf. sikkerhedshåndbogen procedure " -"herfor.

'\n" -" " -"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Er der tale om en " -"ren intern løsning, der ikke anvendes borgerettet eller til " -"borgererettede output / sagsbehandling? '\n" -" " -"anvendes_systemet_til_sagsbehandling_uanset_om_det_er_borgerrett:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Anvendes systemet " -"til sagsbehandling (uanset om det er borgerrettet eller " -"virksomhedsrettet)?'\n" -" '#text_yes': '

Overvejelse

Det følger af " -"det forvaltningsretlige undersøgelsesprincip , at myndigheden er " -"forpligtet til at sikre tilstrækkelig og relevant sagsoplysning. En " -"automatiseret sagsgang forudsætter derfor, at myndigheden på " -"forhånd kan afgrænse, hvilke oplysninger og fakta, der er relevant " -"til brug for sagsbehandlingen. Uanset om det er muligt på forhånd at " -"afgrænse, hvilke oplysninger der er nødvendige i forbindelse med den " -"konkrete sagsbehandling, kan der ved en fuldautomatiseret afgørelse " -"være risiko for, at tilfælde med atypiske fakta eller andre forhold, " -"som normalt ikke er relevante, overses.

Opgave

Da systemet anvendes til " -"sagsbehandling skal du afdække om der er særlovgivning, der " -"regulerer området eller har anden indvirkning.

Opgave

Da systemet anvendes til " -"sagsbehandling skal der gennemføres en forvaltningsretlig " +" indgaar_der_personoplysninger_i_loesning:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Indgår der personoplysninger i løsning?'\n" +" '#text_yes': '

Overvejelse

Husk fra start at indtænke databeskyttelse gennem design " +"og standardindstillinger, herunder også løbende opfølgning derpå efter udviklingen, for at sikre passende sikkerhed.

Opgave

Der skal gennemføres en GDPR-mæssig risikovurdering og GDPR-mæssig konsekvensanalyse " +"(DPIA).

Opgave

De registrerede skal både ved udvikling og drift, i en oplysningstekst, " +"informeres om de nye formål (AI træning) vi vil anvende allerede indsamlede personoplysninger til, og ligeledes hvis vi " +"indsamler oplysninger direkte til formålet. Alle andre krav vedr. oplysningstekst skal også efterleves jf. " +"databeskyttelsesforordningens artikel 13 eller artikel 14.

Opgave

Der skal oprettes en " +"intern anmeldelse jf. sikkerhedshåndbogen procedure herfor.

'\n" +" er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Er der tale om en ren intern løsning, der ikke anvendes borgerettet eller til borgererettede output / " +"sagsbehandling? '\n" +" anvendes_systemet_til_sagsbehandling_uanset_om_det_er_borgerrett:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Anvendes systemet til sagsbehandling (uanset om det er borgerrettet eller virksomhedsrettet)?'\n" +" '#text_yes': '

Overvejelse

Det følger af det forvaltningsretlige " +"undersøgelsesprincip , at myndigheden er forpligtet til at sikre tilstrækkelig og relevant sagsoplysning. En automatiseret " +"sagsgang forudsætter derfor, at myndigheden på forhånd kan afgrænse, hvilke oplysninger og fakta, der er relevant til brug for " +"sagsbehandlingen. Uanset om det er muligt på forhånd at afgrænse, hvilke oplysninger der er nødvendige i forbindelse med den " +"konkrete sagsbehandling, kan der ved en fuldautomatiseret afgørelse være risiko for, at tilfælde med atypiske fakta eller andre " +"forhold, som normalt ikke er relevante, overses.

Opgave

Da systemet anvendes til " +"sagsbehandling skal du afdække om der er særlovgivning, der regulerer området eller har anden indvirkning.

Opgave

Da systemet anvendes til sagsbehandling skal der gennemføres en forvaltningsretlig " "konsekvensanalyse

'\n" " '#states':\n" " visible:\n" -" " -" " -"':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" -" " -" value: '0'\n" +" ':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" +" value: '0'\n" " anvedes_systemet_til_borgerrettet_ai:\n" -" " -"'#type': ai_screening_yes_no_stop\n" -" '#title': 'Anvedes systemet " -"til borgerrettet AI?'\n" -" '#text_yes': '

Opgave

Da systemet anvendes til " -"sagsbehandling skal der gennemføres en forvaltningsretlig " -"konsekvensanalyse

Opgave

Det skal sikres at AI’en " -"opfylder forvaltningslovens vejledningsforpligtelse samt der skal " -"vejledes borgere ifm. Chatbots og lign. om, at der findes andre " -"kanaler at kontakte kommunen på.

Opgave

Systemet skal tydeligt oplyse " -"borgeren at der er tale om et AI system.

'\n" -" " -"'#states':\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Anvedes systemet til borgerrettet AI?'\n" +" '#text_yes': '

Opgave

Da systemet anvendes til sagsbehandling skal der gennemføres en " +"forvaltningsretlig konsekvensanalyse

Opgave

Det skal sikres at AI’en opfylder " +"forvaltningslovens vejledningsforpligtelse samt der skal vejledes borgere ifm. Chatbots og lign. om, at der findes andre " +"kanaler at kontakte kommunen på.

Opgave

Systemet skal tydeligt oplyse borgeren " +"at der er tale om et AI system.

'\n" +" '#states':\n" " visible:\n" -" " -"':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" -" " -" value: '0'\n" -" " -"anvendes_det_af_borgerne_til_ansoegninger_og_lign_handlinger:\n" -" " -"'#type': ai_screening_yes_no_stop\n" -" '#title': 'Anvendes det af " -"borgerne til ansøgninger og lign. handlinger?'\n" -" '#text_yes': " -"'

Opgave

Det skal sikres at det " -"er muligt at lade sig repræsentere af en anden (Partsrepræsentation) " -"i AI-systemet

'\n" +" ':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" +" value: '0'\n" +" anvendes_det_af_borgerne_til_ansoegninger_og_lign_handlinger:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Anvendes det af borgerne til ansøgninger og lign. handlinger?'\n" +" '#text_yes': '

Opgave

Det skal sikres at det er muligt at lade sig repræsentere af en " +"anden (Partsrepræsentation) i AI-systemet

'\n" " '#states':\n" " visible:\n" -" " -"':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" -" " -" value: '0'\n" -" " -"falder_behandlingen_inden_for_listen_over_forbudt_ai_biometriske:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Falder " -"behandlingen inden for listen over forbudt AI?'\n" -" " -"'#text_question': \"
  • Biometriske kategoriseringssystemer, der " -"anvender følsomme karakteristika, såsom politiske, religiøse, " -"filosofiske overbevisninger, seksuel orientering, " -"race.
  • Ugrundet indsamling af ansigtsbilleder fra internettet " -"eller overvågningskameraer til oprettelse af " -"ansigtsgenkendelsesdatabaser.
  • Systemer for " -"følelsesgenkendelse på arbejdspladsen og " -"uddannelsesinstitutioner.
  • AI-systemer, der tillader brugen af " -"'sociale point' tildelt af regeringer eller virksomheder baseret på " -"social adfærd eller personlige karakteristika.
  • Kunstig " -"intelligens, der manipulerer menneskelig adfærd for at omgå deres " -"frie vilje.
  • Kunstig intelligens, der udnytter sårbarheder hos " -"mennesker.
  • Anvendelse af biometrisk fjernidentifikation i " -"realtid på offentlige steder med henblik på retshåndhævelse (med " -"snævre undtagelser)?
\"\n" +" ':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" +" value: '0'\n" +" falder_behandlingen_inden_for_listen_over_forbudt_ai_biometriske:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Falder behandlingen inden for listen over forbudt AI?'\n" +" '#text_question': \"
  • Biometriske kategoriseringssystemer, der anvender følsomme karakteristika, såsom politiske, " +"religiøse, filosofiske overbevisninger, seksuel orientering, race.
  • Ugrundet indsamling af ansigtsbilleder fra " +"internettet eller overvågningskameraer til oprettelse af ansigtsgenkendelsesdatabaser.
  • Systemer for følelsesgenkendelse " +"på arbejdspladsen og uddannelsesinstitutioner.
  • AI-systemer, der tillader brugen af 'sociale point' tildelt af " +"regeringer eller virksomheder baseret på social adfærd eller personlige karakteristika.
  • Kunstig intelligens, der " +"manipulerer menneskelig adfærd for at omgå deres frie vilje.
  • Kunstig intelligens, der udnytter sårbarheder hos " +"mennesker.
  • Anvendelse af biometrisk fjernidentifikation i realtid på offentlige steder med henblik på retshåndhævelse " +"(med snævre undtagelser)?
\"\n" " '#stop_value': '1'\n" -" " -"'#text_stop': '

Krav

Da den " -"tiltænkte AI-løsning er på listen over forbudte AI-systemer er det " -"ulovligt at fortsætte udviklingen/anvendelsen.

'\n" -" " -"skal_systemet_anvendes_af_medarbejdere:\n" -" '#type': " -"ai_screening_yes_no_stop\n" -" '#title': 'Skal systemet anvendes af " -"medarbejdere?'\n" -" '#text_yes': '

Overvejelse

Vær opmærksom " -"på at offentligt ansatte har tavshedspligt. Det indebærer, at " -"fortrolige oplysninger, som der opnås adgang til i forbindelse med " -"arbejdet, ikke må videregives til uvedkommende. Fortrolige " -"oplysninger kan kun indtastes i interne generative AI-systemer, hvis " -"der er foretaget en risikovurdering af brugen af den valgte løsning. " -"Risikovurderingen skal genbesøges Regelmæssigt, således den " -"aktuelle anvendelse af AI-systemet svarer til de accepterede risici. " -"Fortrolige oplysninger må ikke indtastes i generative AI-systemer, " -"som er gratis tilgængelige via offentligt tilgængelige hjemmesider. " -"Vær opmærksom på, at oplysninger af fortrolig karakter og dermed " -"underlagt krav om tavshedspligt både kan vedrøre personoplysninger " -"og andre forhold, eksempelvis virksomheders " +" '#text_stop': '

Krav

Da den tiltænkte AI-løsning er på listen over forbudte AI-" +"systemer er det ulovligt at fortsætte udviklingen/anvendelsen.

'\n" +" skal_systemet_anvendes_af_medarbejdere:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Skal systemet anvendes af medarbejdere?'\n" +" '#text_yes': '

Overvejelse

Vær opmærksom på at offentligt ansatte har " +"tavshedspligt. Det indebærer, at fortrolige oplysninger, som der opnås adgang til i forbindelse med arbejdet, ikke må " +"videregives til uvedkommende. Fortrolige oplysninger kan kun indtastes i interne generative AI-systemer, hvis der er foretaget " +"en risikovurdering af brugen af den valgte løsning. Risikovurderingen skal genbesøges Regelmæssigt, således den aktuelle " +"anvendelse af AI-systemet svarer til de accepterede risici. Fortrolige oplysninger må ikke indtastes i generative AI-systemer, " +"som er gratis tilgængelige via offentligt tilgængelige hjemmesider. Vær opmærksom på, at oplysninger af fortrolig karakter og " +"dermed underlagt krav om tavshedspligt både kan vedrøre personoplysninger og andre forhold, eksempelvis virksomheders " "forretningshemmeligheder.

'\n" -" " -"er_der_tale_om_et_ai_system_hvor_der_sker_en_hel_eller_delvis_au:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Er der tale om et " -"AI-system, hvor der sker en hel eller delvis automatiseret " -"sagsbehandling i sager, hvor der træffes borger- eller " -"virksomhedsrettede afgørelser?'\n" -" '#text_yes': '

Overvejelse

Der skal være " -"opmærksomhed på automation bias i afgørelser, da det kan medføre " -"at afgørelsen defacto bliver en automatisk afgørelse.

Opgave

Der skal sikres mulighed for " -"partshøring af parterne i, hvis der anvendes oplysninger, som en part " -"ikke kan antages at være bekendt med, og disse er til ugunst for " -"parten.

Regel

Er " -"sagsbehandlingsområdet pålagt at kommunen skal foretage et skøn (og " -"sagen altså ikke må afgøres alene pba. regler) - det som hedder " -"Skøn under Regel - så må behandlingen ikke være " -"fuldautomatisk.

Regel

Fuldautomatiserede afgørelser " -"er forbudt jf. artikel 22 GDPR, medmindre det er eksplicit hjemlet i " -"anden EU- eller dansk lovgivning – det skal fremgå direkte at " -"automatiske afgørelse kan anvendes!

'\n" +" er_der_tale_om_et_ai_system_hvor_der_sker_en_hel_eller_delvis_au:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Er der tale om et AI-system, hvor der sker en hel eller delvis automatiseret sagsbehandling i sager, hvor der " +"træffes borger- eller virksomhedsrettede afgørelser?'\n" +" '#text_yes': '

Overvejelse

Der skal være opmærksomhed på automation bias i " +"afgørelser, da det kan medføre at afgørelsen defacto bliver en automatisk afgørelse.

Opgave

Der skal sikres mulighed for partshøring af parterne i, hvis der anvendes oplysninger, " +"som en part ikke kan antages at være bekendt med, og disse er til ugunst for parten.

Regel

Er sagsbehandlingsområdet pålagt at kommunen skal foretage et skøn (og sagen altså ikke må afgøres alene pba. regler) " +"- det som hedder Skøn under Regel - så må behandlingen ikke være fuldautomatisk.

Regel

Fuldautomatiserede afgørelser er forbudt jf. artikel 22 GDPR, medmindre det er eksplicit hjemlet i anden EU- eller " +"dansk lovgivning – det skal fremgå direkte at automatiske afgørelse kan anvendes!

'\n" " '#states':\n" -" " -" visible:\n" -" " -"':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" -" " -" value: '0'\n" -" " -"kan_der_beskrives_et_baade_udtrykkeligt_og_legitimt_formaal_vaer:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Kan der beskrives " -"et både udtrykkeligt og legitimt formål (vær opmærksom på at der " -"typisk vil være krævet forskellige hjemler til henholdsvis " -"udvikling og drift)?'\n" +" visible:\n" +" ':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" +" value: '0'\n" +" kan_der_beskrives_et_baade_udtrykkeligt_og_legitimt_formaal_vaer:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Kan der beskrives et både udtrykkeligt og legitimt formål (vær opmærksom på at der typisk vil være krævet " +"forskellige hjemler til henholdsvis udvikling og drift)?'\n" " '#stop_value': '0'\n" -" '#text_stop': " -"'
Krav

Der er besvaret at der ikke kan " -"gives et udtrykkeligt og legitimt formål. Det er påkrævet efter " -"GDPR.

'\n" +" '#text_stop': '
Krav

Der er besvaret at der ikke kan gives et udtrykkeligt og legitimt " +"formål. Det er påkrævet efter GDPR.

'\n" " '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"benyttes_personoplysninger_fra_andre_eksisterende_behandlinger_h:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Benyttes " -"personoplysninger fra andre eksisterende behandlinger hvor formålet " -"(AI-udvikling eller drift) er uforeneligt med det oprindelige " -"formål?'\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" benyttes_personoplysninger_fra_andre_eksisterende_behandlinger_h:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Benyttes personoplysninger fra andre eksisterende behandlinger hvor formålet (AI-udvikling eller drift) er " +"uforeneligt med det oprindelige formål?'\n" " '#stop_value': '1'\n" -" '#text_stop': '

Krav

Der er besvaret at der anvendes " -"personoplysninger fra eksisterende behandlinger hvis formål ikke er " -"foreneligt med AI-udvikling og drift. Personoplysninger må jf. GDPR " -"ikke anvendes til uforeningelige formål!

'\n" -" " -"'#states':\n" +" '#text_stop': '

Krav

Der er besvaret at der anvendes personoplysninger fra " +"eksisterende behandlinger hvis formål ikke er foreneligt med AI-udvikling og drift. Personoplysninger må jf. GDPR ikke anvendes " +"til uforeningelige formål!

'\n" +" '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"er_personoplysningerne_der_anvendes_i_ai_loesningen_proportionel:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Er " -"personoplysningerne der anvendes i AI løsningen proportionelle " -"(egnede, nødvendige og forholdsmæssige)?'\n" -" '#stop_value': " -"'0'\n" -" '#text_stop': '

Krav

Der er besvaret at " -"personoplysningerne der anvendes ikke er proportionelle. Det skal de " -"være jf. GDPR

'\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" er_personoplysningerne_der_anvendes_i_ai_loesningen_proportionel:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Er personoplysningerne der anvendes i AI løsningen proportionelle (egnede, nødvendige og forholdsmæssige)?'\n" +" '#stop_value': '0'\n" +" '#text_stop': '

Krav

Der er besvaret at personoplysningerne der anvendes ikke er " +"proportionelle. Det skal de være jf. GDPR

'\n" " '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"skal_ai_systemet_traenes_paa_rigtige_personoplysninger:\n" -" '#type': " -"ai_screening_yes_no_stop\n" -" '#title': 'Skal AI-systemet trænes på " -"rigtige personoplysninger?'\n" -" '#text_yes': '

Opgave

Træning af AI-systemer på " -"personoplysninger skal skriftligt dokumenteres, herunder hvorfor der " -"kræves ægte personoplysninger, og træningen skal da i videst mulige " -"omfang ske på pseudonymiserede data. Økonomiske hensyn kan ikke " -"udgøre undtagelsesårsagen alene.

'\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" skal_ai_systemet_traenes_paa_rigtige_personoplysninger:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Skal AI-systemet trænes på rigtige personoplysninger?'\n" +" '#text_yes': '

Opgave

Træning af AI-systemer på personoplysninger skal skriftligt " +"dokumenteres, herunder hvorfor der kræves ægte personoplysninger, og træningen skal da i videst mulige omfang ske på " +"pseudonymiserede data. Økonomiske hensyn kan ikke udgøre undtagelsesårsagen alene.

'\n" " '#states':\n" -" " -"visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"er_der_hjemmel_til_behandlingen_vaer_opmaerksom_paa_at_der_typis:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Er der hjemmel til " -"behandlingen?'\n" -" '#text_question': '

Vær opmærksom på at der " -"typisk er forskellige hjemler til henholdsvis udvikling og drift + at " -"hvis der er tale om personoplysninger, så kan GDPR typisk ikke stå " -"alene som hjemmelsgrundlag, men at der så også kræves aktiverende " +" visible:\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" er_der_hjemmel_til_behandlingen_vaer_opmaerksom_paa_at_der_typis:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Er der hjemmel til behandlingen?'\n" +" '#text_question': '

Vær opmærksom på at der typisk er forskellige hjemler til henholdsvis udvikling og drift + at hvis " +"der er tale om personoplysninger, så kan GDPR typisk ikke stå alene som hjemmelsgrundlag, men at der så også kræves aktiverende " "hjemmel i en faglovgivning el. lign.

'\n" " '#stop_value': '0'\n" -" " -" '#text_stop': '

Krav

Der er " -"besvaret at der mangler hjemmel. Der skal fastlægges og dokumenteres " -"behandlingsgrundlag (hjemmel) til en AI-udvikling og/eller anvendelse " -"i drift. Formålene for træning/udvikling og drift er per definition " -"forskellige. Udviklingsfasens formål er netop udvikling, mens drift " -"har løsning af konkret(e) myndighedsopgave(r) som formål. Derfor vil " -"hjemlerne til formålene også være forskellige. Husk at der også " -"skal fastlægges hjemmel for kontinuerlig træning i dynamiske " -"AI-systemer. Og husk at GDPR som hjemmel eks. artikel 6, stk. 1, litra " -"e (myndighedsudøvelse) vil kræve støtte/aktivering fra " -"særlovgivning.

'\n" +" '#text_stop': '

Krav

Der er besvaret at der mangler hjemmel. Der skal fastlægges og " +"dokumenteres behandlingsgrundlag (hjemmel) til en AI-udvikling og/eller anvendelse i drift. Formålene for træning/udvikling og " +"drift er per definition forskellige. Udviklingsfasens formål er netop udvikling, mens drift har løsning af konkret(e) " +"myndighedsopgave(r) som formål. Derfor vil hjemlerne til formålene også være forskellige. Husk at der også skal fastlægges " +"hjemmel for kontinuerlig træning i dynamiske AI-systemer. Og husk at GDPR som hjemmel eks. artikel 6, stk. 1, litra e " +"(myndighedsudøvelse) vil kræve støtte/aktivering fra særlovgivning.

'\n" " '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"er_der_paataenkt_databeskyttelseslovens_ss10_forskning_og_statis:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Er der påtænkt " -"databeskyttelseslovens §10 (forskning og statistik) som hjemmel til " -"drift?'\n" -" '#text_yes': '

Regel

Databeskyttelsesloven §10 vil " -"kun yderst sjældent kunne være driftshjemmel.

'\n" -" " -"'#states':\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" er_der_paataenkt_databeskyttelseslovens_ss10_forskning_og_statis:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Er der påtænkt databeskyttelseslovens §10 (forskning og statistik) som hjemmel til drift?'\n" +" '#text_yes': '

Regel

Databeskyttelsesloven §10 vil kun yderst sjældent kunne være " +"driftshjemmel.

'\n" +" '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"benytter_ai_systemet_kun_almindelige_personoplysninger:\n" -" '#type': " -"ai_screening_yes_no_stop\n" -" '#title': 'Benytter AI-systemet kun " -"almindelige personoplysninger?'\n" -" '#text_no': '

Overvejelse

Selv hvis der " -"ikke indgår artikel 9/10 oplysninger i en AI-behandling, skal vi " -"være særligt opmærksomme på at output ikke medfører, at man (med " -"en høj grad af sikkerhed) kan udlede artikel 9/10 oplysninger om de " -"registrerede . Hvis man kan udlede særlige personoplysninger, så " -"skal løsningen (trods den kun behandler almindelige " -"personoplysninger) betragtes som behandlende særlige kategorier. Det " -"øger kravene til hjemmel, jf. grundlæggende behandlingsforbud for " -"artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal " -"findes

'\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" benytter_ai_systemet_kun_almindelige_personoplysninger:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Benytter AI-systemet kun almindelige personoplysninger?'\n" +" '#text_no': '

Overvejelse

Selv hvis der ikke indgår artikel 9/10 oplysninger " +"i en AI-behandling, skal vi være særligt opmærksomme på at output ikke medfører, at man (med en høj grad af sikkerhed) kan " +"udlede artikel 9/10 oplysninger om de registrerede. Hvis man kan udlede særlige personoplysninger, så skal løsningen (trods den " +"kun behandler almindelige personoplysninger) betragtes som behandlende særlige kategorier. Det øger kravene til hjemmel, jf. " +"grundlæggende behandlingsforbud for artikel 9 oplysninger, hvorfor en undtagelseshjemmel skal findes.

'\n" " '#states':\n" " visible:\n" -" " -"':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" -" " -" value: '1'\n" -" " -"loeser_ai_systemet_en_opgave_som_kommunen_enten_er_forpligtet_ti:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Løser AI-systemet " -"en opgave, som kommunen enten er forpligtet til at varetage som følge " -"af lovgivningen, eller på anden måde varetager en saglig kommunal " -"opgave?'\n" +" ':input[name=\"indgaar_der_personoplysninger_i_loesning\"]':\n" +" value: '1'\n" +" loeser_ai_systemet_en_opgave_som_kommunen_enten_er_forpligtet_ti:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Løser AI-systemet en opgave, som kommunen enten er forpligtet til at varetage som følge af lovgivningen, eller " +"på anden måde varetager en saglig kommunal opgave?'\n" " '#stop_value': '0'\n" -" '#text_stop': '

Krav

Der må kun udvikles/anvendes " -"AI-systemer, hvis der er tale om en opgave, som kommunen enten er " -"forpligtet til at varetage som følge af lovgivningen, eller hvis der " -"på anden måde varetages en saglig kommunal opgave ved anvendelsen af " -"systemet.

'\n" +" '#text_stop': '

Krav

Der må kun udvikles/anvendes AI-systemer, hvis der er tale om en " +"opgave, som kommunen enten er forpligtet til at varetage som følge af lovgivningen, eller hvis der på anden måde varetages en " +"saglig kommunal opgave ved anvendelsen af systemet.

'\n" " indgaar_der_sundhedsjournaloplysninger:\n" -" " -"'#type': ai_screening_yes_no_stop\n" -" '#title': 'Indgår der " -"sundhedsjournaloplysninger?'\n" -" '#text_yes': '

Opgave

Såfremt oplysninger fra " -"patientjournaler skal anvendes til AI, skal dette ske på baggrund af " -"enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 " -"eller §46 (kun til forskning ). Anvendelse af journaloplysninger skal " -"juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf " -"sundhedsloven). Journaloplysninger må ikke anvendes til AI i " -"forbindelse med aktuel behandling af patienten, og formål der ikke er " -"rummet af kvalitetssikring eller -udvikling af behandlingsforløb og " -"arbejdsgange for det faglige område.

'\n" -" " -"udgoer_ai_systemet_en_hoej_risiko_for_fysiske_personers_sundhed:\n" -" " -"'#type': ai_screening_yes_no_stop\n" -" '#title': 'Udgør AI-systemet " -"en høj risiko for fysiske personers sundhed og sikkerhed eller " -"grundlæggende rettigheder (højrisiko AI-systemer)?'\n" -" " -"'#text_yes': '

Opgave

  1. Der " -"skal sikres, at der
    oprettes og løbende evalueres via et " -"risikostyringssystem
  2. foretages datastyring i forbindelse " -"trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes " -"teknisk dokumentation forinden ibrugtagning
  4. foretages logning " -"
  5. sikres en passende gennemsigtighed med henblik på opfyldelse " -"af de relevante bruger- og udbyderforpligtelser
  6. udføres " -"menneskeligt tilsyn i hele AI-systemets levetid
  7. oplyses om " -"nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske " -"redundansløsninger (backupplaner)
  9. sikres modstandsdygtige " -"over for uautoriserede tredjeparters forsøg på at ændre " -"systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, " -"iterativ proces igennem hele systemets levetid
  11. sikres " -"oplysningspligt til nationale kompetente myndigheder og samarbejde med " -"nationalt kompetente myndigheder
'\n" -" " -"skaber_ai_systemet_video_lyd_eller_billeder_som_efterligner_virk:\n" -" " -" '#type': ai_screening_yes_no_stop\n" -" '#title': 'Skaber AI-systemet " -" video, lyd eller billeder, som efterligner virkelige objekter?'\n" -" " -"'#text_yes': '

Regel

Der skal " -"sikres at AI-systemet tydeligt angiver til brugeren/og i output, at " -"indholdet er kunstigt genereret eller manipuleret.

'\n" -" " -"vil_man_kunne_redegoere_for_ai_systemets_funktion_i_afgoerelser:\n" -" " -"'#type': ai_screening_yes_no_stop\n" -" '#title': 'Vil man kunne " -"redegøre for AI-systemets funktion i afgørelser?'\n" -" " -"'#stop_value': '0'\n" -" '#text_stop': '

Krav

Ved anvendelse af AI-systemer i " -"forbindelse med borgerrettede afgørelser, skal der tages højde for, " -"at forvaltningen skal kunne redegøre for, hvorfor en sag har fået et " -"givent udfald. Dette også af hensyn til at sikre en ensartet " -"sagsbehandling og overholdelse af lighedsgrundsætningen. Det hænger " -"også sammen med forvaltningsrettens krav til begrundelse i " -"afgørelsessager, da vi som myndighed er forpligtede til at begrunde, " -"hvorfor afgørelsen har fået et givent udfald.

'\n" -" " -"'#states':\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Indgår der sundhedsjournaloplysninger?'\n" +" '#text_yes': '

Opgave

Såfremt oplysninger fra patientjournaler skal anvendes til AI, " +"skal dette ske på baggrund af enten et sundhedsfagligt samtykke, sundhedslovens §42d, stk. 2, nr. 2 eller §46 (kun til " +"forskning). Anvendelse af journaloplysninger skal juridisk- og ledelsesmæssig godkendes (regionsrådsgodkendelse jf " +"sundhedsloven). Journaloplysninger må ikke anvendes til AI i forbindelse med aktuel behandling af patienten, og formål der ikke " +"er rummet af kvalitetssikring eller -udvikling af behandlingsforløb og arbejdsgange for det faglige område.

'\n" +" udgoer_ai_systemet_en_hoej_risiko_for_fysiske_personers_sundhed:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Udgør AI-systemet en høj risiko for fysiske personers sundhed og sikkerhed eller grundlæggende rettigheder " +"(højrisiko AI-systemer)?'\n" +" '#text_yes': '

Opgave

  1. Der skal sikres, at der oprettes og løbende evalueres via " +"et risikostyringssystem
  2. foretages datastyring i forbindelse trænings-, validerings- og prøvningsdatatsæt
  3. udarbejdes teknisk dokumentation forinden ibrugtagning
  4. foretages logning
  5. sikres en passende " +"gennemsigtighed med henblik på opfyldelse af de relevante bruger- og udbyderforpligtelser
  6. udføres menneskeligt tilsyn i " +"hele AI-systemets levetid
  7. oplyses om nøjagtigheden af systemet
  8. sikres robusthed vha. tekniske " +"redundansløsninger (backupplaner)
  9. sikres modstandsdygtige over for uautoriserede tredjeparters forsøg på at ændre " +"systemet.
  10. sikres vedligehold og dokumenter, kontinuerlig, iterativ proces igennem hele systemets levetid
  11. sikres " +"oplysningspligt til nationale kompetente myndigheder og samarbejde med nationalt kompetente myndigheder
'\n" +" skaber_ai_systemet_video_lyd_eller_billeder_som_efterligner_virk:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Skaber AI-systemet video, lyd eller billeder, som efterligner virkelige objekter?'\n" +" '#text_yes': '

Regel

Der skal sikres at AI-systemet tydeligt angiver til brugeren/og i " +"output, at indholdet er kunstigt genereret eller manipuleret.

'\n" +" vil_man_kunne_redegoere_for_ai_systemets_funktion_i_afgoerelser:\n" +" '#type': ai_screening_yes_no_stop\n" +" '#title': 'Vil man kunne redegøre for AI-systemets funktion i afgørelser?'\n" +" '#stop_value': '0'\n" +" '#text_stop': '

Krav

Ved anvendelse af AI-systemer i forbindelse med borgerrettede " +"afgørelser, skal der tages højde for, at forvaltningen skal kunne redegøre for, hvorfor en sag har fået et givent udfald. Dette " +"også af hensyn til at sikre en ensartet sagsbehandling og overholdelse af lighedsgrundsætningen. Det hænger også sammen med " +"forvaltningsrettens krav til begrundelse i afgørelsessager, da vi som myndighed er forpligtede til at begrunde, hvorfor " +"afgørelsen har fået et givent udfald.

'\n" +" '#states':\n" " visible:\n" -" " -"':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" -" " -" value: '0'" +" ':input[name=\"er_der_tale_om_en_ren_intern_loesning_der_ikke_anvendes_borgeret\"]':\n" +" value: '0'" msgstr "" - diff --git a/tests/user.spec.ts b/tests/user.spec.ts index e7d80061..84311a86 100644 --- a/tests/user.spec.ts +++ b/tests/user.spec.ts @@ -11,9 +11,9 @@ test("Create screening", async ({ page }) => { await page.getByLabel("Password").fill("user"); await page.getByRole("button", { name: "Login", exact: true }).click(); - await page.getByRole("link", { name: "Screeninger" }).click(); + await page.getByRole("link", { name: "Projekter" }).click(); - await page.getByRole("link", { name: "Create new screening" }).click(); + await page.getByRole("link", { name: "Create new project" }).click(); await page.getByLabel("Title", { exact: true }).fill("My first screening"); await page diff --git a/translations/contrib-translations.da.po b/translations/contrib-translations.da.po index 022ddda2..223d77b4 100644 --- a/translations/contrib-translations.da.po +++ b/translations/contrib-translations.da.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-01-28 14:12+0100\n" -"PO-Revision-Date: 2026-01-28 14:12+0100\n" +"POT-Creation-Date: 2026-02-16 13:35+0100\n" +"PO-Revision-Date: 2026-02-16 13:35+0100\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -845,7 +845,7 @@ msgid "Draft" msgstr "Draft" msgid "Save Draft" -msgstr "Save Draft" +msgstr "Gem kladde" msgid "" "Submission saved. You may return to this form later and it will " @@ -949,4 +949,16 @@ msgid "" "screenings can be viewed by editors only." msgstr "👀" +msgid "Show all projects" +msgstr "Vis alle projekter" +msgid "" +"Submission saved. You may return to this form later and it will " +"restore the current values." +msgstr "Kladde gemt." + +msgctxt "webform.settings:settings:default_draft_saved_message" +msgid "" +"Submission saved. You may return to this form later and it will " +"restore the current values." +msgstr "Kladde gemt." diff --git a/web/modules/custom/ai_screening/README.md b/web/modules/custom/ai_screening/README.md index ef3d1b91..3849b105 100644 --- a/web/modules/custom/ai_screening/README.md +++ b/web/modules/custom/ai_screening/README.md @@ -1,4 +1,4 @@ -# AI Screening +# AI Project ## Settings diff --git a/web/modules/custom/ai_screening/src/Form/FrontpageForm.php b/web/modules/custom/ai_screening/src/Form/FrontpageForm.php index 8fc8ce5b..5405c146 100644 --- a/web/modules/custom/ai_screening/src/Form/FrontpageForm.php +++ b/web/modules/custom/ai_screening/src/Form/FrontpageForm.php @@ -12,7 +12,7 @@ use Drupal\Core\Url; /** - * Configure AI Screening project track settings for this site. + * Configure AI Project project track settings for this site. */ final class FrontpageForm extends FormBase { use AutowireTrait; diff --git a/web/modules/custom/ai_screening/src/Helper/ThemeHelper.php b/web/modules/custom/ai_screening/src/Helper/ThemeHelper.php index c29b63ac..cd513544 100644 --- a/web/modules/custom/ai_screening/src/Helper/ThemeHelper.php +++ b/web/modules/custom/ai_screening/src/Helper/ThemeHelper.php @@ -34,7 +34,7 @@ public function formAlter(FormAlterEvent $event): void { $form = &$event->getForm(); $formId = $event->getFormId(); if ('node_project_form' === $formId) { - $form['#title'] = t('Create new screening'); + $form['#title'] = t('Create new project'); } if ('node_static_form' === $formId) { $form['#title'] = t('Create new static page'); diff --git a/web/modules/custom/ai_screening/translations/ai_screening.da.po b/web/modules/custom/ai_screening/translations/ai_screening.da.po index a3b528d0..fdf9bb49 100644 --- a/web/modules/custom/ai_screening/translations/ai_screening.da.po +++ b/web/modules/custom/ai_screening/translations/ai_screening.da.po @@ -82,8 +82,8 @@ msgid "Unblocking OIDC user @user (@id)" msgstr "Ophæver blokering af OIDC-bruger @user (@id)" #: modules/custom/ai_screening/src/Helper/ThemeHelper.php:37 -msgid "Create new screening" -msgstr "Opret ny screening" +msgid "Create new project" +msgstr "Opret nyt projekt" #: modules/custom/ai_screening/src/Helper/ThemeHelper.php:40 msgid "Create new static page" diff --git a/web/modules/custom/ai_screening_fixtures_base/src/Fixture/GroupRelationsFixture.php b/web/modules/custom/ai_screening_fixtures_base/src/Fixture/GroupRelationsFixture.php index d2b20dfc..fbc229cc 100644 --- a/web/modules/custom/ai_screening_fixtures_base/src/Fixture/GroupRelationsFixture.php +++ b/web/modules/custom/ai_screening_fixtures_base/src/Fixture/GroupRelationsFixture.php @@ -30,7 +30,7 @@ public function __construct( public function load(): void { for ($i = 0; $i < ProjectFixture::EXTRA_PROJECTS; $i++) { /** @var \Drupal\node\NodeInterface $project */ - $project = $this->getReference(sprintf('project:Screening - %d', $i + 1)); + $project = $this->getReference(sprintf('project:Project - %d', $i + 1)); // Add 3 users as member to the group. $roles = ['project_group-member']; for ($j = 0; $j < 3; $j++) { @@ -43,7 +43,7 @@ public function load(): void { $group->save(); - echo sprintf('User %s (%s) added as %s to group %s (screening id: %s)', + echo sprintf('User %s (%s) added as %s to group %s (project id: %s)', $user->label(), $user->id(), implode(', ', $roles), $group->label(), diff --git a/web/modules/custom/ai_screening_fixtures_base/src/Fixture/ProjectFixture.php b/web/modules/custom/ai_screening_fixtures_base/src/Fixture/ProjectFixture.php index 9e28b302..26bff9b7 100644 --- a/web/modules/custom/ai_screening_fixtures_base/src/Fixture/ProjectFixture.php +++ b/web/modules/custom/ai_screening_fixtures_base/src/Fixture/ProjectFixture.php @@ -45,27 +45,27 @@ public function load(): void { $node = Node::create([ 'type' => 'project', - 'title' => 'Ordinary screening', + 'title' => 'Ordinary project', 'status' => NodeInterface::PUBLISHED, 'field_department' => ['target_id' => $this->getReference('department:Department A')->id()], 'field_description' => [ - 'value' => 'En ny screening', + 'value' => 'Et nyt projekt', 'format' => 'plain_text', ], ProjectHelper::FIELD_CORRUPTED => 0, ]); $node->setOwner($editor); - $this->addReference('project:Ordinary screening', $node); + $this->addReference('project:Ordinary project', $node); $node->save(); $node = Node::create([ 'type' => 'project', - 'title' => '(kladde) Another screening', + 'title' => '(kladde) Another project', 'status' => NodeInterface::NOT_PUBLISHED, 'field_department' => ['target_id' => $this->getReference('department:Department A')->id()], 'field_description' => [ - 'value' => 'Denne screening er endnu ikke offentlig', + 'value' => 'Dette projekt er endnu ikke offentligt', 'format' => 'plain_text', ], ProjectHelper::FIELD_CORRUPTED => 0, @@ -76,14 +76,14 @@ public function load(): void { $node = Node::create([ 'type' => 'project', - 'title' => 'Screening with multiple departments', + 'title' => 'Project with multiple departments', 'status' => NodeInterface::PUBLISHED, 'field_department' => [ ['target_id' => $this->getReference('department:Department B')->id()], ['target_id' => $this->getReference('department:Department C')->id()], ], 'field_description' => [ - 'value' => 'Tværgående screening', + 'value' => 'Tværgående projekt', 'format' => 'plain_text', ], ProjectHelper::FIELD_CORRUPTED => 0, @@ -93,11 +93,11 @@ public function load(): void { $node = Node::create([ 'type' => 'project', - 'title' => 'Finished screening', + 'title' => 'Finished project', 'status' => NodeInterface::PUBLISHED, 'field_department' => ['target_id' => $this->getReference('department:Department C')->id()], 'field_description' => [ - 'value' => 'En afsluttet screening', + 'value' => 'Et afsluttet projekt', 'format' => 'plain_text', ], 'field_project_state' => 'finished', @@ -105,34 +105,34 @@ public function load(): void { ]); $node->setOwner($editor); - $this->addReference('project:Finished screening', $node); + $this->addReference('project:Finished project', $node); $node->save(); $node = Node::create([ 'type' => 'project', - 'title' => 'Corrupted screening', + 'title' => 'Corrupted project', 'status' => NodeInterface::NOT_PUBLISHED, 'field_department' => ['target_id' => $this->getReference('department:Department C')->id()], 'field_description' => [ - 'value' => 'En ødelagt screening bør slettes med cron.', + 'value' => 'Et ødelagt projekt bør slettes med cron.', 'format' => 'plain_text', ], 'corrupted' => 1, ]); $node->setOwner($editor); - $this->addReference('project:Corrupted screening', $node); + $this->addReference('project:Corrupted project', $node); $node->save(); for ($projectCount = 1; $projectCount <= self::EXTRA_PROJECTS; $projectCount++) { - $label = 'Screening - ' . $projectCount; + $label = 'Project - ' . $projectCount; $node = Node::create([ 'type' => 'project', 'title' => $label, 'status' => NodeInterface::PUBLISHED, 'field_department' => ['target_id' => $this->getReference('department:Department B')->id()], 'field_description' => [ - 'value' => 'Screeningsnummer ' . $projectCount, + 'value' => 'Projektnummer ' . $projectCount, 'format' => 'plain_text', ], 'corrupted' => 0, diff --git a/web/modules/custom/ai_screening_project/ai_screening_project.info.yml b/web/modules/custom/ai_screening_project/ai_screening_project.info.yml index a019ca1d..4d78e87d 100644 --- a/web/modules/custom/ai_screening_project/ai_screening_project.info.yml +++ b/web/modules/custom/ai_screening_project/ai_screening_project.info.yml @@ -1,4 +1,4 @@ -name: AI Screening project +name: AI Project project description: Functionality related to creating and maintaining the project content type and related entities. package: "Custom" type: module diff --git a/web/modules/custom/ai_screening_project/ai_screening_project.routing.yml b/web/modules/custom/ai_screening_project/ai_screening_project.routing.yml index f5e29025..2b599399 100644 --- a/web/modules/custom/ai_screening_project/ai_screening_project.routing.yml +++ b/web/modules/custom/ai_screening_project/ai_screening_project.routing.yml @@ -2,7 +2,7 @@ ai_screening_project.project_deactivate_confirm: path: "/node/{node}/edit/confirm" defaults: _form: '\Drupal\ai_screening_project\Form\ProjectNodeConfirmForm' - _title: "Confirm Screening Changes" + _title: "Confirm Project Changes" requirements: _entity_access: "node.update" _node_type: "project" diff --git a/web/modules/custom/ai_screening_project/src/BreadcrumbBuilder.php b/web/modules/custom/ai_screening_project/src/BreadcrumbBuilder.php index df10a86b..675365c3 100644 --- a/web/modules/custom/ai_screening_project/src/BreadcrumbBuilder.php +++ b/web/modules/custom/ai_screening_project/src/BreadcrumbBuilder.php @@ -65,10 +65,10 @@ public function build(RouteMatchInterface $route_match): Breadcrumb { } if (NULL !== $project) { - $breadcrumb->addLink(Link::fromTextAndUrl($this->t('Screenings'), Url::fromUri('internal:/projects'))); + $breadcrumb->addLink(Link::fromTextAndUrl($this->t('Projects'), Url::fromUri('internal:/projects'))); if ($project->isNew()) { $breadcrumb->addLink(Link::fromTextAndUrl( - $this->t('Create new screening'), + $this->t('Create new project'), Url::fromRoute('node.add', ['node_type' => $project->bundle()]) )); } diff --git a/web/modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php b/web/modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php index 9c1f4cd3..a2750099 100644 --- a/web/modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php +++ b/web/modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php @@ -61,7 +61,7 @@ public function buildForm(array $form, FormStateInterface $form_state, ?Node $no * {@inheritdoc} */ public function getQuestion() { - return $this->t('Are you sure you want to save the screening "@title"?', ['@title' => $this->node->label()]); + return $this->t('Are you sure you want to save the project "@title"?', ['@title' => $this->node->label()]); } /** @@ -75,14 +75,14 @@ public function getCancelUrl() { * {@inheritdoc} */ public function getDescription() { - return $this->t('Deactivating a screening will disable further work on the screening and archive it. Reactivation of the screening requires site administrative privileges.'); + return $this->t('Deactivating a project will disable further work on the project and archive it. Reactivation of the project requires site administrative privileges.'); } /** * {@inheritdoc} */ public function getConfirmText() { - return $this->t('Save screening'); + return $this->t('Save project'); } /** @@ -110,7 +110,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $tempstore->delete('project_form_values_' . $node->id()); // Set a success message. - $this->messenger()->addStatus($this->t('Screening "@title" has been updated.', ['@title' => $node->label()])); + $this->messenger()->addStatus($this->t('Project "@title" has been updated.', ['@title' => $node->label()])); // Redirect to the node view page. $form_state->setRedirectUrl(Url::fromRoute('entity.node.canonical', ['node' => $node->id()])); diff --git a/web/modules/custom/ai_screening_project/src/Helper/ProjectHelper.php b/web/modules/custom/ai_screening_project/src/Helper/ProjectHelper.php index 30a7d774..62a33eb9 100644 --- a/web/modules/custom/ai_screening_project/src/Helper/ProjectHelper.php +++ b/web/modules/custom/ai_screening_project/src/Helper/ProjectHelper.php @@ -156,7 +156,7 @@ public function deleteRelated(NodeInterface $project): void { $this->projectTrackHelper->deleteProjectTracks($projectTracks); } catch (\Exception $exception) { - $this->error('Error deleting screening: @message', [ + $this->error('Error deleting project: @message', [ '@message' => $exception->getMessage(), ]); } @@ -199,7 +199,7 @@ public function entityAccess(EntityAccessEvent $event): void { } if ($this->isFinished($entity)) { if ('view' !== $event->getOperation()) { - $event->setAccessResult(AccessResult::forbidden(sprintf('Screening %s (%s) is marked as finished', $entity->label(), + $event->setAccessResult(AccessResult::forbidden(sprintf('Project %s (%s) is marked as finished', $entity->label(), $entity->id()))); } } @@ -238,7 +238,7 @@ public function entityBaseFieldInfo(EntityBaseFieldInfoEvent $event): void { $event->setFields([ self::FIELD_CORRUPTED => BaseFieldDefinition::create('boolean') ->setLabel($this->t('Corrupted')) - ->setDescription($this->t('If the screening or related entities are corrupted.')) + ->setDescription($this->t('If the project or related entities are corrupted.')) ->setTargetEntityTypeId($entityType->id()) ->setReadOnly(TRUE), ]); @@ -355,12 +355,12 @@ public function formAlter(FormAlterEvent $event): void { $form['group_fieldset'] = [ '#type' => 'fieldset', - '#title' => $this->t('Screening group'), + '#title' => $this->t('Project group'), ]; $form['group_fieldset']['project_owner'] = [ '#type' => 'select', - '#title' => $this->t('Screening owner'), + '#title' => $this->t('Project owner'), '#default_value' => $groupOwnerId, '#options' => $optionsGroupOwner, '#attributes' => ['class' => ['text-full form-text required bg-primary text-primary border border-primary rounded-md py-2 px-3 my-1 w-full']], @@ -370,7 +370,7 @@ public function formAlter(FormAlterEvent $event): void { $form['group_fieldset']['project_contributors'] = [ '#type' => 'select', '#title' => $this->t('Contributors'), - '#description' => $this->t('Which users are allowed to contribute to this screening'), + '#description' => $this->t('Which users are allowed to contribute to this project'), '#description_display' => 'before', '#options' => $optionsGroupContributors, '#multiple' => TRUE, @@ -397,7 +397,7 @@ public function formAlter(FormAlterEvent $event): void { */ public function validateGroupsForm(array &$form, FormStateInterface $form_state): void { if (!in_array($form_state->getValue('project_owner'), $form_state->getValue('project_contributors'))) { - $form_state->setErrorByName('project_owner', $this->t('Screening owner must be a contributor.')); + $form_state->setErrorByName('project_owner', $this->t('Project owner must be a contributor.')); } } @@ -478,7 +478,7 @@ public function log($level, string|\Stringable $message, array $context = []): v private function addProjectGroup(NodeInterface $entity): void { try { if ($this->accountProxy->isAnonymous()) { - throw new AccessDeniedHttpException('Cannot create screening as anonymous user.'); + throw new AccessDeniedHttpException('Cannot create project as anonymous user.'); } // Create group when a project is created. @@ -573,7 +573,7 @@ private function addProjectTracks(NodeInterface $entity): void { } } catch (\Exception $exception) { - $this->error('Error creating screening tracks: @message', [ + $this->error('Error creating project tracks: @message', [ '@message' => $exception->getMessage(), 'entity' => $entity, ]); diff --git a/web/modules/custom/ai_screening_project/src/Hook/FormHooks.php b/web/modules/custom/ai_screening_project/src/Hook/FormHooks.php index d30a9508..8f5ccc8b 100644 --- a/web/modules/custom/ai_screening_project/src/Hook/FormHooks.php +++ b/web/modules/custom/ai_screening_project/src/Hook/FormHooks.php @@ -22,7 +22,7 @@ class FormHooks { public function formAlter(array &$form, FormStateInterface $form_state, string $form_id): void { if ('node_project_edit_form' === $form_id) { $form['status']['widget']['value']['#title'] = $this->t('Public', options: ['context' => 'project']); - $form['status']['widget']['value']['#description'] = $this->t('Public screenings can be viewed by all users. Non-public screenings can be viewed by editors only.', + $form['status']['widget']['value']['#description'] = $this->t('Public projects can be viewed by all users. Non-public projects can be viewed by editors only.', options: ['context' => 'project']); } } diff --git a/web/modules/custom/ai_screening_project/src/Template/ProjectTwigExtension.php b/web/modules/custom/ai_screening_project/src/Template/ProjectTwigExtension.php index 266f2913..086666ae 100644 --- a/web/modules/custom/ai_screening_project/src/Template/ProjectTwigExtension.php +++ b/web/modules/custom/ai_screening_project/src/Template/ProjectTwigExtension.php @@ -4,6 +4,7 @@ use Drupal\ai_screening_project\Helper\ProjectHelper; use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; use Twig\TwigFunction; /** @@ -25,6 +26,15 @@ public function getName() { return 'ai_screening_project'; } + /** + * {@inheritdoc} + */ + public function getFilters() { + return [ + new TwigFilter('html2text', $this->html2text(...)), + ]; + } + /** * {@inheritdoc} */ @@ -47,4 +57,17 @@ public function getProjectTrackEvaluation(string $projectId): array { return $this->projectHelper->getProjectTrackEvaluation($projectId); } + /** + * A poor man's HTML to plain text converter. + */ + public function html2text(string $html): string { + // Add space before select block-level elements. + $html = \Safe\preg_replace('/<(div|li|p)[[:space:]>]/', ' \0', $html); + + $html = strip_tags($html); + + // Normalize whitespace. + return preg_replace('/[[:space:]]+/', ' ', trim($html)); + } + } diff --git a/web/modules/custom/ai_screening_project/translations/ai_screening_project.da.po b/web/modules/custom/ai_screening_project/translations/ai_screening_project.da.po index 8ed53d8e..9740f951 100644 --- a/web/modules/custom/ai_screening_project/translations/ai_screening_project.da.po +++ b/web/modules/custom/ai_screening_project/translations/ai_screening_project.da.po @@ -25,81 +25,81 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: modules/custom/ai_screening_project/ai_screening_project.info.yml:0 -msgid "AI Screening project" -msgstr "AI Screening-screening" +msgid "AI Project project" +msgstr "AI Project-screening" #: modules/custom/ai_screening_project/ai_screening_project.info.yml:0 msgid "Functionality related to creating and maintaining the project content type and related entities." msgstr "" "Funktionalitet relateret til oprettelse og vedligehold af af " -"screeningsindholdstype og relaterede entiteter." +"projektindholdstype og relaterede entiteter." #: modules/custom/ai_screening_project/ai_screening_project.info.yml:0 modules/custom/ai_screening_project/src/Plugin/Block/FrontpageStatsTopBlock.php:21 msgid "Custom" msgstr "Tilpasset" #: modules/custom/ai_screening_project/ai_screening_project.routing.yml:0 -msgid "Confirm Screening Changes" -msgstr "Bekræft screeningsændringer" +msgid "Confirm Project Changes" +msgstr "Bekræft projektændringer" #: modules/custom/ai_screening_project/src/BreadcrumbBuilder.php:68 -msgid "Screenings" -msgstr "Screeninger" +msgid "Projects" +msgstr "Projekter" #: modules/custom/ai_screening_project/src/BreadcrumbBuilder.php:71 -msgid "Create new screening" -msgstr "Opret ny screening" +msgid "Create new project" +msgstr "Opret nyt projekt" #: modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php:64 -msgid "Are you sure you want to save the screening \"@title\"?" -msgstr "Er du sikker på at du vil gemme screeningen \"@title\"?" +msgid "Are you sure you want to save the project \"@title\"?" +msgstr "Er du sikker på at du vil gemme projektet \"@title\"?" #: modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php:78 -msgid "Deactivating a screening will disable further work on the screening and archive it. Reactivation of the screening requires site administrative privileges." +msgid "Deactivating a project will disable further work on the project and archive it. Reactivation of the project requires site administrative privileges." msgstr "" -"Deaktivering af screeningen vil forhindre yderligere arbejde på " -"screeningen og arkivere det. Reaktivering af screeningen kræver " -"administrator adgang på sitet." +"Deaktivering af projektet vil forhindre yderligere arbejde på " +"projektet og arkivere det. Reaktivering af projektet kræver " +"administratoradgang på sitet." #: modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php:85 -msgid "Save screening" -msgstr "Gem screening" +msgid "Save project" +msgstr "Gem projekt" #: modules/custom/ai_screening_project/src/Form/ProjectNodeConfirmForm.php:113 -msgid "Screening \"@title\" has been updated." -msgstr "Screening \"@title\" er blevet opdateret." +msgid "Project \"@title\" has been updated." +msgstr "Project \"@title\" er blevet opdateret." #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:240 msgid "Corrupted" msgstr "Beskadiget" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:241 -msgid "If the screening or related entities are corrupted." -msgstr "Hvis screeningen eller relaterede entiteter er beskadiget." +msgid "If the project or related entities are corrupted." +msgstr "Hvis projektet eller relaterede entiteter er beskadiget." #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:358 -msgid "Screening group" +msgid "Project group" msgstr "Projectgruppe" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:363 -msgid "Screening owner" -msgstr "Screeningsejer" +msgid "Project owner" +msgstr "Projektejer" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:372 msgid "Contributors" msgstr "Bidragydere" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:373 -msgid "Which users are allowed to contribute to this screening" -msgstr "Hvilke brugere har tilladelse til at bidrage til denne screening" +msgid "Which users are allowed to contribute to this project" +msgstr "Hvilke brugere har tilladelse til at bidrage til dette projekt" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:400 -msgid "Screening owner must be a contributor." -msgstr "Screeningsejeren skal være bidragyder." +msgid "Project owner must be a contributor." +msgstr "Projektejeren skal være bidragyder." #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:159 -msgid "Error deleting screening: @message" -msgstr "Fejl ved sletning af screening: @message" +msgid "Error deleting project: @message" +msgstr "Fejl ved sletning af projekt: @message" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:182 msgid "Error deleting corrupted nodes: @message" @@ -110,18 +110,17 @@ msgid "Error creating groups: @message" msgstr "Fejl ved oprettelse af grupper: @message" #: modules/custom/ai_screening_project/src/Helper/ProjectHelper.php:576 -msgid "Error creating screening tracks: @message" -msgstr "Fejl ved oprettelse af screeningsspor: @message" +msgid "Error creating project tracks: @message" +msgstr "Fejl ved oprettelse af projektspor: @message" #: modules/custom/ai_screening_project/src/Hook/FormHooks.php:24 msgid "Public" msgstr "Tillad kiggeadgang" #: modules/custom/ai_screening_project/src/Hook/FormHooks.php:25 -msgid "Public screenings can be viewed by all users. Non-public screenings can be viewed by editors only." +msgid "Public projects can be viewed by all users. Non-public projects can be viewed by editors only." msgstr "👀" #: modules/custom/ai_screening_project/src/Plugin/Block/FrontpageStatsTopBlock.php:20 msgid "Frontpage stats top" msgstr "Forside statistik top" - diff --git a/web/modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml b/web/modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml index b1a5acd9..bf4f3675 100644 --- a/web/modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml +++ b/web/modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml @@ -1,4 +1,4 @@ -name: AI Screening project track +name: AI Project project track description: Adds project track entity and functionality package: "Custom" type: module diff --git a/web/modules/custom/ai_screening_project_track/ai_screening_project_track.install b/web/modules/custom/ai_screening_project_track/ai_screening_project_track.install index 73ffb272..0ef96421 100644 --- a/web/modules/custom/ai_screening_project_track/ai_screening_project_track.install +++ b/web/modules/custom/ai_screening_project_track/ai_screening_project_track.install @@ -12,7 +12,7 @@ use Drupal\Core\Field\BaseFieldDefinition; */ function ai_screening_project_track_update_11001() { $fields['configuration'] = BaseFieldDefinition::create('string_long') - ->setLabel(t('Screening track configuration')) + ->setLabel(t('Project track configuration')) ->setDescription(t('Configuration for the track.')) ->setReadOnly(TRUE); @@ -27,8 +27,8 @@ function ai_screening_project_track_update_11001() { */ function ai_screening_project_track_update_11002() { $fields['project_track_evaluation_overridden'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track evaluation overridden')) - ->setDescription(t('The overridden evaluation of the screening track')) + ->setLabel(t('Project track evaluation overridden')) + ->setDescription(t('The overridden evaluation of the project track')) ->setReadOnly(TRUE); foreach ($fields as $fieldName => $fieldDefinition) { diff --git a/web/modules/custom/ai_screening_project_track/src/Drush/Commands/ProjectTrackCommands.php b/web/modules/custom/ai_screening_project_track/src/Drush/Commands/ProjectTrackCommands.php index 4ab9c8f3..141a3fee 100644 --- a/web/modules/custom/ai_screening_project_track/src/Drush/Commands/ProjectTrackCommands.php +++ b/web/modules/custom/ai_screening_project_track/src/Drush/Commands/ProjectTrackCommands.php @@ -51,8 +51,8 @@ public function __construct( #[CLI\FieldLabels(labels: [ 'id' => 'ID', 'url' => 'URL', - 'project' => 'Screening ID', - 'project_url' => 'Screening URL', + 'project' => 'Project ID', + 'project_url' => 'Project URL', 'created' => 'Created', 'changed' => 'Changed', 'tools' => 'Tools', diff --git a/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php b/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php index 94360f08..684519c2 100644 --- a/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php +++ b/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php @@ -25,8 +25,8 @@ * label_singular = @Translation("project track"), * label_plural = @Translation("project tracks"), * label_count = @PluralTranslation( - * singular = "@count screening tracks", - * plural = "@count screening tracks", + * singular = "@count project tracks", + * plural = "@count project tracks", * ), * handlers = { * "storage" = "Drupal\ai_screening_project_track\ProjectTrackStorage", @@ -101,44 +101,44 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type): a $fields['type'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Type')) - ->setDescription(t('The type of the screening track, as defined by taxonommy term')) + ->setDescription(t('The type of the project track, as defined by taxonommy term')) ->setSetting('target_type', 'taxonomy_term') ->setSetting('handler_settings', ['target_bundles' => ['project_track_type' => 'project_track_type']]); $fields['title'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track title')) + ->setLabel(t('Project track title')) ->setDescription(t('The title of the project track.')); $fields['description'] = BaseFieldDefinition::create('string_long') - ->setLabel(t('Screening track description')) + ->setLabel(t('Project track description')) ->setDescription(t('A description of the project track.')); $fields['project_track_evaluation'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track evaluation')) + ->setLabel(t('Project track evaluation')) ->setDescription(t('The evaluation of the project track.')); $fields['project_track_evaluation_overridden'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track evaluation overridden')) + ->setLabel(t('Project track evaluation overridden')) ->setDescription(t('The overridden evaluation of the project track.')); $fields['project_track_note'] = BaseFieldDefinition::create('string_long') - ->setLabel(t('Screening track note')) + ->setLabel(t('Project track note')) ->setDescription(t('A note related to project track evaluation.')); $fields['project_track_status'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track status')) - ->setDescription(t('The status of the screening track.')); + ->setLabel(t('Project track status')) + ->setDescription(t('The status of the project track.')); $fields['created'] = BaseFieldDefinition::create('created') ->setLabel(t('Authored on')) - ->setDescription(t('The time that the screening track was created.')); + ->setDescription(t('The time that the project track was created.')); $fields['changed'] = BaseFieldDefinition::create('changed') ->setLabel(t('Changed')) - ->setDescription(t('The time that the screening track was last edited.')); + ->setDescription(t('The time that the project track was last edited.')); $fields['project_id'] = BaseFieldDefinition::create('entity_reference') - ->setLabel(t('Screening')) + ->setLabel(t('Project')) ->setSetting('target_type', 'node') ->setSetting('handler_settings', ['target_bundles' => ['project' => 'project']]); @@ -146,7 +146,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type): a ->setLabel(t('Delta')); $fields['configuration'] = BaseFieldDefinition::create('string_long') - ->setLabel(t('Screening track configuration')) + ->setLabel(t('Project track configuration')) ->setDescription(t('Configuration for the track.')) ->setReadOnly(TRUE); diff --git a/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php b/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php index 95d13a0d..9e25a7b0 100644 --- a/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php +++ b/web/modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php @@ -88,11 +88,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type): a $fields = parent::baseFieldDefinitions($entity_type); $fields['project_track_id'] = BaseFieldDefinition::create('entity_reference') - ->setLabel(t('Screening track')) + ->setLabel(t('Project track')) ->setSetting('target_type', 'project_track'); $fields['project_track_tool_status'] = BaseFieldDefinition::create('string') - ->setLabel(t('Screening track tool status')) + ->setLabel(t('Project track tool status')) ->setDescription(t('The status of the project track tool.')); $fields['tool_entity_type'] = BaseFieldDefinition::create('string') @@ -110,11 +110,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type): a $fields['created'] = BaseFieldDefinition::create('created') ->setLabel(t('Authored on')) - ->setDescription(t('The time that the screening track tool was created.')); + ->setDescription(t('The time that the project track tool was created.')); $fields['changed'] = BaseFieldDefinition::create('changed') ->setLabel(t('Changed')) - ->setDescription(t('The time that the screening track tool was last edited.')); + ->setDescription(t('The time that the project track tool was last edited.')); $fields['delta'] = BaseFieldDefinition::create('integer') ->setLabel(t('Dalte')); diff --git a/web/modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php b/web/modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php index b9cc9f95..9e6f3045 100644 --- a/web/modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php +++ b/web/modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php @@ -146,13 +146,13 @@ public function save(array $form, FormStateInterface $form_state): int { switch ($result) { case SAVED_NEW: - $this->messenger()->addStatus($this->t('New screening track %label has been created.', $message_args)); - $this->logger('ai_screening_project_track')->notice('New screening track %label has been created.', $logger_args); + $this->messenger()->addStatus($this->t('New project track %label has been created.', $message_args)); + $this->logger('ai_screening_project_track')->notice('New project track %label has been created.', $logger_args); break; case SAVED_UPDATED: - $this->messenger()->addStatus($this->t('The screening track %label has been updated.', $message_args)); - $this->logger('ai_screening_project_track')->notice('The screening track %label has been updated.', $logger_args); + $this->messenger()->addStatus($this->t('The project track %label has been updated.', $message_args)); + $this->logger('ai_screening_project_track')->notice('The project track %label has been updated.', $logger_args); break; default: diff --git a/web/modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php b/web/modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php index bcd307d8..5853f323 100644 --- a/web/modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php +++ b/web/modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php @@ -14,7 +14,7 @@ use Drupal\ai_screening_project_track\Helper\ProjectTrackTypeHelper; /** - * Configure AI Screening project track settings for this site. + * Configure AI Project project track settings for this site. */ final class ThresholdsForm extends FormBase { use AutowireTrait; diff --git a/web/modules/custom/ai_screening_project_track/src/Helper/FormHelper.php b/web/modules/custom/ai_screening_project_track/src/Helper/FormHelper.php index f3bec87f..3732556a 100644 --- a/web/modules/custom/ai_screening_project_track/src/Helper/FormHelper.php +++ b/web/modules/custom/ai_screening_project_track/src/Helper/FormHelper.php @@ -44,7 +44,7 @@ public function getWebform(FormStateInterface $formState): ?WebformInterface { * @throws \Drupal\ai_screening_project_track\Exception\InvalidValueException */ public static function getIntegers(string $value, string $separator = ','): array { - $values = array_map('trim', str_getcsv($value, $separator)); + $values = array_map('trim', str_getcsv($value, $separator, escape: '')); $nonIntegers = array_filter($values, static fn(string $v) => (string) intval($v) !== $v); if (!empty($nonIntegers)) { diff --git a/web/modules/custom/ai_screening_project_track/src/Helper/ProjectTrackHelper.php b/web/modules/custom/ai_screening_project_track/src/Helper/ProjectTrackHelper.php index 6eaf7150..a53c087b 100644 --- a/web/modules/custom/ai_screening_project_track/src/Helper/ProjectTrackHelper.php +++ b/web/modules/custom/ai_screening_project_track/src/Helper/ProjectTrackHelper.php @@ -366,10 +366,10 @@ private function getActiveQuadrant(array $sums, Evaluation $evaluation): string break; case Evaluation::UNDECIDED: - if ($sums['0']['sum'] > $sums[0]['approvedThreshold']) { + if (($sums['0']['sum'] ?? 0) > ($sums[0]['approvedThreshold'] ?? 0)) { $activeQuadrant = 4; } - if ($sums['1']['sum'] > $sums[1]['approvedThreshold']) { + if (($sums['1']['sum'] ?? 0) > ($sums[1]['approvedThreshold'] ?? 0)) { $activeQuadrant = 2; } break; diff --git a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php index b593d8e8..feed4699 100644 --- a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php +++ b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php @@ -11,7 +11,7 @@ * id = "ai_screening_static_select", * label = @Translation("Static select field"), * description = @Translation("Select field with four static options"), - * category = @Translation("AI Screening"), + * category = @Translation("AI Project"), * ) */ class StaticSelect extends WebformElementBase { diff --git a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php index ffc1a765..8e107945 100644 --- a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php +++ b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php @@ -16,7 +16,7 @@ * id = "ai_screening_weighted_radios", * label = @Translation("Weighted radios"), * description = @Translation("Radios with an (x, y) weight."), - * category = @Translation("AI Screening"), + * category = @Translation("AI Project"), * ) */ final class WeightedRadios extends Radios { diff --git a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php index 1454f43a..dd1be8cd 100644 --- a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php +++ b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php @@ -11,7 +11,7 @@ * id = "ai_screening_weighted_textarea", * label = @Translation("Weighted textarea"), * description = @Translation("Tecfield with an (x, y) weight."), - * category = @Translation("AI Screening"), + * category = @Translation("AI Project"), * ) */ class WeightedTextarea extends Textarea { diff --git a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php index 0a8eea8c..165760c6 100644 --- a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php +++ b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php @@ -11,7 +11,7 @@ * id = "ai_screening_weighted_textfield", * label = @Translation("Weighted textfield"), * description = @Translation("Texfield with an (x, y) weight."), - * category = @Translation("AI Screening"), + * category = @Translation("AI Project"), * ) */ class WeightedTextfield extends TextField { diff --git a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php index fe5a23c9..6680d892 100644 --- a/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php +++ b/web/modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php @@ -26,7 +26,7 @@ * id = "ai_screening_yes_no_stop", * label = @Translation("Yes/no stop"), * description = @Translation("Yes/no question."), - * category = @Translation("AI Screening"), + * category = @Translation("AI Project"), * ) */ final class YesNoStop extends OptionsBase { diff --git a/web/modules/custom/ai_screening_project_track/translations/ai_screening_project_track.da.po b/web/modules/custom/ai_screening_project_track/translations/ai_screening_project_track.da.po index 21a53ee3..b122c019 100644 --- a/web/modules/custom/ai_screening_project_track/translations/ai_screening_project_track.da.po +++ b/web/modules/custom/ai_screening_project_track/translations/ai_screening_project_track.da.po @@ -29,33 +29,38 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "POT-Creation-Date: 2026-01-28 10:06+0100\n" -"PO-Revision-Date: 2026-01-28 10:06+0100\n" +"PO-Revision-Date: 2026-02-24 10:32+0100\n" "Last-Translator: NAME \n" "Language-Team: Danish \n" +"Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.8\n" -#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:15 modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:149 -msgid "Screening track configuration" -msgstr "Screeningssporskonfiguration" +#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:15 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:149 +msgid "Project track configuration" +msgstr "Projectssporskonfiguration" -#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:16 modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:150 +#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:16 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:150 msgid "Configuration for the track." msgstr "Konfiguration for sporet." -#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:30 modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:121 -msgid "Screening track evaluation overridden" -msgstr "Screeningssporsevaluering tilsidesat" +#: modules/custom/ai_screening_project_track/ai_screening_project_track.install:30 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:121 +msgid "Project track evaluation overridden" +msgstr "Projectssporsevaluering tilsidesat" #: modules/custom/ai_screening_project_track/ai_screening_project_track.install:31 -msgid "The overridden evaluation of the screening track" -msgstr "Den tilsidesatte evaluering af screeningssporet" +msgid "The overridden evaluation of the project track" +msgstr "Den tilsidesatte evaluering af projektsporet" #: modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml:0 -msgid "AI Screening project track" -msgstr "" +msgid "AI Project project track" +msgstr "AI-screening-projektspor" #: modules/custom/ai_screening_project_track/ai_screening_project_track.info.yml:0 msgid "Adds project track entity and functionality" @@ -73,11 +78,13 @@ msgstr "Tærskelindstillinger" msgid "Not started" msgstr "Ikke påbegyndt" -#: modules/custom/ai_screening_project_track/src/Evaluation.php:22 modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php:93 +#: modules/custom/ai_screening_project_track/src/Evaluation.php:22 +#: modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php:93 msgid "Approved" msgstr "Godkendt" -#: modules/custom/ai_screening_project_track/src/Evaluation.php:23 modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php:101 +#: modules/custom/ai_screening_project_track/src/Evaluation.php:23 +#: modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php:101 msgid "Undecided" msgstr "Uafklaret" @@ -85,15 +92,18 @@ msgstr "Uafklaret" msgid "Refused" msgstr "Afvist" -#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:19 modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:19 +#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:19 +#: modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:19 msgid "ID" msgstr "ID" -#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:20 modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:23 +#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:20 +#: modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:23 msgid "Created" msgstr "Oprettet" -#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:21 modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:24 +#: modules/custom/ai_screening_project_track/src/ProjectTrackListBuilder.php:21 +#: modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:24 msgid "Updated" msgstr "Opdateret" @@ -101,7 +111,8 @@ msgstr "Opdateret" msgid "Label" msgstr "Etiket" -#: modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:21 modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:92 +#: modules/custom/ai_screening_project_track/src/ProjectTrackToolListBuilder.php:21 +#: modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:92 msgid "Status" msgstr "Status" @@ -142,28 +153,28 @@ msgid "Type" msgstr "Type" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:104 -msgid "The type of the screening track, as defined by taxonommy term" -msgstr "Typen af screeningsspor, som defineret af taxonomibegreb" +msgid "The type of the project track, as defined by taxonommy term" +msgstr "Typen af projektspor, som defineret af taxonomibegreb" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:109 -msgid "Screening track title" -msgstr "Screeningssporets titel" +msgid "Project track title" +msgstr "Projektsporets titel" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:110 msgid "The title of the project track." msgstr "" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:113 -msgid "Screening track description" -msgstr "Screeningssporets beskrivelse" +msgid "Project track description" +msgstr "Projectssporets beskrivelse" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:114 msgid "A description of the project track." msgstr "" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:117 -msgid "Screening track evaluation" -msgstr "Screeningssporets evaluering" +msgid "Project track evaluation" +msgstr "Projectssporets evaluering" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:118 msgid "The evaluation of the project track." @@ -174,68 +185,66 @@ msgid "The overridden evaluation of the project track." msgstr "" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:125 -msgid "Screening track note" -msgstr "Screeningssporets note" +msgid "Project track note" +msgstr "Projectssporets note" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:126 msgid "A note related to project track evaluation." msgstr "" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:129 -msgid "Screening track status" -msgstr "Screeningssporets status" +msgid "Project track status" +msgstr "Projektsporets status" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:130 -msgid "The status of the screening track." -msgstr "Statusen på screeningssporet." +msgid "The status of the project track." +msgstr "Statusen på projektsporet." -#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:133 modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:112 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:133 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:112 msgid "Authored on" msgstr "Skrevet den" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:134 -msgid "The time that the screening track was created." -msgstr "Tidspunktet hvor screeningssporet blev oprettet." +msgid "The time that the project track was created." +msgstr "Tidspunktet hvor projektsporet blev oprettet." -#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:137 modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:116 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:137 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:116 msgid "Changed" msgstr "Ændret" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:138 -msgid "The time that the screening track was last edited." -msgstr "Tidspunktet hvor screeningssporet sidst blev redigeret." +msgid "The time that the project track was last edited." +msgstr "Tidspunktet hvor projektsporet sidst blev redigeret." #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:141 -msgid "Screening" -msgstr "Screening" +msgid "Project" +msgstr "Projekt" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:146 msgid "Delta" msgstr "Delta" -#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:18 +#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:91 msgid "Project track" -msgstr "" +msgstr "Projektspor" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:18 msgid "Project tracks" -msgstr "" +msgstr "Projektspor" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:18 msgid "project track" -msgstr "" +msgstr "projektspor" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrack.php:18 msgid "project tracks" -msgstr "" - -#: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:91 -msgid "Screening track" -msgstr "Screeningsspor" +msgstr "projektspor" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:95 -msgid "Screening track tool status" -msgstr "Status for screeningssporsværktøj" +msgid "Project track tool status" +msgstr "Status for projektsporsværktøj" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:96 msgid "The status of the project track tool." @@ -266,12 +275,12 @@ msgid "The data matching the tool configuration" msgstr "Data der matcher værktøjets konfiguration" #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:113 -msgid "The time that the screening track tool was created." -msgstr "Tidspunktet hvor screeningssporsværktøjet blev oprettet." +msgid "The time that the project track tool was created." +msgstr "Tidspunktet hvor projektsporsværktøjet blev oprettet." #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:117 -msgid "The time that the screening track tool was last edited." -msgstr "Tidspunktet hvor screeningssporsværktøjet sidst blev redigeret." +msgid "The time that the project track tool was last edited." +msgstr "Tidspunktet hvor projektsporsværktøjet sidst blev redigeret." #: modules/custom/ai_screening_project_track/src/Entity/ProjectTrackTool.php:120 msgid "Dalte" @@ -305,17 +314,18 @@ msgstr "Noter" msgid "Cancel" msgstr "Annullér" -#: modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:144 modules/custom/ai_screening_project_track/src/Form/ProjectTrackToolForm.php:24 +#: modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:144 +#: modules/custom/ai_screening_project_track/src/Form/ProjectTrackToolForm.php:24 msgid "View" msgstr "Vis" #: modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:149;150 -msgid "New screening track %label has been created." -msgstr "Nyt screeningsspor %label er blevet oprettet." +msgid "New project track %label has been created." +msgstr "Nyt projektspor %label er blevet oprettet." #: modules/custom/ai_screening_project_track/src/Form/ProjectTrackForm.php:154;155 -msgid "The screening track %label has been updated." -msgstr "Screeningssporet %label er blevet opdateret." +msgid "The project track %label has been updated." +msgstr "Projectssporet %label er blevet opdateret." #: modules/custom/ai_screening_project_track/src/Form/ProjectTrackToolForm.php:29;30 msgid "New tool %label has been created." @@ -347,9 +357,7 @@ msgstr "Gem" #: modules/custom/ai_screening_project_track/src/Form/ThresholdsForm.php:171 msgid "\"Undecided\" threshold can not be greater than \"Approved\" threshold." -msgstr "" -"\"Uafklaret\"-tærsklen kan ikke være større end " -"\"Godkendt\"-tærsklen." +msgstr "\"Uafklaret\"-tærsklen kan ikke være større end \"Godkendt\"-tærsklen." #: modules/custom/ai_screening_project_track/src/Helper/ProjectTrackTypeHelper.php:129 msgid "The configuration option cannot be empty." @@ -367,9 +375,13 @@ msgstr "Statisk valgfelt" msgid "Select field with four static options" msgstr "Valgfelt med fire statiske muligheder" -#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php:7 modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php:12 modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php:7 modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php:7 modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php:19 -msgid "AI Screening" -msgstr "AI Screening" +#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/StaticSelect.php:7 +#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php:12 +#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextarea.php:7 +#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedTextfield.php:7 +#: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php:19 +msgid "AI Project" +msgstr "AI Project" #: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedElementTrait.php:37 msgid "Question weight" @@ -389,7 +401,8 @@ msgstr "Angiv venligst vægten." #: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/WeightedRadios.php:63 msgid "Each option must be an integer (%dimensions)" -msgid_plural "Each option must be %cardinality integers (%dimensions) separated by comma" +msgid_plural "" +"Each option must be %cardinality integers (%dimensions) separated by comma" msgstr[0] "" msgstr[1] "" @@ -478,4 +491,3 @@ msgstr "Ja/nej stop" #: modules/custom/ai_screening_project_track/src/Plugin/WebformElement/YesNoStop.php:19 msgid "Yes/no question." msgstr "Ja/nej-spørgsmål." - diff --git a/web/modules/custom/ai_screening_reports/ai_screening_reports.info.yml b/web/modules/custom/ai_screening_reports/ai_screening_reports.info.yml index f4d71e59..026dd6b0 100644 --- a/web/modules/custom/ai_screening_reports/ai_screening_reports.info.yml +++ b/web/modules/custom/ai_screening_reports/ai_screening_reports.info.yml @@ -1,6 +1,6 @@ name: "AI screening reports" type: module -description: "Reports for AI Screening" +description: "Reports for AI Project" package: Custom core_version_requirement: ^11 dependencies: diff --git a/web/modules/custom/ai_screening_reports/ai_screening_reports.routing.yml b/web/modules/custom/ai_screening_reports/ai_screening_reports.routing.yml index 682d50b3..0b921426 100644 --- a/web/modules/custom/ai_screening_reports/ai_screening_reports.routing.yml +++ b/web/modules/custom/ai_screening_reports/ai_screening_reports.routing.yml @@ -9,7 +9,7 @@ ai_screening_reports.create_report: ai_screening_reports.project: path: "/reports/project/{node}" defaults: - _title: "Screening" + _title: "Project" _controller: '\Drupal\ai_screening_reports\Controller\AiScreeningReportsController' requirements: _permission: "access content" @@ -23,7 +23,7 @@ ai_screening_reports.project: ai_screening_reports.project_track: path: "/reports/project_tracks" defaults: - _title: "Screening" + _title: "Project" _controller: '\Drupal\ai_screening_reports\Controller\AiScreeningReportsController::projectTrack' requirements: _permission: "access content" diff --git a/web/modules/custom/ai_screening_reports/src/Form/CreateReport.php b/web/modules/custom/ai_screening_reports/src/Form/CreateReport.php index c418d0f6..f2010f75 100644 --- a/web/modules/custom/ai_screening_reports/src/Form/CreateReport.php +++ b/web/modules/custom/ai_screening_reports/src/Form/CreateReport.php @@ -51,7 +51,7 @@ public function buildForm(array $form, FormStateInterface $form_state): array { $form['project'] = [ '#type' => 'select', '#multiple' => TRUE, - '#title' => $this->t('Select screening'), + '#title' => $this->t('Select project'), '#options' => $options, '#attributes' => ['class' => ['use-choicesjs-plugin bg-primary text-primary border border-primary rounded-md py-2 px-3 my-1 w-full']], ]; diff --git a/web/modules/custom/ai_screening_reports/translations/ai_screening_reports.da.po b/web/modules/custom/ai_screening_reports/translations/ai_screening_reports.da.po index a2eec757..37e1b38c 100644 --- a/web/modules/custom/ai_screening_reports/translations/ai_screening_reports.da.po +++ b/web/modules/custom/ai_screening_reports/translations/ai_screening_reports.da.po @@ -23,11 +23,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: modules/custom/ai_screening_reports/ai_screening_reports.info.yml:0 -msgid "AI screening reports" -msgstr "AI-screeningsrapporter" +msgid "AI project reports" +msgstr "AI-projektrapporter" #: modules/custom/ai_screening_reports/ai_screening_reports.info.yml:0 -msgid "Reports for AI Screening" +msgid "Reports for AI Project" msgstr "Rapporter til AI-screening" #: modules/custom/ai_screening_reports/ai_screening_reports.info.yml:0 @@ -47,8 +47,8 @@ msgid "Create report" msgstr "Opret rapport" #: modules/custom/ai_screening_reports/ai_screening_reports.routing.yml:0;0 -msgid "Screening" -msgstr "Screening" +msgid "Project" +msgstr "Projekt" #: modules/custom/ai_screening_reports/src/Controller/AiScreeningReportsController.php:137 msgid "A maximum of @max tracks can be displayed." @@ -59,10 +59,9 @@ msgid "Incorrect url parameters." msgstr "Forkerte URL-parametre." #: modules/custom/ai_screening_reports/src/Form/CreateReport.php:54 -msgid "Select screening" -msgstr "Vælg screening" +msgid "Select project" +msgstr "Vælg projekt" #: modules/custom/ai_screening_reports/src/Form/CreateReport.php:63 msgid "Fetch report" msgstr "Hent rapport" - diff --git a/web/themes/custom/itkdev/itkdev_project_theme/templates/components/new-project-button.html.twig b/web/themes/custom/itkdev/itkdev_project_theme/templates/components/new-project-button.html.twig index 8b5a92c2..e722093f 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/templates/components/new-project-button.html.twig +++ b/web/themes/custom/itkdev/itkdev_project_theme/templates/components/new-project-button.html.twig @@ -3,6 +3,6 @@ - {{ 'Create new screening'|t }} + {{ 'Create new project'|t }} {% endif %} diff --git a/web/themes/custom/itkdev/itkdev_project_theme/templates/form/form--ai-screening-project-track-thresholds.html.twig b/web/themes/custom/itkdev/itkdev_project_theme/templates/form/form--ai-screening-project-track-thresholds.html.twig index 81c03081..d085bfb0 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/templates/form/form--ai-screening-project-track-thresholds.html.twig +++ b/web/themes/custom/itkdev/itkdev_project_theme/templates/form/form--ai-screening-project-track-thresholds.html.twig @@ -21,7 +21,7 @@ {% block content %}
- {{ 'Define thresholds for all screenings. This is used by the system to make a suggested evaluation by measuring all the combined answers of each project track against the corresponding thresholds.'|t }} + {{ 'Define thresholds for all projects. This is used by the system to make a suggested evaluation by measuring all the combined answers of each project track against the corresponding thresholds.'|t }}
diff --git a/web/themes/custom/itkdev/itkdev_project_theme/templates/form/webform-element-base-html--text-format.html.twig b/web/themes/custom/itkdev/itkdev_project_theme/templates/form/webform-element-base-html--text-format.html.twig index ad3e30b1..f0aceb9b 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/templates/form/webform-element-base-html--text-format.html.twig +++ b/web/themes/custom/itkdev/itkdev_project_theme/templates/form/webform-element-base-html--text-format.html.twig @@ -27,7 +27,7 @@

{{ title }}

{% if element['#help'] %} -
{{ element['#help']|striptags }}
+
{{ element['#help']|html2text }}
{% endif %} {% set displayedValue = (value['#markup'] is same as ('{Empty}') or value['#string'] is same as ('{Empty}')) ? '{Empty}'|t : value %}
diff --git a/web/themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig b/web/themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig index 25dc54e9..bb12a7e3 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig +++ b/web/themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig @@ -18,7 +18,7 @@ {% trans %} Project that complies to all demands for use {% plural data.stats.approvedCount %} - Screenings that comply to all demands for use + Projects that comply to all demands for use {% endtrans %}
@@ -28,7 +28,7 @@ {% trans %} Project that complies to some demands for use {% plural data.stats.approvedCount %} - Screenings that comply to some demands for use + Projects that comply to some demands for use {% endtrans %}
@@ -38,7 +38,7 @@ {% trans %} Project that does not comply to the demands for use {% plural data.stats.approvedCount %} - Screenings that do not comply to the demands for use + Projects that do not comply to the demands for use {% endtrans %}
diff --git a/web/themes/custom/itkdev/itkdev_project_theme/templates/views/views-view-table--front.html.twig b/web/themes/custom/itkdev/itkdev_project_theme/templates/views/views-view-table--front.html.twig index 960bcc54..20871c95 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/templates/views/views-view-table--front.html.twig +++ b/web/themes/custom/itkdev/itkdev_project_theme/templates/views/views-view-table--front.html.twig @@ -48,7 +48,7 @@
{% if user.hasPermission('create project content') %} - {{ 'Create new screening'|t }} + {{ 'Create new project'|t }} {% endif %}
{{ 'Latest'|t }}
@@ -134,7 +134,7 @@
diff --git a/web/themes/custom/itkdev/itkdev_project_theme/translations/itkdev_project_theme.da.po b/web/themes/custom/itkdev/itkdev_project_theme/translations/itkdev_project_theme.da.po index 7f4e1505..ec6ee7e7 100644 --- a/web/themes/custom/itkdev/itkdev_project_theme/translations/itkdev_project_theme.da.po +++ b/web/themes/custom/itkdev/itkdev_project_theme/translations/itkdev_project_theme.da.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2026-01-28 10:06+0100\n" -"PO-Revision-Date: 2026-01-28 10:06+0100\n" +"POT-Creation-Date: 2026-02-17 11:03+0100\n" +"PO-Revision-Date: 2026-02-17 11:03+0100\n" "Last-Translator: NAME \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" @@ -22,11 +22,11 @@ msgstr "" #: themes/custom/itkdev/itkdev_project_theme/itkdev_project_theme.info.yml:0 msgid "ITK-dev Project Theme" -msgstr "ITK-dev Screeningstema" +msgstr "ITK-dev Projectstema" #: themes/custom/itkdev/itkdev_project_theme/itkdev_project_theme.info.yml:0 msgid "Project theme" -msgstr "Screeningstema" +msgstr "Projekttema" #: themes/custom/itkdev/itkdev_project_theme/itkdev_project_theme.info.yml:0 msgid "itkdev" @@ -66,19 +66,21 @@ msgstr "Tryk for at vælge" #: themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig:18 msgid "Project that complies to all demands for use" -msgid_plural "Screenings that comply to all demands for use" -msgstr[0] "" -msgstr[1] "" +msgid_plural "Projects that comply to all demands for use" +msgstr[0] "Project der opfylder alle krav til brug" +msgstr[1] "Projekter der opfylder alle krav til brug" #: themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig:28 msgid "Project that complies to some demands for use" -msgid_plural "Screenings that comply to some demands for use" -msgstr[0] "" -msgstr[1] "" +msgid_plural "Projects that comply to some demands for use" +msgstr[0] "Project der opfylder nogle krav til brug" +msgstr[1] "Projekter der opfylder nogle krav til brug" #: themes/custom/itkdev/itkdev_project_theme/templates/stats-top-block.html.twig:38 msgid "Project that does not comply to the demands for use" -msgid_plural "Screenings that do not comply to the demands for use" -msgstr[0] "" -msgstr[1] "" +msgid_plural "Projects that do not comply to the demands for use" +msgstr[0] "Project der ikke opfylder kravene til brug" +msgstr[1] "Projekter der ikke opfylder kravene til brug" +msgid "Department" +msgstr "Magistratsafdeling"