diff --git a/docs/docs/provider_schema.md b/docs/docs/provider_schema.md
index 27526c931ed308e163d79a1edb1d226d3d1afd95..29dc73ad5b1e64adc5ae28d787f9adb9a6794bbb 100644
--- a/docs/docs/provider_schema.md
+++ b/docs/docs/provider_schema.md
@@ -204,42 +204,49 @@ In a later stage of development, we introduced comprehensive internationalizatio
 
 You have the option to retain the existing schema, translate specific properties, or fully translate the entire schema. All of these variants are feasible and supported within the system's configuration. This flexibility ensures that you can adapt the schema to your language and localization requirements, providing a tailored experience for your users.
 
-You can define the i18n fields using the suffix "-i18n". For example:
+You can define the i18n fields using the suffix "I18n". For example:
 
 ```json
- {
+{
   "id": "moodle-0",
-  "name": "Moodle", # default value
-  "name-i18n": {
-    "enUS": "Python Programming Course",
-    "frFr": "Cours de programmation Python"
+  "name": "Moodle",
+  "nameI18n": {
+    "de": "Python Programmier Kurs",
+    "en": "Python Programming Course",
+    "fr": "Cours de programmation Python"
   },
-  "description": "Open-source learning management system", # default value
-  "description-i18n": {
-    "enUS": "Python Programming Course"
+  "description": "Open-source learning management system",
+  "descriptionI18n": {
+    "en": "Python Programming Course"
   },
   "groups": [
     {
       "id": "default_group",
-      "label": "Default group", # default value
-      "label-i18n": {
-        "enUS": "Python Programming Course"
+      "label": "Default group",
+      "labelI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course"
       },
-      "description": "default", # default value
-      "description-i18n": {
-        "enUS": "Python Programming Course"
+      "isDefault": true,
+      "description": "default",
+      "descriptionI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course"
       },
       "showVerbDetails": true,
-      "purposeOfCollection": "Lorem Ipsum", # default value
-      "purposeOfCollection-i18n": {
-        "enUS": "Python Programming Course"
+      "purposeOfCollection": "Lorem Ipsum",
+      "purposeOfCollectionI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course"
       },
       "verbs": [
-        ...
+     ...
       ]
     }
-  ]
- }
+  ],
+  "essentialVerbs": []
+}
+
 ```   
 
 ## Useful online tools
diff --git a/src/consents/serializers.py b/src/consents/serializers.py
index c2bc242f9b8c2d075ec66823593bb407cbda94b8..ca43afd93ff37fad117d3d6628bc232e676c90b0 100644
--- a/src/consents/serializers.py
+++ b/src/consents/serializers.py
@@ -13,7 +13,9 @@ class ProviderSchemaSerializer(serializers.ModelSerializer):
         return {
             "id": obj.provider.definition_id,
             "name": obj.provider.name,
+            "nameI18n": obj.provider.nameI18n,
             "description": obj.provider.description,
+            "descriptionI18n": obj.provider.descriptionI18n,
             "groups": obj.groups,
             "essential_verbs": obj.essential_verbs,
         }
@@ -33,7 +35,7 @@ class ProvidersSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Provider
-        fields = ["id", "name", "versions"]
+        fields = ["id", "name", "versions","nameI18n","descriptionI18n"]
 
 
 class UserVerbSerializer(serializers.Serializer):
diff --git a/src/consents/views.py b/src/consents/views.py
index fa87f584830208719c783263c6f2b01c11d7065f..3e892157743085bce75dcd4bddf70561e3244f74 100644
--- a/src/consents/views.py
+++ b/src/consents/views.py
@@ -34,6 +34,7 @@ def render_provider_consent(provider_schema, supersedes=None):
     return {
         "id": provider_schema.provider.id,
         "name": provider_schema.provider.name,
+        "nameI18n": provider_schema.provider.nameI18n,
         "superseded_by": provider_schema.superseded_by.id
         if provider_schema.superseded_by
         else None,
@@ -214,6 +215,8 @@ class CreateProviderConsentView(APIView):
                     definition_id=provider_schema["id"]
                 )  # maybe TODO: match via name, not definition_id, iff definition_id can change each definition
                 providerModel.description = provider_schema["description"]
+                providerModel.descriptionI18n = provider_schema["descriptionI18n"]
+                providerModel.nameI18n = provider_schema["nameI18n"]
                 providerModel.save()
         except OSError:
             return JsonResponse(
@@ -240,6 +243,8 @@ class CreateProviderConsentView(APIView):
                 definition_id=provider_schema["id"],
                 name=provider_schema["name"],
                 description=provider_schema["description"],
+                descriptionI18n = provider_schema["descriptionI18n"],
+                nameI18n = provider_schema["nameI18n"]
             )
             auth_key = secrets.token_hex(
                 32
@@ -265,6 +270,8 @@ class CreateProviderConsentView(APIView):
                 provider = precedingProviderSchema.provider
                 provider.description = provider_schema["description"]
                 provider.name=provider_schema["name"]
+                provider.descriptionI18n = provider_schema["descriptionI18n"]
+                provider.nameI18n = provider_schema["nameI18n"]
                 provider.save()
 
         except ObjectDoesNotExist:
diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json
index 49bffbb548501bef4b7dc665aaa9db13af3bde27..16d38d245c767d5bbba7bfb524ddca0b0b427d39 100644
--- a/src/frontend/package-lock.json
+++ b/src/frontend/package-lock.json
@@ -19,6 +19,7 @@
         "@angular/platform-browser": "^14.2.0",
         "@angular/platform-browser-dynamic": "^14.2.0",
         "@angular/router": "^14.2.0",
+        "flag-icons": "^6.11.2",
         "jwt-decode": "^3.1.2",
         "ngx-toastr": "^15.2.1",
         "rxjs": "~7.5.0",
@@ -5973,6 +5974,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/flag-icons": {
+      "version": "6.11.2",
+      "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-6.11.2.tgz",
+      "integrity": "sha512-xEVPdyDkL28GG0H+x7OP89uFXDgCduNX5DEJ9ZJuxpg3dnDCioBoHfhl4kjC4ixnOnVh7ajL/PNFg7my8qBxtQ=="
+    },
     "node_modules/flatted": {
       "version": "3.2.7",
       "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
diff --git a/src/frontend/package.json b/src/frontend/package.json
index cbf2d04f5e9975955a9c1872ea20ccfb9d2ad9ef..484132667c2f58ecce5444597e80506be8a39d30 100644
--- a/src/frontend/package.json
+++ b/src/frontend/package.json
@@ -3,7 +3,7 @@
   "version": "0.0.0",
   "scripts": {
     "ng": "ng",
-    "start": "ng serve",
+    "start": "ng serve --port 8001 --host 0.0.0.0 --disable-host-check",
     "build": "ng build --localize --base-href=/app",
     "watch": "ng build --watch --configuration development",
     "test": "ng test"
@@ -21,6 +21,7 @@
     "@angular/platform-browser": "^14.2.0",
     "@angular/platform-browser-dynamic": "^14.2.0",
     "@angular/router": "^14.2.0",
+    "flag-icons": "^6.11.2",
     "jwt-decode": "^3.1.2",
     "ngx-toastr": "^15.2.1",
     "rxjs": "~7.5.0",
diff --git a/src/frontend/src/app/app.component.scss b/src/frontend/src/app/app.component.scss
index 7edb82723438cf9ce540065c7b6185d4ccdf5b09..f98668ee58569533587a1503fee6f00acba57921 100644
--- a/src/frontend/src/app/app.component.scss
+++ b/src/frontend/src/app/app.component.scss
@@ -4,3 +4,5 @@
         min-height: calc(100vh - 128px);
     }
 }
+
+@import "~flag-icons/css/flag-icons.min.css";
\ No newline at end of file
diff --git a/src/frontend/src/app/consent-management/consentDeclaration.ts b/src/frontend/src/app/consent-management/consentDeclaration.ts
index 369df5c1da8128a0eb1d3184c8a491bdad991367..378c8d116946b118f0f50a578937cbbb43d59e74 100644
--- a/src/frontend/src/app/consent-management/consentDeclaration.ts
+++ b/src/frontend/src/app/consent-management/consentDeclaration.ts
@@ -32,8 +32,11 @@ export interface XApiVerbConsented extends XApiVerbSchema {
 export interface ConsentGroupSchema {
     id: string
     label: string
-    description: string
-    purposeOfCollection: string
+    labelI18n: Record<string,string>,
+    description: string,
+    descriptionI18n:  Record<string,string>,
+    purposeOfCollection: string,
+    purposeOfCollectionI18n:  Record<string,string>,
     showVerbDetails: boolean
     verbs: XApiVerbSchema[]
     isDefault: boolean
@@ -46,8 +49,11 @@ export const instanceOfXApiVerbConsented = (object: any): object is XApiObjectCo
 export interface ConsentGroupConsented {
     id: string
     label: string
+    labelI18n: Record<string,string>,
     description: string
+    descriptionI18n:  Record<string,string>,
     purposeOfCollection: string
+    purposeOfCollectionI18n:  Record<string,string>,
     showVerbDetails: boolean
     verbs: XApiVerbConsented[]
     isDefault: boolean
diff --git a/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.html b/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.html
index 6f224ee44dc8c10508583b46bc1297eb7281778f..1495610e43636797c1f9f916bb16cffa19c6bb1b 100644
--- a/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.html
+++ b/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.html
@@ -8,10 +8,15 @@
                 (click)="$event.stopPropagation()"
                 (change)="toggleGroup(consentGroup, $event)"
                 [checked]="isGroupActive(consentGroup)"></mat-slide-toggle>
-            {{ consentGroup.label }}
+            {{ consentGroup.labelI18n && consentGroup.labelI18n[language] ? consentGroup.labelI18n[language] : consentGroup.label }}
+        </mat-card-title>
+        <mat-card-title
+        *ngIf="consentGroup.isDefault"
+        [ngClass]="{ inactive: !isGroupActive(consentGroup) }">
+             {{ consentGroup.labelI18n && consentGroup.labelI18n[language] ? consentGroup.labelI18n[language] : consentGroup.label }}
         </mat-card-title>
         <div [ngClass]="{ inactive: !consentGroup.isDefault && !isGroupActive(consentGroup) }">
-            <p>{{ consentGroup.description }}</p>
+            <p>{{ consentGroup.descriptionI18n && consentGroup.descriptionI18n[language]  ? consentGroup.descriptionI18n[language] :  consentGroup.description }}</p>
         </div>
 
         <mat-accordion
@@ -43,7 +48,7 @@
                                         (change)="toggleVerb(verb.id, $event)"
                                         [checked]="verb.consented"
                                         [disabled]="!consentGroup.isDefault"></mat-slide-toggle>
-                                    <div>{{ verb.label }}</div>
+                                    <div>{{ verb.labelI18n && verb.labelI18n[language]  ? verb.labelI18n[language] :  verb.label }}</div>
                                     <mat-icon [matTooltip]="verb.description" class="hint-icon"
                                         >info_outlined</mat-icon
                                     >
@@ -56,7 +61,7 @@
                                 </div>
                             </mat-panel-title>
                             <mat-panel-description>
-                                {{ verb.description }}
+                                {{ verb.descriptionI18n && verb.descriptionI18n[language]  ? verb.descriptionI18n[language] :  verb.description  }}
                             </mat-panel-description>
                         </mat-expansion-panel-header>
 
@@ -82,7 +87,9 @@
                                             matTooltipShowDelay="250"
                                             i18n-matTooltip="Previous setting @@previousSetting"
                                             disabled="true"></mat-slide-toggle>
-                                        <div>{{ object.label }}</div>
+                                        <div>
+                                            {{ object.labelI18n && object.labelI18n[language]  ? object.labelI18n[language] :  object.label  }}
+                                        </div>
                                         <mat-icon
                                             class="delete-icon"
                                             *ngIf="deleteable"
@@ -110,7 +117,7 @@
                 i18n="Purpose of Collection | Header @@purposeOfCollection">
                 Why would we like to collect these data?
             </div>
-            {{ consentGroup.purposeOfCollection }}
+            {{ consentGroup.purposeOfCollectionI18n && consentGroup.purposeOfCollectionI18n[language]  ? consentGroup.purposeOfCollectionI18n[language] :  consentGroup.purposeOfCollection }}
         </div>
     </mat-card>
     <div
diff --git a/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.ts b/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.ts
index 850222f2635a3a9e32c1d97482690fffa85bd121..09e6f0f5cb07f886db9f7006aa45e0fce505da19 100644
--- a/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.ts
+++ b/src/frontend/src/app/consent-management/provider-settings/provider-setting.component.ts
@@ -10,6 +10,7 @@ import { MatSlideToggleChange } from '@angular/material/slide-toggle'
 import { DeleteDialog } from 'src/app/dialogs/delete-dialog/delete-dialog'
 import { DataRemovalService } from 'src/app/data-removal.service'
 import { ToastrService } from 'ngx-toastr'
+import { LanguageService } from 'src/app/services/language.service'
 
 interface LookUp {
     [key: string]: boolean
@@ -21,6 +22,7 @@ interface LookUp {
     styleUrls: ['./provider-setting.component.scss']
 })
 export class PrivacySettingComponent implements OnInit {
+    language: string = "de"
     userConsentVerbsLookUp: LookUp = {}
     userConsentObjectLookUp: LookUp = {}
     @Input() consentDeclaration!: UserConsent
@@ -32,11 +34,13 @@ export class PrivacySettingComponent implements OnInit {
     constructor(
         private _dialog: MatDialog,
         private _removalService: DataRemovalService,
-        private _toasterService: ToastrService
+        private _toasterService: ToastrService,
+        private _languageService: LanguageService
     ) {}
 
     ngOnInit(): void {
         if (this.previousUserConsent) this.buildUserConsentVerbsLookUps()
+        this._languageService.language.subscribe((x) => (this.language = x))
     }
 
     buildUserConsentVerbsLookUps(): void {
diff --git a/src/frontend/src/app/consent-management/wizard/wizard.component.html b/src/frontend/src/app/consent-management/wizard/wizard.component.html
index 6077a49ffac4772eae07ec978a9e7e869364c763..51c4bc224283ec8b19433653bac4373e8d0f4fd2 100644
--- a/src/frontend/src/app/consent-management/wizard/wizard.component.html
+++ b/src/frontend/src/app/consent-management/wizard/wizard.component.html
@@ -1,4 +1,27 @@
-<h1 mat-dialog-title i18n="Consent Declaration | Wizard header @@consentDeclaration">
+
+<div class="float-r">
+<button mat-icon-button [matMenuTriggerFor]="menu" aria-label="Example icon-button with a menu">
+    <span [ngClass]="'fi fi-' + language + ' fis big'"></span>
+  </button>
+  <mat-menu #menu="matMenu">
+    <button mat-menu-item (click)="setLanguage('de')">
+        <span class="fi fi-de fis big mr"></span>
+      <span>Deutsch</span>
+    </button>
+    <button mat-menu-item (click)="setLanguage('gb')">
+        <span class="fi fi-gb fis big mr"></span>
+      <span>English</span>
+    </button>
+    <button mat-menu-item  (click)="setLanguage('nl')" >
+        <span class="fi fi-nl fis big mr"></span>
+      <span>Nederlends</span>
+    </button>
+    <button mat-menu-item  (click)="setLanguage('fr')">
+        <span class="fi fi-fr fis big mr"></span>
+      <span>Français</span>
+    </button>
+  </mat-menu></div>
+  <h1 mat-dialog-title i18n="Consent Declaration | Wizard header @@consentDeclaration">
     Consent Declaration
 </h1>
 <div mat-dialog-content>
@@ -13,18 +36,9 @@
             The provider has not yet uploaded a consent form.
         </h3>
 
-        <div i18n="Guide | Guide Text @@guideText">
-          <h2>Guide</h2>
-          <ul>
-            <li>Hint 1</li>
-            <li>Hint 2</li>
-            <li>Hint 3</li>
-          </ul>
-        </div>
-
         <div *ngIf="!isSummary && selectedProviderId">
             <div class="user-consents" *ngIf="wizardUserConsents[selectedProviderId] as userData">
-                <h2>{{ userData.provider.name }}</h2>
+                <h2>{{ userData.provider.nameI18n && userData.provider.nameI18n[language] ? userData.provider.nameI18n[language] : userData.provider.name }}</h2>
                 <div *ngIf="userData.acceptedProviderSchema as userAcceptedSchema">
                     <div *ngIf="userAcceptedSchema.superseded_by !== null">
                         <h3 i18n="Provider schema changed @@providerSchemaChanged">
@@ -73,7 +87,7 @@
             <div *ngFor="let providerId of providerIds">
                 <mat-card>
                     <mat-card-title>{{
-                        wizardUserConsents[providerId].provider.name
+                        wizardUserConsents[providerId].provider.nameI18n && wizardUserConsents[providerId].provider.nameI18n[language] ? wizardUserConsents[providerId].provider.nameI18n[language]  : wizardUserConsents[providerId].provider.name
                     }}</mat-card-title>
                     <div class="user-consents" *ngIf="wizardUserConsents[providerId] as userData">
                         <div *ngIf="userData.acceptedProviderSchema as userAcceptedSchema">
diff --git a/src/frontend/src/app/consent-management/wizard/wizard.component.scss b/src/frontend/src/app/consent-management/wizard/wizard.component.scss
index e0f4744ab5fe2ee24971eca8b52bcb723419bc0a..db33132f647b3dfd33392f816c2425ef32c1b89e 100644
--- a/src/frontend/src/app/consent-management/wizard/wizard.component.scss
+++ b/src/frontend/src/app/consent-management/wizard/wizard.component.scss
@@ -1,3 +1,5 @@
+@import "~flag-icons/css/flag-icons.min.css";
+
 .wizard {
     padding: 20px;
 }
@@ -32,3 +34,17 @@
 .action-btns-end {
     gap: 20px;
 }
+
+.big {
+    line-height: 1.5em;
+    font-size: 1.5em;
+}
+
+.float-r 
+{
+    float: right;
+}
+
+.mr {
+    margin-right: 0.5em;
+}
diff --git a/src/frontend/src/app/consent-management/wizard/wizard.component.ts b/src/frontend/src/app/consent-management/wizard/wizard.component.ts
index 4a434e7b02264d050f72a9ec8ea33d33e6dfec95..20e6c87e124934ba4ab22b6b017489ae62a559b4 100644
--- a/src/frontend/src/app/consent-management/wizard/wizard.component.ts
+++ b/src/frontend/src/app/consent-management/wizard/wizard.component.ts
@@ -11,6 +11,7 @@ import { ToastrService } from 'ngx-toastr'
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'
 import { AuthService } from 'src/app/services/auth.service'
 import { zip } from 'rxjs'
+import { LanguageService } from 'src/app/services/language.service'
 
 export const extractVerbs = (providerSchema: UserConsent, providerId: ProviderId): any[] => {
     return providerSchema.groups.flatMap((group) => {
@@ -39,10 +40,12 @@ export class WizardDialog {
         @Inject(MAT_DIALOG_DATA) public data: UserConsentStatus | null,
         private _apiService: ApiService,
         private _toasterService: ToastrService,
-        private _authService: AuthService
+        private _authService: AuthService,
+        private _languageService: LanguageService
     ) {}
 
     loading = false
+    language: string = "de"
     providers: Provider[] = []
     providerIds: number[] = []
     providerUserConsent: Record<
@@ -69,6 +72,7 @@ export class WizardDialog {
 
     ngOnInit(): void {
         this.loading = true
+        this._languageService.language.subscribe((x) => (this.language = x))
         this._apiService.getProviders().subscribe((providers) => {
             this.providers = providers
 
@@ -120,6 +124,10 @@ export class WizardDialog {
         })
     }
 
+    setLanguage(language: string) {
+        this._languageService.setLanguage(language)
+    }
+
     next(): void {
         if (this.selectedProviderId) {
             const idx = this.providerIds.indexOf(this.selectedProviderId)
diff --git a/src/frontend/src/app/navigation/footer/footer.component.html b/src/frontend/src/app/navigation/footer/footer.component.html
index a7e49c3fa2c934040b9572221dcadade2722cb31..bf318b28daef26afcbee49e2b8c1176e5c3f9746 100644
--- a/src/frontend/src/app/navigation/footer/footer.component.html
+++ b/src/frontend/src/app/navigation/footer/footer.component.html
@@ -1,5 +1,5 @@
 <mat-toolbar color="primary" class="footer-content">
-    <div>Ⓒ 2022</div>
+    <div>Ⓒ 2023</div>
     <div class="footer-links">
         <a routerLink="/legal-notice">Impressum</a>
         <a routerLink="/login">Administration</a>
diff --git a/src/frontend/src/app/navigation/header/header.component.html b/src/frontend/src/app/navigation/header/header.component.html
index cb2a0ef4b2affbcc6d15d771013a8670b3ae2aca..50feebe48751a08a3026a96bd5621775dbc70b57 100644
--- a/src/frontend/src/app/navigation/header/header.component.html
+++ b/src/frontend/src/app/navigation/header/header.component.html
@@ -58,10 +58,36 @@
         <mat-icon *ngIf="isDarkModeOn">light_mode</mat-icon>
         <mat-icon *ngIf="!isDarkModeOn">dark_mode</mat-icon>
     </button>
+
+    
+
     <a mat-raised-button *ngIf="!loggedIn" (click)="handleSSOClick()">
         Single Sign-On (SSO)
     </a>
 
+
+    <button mat-icon-button [matMenuTriggerFor]="menu" aria-label="Example icon-button with a menu">
+        <span [ngClass]="'fi fi-' + language + ' fis big'"></span>
+      </button>
+      <mat-menu #menu="matMenu">
+        <button mat-menu-item (click)="setLanguage('de')">
+            <span class="fi fi-de fis big mr"></span>
+          <span>Deutsch</span>
+        </button>
+        <button mat-menu-item (click)="setLanguage('gb')">
+            <span class="fi fi-gb fis big mr"></span>
+          <span>English</span>
+        </button>
+        <button mat-menu-item  (click)="setLanguage('nl')" >
+            <span class="fi fi-nl fis big mr"></span>
+          <span>Nederlends</span>
+        </button>
+        <button mat-menu-item  (click)="setLanguage('fr')">
+            <span class="fi fi-fr fis big mr"></span>
+          <span>Français</span>
+        </button>
+      </mat-menu>
+
     <div *ngIf="loggedIn" class="login-info">
         <button mat-stroked-button [matMenuTriggerFor]="menu">{{ loggedIn.email }}</button>
         <mat-menu #menu="matMenu" xPosition="before">
diff --git a/src/frontend/src/app/navigation/header/header.component.scss b/src/frontend/src/app/navigation/header/header.component.scss
index b9f6f3311fd7b8247e2cc28aa8953ebb554f93db..e4c7e725a30b9959ba3409a88765d0cb7b98b04d 100644
--- a/src/frontend/src/app/navigation/header/header.component.scss
+++ b/src/frontend/src/app/navigation/header/header.component.scss
@@ -1,4 +1,5 @@
 @import '@angular/material/theming';
+@import "~flag-icons/css/flag-icons.min.css";
 
 .header {
     position: fixed;
@@ -28,3 +29,12 @@
 .toolbar-spacer {
     flex: 1 1 auto;
 }
+
+.big {
+    line-height: 1.5em;
+    font-size: 1.5em;
+}
+
+.mr {
+    margin-right: 0.5em;
+}
\ No newline at end of file
diff --git a/src/frontend/src/app/navigation/header/header.component.ts b/src/frontend/src/app/navigation/header/header.component.ts
index 6e1f49e8e17e7812af9237b86d1ece61c64de056..b29600db24090eb493bfcea3fdf987acfd7d2437 100644
--- a/src/frontend/src/app/navigation/header/header.component.ts
+++ b/src/frontend/src/app/navigation/header/header.component.ts
@@ -1,6 +1,7 @@
 import { OverlayContainer } from '@angular/cdk/overlay'
 import { Component, OnInit } from '@angular/core'
 import { AuthService, Userinfo } from 'src/app/services/auth.service'
+import { LanguageService } from 'src/app/services/language.service'
 import { ThemeService } from 'src/app/services/theme.service'
 import { environment } from 'src/environments/environment'
 
@@ -12,14 +13,17 @@ import { environment } from 'src/environments/environment'
 export class HeaderComponent implements OnInit {
     loggedIn: Userinfo | null = null
     isDarkModeOn: boolean = false
+    language: string = "de"
 
     constructor(
         private _authService: AuthService,
         private _theme: ThemeService,
+        private _language: LanguageService,
         private _overlay: OverlayContainer
     ) {
         this._authService.loggedIn.subscribe((x) => (this.loggedIn = x))
         this._theme.darkModeSubject.subscribe((x) => (this.isDarkModeOn = x))
+        this._language.language.subscribe((x) => (this.language = x))
     }
 
     ngOnInit(): void {
@@ -36,6 +40,10 @@ export class HeaderComponent implements OnInit {
         else this._overlay.getContainerElement().classList.remove('dark-mode')
     }
 
+    setLanguage(language: string) {
+        this._language.setLanguage(language)
+    }
+
     /**
      * Redirect user to SSO page.
      */
diff --git a/src/frontend/src/app/services/api.service.ts b/src/frontend/src/app/services/api.service.ts
index 23975f7d578667a49d95a7a70021844e5750c502..21c8f63e99cda6688cf8cf4839d533f256b89715 100644
--- a/src/frontend/src/app/services/api.service.ts
+++ b/src/frontend/src/app/services/api.service.ts
@@ -18,8 +18,10 @@ export interface UserConsentResponse {
 
 export interface Provider {
     id: number
-    name: string
-    description: string
+    name: string,
+    nameI18n: Record<string, string>,
+    description: string,
+    descriptionI18n: Record<string,string>,
     createdAt: string
     versions: ProviderSchema[]
 }
diff --git a/src/frontend/src/app/services/language.service.ts b/src/frontend/src/app/services/language.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7ca3ffdd29c42c86ef197de0ad464a315f19b68d
--- /dev/null
+++ b/src/frontend/src/app/services/language.service.ts
@@ -0,0 +1,19 @@
+import { Injectable } from '@angular/core'
+import { Observable, BehaviorSubject } from 'rxjs'
+import { LocalStorageService } from './localstorage.service'
+
+@Injectable({
+    providedIn: 'root'
+})
+export class LanguageService {
+    public language: BehaviorSubject<string>
+
+    constructor(private _localStorage: LocalStorageService) {
+        this.language = new BehaviorSubject<string>("de")
+    }
+
+    setLanguage(language : string) {
+        this.language.next(language)
+        this._localStorage.set('languagePreference', language)
+    }
+}
diff --git a/src/frontend/src/environments/environment.ts b/src/frontend/src/environments/environment.ts
index 290cd2399a6aa0fa6f576792565e8d46ad0214a0..d189ecee395b9f33c806a5f76b819e337832f89c 100644
--- a/src/frontend/src/environments/environment.ts
+++ b/src/frontend/src/environments/environment.ts
@@ -4,7 +4,7 @@
 
 export const environment = {
   production: false,
-  apiUrl: 'http://vs-code-cloud.digitallearning.gmbh:8005'
+  apiUrl: 'http://vs-code-cloud.digitallearning.gmbh:8000'
 };
 
 /*
diff --git a/src/frontend/src/locale/messages.de.xlf b/src/frontend/src/locale/messages.de.xlf
index 2a7a59caa7ca9989c0d0a69563dbcf167481fd16..3f78765556334ffef19821344a0b4d6289c5e7b7 100644
--- a/src/frontend/src/locale/messages.de.xlf
+++ b/src/frontend/src/locale/messages.de.xlf
@@ -516,6 +516,7 @@
       </trans-unit>
       <trans-unit id="schemaChanges" datatype="html">
         <source> Schema Changes </source>
+        <target> Schema Änderungen </target>
         <context-group purpose="location">
           <context context-type="sourcefile">src/app/consent-management/schema-change/schema-change.component.html</context>
           <context context-type="linenumber">3,5</context>
@@ -525,6 +526,7 @@
       </trans-unit>
       <trans-unit id="schemaChanged" datatype="html">
         <source>Schema changed</source>
+        <target> Schema geändert </target>
         <context-group purpose="location">
           <context context-type="sourcefile">src/app/consent-management/schema-change/schema-change.component.html</context>
           <context context-type="linenumber">15</context>
@@ -534,6 +536,7 @@
       </trans-unit>
       <trans-unit id="schemaAdded" datatype="html">
         <source>Schema added</source>
+        <target> Schema hinzugefügt </target>
         <context-group purpose="location">
           <context context-type="sourcefile">src/app/consent-management/schema-change/schema-change.component.html</context>
           <context context-type="linenumber">20</context>
@@ -668,6 +671,7 @@
       <trans-unit id="consentDeclaration" datatype="html">
         <source> Consent Declaration
 </source>
+<target>Zustimmung zur Datenerfassung</target>
         <context-group purpose="location">
           <context context-type="sourcefile">src/app/consent-management/wizard/wizard.component.html</context>
           <context context-type="linenumber">1,3</context>
diff --git a/src/providers/migrations/0007_provider_descriptioni18n.py b/src/providers/migrations/0007_provider_descriptioni18n.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef7ad8221f755320c17f5955939cc0c6d589b5ba
--- /dev/null
+++ b/src/providers/migrations/0007_provider_descriptioni18n.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2023-11-02 12:23
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('providers', '0006_analyticstoken_description_analyticstoken_image_path'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='provider',
+            name='descriptionI18n',
+            field=models.JSONField(null=True),
+        ),
+    ]
diff --git a/src/providers/migrations/0008_provider_name18n.py b/src/providers/migrations/0008_provider_name18n.py
new file mode 100644
index 0000000000000000000000000000000000000000..5d71e8369bb9c8f9eff41cf67dc841715dc89992
--- /dev/null
+++ b/src/providers/migrations/0008_provider_name18n.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2023-11-02 12:29
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('providers', '0007_provider_descriptioni18n'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='provider',
+            name='nameI18n',
+            field=models.JSONField(null=True),
+        ),
+    ]
diff --git a/src/providers/models.py b/src/providers/models.py
index e14fb36ca2fe55a03d64baf263cc35c761044564..0936ae358d63f4d857b4b9ebd6079fc5e2b8f2f6 100644
--- a/src/providers/models.py
+++ b/src/providers/models.py
@@ -9,7 +9,9 @@ class Provider(models.Model):
         max_length=255
     )  # id gotten from uploaded definition
     name = models.CharField(max_length=200)
+    nameI18n = models.JSONField(null=True)
     description = models.TextField()
+    descriptionI18n = models.JSONField(null=True)
     updated = models.DateTimeField(auto_now=True)
     created = models.DateTimeField(auto_now_add=True)
 
diff --git a/src/providers/views.py b/src/providers/views.py
index 3c2cee522b5a5e1d86a0bacdaa7d7c60340e2e29..494b3a7cc6e326d0274a4a838ac3a300aca953e7 100644
--- a/src/providers/views.py
+++ b/src/providers/views.py
@@ -40,7 +40,9 @@ def render_provider(provider):
     return {
         "id": provider.id,
         "name": provider.name,
+        "nameI18n": provider.nameI18n,
         "description": provider.description,
+        "descriptionI18n": provider.descriptionI18n,
         "schema": render_provider_schema(
             ProviderSchema.objects.get(provider=provider, superseded_by=None)
         ),
diff --git a/src/static/provider_schema_moodle_v2.i18n.json b/src/static/provider_schema_moodle_v2.i18n.json
index 065abcad42358b182e0797fcdd159f280d597c33..76cc276bd2e51df6e0531ded4c9c89fc66e7c30a 100644
--- a/src/static/provider_schema_moodle_v2.i18n.json
+++ b/src/static/provider_schema_moodle_v2.i18n.json
@@ -1,48 +1,59 @@
 {
   "id": "moodle-0",
   "name": "Moodle",
-  "name-i18n": {
-    "enUS": "Python Programming Course",
-    "frFr": "Cours de programmation Python"
+  "nameI18n": {
+    "de": "Python Programmier Kurs",
+    "en": "Python Programming Course",
+    "fr": "Cours de programmation Python"
   },
   "description": "Open-source learning management system",
-  "description-i18n": {
-    "enUS": "Python Programming Course"
+  "descriptionI18n": {
+    "en": "Python Programming Course"
   },
   "groups": [
     {
       "id": "default_group",
       "label": "Default group",
-      "label-i18n": {
-        "enUS": "Python Programming Course"
+      "labelI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course",
+        "fr": "Cours de programmation Python"
       },
       "description": "default",
-      "description-i18n": {
-        "enUS": "Python Programming Course"
+      "descriptionI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course",
+        "fr": "Cours de programmation Python"
       },
       "showVerbDetails": true,
       "purposeOfCollection": "Lorem Ipsum",
-      "purposeOfCollection-i18n": {
-        "enUS": "Python Programming Course"
+      "purposeOfCollectionI18n": {
+        "de": "Python Programmier Kurs",
+        "en": "Python Programming Course",
+        "fr": "Cours de programmation Python"
       },
+      "isDefault": true,
       "verbs": [
         {
           "id": "http://moodle.example.com/expapi/verbs/completed",
-          "label": "Completed",
-          "label-i18n": {
-            "enUS": "Python Programming Course"
+          "label": "Course completed",
+          "labelI18n": {
+            "de": "Kurs erledigt",
+            "en": "Course completed"
           },
           "description": "Completed",
-          "description-i18n": {
-            "enUS": "Python Programming Course"
+          "descriptionI18n": {
+            "de": "Du hast den Kurs abgeschlossen",
+            "en": "You have completed the course"
           },
           "defaultConsent": true,
           "objects": [
             {
               "id": "http://moodle.example.com/expapi/activity/programming-course-python",
-              "label": "Python Programming Course",
-              "label-i18n": {
-                "enUS": "Python Programming Course"
+              "label": "Result",
+              "labelI18n": {
+                "en": "Result",
+                "de": "Ergebnis"
               },
               "defaultConsent": true,
               "matching": "definitionType",