From a67a0be3abf1cc4a8fee2c98fae3c236780fbc96 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 11:40:57 +0100
Subject: [PATCH 01/19] Translated in components

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 src/components/Footer.tsx      | 26 +++++++++++++-------------
 src/components/ResultGrid.tsx  | 10 +++++-----
 src/components/ResultTable.tsx | 15 +++------------
 3 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
index 3d8a999..6ec2c5f 100644
--- a/src/components/Footer.tsx
+++ b/src/components/Footer.tsx
@@ -26,41 +26,41 @@ const navigation = {
     ],
     community: [
         {
-            name: 'Project on openCode',
+            name: 'Projekt auf openCode',
             href: 'https://gitlab.opencode.de/open-code/badgebackend',
             external: true,
         },
         {
-            name: 'Contribute',
+            name: 'Beitragen',
             href: 'https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/blob/main/CONTRIBUTING.md',
             external: true,
         },
         {
-            name: 'Open issue',
+            name: 'Issue öffnen',
             href: 'https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/issues/new',
             external: true,
         },
     ],
     legal: [
         {
-            name: 'Imprint',
+            name: 'Impressum',
             href: 'https://opencode.de/de/impressum',
             external: true,
         },
         {
-            name: 'Privacy policy',
+            name: 'Datenschutzerklärung',
             href: 'https://opencode.de/de/datenschutz',
             external: true,
         },
         {
-            name: 'License',
+            name: 'Lizenz',
             href: 'https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/blob/main/LICENSE',
             external: true,
         },
     ],
     accessibility: [
         {
-            name: 'Declaration on Accessibility',
+            name: 'Erklärung zur Barrierefreiheit',
             href: '/declaration-on-accessibility',
             external: false,
         },
@@ -94,7 +94,7 @@ export default function Footer() {
                         />
                     </a>
                     <p className="text-balance text-sm/6 text-gray-600">
-                        The Badge Programm is an{' '}
+                        Das Badge Programm ist ein{' '}
                         <a
                             href="https://opencode.de/"
                             target="_blank"
@@ -103,7 +103,7 @@ export default function Footer() {
                         >
                             openCode
                         </a>{' '}
-                        service by{' '}
+                        Dienst der{' '}
                         <a
                             href="https://zendis.de/"
                             target="_blank"
@@ -112,7 +112,7 @@ export default function Footer() {
                         >
                             ZenDiS
                         </a>{' '}
-                        maintained by{' '}
+                        maintained durch{' '}
                         <a
                             href="https://l3montree.com"
                             target="_blank"
@@ -128,7 +128,7 @@ export default function Footer() {
                     <div className="md:grid md:grid-cols-2 md:gap-8">
                         <div>
                             <h3 className="text-sm/6 font-semibold text-gray-900">
-                                Official Badges
+                                Offizielle Badges
                             </h3>
                             <ul role="list" className="mt-6 space-y-4">
                                 {navigation.officialBadges.map((item) => (
@@ -176,7 +176,7 @@ export default function Footer() {
                     <div className="md:grid md:grid-cols-2 md:gap-8">
                         <div>
                             <h3 className="text-sm/6 font-semibold text-gray-900">
-                                Legal
+                                Rechtliches
                             </h3>
                             <ul role="list" className="mt-6 space-y-4">
                                 {navigation.legal.map((item) => (
@@ -199,7 +199,7 @@ export default function Footer() {
                         </div>
                         <div className="mt-10 md:mt-0">
                             <h3 className="text-sm/6 font-semibold text-gray-900">
-                                Accessibility
+                                Barrierefreiheit
                             </h3>
                             <ul role="list" className="mt-6 space-y-4">
                                 {navigation.accessibility.map((item) => (
diff --git a/src/components/ResultGrid.tsx b/src/components/ResultGrid.tsx
index e96d156..2452741 100644
--- a/src/components/ResultGrid.tsx
+++ b/src/components/ResultGrid.tsx
@@ -19,7 +19,7 @@ export default function ResultGrid({ currentScan }: Props) {
                     <div className="mx-auto max-w-7xl px-6 lg:px-8">
                         <div className="mb-8">
                             <h2 className="mb-1 text-2xl font-semibold">
-                                Displaying results for:
+                                Ergebnisse für:
                             </h2>
                             <a
                                 target="_blank"
@@ -36,7 +36,7 @@ export default function ResultGrid({ currentScan }: Props) {
                                 }
                             </a>
                         </div>
-                        <div className="-mx-6 grid grid-cols-2 gap-0.5 overflow-hidden sm:mx-0 sm:rounded-2xl md:grid-cols-3">
+                        <div className="-mx-6 grid grid-cols-1 gap-0.5 overflow-hidden px-6 sm:mx-0 sm:rounded-2xl sm:px-0 md:grid-cols-3">
                             {currentScan.runs[0].properties.testedRepository &&
                                 currentScan?.runs[0].properties.badges
                                     .sort((a, b) =>
@@ -44,13 +44,13 @@ export default function ResultGrid({ currentScan }: Props) {
                                     )
                                     .map((badge) => (
                                         <div
-                                            className="overflow-hidden bg-gray-400/10 p-10"
+                                            className="overflow-hidden rounded-xl bg-gray-400/10 p-10 sm:rounded-none"
                                             key={`${badge.badgeId}-${badge.badgeLevel}`}
                                         >
                                             <div className="relative aspect-square">
                                                 {!badge.badgeGranted && (
-                                                    <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2 rotate-45 bg-red-600 px-10 py-2 font-bold text-white">
-                                                        Not granted
+                                                    <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2 rotate-45 bg-red-600 px-10 py-2 text-xs font-bold text-white">
+                                                        Nicht gewährt
                                                     </div>
                                                 )}
                                                 <Image
diff --git a/src/components/ResultTable.tsx b/src/components/ResultTable.tsx
index 68b0243..feca39b 100644
--- a/src/components/ResultTable.tsx
+++ b/src/components/ResultTable.tsx
@@ -6,15 +6,6 @@ import { SarifApiResponse } from '../lib/apiClient'
 import { cn } from '../lib/utils'
 import { Badge } from './ui/badge'
 
-const people = [
-    {
-        name: 'Lindsay Walton',
-        title: 'Front-end Developer',
-        email: 'lindsay.walton@example.com',
-        role: 'Member',
-    },
-    // More people...
-]
 interface Props {
     currentScan: SarifApiResponse
 }
@@ -32,7 +23,7 @@ export default function ResultTable({ currentScan }: Props) {
                         <details className="">
                             <summary className="relative flex cursor-pointer flex-row justify-between text-lg font-medium text-gray-900">
                                 <span>
-                                    Details on: {badge.badgeId}{' '}
+                                    Details für: {badge.badgeId}{' '}
                                     {badge.badgeLevel}
                                     <Badge
                                         variant={
@@ -72,13 +63,13 @@ export default function ResultTable({ currentScan }: Props) {
                                                         scope="col"
                                                         className="col-span-2 px-3 py-3.5 text-left font-semibold"
                                                     >
-                                                        Description
+                                                        Beschreibung
                                                     </th>
                                                     <th
                                                         scope="col"
                                                         className="col-span-2 px-3 py-3.5 text-left font-semibold"
                                                     >
-                                                        Evidence
+                                                        Nachweis
                                                     </th>
                                                 </tr>
                                             </thead>
-- 
GitLab


From 9323bffbf78965c42ecfc1c6c4b57bbaaff37e96 Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 12:20:23 +0100
Subject: [PATCH 02/19] adds bg background, translates toast

---
 src/components/CheckRepoForm.tsx | 18 +++++++++---------
 src/pages/_meta.ts               |  6 ------
 tailwind.config.js               | 14 ++++++++++++++
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/components/CheckRepoForm.tsx b/src/components/CheckRepoForm.tsx
index 15066d8..45e198b 100644
--- a/src/components/CheckRepoForm.tsx
+++ b/src/components/CheckRepoForm.tsx
@@ -1,15 +1,15 @@
 // Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 // SPDX-License-Identifier: MIT
 
-import React, { FunctionComponent, useTransition } from 'react'
-import { Form, FormItem } from './ui/form'
-import { Label } from './ui/label'
-import { Input } from './ui/input'
-import { Button } from './ui/button'
-import { useToast } from '../hooks/use-toast'
+import { Loader2 } from 'lucide-react'
+import React, { FunctionComponent } from 'react'
 import { useForm } from 'react-hook-form'
+import { useToast } from '../hooks/use-toast'
 import { apiCall, SarifApiResponse } from '../lib/apiClient'
-import { Loader2 } from 'lucide-react'
+import { Button } from './ui/button'
+import { Form, FormItem } from './ui/form'
+import { Input } from './ui/input'
+import { Label } from './ui/label'
 
 interface Props {
     onScanFinished: (response: SarifApiResponse) => void
@@ -50,9 +50,9 @@ const CheckRepoForm: FunctionComponent<Props> = ({
         } catch (e) {
             console.error(e)
             toast({
-                title: 'Provided url is invalid',
+                title: 'Die angegebene Url ist ungültig',
                 description:
-                    'Please check if the url you provided has a typo. Make sure to include the whole url to the repo, without the .git ending.',
+                    'Bitte überprüfen Sie, ob die von Ihnen angegebene URL einen Tippfehler enthält. Stellen Sie sicher, dass Sie die gesamte URL des Repos angeben, ohne die Endung .git.',
             })
         } finally {
             setIsPending(false)
diff --git a/src/pages/_meta.ts b/src/pages/_meta.ts
index e33d114..90b53a9 100644
--- a/src/pages/_meta.ts
+++ b/src/pages/_meta.ts
@@ -22,12 +22,6 @@ export default {
         type: 'page',
         href: '/#api-small-demo',
     },
-    'about-opencode': {
-        title: 'Mehr zu openCode ↗',
-        type: 'page',
-        href: 'https://opencode.de/en',
-        newWindow: true,
-    },
     'declaration-on-accessibility': {
         display: 'hidden',
     },
diff --git a/tailwind.config.js b/tailwind.config.js
index 709dc19..b80ad1b 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -15,6 +15,20 @@ module.exports = {
         },
         extend: {
             colors: {
+                background: {
+                    DEFAULT: '#f7f7f7',
+                    50: '#ffffff',
+                    100: '#ffffff',
+                    200: '#ffffff',
+                    300: '#ffffff',
+                    400: '#ffffff',
+                    500: '#f7f7f7',
+                    600: '#e0e0e0',
+                    700: '#c8c8c8',
+                    800: '#b1b1b1',
+                    900: '#999999',
+                },
+                
                 zendis: {
                     50: '#eefffb',
                     100: '#c6fff4',
-- 
GitLab


From facd08d37cd445a33a133fb6a3e8a789fc553eb9 Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 12:25:50 +0100
Subject: [PATCH 03/19] responsive header

---
 theme.config.tsx | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/theme.config.tsx b/theme.config.tsx
index 6b99881..eb9e1e7 100644
--- a/theme.config.tsx
+++ b/theme.config.tsx
@@ -48,12 +48,11 @@ const config: DocsThemeConfig = {
                 alt="Badge API Icon"
                 width={220}
                 height={80}
-                className="h-12 w-auto"
+                className="h-12 w-auto md:inline-block"
             />
-            <span>
-                <span className="font-space-grotesk text-xl font-bold text-black">
-                    Badge Programm
-                </span>
+
+            <span className="font-space-grotesk text-xl font-bold text-black md:hidden lg:inline-block">
+                Badge Programm
             </span>
         </span>
     ),
-- 
GitLab


From 52d40f4318e4a90b090de3fad20ad69eebad3386 Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 12:28:57 +0100
Subject: [PATCH 04/19] responsive hero

---
 src/components/landing-page/Hero.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/landing-page/Hero.tsx b/src/components/landing-page/Hero.tsx
index 85ae56d..eced96a 100644
--- a/src/components/landing-page/Hero.tsx
+++ b/src/components/landing-page/Hero.tsx
@@ -54,7 +54,7 @@ export default function Hero() {
                         />
                     </div>
                     <div className="overflow-hidden">
-                        <div className="mx-auto max-w-7xl px-6 pb-32 pt-36 sm:pt-60 lg:px-8 lg:pt-32">
+                        <div className="mx-auto max-w-7xl px-6 pb-0 pt-20 md:pb-20 md:pt-20 lg:px-8 lg:pt-32">
                             <div className="mx-auto max-w-2xl gap-x-14 lg:mx-0 lg:flex lg:max-w-none lg:items-center">
                                 <div className="relative w-full lg:max-w-xl lg:shrink-0 xl:max-w-2xl">
                                     <h1 className="text-pretty text-5xl font-semibold tracking-tight text-zinc-900 sm:text-7xl">
-- 
GitLab


From b1a8a97eca26072c161c43ed7b0dca74734f8edd Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 13:21:02 +0100
Subject: [PATCH 05/19] Starts translating docs to de

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 next.config.mjs                               |   4 +
 src/components/Footer.tsx                     |  12 +-
 src/components/landing-page/Hero.tsx          |   2 +-
 .../concepts/implemented-checks/index.mdx     |  16 -
 src/pages/{ => de}/_meta.ts                   |  17 +-
 src/pages/{ => de}/api-docs/_meta.ts          |   0
 src/pages/{ => de}/api-docs/index.mdx         |   0
 src/pages/{ => de}/api-docs/v1/_meta.ts       |   0
 .../api-docs/v1/badge-explanation.mdx         |   2 +-
 src/pages/{ => de}/api-docs/v1/badges.mdx     |   2 +-
 .../api-docs/v1/sarif-per-repo-endpoint.mdx   |   0
 src/pages/de/concepts/_meta.ts                |   8 +
 src/pages/de/concepts/configuration/_meta.ts  |   7 +
 src/pages/de/concepts/configuration/index.mdx | 182 ++++++
 .../concepts/configuration/manual-checks.mdx  |   2 +-
 .../concepts/implemented-checks/_meta.ts      |   0
 .../implemented-checks/bus-factor.mdx         |   0
 .../implemented-checks/ci-pipeline.mdx        |   0
 .../concepts/implemented-checks/commits.mdx   |   0
 .../implemented-checks/elephant-factor.mdx    |   2 +-
 .../de/concepts/implemented-checks/index.mdx  |  16 +
 .../issue-reaction-time.mdx                   |   0
 .../concepts/implemented-checks/packages.mdx  |   0
 .../implemented-checks/protected-branches.mdx |   0
 .../concepts/implemented-checks/releases.mdx  |   0
 .../implemented-checks/subsequent-use.mdx     |   0
 src/pages/de/concepts/index.mdx               |  26 +
 .../erklaerung-zur-barrierefreiheit.mdx}      |   0
 src/pages/{ => de}/index.mdx                  |   4 +-
 src/pages/de/introduction.mdx                 |  58 ++
 src/pages/{ => de}/leichte-sprache.mdx        |   5 -
 src/pages/de/official-badges/_meta.ts         |   9 +
 .../active-maintained-badge.mdx               |  46 ++
 .../de/official-badges/open-source-badge.mdx  |  32 +
 src/pages/de/official-badges/reuse-badge.mdx  |  40 ++
 .../de/official-badges/security-badge.mdx     |  37 ++
 src/pages/en/_meta.ts                         |  25 +
 src/pages/en/api-docs/_meta.ts                |   7 +
 src/pages/en/api-docs/index.mdx               |  35 ++
 src/pages/en/api-docs/v1/_meta.ts             |   7 +
 .../en/api-docs/v1/badge-explanation.mdx      |  71 +++
 src/pages/en/api-docs/v1/badges.mdx           |  71 +++
 .../api-docs/v1/sarif-per-repo-endpoint.mdx   | 572 ++++++++++++++++++
 src/pages/{ => en}/concepts/_meta.ts          |   0
 .../{ => en}/concepts/configuration/_meta.ts  |   0
 .../{ => en}/concepts/configuration/index.mdx |   0
 .../concepts/configuration/manual-checks.mdx  |  23 +
 .../en/concepts/implemented-checks/_meta.ts   |   6 +
 .../implemented-checks/bus-factor.mdx         |  32 +
 .../implemented-checks/ci-pipeline.mdx        |  36 ++
 .../concepts/implemented-checks/commits.mdx   |  27 +
 .../implemented-checks/elephant-factor.mdx    |  31 +
 .../en/concepts/implemented-checks/index.mdx  |  16 +
 .../issue-reaction-time.mdx                   |  55 ++
 .../concepts/implemented-checks/packages.mdx  |  33 +
 .../implemented-checks/protected-branches.mdx |  35 ++
 .../concepts/implemented-checks/releases.mdx  |  45 ++
 .../implemented-checks/subsequent-use.mdx     |  32 +
 src/pages/{ => en}/concepts/index.mdx         |   2 +-
 src/pages/en/index.mdx                        |  20 +
 src/pages/{ => en}/introduction.mdx           |   8 +-
 src/pages/{ => en}/official-badges/_meta.ts   |   0
 .../active-maintained-badge.mdx               |   8 +-
 .../official-badges/open-source-badge.mdx     |   0
 .../{ => en}/official-badges/reuse-badge.mdx  |   8 +-
 .../official-badges/security-badge.mdx        |   4 +-
 src/pages/index.tsx                           |  12 +
 theme.config.tsx                              |   6 +-
 68 files changed, 1696 insertions(+), 60 deletions(-)
 delete mode 100644 src/pages/concepts/implemented-checks/index.mdx
 rename src/pages/{ => de}/_meta.ts (58%)
 rename src/pages/{ => de}/api-docs/_meta.ts (100%)
 rename src/pages/{ => de}/api-docs/index.mdx (100%)
 rename src/pages/{ => de}/api-docs/v1/_meta.ts (100%)
 rename src/pages/{ => de}/api-docs/v1/badge-explanation.mdx (96%)
 rename src/pages/{ => de}/api-docs/v1/badges.mdx (96%)
 rename src/pages/{ => de}/api-docs/v1/sarif-per-repo-endpoint.mdx (100%)
 create mode 100644 src/pages/de/concepts/_meta.ts
 create mode 100644 src/pages/de/concepts/configuration/_meta.ts
 create mode 100644 src/pages/de/concepts/configuration/index.mdx
 rename src/pages/{ => de}/concepts/configuration/manual-checks.mdx (91%)
 rename src/pages/{ => de}/concepts/implemented-checks/_meta.ts (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/bus-factor.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/ci-pipeline.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/commits.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/elephant-factor.mdx (88%)
 create mode 100644 src/pages/de/concepts/implemented-checks/index.mdx
 rename src/pages/{ => de}/concepts/implemented-checks/issue-reaction-time.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/packages.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/protected-branches.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/releases.mdx (100%)
 rename src/pages/{ => de}/concepts/implemented-checks/subsequent-use.mdx (100%)
 create mode 100644 src/pages/de/concepts/index.mdx
 rename src/pages/{declaration-on-accessibility.mdx => de/erklaerung-zur-barrierefreiheit.mdx} (100%)
 rename src/pages/{ => de}/index.mdx (74%)
 create mode 100644 src/pages/de/introduction.mdx
 rename src/pages/{ => de}/leichte-sprache.mdx (98%)
 create mode 100644 src/pages/de/official-badges/_meta.ts
 create mode 100644 src/pages/de/official-badges/active-maintained-badge.mdx
 create mode 100644 src/pages/de/official-badges/open-source-badge.mdx
 create mode 100644 src/pages/de/official-badges/reuse-badge.mdx
 create mode 100644 src/pages/de/official-badges/security-badge.mdx
 create mode 100644 src/pages/en/_meta.ts
 create mode 100644 src/pages/en/api-docs/_meta.ts
 create mode 100644 src/pages/en/api-docs/index.mdx
 create mode 100644 src/pages/en/api-docs/v1/_meta.ts
 create mode 100644 src/pages/en/api-docs/v1/badge-explanation.mdx
 create mode 100644 src/pages/en/api-docs/v1/badges.mdx
 create mode 100644 src/pages/en/api-docs/v1/sarif-per-repo-endpoint.mdx
 rename src/pages/{ => en}/concepts/_meta.ts (100%)
 rename src/pages/{ => en}/concepts/configuration/_meta.ts (100%)
 rename src/pages/{ => en}/concepts/configuration/index.mdx (100%)
 create mode 100644 src/pages/en/concepts/configuration/manual-checks.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/_meta.ts
 create mode 100644 src/pages/en/concepts/implemented-checks/bus-factor.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/ci-pipeline.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/commits.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/elephant-factor.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/index.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/issue-reaction-time.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/packages.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/protected-branches.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/releases.mdx
 create mode 100644 src/pages/en/concepts/implemented-checks/subsequent-use.mdx
 rename src/pages/{ => en}/concepts/index.mdx (93%)
 create mode 100644 src/pages/en/index.mdx
 rename src/pages/{ => en}/introduction.mdx (87%)
 rename src/pages/{ => en}/official-badges/_meta.ts (100%)
 rename src/pages/{ => en}/official-badges/active-maintained-badge.mdx (70%)
 rename src/pages/{ => en}/official-badges/open-source-badge.mdx (100%)
 rename src/pages/{ => en}/official-badges/reuse-badge.mdx (68%)
 rename src/pages/{ => en}/official-badges/security-badge.mdx (86%)
 create mode 100644 src/pages/index.tsx

diff --git a/next.config.mjs b/next.config.mjs
index 7a0ce94..8892f3d 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -76,6 +76,10 @@ const nextConfig = {
     images: {
         unoptimized: true, // mandatory, otherwise won't export
     },
+    i18n: {
+        locales: ['de', 'en'],
+        defaultLocale: 'de',
+    },
 }
 const withNextra = nextra({
     theme: 'nextra-theme-docs',
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
index 6ec2c5f..2b8915c 100644
--- a/src/components/Footer.tsx
+++ b/src/components/Footer.tsx
@@ -5,22 +5,22 @@ const navigation = {
     officialBadges: [
         {
             name: 'Maintained Badge',
-            href: '/official-badges/active-maintained-badge',
+            href: '/de/official-badges/active-maintained-badge',
             external: false,
         },
         {
             name: 'Reuse Badge',
-            href: '/official-badges/reuse-badge',
+            href: '/de/official-badges/reuse-badge',
             external: false,
         },
         {
             name: 'Open Source Badge',
-            href: '/official-badges/open-source-badge',
+            href: '/de/official-badges/open-source-badge',
             external: false,
         },
         {
             name: 'Security Badge',
-            href: '/official-badges/security-badge',
+            href: '/de/official-badges/security-badge',
             external: false,
         },
     ],
@@ -61,7 +61,7 @@ const navigation = {
     accessibility: [
         {
             name: 'Erklärung zur Barrierefreiheit',
-            href: '/declaration-on-accessibility',
+            href: '/de/erklaerung-zur-barrierefreiheit',
             external: false,
         },
         {
@@ -71,7 +71,7 @@ const navigation = {
         },
         {
             name: 'Leichte Sprache',
-            href: '/leichte-sprache',
+            href: '/de/leichte-sprache',
             external: false,
         },
     ],
diff --git a/src/components/landing-page/Hero.tsx b/src/components/landing-page/Hero.tsx
index 85ae56d..fae42a4 100644
--- a/src/components/landing-page/Hero.tsx
+++ b/src/components/landing-page/Hero.tsx
@@ -81,7 +81,7 @@ export default function Hero() {
                                             href="/introduction"
                                             className="rounded-md bg-blue-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
                                         >
-                                            Zur Dokumentation (EN)
+                                            Zur Dokumentation
                                         </a>
                                         <a
                                             href="#api-small-demo"
diff --git a/src/pages/concepts/implemented-checks/index.mdx b/src/pages/concepts/implemented-checks/index.mdx
deleted file mode 100644
index 5af1d65..0000000
--- a/src/pages/concepts/implemented-checks/index.mdx
+++ /dev/null
@@ -1,16 +0,0 @@
-{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
-SPDX-License-Identifier: MIT */}
-
-# Overview of Implemented Checks
-
-The following checks are implemented and can be used to generate badges:
-
-- [`BUS_FACTOR` ↗](/concepts/implemented-checks/bus-factor)
-- [`CI_PIPELINE` ↗](/concepts/implemented-checks/ci-pipeline)
-- [`COMMITS` ↗](/concepts/implemented-checks/commits)
-- [`ELEPHANT_FACTOR` ↗](/concepts/implemented-checks/elephant-factor)
-- [`ISSUE_REACTION_TIME` ↗](/concepts/implemented-checks/issue-reaction-time)
-- [`PACKAGES` ↗](/concepts/implemented-checks/packages)
-- [`PROTECTED_BRANCHES` ↗](/concepts/implemented-checks/protected-branches)
-- [`RELEASES` ↗](/concepts/implemented-checks/releases)
-- [`SUBSEQUENT_USE` ↗](/concepts/implemented-checks/subsequent-use)
\ No newline at end of file
diff --git a/src/pages/_meta.ts b/src/pages/de/_meta.ts
similarity index 58%
rename from src/pages/_meta.ts
rename to src/pages/de/_meta.ts
index e33d114..b7d2503 100644
--- a/src/pages/_meta.ts
+++ b/src/pages/de/_meta.ts
@@ -8,12 +8,12 @@ export default {
         },
         display: 'hidden',
     },
-    introduction: { title: 'Introduction' },
-    'official-badges': { title: 'Official Badges 🛡️' },
-    concepts: { title: 'Concepts' },
+    introduction: { title: 'Einführung' },
+    'official-badges': { title: 'Offizielle Badges 🛡️' },
+    concepts: { title: 'Konzepte' },
     'api-docs': { title: 'API' },
     docs: {
-        title: 'Documentation (EN)',
+        title: 'Dokumentation',
         type: 'page',
         href: '/introduction',
     },
@@ -22,13 +22,10 @@ export default {
         type: 'page',
         href: '/#api-small-demo',
     },
-    'about-opencode': {
-        title: 'Mehr zu openCode ↗',
-        type: 'page',
-        href: 'https://opencode.de/en',
-        newWindow: true,
+    'erklaerung-zur-barrierefreiheit': {
+        display: 'hidden',
     },
-    'declaration-on-accessibility': {
+    'leichte-sprache': {
         display: 'hidden',
     },
 }
diff --git a/src/pages/api-docs/_meta.ts b/src/pages/de/api-docs/_meta.ts
similarity index 100%
rename from src/pages/api-docs/_meta.ts
rename to src/pages/de/api-docs/_meta.ts
diff --git a/src/pages/api-docs/index.mdx b/src/pages/de/api-docs/index.mdx
similarity index 100%
rename from src/pages/api-docs/index.mdx
rename to src/pages/de/api-docs/index.mdx
diff --git a/src/pages/api-docs/v1/_meta.ts b/src/pages/de/api-docs/v1/_meta.ts
similarity index 100%
rename from src/pages/api-docs/v1/_meta.ts
rename to src/pages/de/api-docs/v1/_meta.ts
diff --git a/src/pages/api-docs/v1/badge-explanation.mdx b/src/pages/de/api-docs/v1/badge-explanation.mdx
similarity index 96%
rename from src/pages/api-docs/v1/badge-explanation.mdx
rename to src/pages/de/api-docs/v1/badge-explanation.mdx
index c626840..2d41777 100644
--- a/src/pages/api-docs/v1/badge-explanation.mdx
+++ b/src/pages/de/api-docs/v1/badge-explanation.mdx
@@ -22,7 +22,7 @@ be or was already scanned. **The URL must be URL encoded**
 (`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
 
 The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
-[.badge-api.yaml](/concepts/configuration) of the badge api instance.
+[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
 
 ### Example Request
 
diff --git a/src/pages/api-docs/v1/badges.mdx b/src/pages/de/api-docs/v1/badges.mdx
similarity index 96%
rename from src/pages/api-docs/v1/badges.mdx
rename to src/pages/de/api-docs/v1/badges.mdx
index 3544944..85e445f 100644
--- a/src/pages/api-docs/v1/badges.mdx
+++ b/src/pages/de/api-docs/v1/badges.mdx
@@ -22,7 +22,7 @@ be or was already scanned. **The URL must be URL encoded**
 (`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
 
 The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
-[.badge-api.yaml](/concepts/configuration) of the badge api instance.
+[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
 
 ### Example Request
 
diff --git a/src/pages/api-docs/v1/sarif-per-repo-endpoint.mdx b/src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx
similarity index 100%
rename from src/pages/api-docs/v1/sarif-per-repo-endpoint.mdx
rename to src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx
diff --git a/src/pages/de/concepts/_meta.ts b/src/pages/de/concepts/_meta.ts
new file mode 100644
index 0000000..1e8ba10
--- /dev/null
+++ b/src/pages/de/concepts/_meta.ts
@@ -0,0 +1,8 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    index: { title: 'Ãœberblick' },
+    configuration: { title: 'Konfiguration' },
+    'implemented-checks': { title: 'Implementierte Checks' },
+}
diff --git a/src/pages/de/concepts/configuration/_meta.ts b/src/pages/de/concepts/configuration/_meta.ts
new file mode 100644
index 0000000..25028b1
--- /dev/null
+++ b/src/pages/de/concepts/configuration/_meta.ts
@@ -0,0 +1,7 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    index: { title: 'Konfigurationsdatei' },
+    'manual-checks': { title: 'Manuelle Checks' },
+}
diff --git a/src/pages/de/concepts/configuration/index.mdx b/src/pages/de/concepts/configuration/index.mdx
new file mode 100644
index 0000000..c1f0431
--- /dev/null
+++ b/src/pages/de/concepts/configuration/index.mdx
@@ -0,0 +1,182 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Konfigurationsdatei
+
+<Callout type="info">
+  Die Konfigurationsdatei der offiziellen Instanz finden Sie [hier →](https://gitlab.opencode.de/open-code/badgebackend/badge-config/-/blob/main/.badge-api.yaml?ref_type=heads)
+</Callout>
+
+
+
+The badge API is configured using a yaml configuration file with the name `.badge-api.yaml`. The program looks for this file in the current working directory and inside `/etc/badge-api/`.
+
+The configuration file consists of several key sections, including:
+
+- **gitClients**: Contains the configuration for connecting to git providers.
+- **badges**: Defines the badges, their levels, checks, and associated thresholds.
+- **personalEmailDomains**: A list of personal email domains (required by the elephant and bus factor check).
+- **remoteConfigUrl**: URL to a remote configuration file (optional). Or `REMOTE_CONFIG_URL` environment variable.
+- **subsequentUseApiDomain**: The domain of the subsequent use API
+
+### Git Clients Configuration
+
+The `gitClients` section defines how the Badge API connects to GitLab repositories.
+
+```yaml
+gitClients:
+  - baseUrl: <git_server_url>
+    tokenFile: <path_to_token_file>
+    type: <git_server_type>
+    maxRequestsPerSecond: <requests_per_second>
+```
+
+- `baseUrl`: The URL of your GitLab instance (e.g., https://gitlab.opencode.de).
+- `tokenFile`: The file containing the access token (see Token Permissions).
+- `type`: The type of GitLab server (e.g., gitlab).
+- `maxRequestsPerSecond`: Maximum number of requests allowed per second to avoid rate-limiting.
+
+
+#### Token Permissions
+
+The token is used to authenticate the badge API against the git provider API. For regular usage the token does not need any special permissions. It is only used because even for open source projects **gitlab** requires authentication for `/member` endpoints.
+
+Nevertheless, there is a special case if you provide [manual checks](#manual-check-type) with a decision json file stored in a private repository. In this case, the badge api uses the provided token to access the json file as well (if the baseURL matches). For this operation the token needs to have at least the `read_repository` permission (project access token is fine as well). The same applies to `svgUrls` which are stored in private repositories.
+
+
+The API identifies the correct token by the provided `baseUrl` and `type` in the configuration file.
+
+
+### Badges Configuration
+
+The `badges` section defines various badges, their levels, and checks. A badge can have multiple levels, each with associated checks.
+
+```yaml
+badges:
+  - id: <badge_id>
+    description: <badge_description>
+    levels:
+      - name: <level_name>
+        svgUrl: <url_to_badge_svg>
+        checks:
+          - type: <check_type>
+            description: <check_description>
+            threshold:
+              timeRangeInMonths: <number_of_months>
+              min: <minimum_value>
+              max: <maximum_value>
+```
+
+Each badge can have different levels (e.g., `bronze`, `silver`, `gold`). For each level, there are checks that are applied to the project. A check can be based on the following types:
+
+- `COMMITS`: Checks if the project has a minimum number of commits in a defined time range.
+- `ISSUE_REACTION_TIME`: Measures the average time to respond to issues.
+- `BUS_FACTOR`: Checks the number of maintainers involved.
+- `RELEASES`: Checks the number of releases made in a specified period.
+- `ELEPHANT_FACTOR`: Checks if multiple companies are contributing to the project.
+- `PACKAGES`: Checks the number of packages released.
+- `CI_PIPELINES`: Checks the number of successful CI pipelines.
+
+Each check has a threshold with two optional parameters:
+
+- `min`: Minimum value required (e.g., number of commits, maintainers).
+- `max`: Maximum value allowed (e.g., issue response time).
+- `timeRangeInMonths`: Time period (in months) to evaluate the project activity.
+
+### Example configuration
+
+```yaml
+badges:
+  - id: maintained
+    description: This badge checks if a project is maintained.
+    levels:
+      - name: bronze
+        notNecessaryForNextHigherLevel: true
+        svgUrl: https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-1.svg
+        checks:
+          - type: COMMITS
+            description: Checks if the number of commits during the last 6 month is greater than 5.
+            threshold:
+              timeRangeInMonths: 6
+              min: 5
+      - name: silver
+        svgUrl: https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-2.svg
+        checks:
+          - type: ISSUE_REACTION_TIME
+            description: Checks if the average reaction time to issues is less than 7 days.
+            threshold:
+              timeRangeInMonths: 3
+              max: 7
+          - type: BUS_FACTOR
+            description: Checks if multiple maintainers are working on the project.
+            threshold:
+              timeRangeInMonths: 6
+              min: 1
+      - name: gold
+        svgUrl: https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-3.svg
+        checks:
+          - type: RELEASES
+            description: Checks if the number of releases during the last 6 month is greater than 1.
+            threshold:
+              timeRangeInMonths: 6
+              min: 1
+          - type: ELEPHANT_FACTOR
+            description: Checks if multiple companies are working on the project.
+            threshold:
+              timeRangeInMonths: 6
+              min: 1
+```
+
+### Manual check type
+
+Besides the predefined checks there is a `MANUAL` check type. This type of check requires external input or decision-making, which cannot be automatically evaluated by the API based on predefined metrics like commits, issues, or releases. Instead, it relies on an external JSON file to guide the decision-making process.
+
+Example of a manual check:
+
+```yaml
+badges:
+  - id: open-source
+    description: This badge checks if a project is open source.
+    levels:
+      - name: gold
+        svgUrl: https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/open-source.svg
+        checks:
+          - type: MANUAL
+            decisionJsonUrl: https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/open-source.json
+            description: Checks if a project is open source. This check is decided manually by the openCode team.
+```
+
+In this case, the decisionJsonUrl points to a file (open-source.json) that contains the rules or decision criteria for determining if a project is open source. The file is hosted on a GitLab server, and the Badge API will refresh it every 5 minutes.
+
+The JSON file should have the following structure:
+
+```json
+{
+  "granted": <List of repository urls that are granted the badge>,
+  "grantedRegex": <List of regex patterns that are granted the badge>,
+}
+```
+
+Example decision JSON file:
+
+```json
+{
+  "granted": [
+    "https://gitlab.opencode.de/open-code/badgebackend/badge-api",
+    "https://gitlab.opencode.de/open-code/badgebackend/badge-frontend"
+  ],
+  "grantedRegex": [
+    "https://gitlab.opencode.de/open-code/badgebackend/.*"
+  ]
+}
+```
+
+
+### Remote Configuration
+
+The `remoteConfigUrl` parameter allows you to specify a URL to a remote configuration file. This file will be fetched and used to override the local configuration. Only the `badges` and `personalEmailDomains` sections are respected from the remote configuration file. To update other values, a local file needs to be used.
+
+The remote configuration file might contain the special string `<badge-config-repo>`. This value will be replaced with the `remoteConfigUrl` base path. This is useful to validate remote configuration from a different branch and pass the url via an environment variable.
+
diff --git a/src/pages/concepts/configuration/manual-checks.mdx b/src/pages/de/concepts/configuration/manual-checks.mdx
similarity index 91%
rename from src/pages/concepts/configuration/manual-checks.mdx
rename to src/pages/de/concepts/configuration/manual-checks.mdx
index 02a7314..00aadff 100644
--- a/src/pages/concepts/configuration/manual-checks.mdx
+++ b/src/pages/de/concepts/configuration/manual-checks.mdx
@@ -20,4 +20,4 @@ where the JSON file is stored.
 ```
 
 The file is referenced in the `.badge-api.yaml` configuration file of the badge. 
-See more details about the [configuration file](/concepts/configuration).
\ No newline at end of file
+See more details about the [configuration file](/en/concepts/configuration).
\ No newline at end of file
diff --git a/src/pages/concepts/implemented-checks/_meta.ts b/src/pages/de/concepts/implemented-checks/_meta.ts
similarity index 100%
rename from src/pages/concepts/implemented-checks/_meta.ts
rename to src/pages/de/concepts/implemented-checks/_meta.ts
diff --git a/src/pages/concepts/implemented-checks/bus-factor.mdx b/src/pages/de/concepts/implemented-checks/bus-factor.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/bus-factor.mdx
rename to src/pages/de/concepts/implemented-checks/bus-factor.mdx
diff --git a/src/pages/concepts/implemented-checks/ci-pipeline.mdx b/src/pages/de/concepts/implemented-checks/ci-pipeline.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/ci-pipeline.mdx
rename to src/pages/de/concepts/implemented-checks/ci-pipeline.mdx
diff --git a/src/pages/concepts/implemented-checks/commits.mdx b/src/pages/de/concepts/implemented-checks/commits.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/commits.mdx
rename to src/pages/de/concepts/implemented-checks/commits.mdx
diff --git a/src/pages/concepts/implemented-checks/elephant-factor.mdx b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
similarity index 88%
rename from src/pages/concepts/implemented-checks/elephant-factor.mdx
rename to src/pages/de/concepts/implemented-checks/elephant-factor.mdx
index b21219d..1caed0f 100644
--- a/src/pages/concepts/implemented-checks/elephant-factor.mdx
+++ b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
@@ -24,7 +24,7 @@ The check passes if the elephant factor is greater than or equal to the minimum
 
 The elephant factor is a measure of the risk resulting from information and capabilities not being shared among organizations.
 
-It is similar to the [bus factor](/concepts/implemented-checks/bus-factor) but instead of measuring the risk of losing individuals,
+It is similar to the [bus factor](/en/concepts/implemented-checks/bus-factor) but instead of measuring the risk of losing individuals,
 it measures the risk of losing organizations.
 
 For example, if a project has an elephant factor of 2, it means that the 2 most important organizations are responsible for 50% of the commits
diff --git a/src/pages/de/concepts/implemented-checks/index.mdx b/src/pages/de/concepts/implemented-checks/index.mdx
new file mode 100644
index 0000000..040aaa8
--- /dev/null
+++ b/src/pages/de/concepts/implemented-checks/index.mdx
@@ -0,0 +1,16 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+# Overview of Implemented Checks
+
+The following checks are implemented and can be used to generate badges:
+
+- [`BUS_FACTOR` ↗](/en/concepts/implemented-checks/bus-factor)
+- [`CI_PIPELINE` ↗](/en/concepts/implemented-checks/ci-pipeline)
+- [`COMMITS` ↗](/en/concepts/implemented-checks/commits)
+- [`ELEPHANT_FACTOR` ↗](/en/concepts/implemented-checks/elephant-factor)
+- [`ISSUE_REACTION_TIME` ↗](/en/concepts/implemented-checks/issue-reaction-time)
+- [`PACKAGES` ↗](/en/concepts/implemented-checks/packages)
+- [`PROTECTED_BRANCHES` ↗](/en/concepts/implemented-checks/protected-branches)
+- [`RELEASES` ↗](/en/concepts/implemented-checks/releases)
+- [`SUBSEQUENT_USE` ↗](/en/concepts/implemented-checks/subsequent-use)
\ No newline at end of file
diff --git a/src/pages/concepts/implemented-checks/issue-reaction-time.mdx b/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/issue-reaction-time.mdx
rename to src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
diff --git a/src/pages/concepts/implemented-checks/packages.mdx b/src/pages/de/concepts/implemented-checks/packages.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/packages.mdx
rename to src/pages/de/concepts/implemented-checks/packages.mdx
diff --git a/src/pages/concepts/implemented-checks/protected-branches.mdx b/src/pages/de/concepts/implemented-checks/protected-branches.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/protected-branches.mdx
rename to src/pages/de/concepts/implemented-checks/protected-branches.mdx
diff --git a/src/pages/concepts/implemented-checks/releases.mdx b/src/pages/de/concepts/implemented-checks/releases.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/releases.mdx
rename to src/pages/de/concepts/implemented-checks/releases.mdx
diff --git a/src/pages/concepts/implemented-checks/subsequent-use.mdx b/src/pages/de/concepts/implemented-checks/subsequent-use.mdx
similarity index 100%
rename from src/pages/concepts/implemented-checks/subsequent-use.mdx
rename to src/pages/de/concepts/implemented-checks/subsequent-use.mdx
diff --git a/src/pages/de/concepts/index.mdx b/src/pages/de/concepts/index.mdx
new file mode 100644
index 0000000..4563bd9
--- /dev/null
+++ b/src/pages/de/concepts/index.mdx
@@ -0,0 +1,26 @@
+---
+sidebar_position: 1
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+# Ãœberblick
+
+<div className="flex justify-center py-8">
+    <img src="/assets/overview.png" className="h-auto lg:h-[30rem]" alt="Schematische Darstellung der Architektur des Badge API"/>
+</div>
+
+### Grundlagen
+
+Die Badge-API ist ein Dienst, der Repositories nach bestimmten Kriterien durchsucht und auf der Grundlage
+der Ergebnisse Badges generiert. Die Badges werden im openCode-Softwarekatalog angezeigt und geben den Status
+des Repositorys in Bezug auf **Sicherheit**, **Wartung** und **Wiederverwendung** an.
+
+Jede Badge basiert auf einer Reihe von Kriterien, die das Repository erfüllen muss, um die Badge zu erhalten.
+Die Konfiguration der zu erfüllenden Kriterien sind im Abschnitt [Konfiguration](/de/concepts/configuration) definiert.
+
+Alle Kriterien werden wie eine Checkliste bewertet und müssen daher zu einem wahren oder falschen Ergebnis führen.
+Infolgedessen werden einige Prüfungen anhand von Schwellenwerten bewertet (z. B. die Reaktionszeit auf Issues).
+Um die Schwellenwerte zu bestimmen, untersuchen wir die üblichen Werte der Projekte auf openCode und leiten die
+entsprechenden Schwellenwerte aus ihren Mittelwerten und Standardabweichungen ab.
\ No newline at end of file
diff --git a/src/pages/declaration-on-accessibility.mdx b/src/pages/de/erklaerung-zur-barrierefreiheit.mdx
similarity index 100%
rename from src/pages/declaration-on-accessibility.mdx
rename to src/pages/de/erklaerung-zur-barrierefreiheit.mdx
diff --git a/src/pages/index.mdx b/src/pages/de/index.mdx
similarity index 74%
rename from src/pages/index.mdx
rename to src/pages/de/index.mdx
index 613bfc7..d11ab69 100644
--- a/src/pages/index.mdx
+++ b/src/pages/de/index.mdx
@@ -5,8 +5,8 @@ title: Home
 {/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 SPDX-License-Identifier: MIT */}
 
-import Hero from '../components/landing-page/Hero'
-import ApiSmallDemo from '../components/landing-page/ApiSmallDemo'
+import Hero from '../../components/landing-page/Hero'
+import ApiSmallDemo from '../../components/landing-page/ApiSmallDemo'
 
 export default function Home() {
     return (
diff --git a/src/pages/de/introduction.mdx b/src/pages/de/introduction.mdx
new file mode 100644
index 0000000..735c136
--- /dev/null
+++ b/src/pages/de/introduction.mdx
@@ -0,0 +1,58 @@
+---
+sidebar_position: 1
+title: Einführung
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+# Badge Programm
+
+Das Badge Programm prüft openCode Repositories und vergibt Badges, die im
+[openCode Softwarekatalog](https://opencode.de/de/software) angezeigt werden
+und den Status der Repositories in Bezug auf **Wartung**, **Wiederverwendung**
+und **Sicherheit** anzeigen.
+
+Mit der Badge-API können Sie interagieren, indem Sie eine Repository-URL übermitteln.
+Basierend auf den erfüllten Kriterien des Repositorys erhalten Sie entsprechende
+Badges. Zudem stellt die API eine detaillierte Erklärung des Ergebnisses bereit.
+
+## Offizielle Badges auf openCode
+
+Erfahren Sie mehr über die verschiedenen Arten von Badges, die auf openCode verfügbar
+sind, und was sie bedeuten, im Abschnitt [Offizielle Badges 🛡️](/de/official-badges/active-maintained-badge).
+
+## Erfahre mehr
+
+Mehr über die Ideen hinter dem Badge-Programm, die implementierten Prüfungen
+usw. finden Sie im Abschnitt [Konzepte](/de/concepts).
+
+## Los geht's
+
+### Ausprobieren
+
+Sie können die Badge-API ausprobieren, indem Sie die [API-Live-Demo](/de/#api-small-demo) verwenden.
+
+### API verwenden
+
+Das Herzstück des Badge-Programms ist eine RESTful-API.
+Um die Badge-API zu nutzen, können Sie eine Repository-URL übermitteln und erhalten Badges
+basierend auf den erfüllten Kriterien. Eine Übersicht aller verfügbaren Endpunkte sowie
+deren Verwendung finden Sie in der [API-Dokumentation](/de/api-docs).
+
+### Hoste die Badge-API selbst
+
+Sie können die Badge-API selbst hosten. Wir stellen ein [Helm-Chart zur Bereitstellung
+der Badge-API](https://gitlab.opencode.de/open-code/badgebackend/badge-api-helm-chart)
+auf einem Kubernetes-Cluster ⎈ zur Verfügung. 
+Alternativ können Sie die API lokal als Container oder Bare-Metal ausführen.
+
+### Beitragen zum Badge-Programm
+
+Wir freuen uns über Beiträge zum Badge Programm. Den Quellcode finden Sie auf [openCode](https://gitlab.opencode.de/open-code/badgebackend/badge-api).
+Wir freuen uns, wenn Sie die [Richtlinien für Beiträge](https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/blob/main/CONTRIBUTING.md) befolgen.
+Zögern Sie nicht, ein Issue (Ticket) zu eröffnen, wenn Sie Fragen haben oder Hilfe benötigen.
+
+## Lizenz
+
+Dieses Projekt ist unter der MIT-Lizenz lizenziert.
\ No newline at end of file
diff --git a/src/pages/leichte-sprache.mdx b/src/pages/de/leichte-sprache.mdx
similarity index 98%
rename from src/pages/leichte-sprache.mdx
rename to src/pages/de/leichte-sprache.mdx
index 144302a..20ed30c 100644
--- a/src/pages/leichte-sprache.mdx
+++ b/src/pages/de/leichte-sprache.mdx
@@ -1,8 +1,3 @@
----
-sidebar_position: 1
-title: Introduction
----
-
 {/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 SPDX-License-Identifier: MIT */}
 
diff --git a/src/pages/de/official-badges/_meta.ts b/src/pages/de/official-badges/_meta.ts
new file mode 100644
index 0000000..4a967df
--- /dev/null
+++ b/src/pages/de/official-badges/_meta.ts
@@ -0,0 +1,9 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    'active-maintained-badge': { title: 'Wartungs Badge' },
+    'reuse-badge': { title: 'Nachnutzungs Badge' },
+    'open-source-badge': { title: 'Open Source Badge' },
+    'security-badge': { title: 'Security Badge' },
+}
diff --git a/src/pages/de/official-badges/active-maintained-badge.mdx b/src/pages/de/official-badges/active-maintained-badge.mdx
new file mode 100644
index 0000000..d8cbb55
--- /dev/null
+++ b/src/pages/de/official-badges/active-maintained-badge.mdx
@@ -0,0 +1,46 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Maintained Badge
+
+<Callout type="info" emoji="🛡️">
+**Offizielle Badge im openCode Software-Katalog**
+</Callout>
+
+
+<div className="grid grid-cols-none lg:grid-cols-3 gap-4 mt-8 justify-center">
+    <img src="/assets/badges/MAINTAINED-1.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/MAINTAINED-2.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/MAINTAINED-3.svg" className="h-36 lg:h-48"/>
+</div>
+
+Die Badge für aktive Wartung gibt den Wartungsstatus eines Repositorys an.
+Die Badge basiert auf den folgenden Kriterien:
+
+### Stufe 1: Aktive Wartung
+
+Das Projekt erfüllt die Mindestanforderungen für ein gewartetes Projekt. Es wird weiterentwickelt und auf
+Probleme wird schnell reagiert.
+
+- [Commits](/de/concepts/implemented-checks/commits): Mindestens 5 Commits innerhalb der letzten 6 Monate
+- [Reaktionszeit auf Issues](/de/konzepte/implementierte-kontrollen/reaktionszeit-bei-problemen):
+  Die durchschnittliche Reaktionszeit auf Issues, welche innerhalb der letzten 3 Monate entstanden sind, beträgt weniger als 7 Tage
+
+### Level 2: Verlässliche Wartung
+
+Das Projekt erfüllt die Anforderungen für ein zuverlässig gewartetes Projekt. Es werden regelmäßig neue
+Versionen veröffentlicht, auf Probleme wird schnell reagiert und es gibt eine aktive Community.
+
+- Alle Kriterien des ersten Levels
+- [Releases](/de/concepts/implemented-checks/releases): In den letzten 6 Monaten wurde mindestens ein Release oder ein Git-Tag erstellt
+
+### Level 3: Krisensichere Wartung
+
+Das Projekt erfüllt die Anforderungen an ein krisensicher gewartetes Projekt. Es werden regelmäßig neue
+Versionen veröffentlicht, auf Probleme wird schnell reagiert und es gibt eine breite und aktive Community.
+
+- Alle Kriterien der Levels 1 und 2
+- [Bus Faktor](/de/concepts/implemented-checks/bus-factor): Mehrere Maintainer (Einzelpersonen) tragen aktiv zum Projekt bei.
+  Das Projekt hat im Betrachtungszeitraum von 6 Monaten einen Bus-Faktor von mindestens 2.
\ No newline at end of file
diff --git a/src/pages/de/official-badges/open-source-badge.mdx b/src/pages/de/official-badges/open-source-badge.mdx
new file mode 100644
index 0000000..4ba22dd
--- /dev/null
+++ b/src/pages/de/official-badges/open-source-badge.mdx
@@ -0,0 +1,32 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Open Source Badge
+
+<Callout type="info" emoji="🛡️">
+**Offizielle Badge im openCode Software-Katalog**
+</Callout>
+
+<div className="grid grid-cols-none lg:grid-cols-3 gap-4 mt-8 justify-center">
+    <img src="/assets/badges/OSS.svg" className="h-36 lg:h-48"/>
+</div>
+
+Diese Badge zeigt an, ob ein Projekt Open Source ist. Es handelt sich
+um ein manuell vergebenes Badge, das vom openCode-Team ausgestellt wird.
+
+Alle öffentlichen Projekte auf openCode müssen über eine gültige,
+genehmigte Lizenz verfügen. Daher wird grundsätzlich angenommen,
+dass sämtliche Projekte auf openCode Open Source sind.
+
+- Dieses Abzeichen wird für Projekte auf openCode vergeben, die der folgenden Entscheidungsdatei entsprechen: 
+
+```json
+{
+    "granted": [],
+    "grantedRegex": [
+        "^https://gitlab\\.opencode\\.de.*"
+    ]
+}
+```
\ No newline at end of file
diff --git a/src/pages/de/official-badges/reuse-badge.mdx b/src/pages/de/official-badges/reuse-badge.mdx
new file mode 100644
index 0000000..5413dd6
--- /dev/null
+++ b/src/pages/de/official-badges/reuse-badge.mdx
@@ -0,0 +1,40 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Nachnutzungs Badge
+
+<Callout type="info" emoji="🛡️">
+**Offizielle Badge im openCode Software-Katalog**
+</Callout>
+
+<div className="grid grid-cols-none lg:grid-cols-3 gap-4 mt-8 justify-center">
+    <img src="/assets/badges/REUSED-1.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/REUSED-2.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/REUSED-3.svg" className="h-36 lg:h-48"/>
+</div>
+
+Die Badge für Nachnutzung gibt die Eignung und den Grad der Nutzung eines Repositorys an.
+Die Badge basiert auf den folgenden Kriterien:
+
+### Level 1: Bereit zur Nutzung
+
+Das Projekt erfüllt die Anforderungen für eine spätere Verwendung. Pakete werden für die weitere Verwendung bereitgestellt.
+
+- [Pakete](/de/concepts/implemented-checks/packages): In den letzten 6 Monaten wurde mindestens ein Paket veröffentlicht
+- [CI-Pipelines](/de/concepts/implemented-checks/ci-pipeline): In den letzten 6 Monaten gab es mindestens eine erfolgreiche CI-Pipeline
+
+### Level 2: Aktiv genutzt
+
+Das Projekt wird von mindestens einer Organisation produktiv genutzt.
+
+- Alle Kriterien des Levels 1
+- [Nachnutzung](/de/concepts/implemented-checks/subsequent-use): Mindestens eine Organisation nutzt das Projekt aktiv
+
+### Level 3: Häufig aktiv genutzt
+
+Das Projekt wird von mindestens 10 Organisationen produktiv genutzt.
+
+- Alle Kriterien des Levels 1 und 2
+- [Nachnutzung](/de/concepts/implemented-checks/subsequent-use): Mindestens 10 Organisationen nutzen das Projekt aktiv
diff --git a/src/pages/de/official-badges/security-badge.mdx b/src/pages/de/official-badges/security-badge.mdx
new file mode 100644
index 0000000..0b3dab5
--- /dev/null
+++ b/src/pages/de/official-badges/security-badge.mdx
@@ -0,0 +1,37 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Security Badge
+
+<Callout type="warning">
+**Status: In Planung**
+</Callout>
+
+<div className="grid grid-cols-none lg:grid-cols-3 gap-4 mt-8 justify-center">
+    <img src="/assets/badges/SECURITY-1.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/SECURITY-2.svg" className="h-36 lg:h-48"/>
+    <img src="/assets/badges/SECURITY-3.svg" className="h-36 lg:h-48"/>
+</div>
+
+Die Security Badge gibt auskunft über den Sicherheitsstatus eines Repositorys.
+Die Badge basiert auf den folgenden Kriterien:
+
+### Level 1: Basis Sicherheit
+
+- Fehlerberichtsprozess vorhanden: TBD
+- [Reaktionszeit auf Issues](/de/concepts/implemented-checks/issue-reaction-time): TBD
+- Branch protection: TBD
+- Schwachstellenprüfungen - Alter von CVE: TBD
+- Schwachstellenprüfungen - Behebungszeit: TBD
+
+### Level 2: Erweiterte Sicherheit
+- Alle Kriterien des Levels 1
+- Sicherheitsrichtlinie (SECURITY.md): TBD
+- Keine Releases mit bekannten Schwachstellen: TBD
+
+### Level 3: Umfassende Sicherheit
+- Alle Kriterien der Levels 1 und 2
+- Signed Releases: TBD
+- Code-Review-Prozess vorhanden: TBD
\ No newline at end of file
diff --git a/src/pages/en/_meta.ts b/src/pages/en/_meta.ts
new file mode 100644
index 0000000..8990723
--- /dev/null
+++ b/src/pages/en/_meta.ts
@@ -0,0 +1,25 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    index: {
+        theme: {
+            layout: 'raw',
+        },
+        display: 'hidden',
+    },
+    introduction: { title: 'Introduction' },
+    'official-badges': { title: 'Official Badges 🛡️' },
+    concepts: { title: 'Concepts' },
+    'api-docs': { title: 'API' },
+    docs: {
+        title: 'Documentation',
+        type: 'page',
+        href: '/en/introduction',
+    },
+    'live-demo': {
+        title: 'Live Demo 🚀',
+        type: 'page',
+        href: '/en/#api-small-demo',
+    },
+}
diff --git a/src/pages/en/api-docs/_meta.ts b/src/pages/en/api-docs/_meta.ts
new file mode 100644
index 0000000..5ecd98b
--- /dev/null
+++ b/src/pages/en/api-docs/_meta.ts
@@ -0,0 +1,7 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    index: { title: 'Overview' },
+    v1: { title: 'API v1' },
+}
diff --git a/src/pages/en/api-docs/index.mdx b/src/pages/en/api-docs/index.mdx
new file mode 100644
index 0000000..cfdcadc
--- /dev/null
+++ b/src/pages/en/api-docs/index.mdx
@@ -0,0 +1,35 @@
+---
+sidebar_position: 1
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Cards } from 'nextra/components'
+import {
+  LinkIcon,
+  CubeIcon,
+  EyeSlashIcon
+} from '@heroicons/react/24/outline'
+
+# API Documentation
+
+The ZenDiS Badge API repository scanner provides a JSON API to interact with. The following endpoints are available:
+
+<Cards>
+  <Cards.Card
+    icon={<EyeSlashIcon />}
+    title="SARIF Report per Repository"
+    href="api-docs/v1/sarif-per-repo-endpoint"
+  />
+  <Cards.Card
+    icon={<LinkIcon />}
+    title="Badge of a Repository as SVG"
+    href="api-docs/v1/badges#get-svg-badge"
+  />
+  <Cards.Card
+    icon={<CubeIcon />}
+    title="Explanation of a Badge of a Repository"
+    href="api-docs/v1/badges#get-badge-explanation"
+  />
+</Cards>
\ No newline at end of file
diff --git a/src/pages/en/api-docs/v1/_meta.ts b/src/pages/en/api-docs/v1/_meta.ts
new file mode 100644
index 0000000..5c939c3
--- /dev/null
+++ b/src/pages/en/api-docs/v1/_meta.ts
@@ -0,0 +1,7 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    'sarif-per-repo-endpoint': { title: 'SARIF per Repo' },
+    badges: { title: 'Badge per Repo and BadgeId' },
+}
diff --git a/src/pages/en/api-docs/v1/badge-explanation.mdx b/src/pages/en/api-docs/v1/badge-explanation.mdx
new file mode 100644
index 0000000..2d41777
--- /dev/null
+++ b/src/pages/en/api-docs/v1/badge-explanation.mdx
@@ -0,0 +1,71 @@
+---
+sidebar_position: 3
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Tabs, Callout } from 'nextra/components'
+
+# Badge Explanation
+
+## Get the explanation of a badge
+
+<Callout type="info">
+  `GET /api/v1/repositories/{repositoryUrl}/badges/{badgeID}/sarif`
+</Callout>
+
+This endpoint returns the the explanation of a badge for the given repository URL and badge ID.
+
+This endpoint gets parameterized with the repository URL and the badge ID. The repository URL is the URL of the repository that should 
+be or was already scanned. **The URL must be URL encoded** 
+(`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
+
+The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
+[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
+
+### Example Request
+
+<Tabs items={['GO', 'JavaScript', 'curl']}>
+    <Tabs.Tab>
+        ```go filename="main.go" copy
+        package main
+
+        import (
+            "fmt"
+            "io"
+            "net/http"
+        )
+
+        func main() {
+            url := "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED/sarif"
+            resp, err := http.Get(url)
+            if err != nil {
+                fmt.Println("Error:", err)
+                return
+            }
+            defer resp.Body.Close()
+
+            body, _ := io.ReadAll(resp.Body)
+            fmt.Println(string(body))
+        }
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```js filename="main.js" copy
+        const fetch = require('node-fetch');
+
+        const url = 'https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED/sarif';
+
+        fetch(url)
+        .then(response => response.json())
+        .then(data => console.log(data))
+        .catch(error => console.error('Error:', error));
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```bash filename="cli" copy
+        curl -X GET "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED/sarif"
+        ```
+    </Tabs.Tab>
+</Tabs>
\ No newline at end of file
diff --git a/src/pages/en/api-docs/v1/badges.mdx b/src/pages/en/api-docs/v1/badges.mdx
new file mode 100644
index 0000000..85e445f
--- /dev/null
+++ b/src/pages/en/api-docs/v1/badges.mdx
@@ -0,0 +1,71 @@
+---
+sidebar_position: 2
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Tabs, Callout } from 'nextra/components'
+
+# Badges
+
+## Get SVG Badge
+
+<Callout type="info">
+  `GET /api/v1/repositories/{repositoryUrl}/badges/{badgeID}`
+</Callout>
+
+This endpoint returns the **SVG badge** for the given repository URL and badge ID.
+
+This endpoint gets parameterized with the repository URL and the badge ID. The repository URL is the URL of the repository that should 
+be or was already scanned. **The URL must be URL encoded** 
+(`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
+
+The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
+[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
+
+### Example Request
+
+<Tabs items={['GO', 'JavaScript', 'curl']}>
+    <Tabs.Tab>
+        ```go filename="main.go" copy
+        package main
+
+        import (
+            "fmt"
+            "io"
+            "net/http"
+        )
+
+        func main() {
+            url := "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED"
+            resp, err := http.Get(url)
+            if err != nil {
+                fmt.Println("Error:", err)
+                return
+            }
+            defer resp.Body.Close()
+
+            body, _ := io.ReadAll(resp.Body)
+            fmt.Println(string(body))
+        }
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```js filename="main.js" copy
+        const fetch = require('node-fetch');
+
+        const url = 'https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED';
+
+        fetch(url)
+        .then(response => response.json())
+        .then(data => console.log(data))
+        .catch(error => console.error('Error:', error));
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```bash filename="cli" copy
+        curl -X GET "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/badges/MAINTAINED"
+        ```
+    </Tabs.Tab>
+</Tabs>
diff --git a/src/pages/en/api-docs/v1/sarif-per-repo-endpoint.mdx b/src/pages/en/api-docs/v1/sarif-per-repo-endpoint.mdx
new file mode 100644
index 0000000..dc137c8
--- /dev/null
+++ b/src/pages/en/api-docs/v1/sarif-per-repo-endpoint.mdx
@@ -0,0 +1,572 @@
+---
+sidebar_position: 1
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Tabs, Callout } from 'nextra/components'
+
+# SARIF per Repository
+
+<Callout type="info">
+  `GET /api/v1/repositories/{repositoryUrl}/sarif`
+</Callout>
+
+This endpoint gets parameterized with the **full repository URL**. The repository URL is the URL of the repository that should be scanned.
+**The URL must be URL encoded** 
+(`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
+
+Using this format opens the possibility to scan repositories from other platforms like GitHub, Bitbucket, etc. Besides 
+that, caching is simplified because the URL is unique (instead of using the project ID and a platform URL as query string for 
+example) and the URL is human-readable, at least after URL decoding. This might improve debugging in the future.
+
+The result is returned in [SARIF format](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning). 
+**SARIF simplifies possible later integration with other tools. It is an open standard and widely supported.**
+
+### Example Request
+
+<Tabs items={['GO', 'JavaScript', 'curl']}>
+    <Tabs.Tab>
+        ```go filename="main.go" copy
+        package main
+
+        import (
+            "fmt"
+            "io"
+            "net/http"
+        )
+
+        func main() {
+            url := "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/sarif"
+            resp, err := http.Get(url)
+            if err != nil {
+                fmt.Println("Error:", err)
+                return
+            }
+            defer resp.Body.Close()
+
+            body, _ := io.ReadAll(resp.Body)
+            fmt.Println(string(body))
+        }
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```js filename="main.js" copy
+        const fetch = require('node-fetch');
+
+        const url = 'https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/sarif';
+
+        fetch(url)
+        .then(response => response.json())
+        .then(data => console.log(data))
+        .catch(error => console.error('Error:', error));
+        ```
+    </Tabs.Tab>
+    <Tabs.Tab>
+        ```bash filename="cli" copy
+        curl -X GET "https://scanner.zend.is/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/sarif"
+        ```
+    </Tabs.Tab>
+</Tabs>
+
+### Example JSON Response
+
+```json
+{
+  "$schema": "https://www.schemastore.org/schemas/json/sarif-2.1.0.json",
+  "runs": [
+    {
+      "properties": {
+        "badges": [
+          {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "BRONZE",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-1.svg",
+            "badgeGranted": true,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": false,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "The number of commits in the last 6 months. (The current value is 39)",
+                  "value": "39",
+                  "status": "pass",
+                  "ruleId": "COMMITS",
+                  "threshold": {
+                    "min": 5,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4"
+                }
+              ]
+            }
+          },
+          {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "SILVER",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-2.svg",
+            "badgeGranted": true,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": false,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "The number of commits in the last 6 months. (The current value is 39)",
+                  "value": "39",
+                  "status": "pass",
+                  "ruleId": "COMMITS",
+                  "threshold": {
+                    "min": 5,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4"
+                },
+                {
+                  "description": "The minimum time it takes for a project member to react to an issue in the last 3 months. (The current value is <nil>)",
+                  "value": "<nil>",
+                  "status": "open",
+                  "ruleId": "ISSUE_REACTION_TIME",
+                  "threshold": {
+                    "max": 7,
+                    "timeRangeInMonths": 3
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "SILVER"
+                }
+              ]
+            }
+          },
+          {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "GOLD",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/MAINTAINED-3.svg",
+            "badgeGranted": true,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": true,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "The number of commits in the last 6 months. (The current value is 39)",
+                  "value": "39",
+                  "status": "pass",
+                  "ruleId": "COMMITS",
+                  "threshold": {
+                    "min": 5,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4"
+                },
+                {
+                  "description": "The minimum time it takes for a project member to react to an issue in the last 3 months. (The current value is <nil>)",
+                  "value": "<nil>",
+                  "status": "open",
+                  "ruleId": "ISSUE_REACTION_TIME",
+                  "threshold": {
+                    "max": 7,
+                    "timeRangeInMonths": 3
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "SILVER"
+                },
+                {
+                  "description": "The number of tags/releases in the last 6 months. (The current value is 1)",
+                  "value": "1",
+                  "status": "pass",
+                  "ruleId": "RELEASES",
+                  "threshold": {
+                    "min": 1,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "MAINTAINED",
+                  "badgeLevel": "GOLD",
+                  "evidence": "The number of tags/releases in the last 6 months is 1 (1 tag(s) of which 0 are releases). The following tags/releases were found: tag:v1.1.0"
+                }
+              ]
+            }
+          },
+          {
+            "badgeId": "REUSED",
+            "badgeLevel": "BRONZE",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/badge-api/-/raw/main/assets/REUSED-1.svg",
+            "badgeGranted": false,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": false,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "The project has a packaging system in place and used it during the last 6 months. It checks the container registry, the package registry and the releases. It expects either a release to have assets or packages inside those two registries (The current value is 0)",
+                  "value": "0",
+                  "status": "fail",
+                  "ruleId": "PACKAGES",
+                  "threshold": {
+                    "min": 1,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "REUSED",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "No container tags, packages or releases with assets found."
+                },
+                {
+                  "description": "The number of CI pipeline runs in the last 6 months. (The current value is 56)",
+                  "value": "56",
+                  "status": "pass",
+                  "ruleId": "CI_PIPELINE",
+                  "threshold": {
+                    "min": 1,
+                    "timeRangeInMonths": 6
+                  },
+                  "badgeId": "REUSED",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "The number of CI pipeline runs in the last 6 months is 56 (43 of 56 were successful)."
+                }
+              ]
+            }
+          },
+          {
+            "badgeId": "DIN-SPEC-XXXX",
+            "badgeLevel": "BRONZE",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/din-spec-xxxx.svg",
+            "badgeGranted": false,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": false,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "Provides a badge for projects that are compliant with DIN SPEC XXXX. This badge is granted manually trough the DIN SPEC XXXX working group. (The current value is 0)",
+                  "value": "0",
+                  "status": "fail",
+                  "ruleId": "MANUAL/DIN SPEC XXXX compliant",
+                  "threshold": {
+                    "min": 1
+                  },
+                  "badgeId": "DIN-SPEC-XXXX",
+                  "badgeLevel": "BRONZE",
+                  "evidence": "Check was not manually granted"
+                }
+              ]
+            }
+          },
+          {
+            "badgeId": "OPEN-SOURCE",
+            "badgeLevel": "GOLD",
+            "badgeUrl": "https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/open-source.svg",
+            "badgeGranted": true,
+            "badgeInformationUri": "",
+            "isHighestGrantedBadge": true,
+            "badgeExplanation": {
+              "criteria": [
+                {
+                  "description": "Provides a badge for projects that are open-source. This badge is granted manually by the openCode team. (The current value is 1)",
+                  "value": "1",
+                  "status": "pass",
+                  "ruleId": "MANUAL/Project is open source",
+                  "threshold": {
+                    "min": 1
+                  },
+                  "badgeId": "OPEN-SOURCE",
+                  "badgeLevel": "GOLD",
+                  "evidence": "Check was manually granted"
+                }
+              ]
+            }
+          }
+        ],
+        "testedRepository": "https://gitlab.opencode.de/bmi/ozg-rahmenarchitektur/ozgsec/ozgsec-best-practice-scanner"
+      },
+      "results": [
+        {
+          "kind": "pass",
+          "message": "The number of commits in the last 6 months. (The current value is 39)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "BRONZE",
+            "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4",
+            "threshold": {
+              "min": 5,
+              "timeRangeInMonths": 6
+            },
+            "value": "39"
+          },
+          "ruleId": "COMMITS",
+          "ruleIndex": 0
+        },
+        {
+          "kind": "pass",
+          "message": "The number of commits in the last 6 months. (The current value is 39)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "BRONZE",
+            "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4",
+            "threshold": {
+              "min": 5,
+              "timeRangeInMonths": 6
+            },
+            "value": "39"
+          },
+          "ruleId": "COMMITS",
+          "ruleIndex": 0
+        },
+        {
+          "kind": "open",
+          "message": "The minimum time it takes for a project member to react to an issue in the last 3 months. (The current value is <nil>)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "SILVER",
+            "evidence": "",
+            "threshold": {
+              "max": 7,
+              "timeRangeInMonths": 3
+            },
+            "value": "<nil>"
+          },
+          "ruleId": "ISSUE_REACTION_TIME",
+          "ruleIndex": 1
+        },
+        {
+          "kind": "pass",
+          "message": "The number of commits in the last 6 months. (The current value is 39)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "BRONZE",
+            "evidence": "The number of commits in the last 6 months is 39. First commit dd519848, last commit e5eaf6c4",
+            "threshold": {
+              "min": 5,
+              "timeRangeInMonths": 6
+            },
+            "value": "39"
+          },
+          "ruleId": "COMMITS",
+          "ruleIndex": 0
+        },
+        {
+          "kind": "open",
+          "message": "The minimum time it takes for a project member to react to an issue in the last 3 months. (The current value is <nil>)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "SILVER",
+            "evidence": "",
+            "threshold": {
+              "max": 7,
+              "timeRangeInMonths": 3
+            },
+            "value": "<nil>"
+          },
+          "ruleId": "ISSUE_REACTION_TIME",
+          "ruleIndex": 1
+        },
+        {
+          "kind": "pass",
+          "message": "The number of tags/releases in the last 6 months. (The current value is 1)",
+          "properties": {
+            "badgeId": "MAINTAINED",
+            "badgeLevel": "GOLD",
+            "evidence": "The number of tags/releases in the last 6 months is 1 (1 tag(s) of which 0 are releases). The following tags/releases were found: tag:v1.1.0",
+            "threshold": {
+              "min": 1,
+              "timeRangeInMonths": 6
+            },
+            "value": "1"
+          },
+          "ruleId": "RELEASES",
+          "ruleIndex": 2
+        },
+        {
+          "kind": "fail",
+          "message": "The project has a packaging system in place and used it during the last 6 months. It checks the container registry, the package registry and the releases. It expects either a release to have assets or packages inside those two registries (The current value is 0)",
+          "properties": {
+            "badgeId": "REUSED",
+            "badgeLevel": "BRONZE",
+            "evidence": "No container tags, packages or releases with assets found.",
+            "threshold": {
+              "min": 1,
+              "timeRangeInMonths": 6
+            },
+            "value": "0"
+          },
+          "ruleId": "PACKAGES",
+          "ruleIndex": 3
+        },
+        {
+          "kind": "pass",
+          "message": "The number of CI pipeline runs in the last 6 months. (The current value is 56)",
+          "properties": {
+            "badgeId": "REUSED",
+            "badgeLevel": "BRONZE",
+            "evidence": "The number of CI pipeline runs in the last 6 months is 56 (43 of 56 were successful).",
+            "threshold": {
+              "min": 1,
+              "timeRangeInMonths": 6
+            },
+            "value": "56"
+          },
+          "ruleId": "CI_PIPELINE",
+          "ruleIndex": 4
+        },
+        {
+          "kind": "fail",
+          "message": "Provides a badge for projects that are compliant with DIN SPEC XXXX. This badge is granted manually trough the DIN SPEC XXXX working group. (The current value is 0)",
+          "properties": {
+            "badgeId": "DIN-SPEC-XXXX",
+            "badgeLevel": "BRONZE",
+            "evidence": "Check was not manually granted",
+            "threshold": {
+              "min": 1
+            },
+            "value": "0"
+          },
+          "ruleId": "MANUAL/DIN SPEC XXXX compliant",
+          "ruleIndex": 5
+        },
+        {
+          "kind": "pass",
+          "message": "Provides a badge for projects that are open-source. This badge is granted manually by the openCode team. (The current value is 1)",
+          "properties": {
+            "badgeId": "OPEN-SOURCE",
+            "badgeLevel": "GOLD",
+            "evidence": "Check was manually granted",
+            "threshold": {
+              "min": 1
+            },
+            "value": "1"
+          },
+          "ruleId": "MANUAL/Project is open source",
+          "ruleIndex": 6
+        }
+      ],
+      "tool": {
+        "driver": {
+          "informationUri": "https://gitlab.opencode.de/open-code/badgebackend/badge-api",
+          "name": "badge-api",
+          "rules": [
+            {
+              "id": "COMMITS",
+              "name": "Commits",
+              "fullDescription": {
+                "text": "The number of commits in the last 6 months."
+              },
+              "help": {
+                "text": "The number of commits in the last 6 months."
+              },
+              "properties": {
+                "unit": "commits",
+                "threshold": {
+                  "min": 5,
+                  "timeRangeInMonths": 6
+                }
+              }
+            },
+            {
+              "id": "ISSUE_REACTION_TIME",
+              "name": "Issue Reaction Time",
+              "fullDescription": {
+                "text": "The minimum time it takes for a project member to react to an issue in the last 3 months."
+              },
+              "help": {
+                "text": "The minimum time it takes for a project member to react to an issue in the last 3 months."
+              },
+              "properties": {
+                "unit": "days",
+                "threshold": {
+                  "max": 7,
+                  "timeRangeInMonths": 3
+                }
+              }
+            },
+            {
+              "id": "RELEASES",
+              "name": "Releases",
+              "fullDescription": {
+                "text": "The number of tags/releases in the last 6 months."
+              },
+              "help": {
+                "text": "The number of tags/releases in the last 6 months."
+              },
+              "properties": {
+                "unit": "releases",
+                "threshold": {
+                  "min": 1,
+                  "timeRangeInMonths": 6
+                }
+              }
+            },
+            {
+              "id": "PACKAGES",
+              "name": "Packaging",
+              "fullDescription": {
+                "text": "The project has a packaging system in place and used it during the last 6 months. It checks the container registry, the package registry and the releases. It expects either a release to have assets or packages inside those two registries"
+              },
+              "help": {
+                "text": "Packaging is a way to distribute software. It is important to have a packaging system in place to make it easier for users to install and use the software. Packaging systems can help automate the process of installing software, manage dependencies, and ensure that the software is installed correctly. This check looks for a packaging system in the project and checks if it has been used in the last 6 months."
+              },
+              "properties": {
+                "unit": "packages",
+                "threshold": {
+                  "min": 1,
+                  "timeRangeInMonths": 6
+                }
+              }
+            },
+            {
+              "id": "CI_PIPELINE",
+              "name": "CI Pipeline Runs",
+              "fullDescription": {
+                "text": "The number of CI pipeline runs in the last 6 months."
+              },
+              "help": {
+                "text": "The number of CI pipeline runs the last 6 months."
+              },
+              "properties": {
+                "unit": "runs",
+                "threshold": {
+                  "min": 1,
+                  "timeRangeInMonths": 6
+                }
+              }
+            },
+            {
+              "id": "MANUAL/DIN SPEC XXXX compliant",
+              "name": "DIN SPEC XXXX compliant",
+              "fullDescription": {
+                "text": "Provides a badge for projects that are compliant with DIN SPEC XXXX. This badge is granted manually trough the DIN SPEC XXXX working group."
+              },
+              "help": {
+                "text": "This is a manual check"
+              },
+              "properties": {
+                "unit": "",
+                "threshold": {
+                  "min": 1
+                }
+              }
+            },
+            {
+              "id": "MANUAL/Project is open source",
+              "name": "Project is open source",
+              "fullDescription": {
+                "text": "Provides a badge for projects that are open-source. This badge is granted manually by the openCode team."
+              },
+              "help": {
+                "text": "This is a manual check"
+              },
+              "properties": {
+                "unit": "",
+                "threshold": {
+                  "min": 1
+                }
+              }
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "version": "2.1.0"
+}
+```
\ No newline at end of file
diff --git a/src/pages/concepts/_meta.ts b/src/pages/en/concepts/_meta.ts
similarity index 100%
rename from src/pages/concepts/_meta.ts
rename to src/pages/en/concepts/_meta.ts
diff --git a/src/pages/concepts/configuration/_meta.ts b/src/pages/en/concepts/configuration/_meta.ts
similarity index 100%
rename from src/pages/concepts/configuration/_meta.ts
rename to src/pages/en/concepts/configuration/_meta.ts
diff --git a/src/pages/concepts/configuration/index.mdx b/src/pages/en/concepts/configuration/index.mdx
similarity index 100%
rename from src/pages/concepts/configuration/index.mdx
rename to src/pages/en/concepts/configuration/index.mdx
diff --git a/src/pages/en/concepts/configuration/manual-checks.mdx b/src/pages/en/concepts/configuration/manual-checks.mdx
new file mode 100644
index 0000000..00aadff
--- /dev/null
+++ b/src/pages/en/concepts/configuration/manual-checks.mdx
@@ -0,0 +1,23 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+# Manual checks
+
+Manual checks are a special type of check that is not automatically evaluated by the badge API. 
+Instead, the result of the check is provided by a JSON file that is hosted on a server reachable by the Badge API Instance. 
+The JSON file contains a list of granted projects or a regex pattern for granted projects.
+
+You can provide a GitLab personal access token via the environment variable `GITLAB_TOKEN` to access a private repository 
+where the JSON file is stored.
+
+```json filename="manual-check.json" copy
+{
+    "granted": [],
+    "grantedRegex": [
+        "^https://gitlab\\.opencode\\.de.*"
+    ]
+}
+```
+
+The file is referenced in the `.badge-api.yaml` configuration file of the badge. 
+See more details about the [configuration file](/en/concepts/configuration).
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/_meta.ts b/src/pages/en/concepts/implemented-checks/_meta.ts
new file mode 100644
index 0000000..b4b5580
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/_meta.ts
@@ -0,0 +1,6 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
+export default {
+    index: { title: 'Overview' },
+}
diff --git a/src/pages/en/concepts/implemented-checks/bus-factor.mdx b/src/pages/en/concepts/implemented-checks/bus-factor.mdx
new file mode 100644
index 0000000..3a06a54
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/bus-factor.mdx
@@ -0,0 +1,32 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Bus Factor
+
+<Callout type="default">
+  Check type: `BUS_FACTOR`
+</Callout>
+
+This check calculates the bus factor of a project for a given time range.
+The check passes if the bus factor is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: BUS_FACTOR
+  description: Checks if multiple maintainers are working on the project.
+  threshold:
+    timeRangeInMonths: 6
+    min: 2
+```
+
+### Background
+
+The bus factor is a measure of the risk resulting from information and capabilities not being shared among team members.
+
+Imagine there is a pretty precise bus that unfortunately hits always exactly one person. The bus factor is the number of people
+that need to be hit by the bus until half of the projects commits have no living producer anymore. The higher the bus factor,
+the lower the risk of the project failing due to the loss of a single person.
+
+For example if a project has a bus factor of 2, it means that the 2 most important contributors are responsible for 50% of the commits
+and after both are gone, the project would be in danger.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/ci-pipeline.mdx b/src/pages/en/concepts/implemented-checks/ci-pipeline.mdx
new file mode 100644
index 0000000..be4ba5e
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/ci-pipeline.mdx
@@ -0,0 +1,36 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# CI Pipeline
+
+<Callout type="default">
+  Check type: `CI_PIPELINE`
+</Callout>
+
+This check queries the GitLab API and counts the number of CI pipeline runs (whether successfull or failed)
+in the time range.
+The check passes if the number of commits is greater than or equal to the minimum threshold.
+
+The number of successfull CI pipeline runs is provided as info in the evidence of the API Response.
+
+```yaml filename=".badge-api.yaml" copy
+- type: CI_PIPELINE
+  description: "Describe the check in context of your badge and level"
+  threshold:
+    timeRangeInMonths: 6
+    min: 1
+```
+
+### Background
+
+Measuring the number of CI pipeline runs can help gauge the stability and reliability of a project's 
+development process. A high number of successful pipeline runs indicates a well-maintained and 
+stable codebase, with regular testing and validation.
+
+- Continuous Integration Health: Frequent CI pipeline runs indicates that the project is undergoing regular 
+automated testing, catching errors early, and ensuring the quality of the software.
+
+- Development Efficiency: A smooth CI pipeline also reflects the development team's efficiency in 
+integrating and testing new changes, improving the project's overall workflow and reducing the likelihood of issues in production.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/commits.mdx b/src/pages/en/concepts/implemented-checks/commits.mdx
new file mode 100644
index 0000000..c9418f1
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/commits.mdx
@@ -0,0 +1,27 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Commits
+
+<Callout type="default">
+  Check type: `COMMITS`
+</Callout>
+
+This check queries the GitLab API and counts the number of commits in a given time range. 
+The check passes if the number of commits is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: COMMITS
+  description: "Describe the check in context of your badge and level"
+  threshold:
+    timeRangeInMonths: 6
+    min: 5
+```
+
+### Background
+
+Counting commits within a time range can be part of measuring a project's activity and maintenance. 
+Frequent commits indicate active development, bug fixes, and ongoing improvements. A high commit 
+count can reflect engaged contributors and project evolution, while fewer commits may signal stagnation.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/elephant-factor.mdx b/src/pages/en/concepts/implemented-checks/elephant-factor.mdx
new file mode 100644
index 0000000..1caed0f
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/elephant-factor.mdx
@@ -0,0 +1,31 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Elephant Factor
+
+<Callout type="default">
+  Check type: `ELEPHANT_FACTOR`
+</Callout>
+
+This check calculates the elephant factor of a project for a given time range.
+The check passes if the elephant factor is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: ELEPHANT_FACTOR
+  description: Checks if multiple companies are working on the project.
+  threshold:
+    timeRangeInMonths: 6
+    min: 2
+```
+
+### Background
+
+The elephant factor is a measure of the risk resulting from information and capabilities not being shared among organizations.
+
+It is similar to the [bus factor](/en/concepts/implemented-checks/bus-factor) but instead of measuring the risk of losing individuals,
+it measures the risk of losing organizations.
+
+For example, if a project has an elephant factor of 2, it means that the 2 most important organizations are responsible for 50% of the commits
+and after both are gone, the project would be in danger. 
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/index.mdx b/src/pages/en/concepts/implemented-checks/index.mdx
new file mode 100644
index 0000000..040aaa8
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/index.mdx
@@ -0,0 +1,16 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+# Overview of Implemented Checks
+
+The following checks are implemented and can be used to generate badges:
+
+- [`BUS_FACTOR` ↗](/en/concepts/implemented-checks/bus-factor)
+- [`CI_PIPELINE` ↗](/en/concepts/implemented-checks/ci-pipeline)
+- [`COMMITS` ↗](/en/concepts/implemented-checks/commits)
+- [`ELEPHANT_FACTOR` ↗](/en/concepts/implemented-checks/elephant-factor)
+- [`ISSUE_REACTION_TIME` ↗](/en/concepts/implemented-checks/issue-reaction-time)
+- [`PACKAGES` ↗](/en/concepts/implemented-checks/packages)
+- [`PROTECTED_BRANCHES` ↗](/en/concepts/implemented-checks/protected-branches)
+- [`RELEASES` ↗](/en/concepts/implemented-checks/releases)
+- [`SUBSEQUENT_USE` ↗](/en/concepts/implemented-checks/subsequent-use)
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/issue-reaction-time.mdx b/src/pages/en/concepts/implemented-checks/issue-reaction-time.mdx
new file mode 100644
index 0000000..8ca4f1b
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/issue-reaction-time.mdx
@@ -0,0 +1,55 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Issue Reaction Time
+
+<Callout type="default">
+  Check type: `ISSUE_REACTION_TIME`
+</Callout>
+
+This check queries the GitLab API for the minimum time it takes for a project member to react to an issue in the given time range.
+The check passes if the number of commits is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: ISSUE_REACTION_TIME
+  description: "Describe the check in context of your badge and level"
+  threshold:
+    timeRangeInMonths: 3
+    max: 7
+```
+
+The issue response time is the time between the creation of an issue in a project and the first valid response.
+
+A **project member** is a user matching one of the following criteria:
+
+- A member of the project (as returned by the project member API of GitLab)
+- A user who has created at least 5% (magic number) of all issues and/or commits in the project
+
+**The conditions apply simultaneously and not independently of each other:**
+
+- If a project does not have any issues, the check will pass.
+- Issues created by project members are not considered.
+- Every (automatic) action in the stream of an issue, except comments such as “Mentioned in MR” or “labeled” or “Assigned to” etc. are evaluated as a valid issue reaction.
+- A comment is considered a valid response if the comment is submitted by a project member.
+- A comment is not considered a valid response if a non-project member responds to the ticket of a non-project member.
+
+### Background
+
+Measuring issue reaction time is a valuable metric for assessing a project's maintenance and responsiveness. 
+A quick reaction time indicates that project maintainers are actively monitoring and addressing issues, which 
+reflects good project health and responsiveness.
+
+- Indicator of Active Maintenance: Fast issue responses signal that the project is being actively maintained, 
+with attention to bugs, feature requests, or other user concerns. Slow reactions might suggest neglect, 
+which could impact the user experience or drive away contributors.
+
+- Community Engagement: Quick reactions from project members also demonstrate an engaged and supportive community.
+It shows that maintainers or contributors are available to help, fostering a more collaborative and productive environment.
+
+- User Confidence: Projects with shorter issue reaction times inspire greater confidence in users, as they know 
+their concerns will be addressed promptly, making the project more appealing for adoption and contribution.
+
+In summary, tracking issue reaction time helps gauge the level of active maintenance, community involvement, 
+and responsiveness, which are crucial for the long-term success and sustainability of a project.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/packages.mdx b/src/pages/en/concepts/implemented-checks/packages.mdx
new file mode 100644
index 0000000..ef198d0
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/packages.mdx
@@ -0,0 +1,33 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Packages
+
+<Callout type="default">
+  Check type: `PACKAGES`
+</Callout>
+
+The check passes if the project has a packaging system in place and used it the give times during the given time range.
+It checks the container registry, the package registry and the releases. It expects either a release to 
+have assets or packages inside those two registries.
+
+
+```yaml filename=".badge-api.yaml" copy
+- type: PACKAGES
+  description: "Describe the check in context of your badge and level"
+  threshold:
+    timeRangeInMonths: 6
+    max: 1
+```
+
+### Background
+
+Packaging is a way to distribute software. It is important to have a packaging system in place to make it 
+easier for users to install and use the software. Packaging systems can help automate the process of 
+installing software, manage dependencies, and ensure that the software is installed correctly.
+Regularly updating these registries signals active maintenance, showing that the project is well-supported
+and evolving. Versioning helps users track updates and access stable releases, while consistent
+packaging enhances compatibility and consistency across environments. Overall, using packaging systems
+improves software accessibility, signals good project health, and fosters reliability and reuse.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/protected-branches.mdx b/src/pages/en/concepts/implemented-checks/protected-branches.mdx
new file mode 100644
index 0000000..64e9230
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/protected-branches.mdx
@@ -0,0 +1,35 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Protected Branches
+
+<Callout type="default">
+  Check type: `PROTECTED_BRANCHES`
+</Callout>
+
+This check verifies if the main branch is protected and if force push is disabled for default branches.
+The check passes if the main branch is protected and force push is disabled for default branches and 
+the minimum permission level for access to the main and default branch is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: PROTECTED_BRANCHES
+  description: Checks if main branch is protected and if force push is disabled for default branches
+  threshold:
+    min: 40 # 0: no access; 30: Developer access; 40: Maintainer access; 60: Admin access
+```
+
+### Background
+
+Protected branches are an important feature of Git repositories that help maintain the integrity of the codebase.
+By protecting branches, you can prevent accidental changes, enforce code review policies, and ensure that only
+authorized users can change the codebase.
+
+The main branch is often the default branch in a repository and serves as the primary
+branch for the project. Protecting the main branch ensures that only authorized users can push changes to it,
+reducing the risk of accidental changes or unauthorized modifications.
+
+Force push is a Git operation that allows you to overwrite the history of a branch, potentially losing commits
+and making it difficult to track changes. Disabling force push for default branches helps maintain the integrity
+of the commit history and ensures that changes are tracked accurately.
\ No newline at end of file
diff --git a/src/pages/en/concepts/implemented-checks/releases.mdx b/src/pages/en/concepts/implemented-checks/releases.mdx
new file mode 100644
index 0000000..3562e8e
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/releases.mdx
@@ -0,0 +1,45 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Releases
+
+<Callout type="default">
+  Check type: `RELEASES`
+</Callout>
+
+This check queries the GitLab API and counts the number of tags/releases in the time range.
+The check passes if the number of tags/releases is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: RELEASES
+  description: "Describe the check in context of your badge and level"
+  threshold:
+    timeRangeInMonths: 6
+    max: 1
+```
+
+### Background
+
+The use of tags and releases in a project can be an indicator of its maintenance, stability, and ease of reuse. 
+Tags and releases allow developers to mark specific points in a project's history, often representing stable versions, 
+important updates, or significant milestones.
+
+- Maintenance Indicator: Regular releases and tags show that a project is actively maintained. If releases are 
+consistently made, it indicates that the project is receiving attention and updates from its maintainers. 
+Conversely, a lack of releases over a prolonged period might suggest that the project is abandoned or in a stagnant state.
+
+- Versioning and Stability: Tags often correspond to stable points in the project's development. 
+They help define and communicate specific versions of the software, making it easier to track 
+changes over time. Users or other developers relying on your project can be confident in the 
+version they're using, knowing it's a defined, stable release.
+
+- Ease of Reuse: Projects with regular, well-documented releases are easier to reuse in other projects. 
+When developers can clearly see what versions of a project are available, it's much simpler to pick the right 
+one for their needs. Furthermore, proper tagging allows users to access more recent or earlier versions of the project, 
+if needed, without the risk of breaking changes or similar issues.
+
+In essence, keeping tags and releases up-to-date and within a sensible threshold makes your project 
+more attractive for contributors, users, and those looking to integrate it into their own work. 
+It builds trust, improves usability, and ensures your project remains relevant over time.
diff --git a/src/pages/en/concepts/implemented-checks/subsequent-use.mdx b/src/pages/en/concepts/implemented-checks/subsequent-use.mdx
new file mode 100644
index 0000000..8ddac1f
--- /dev/null
+++ b/src/pages/en/concepts/implemented-checks/subsequent-use.mdx
@@ -0,0 +1,32 @@
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import { Callout } from 'nextra/components'
+
+# Subsequent Use
+
+<Callout type="default">
+  Check type: `SUBSEQUENT_USE`
+</Callout>
+
+This check fetches the number of organizations that reported using the project in production.
+The check passes if the number of using organizations is greater than or equal to the minimum threshold.
+
+```yaml filename=".badge-api.yaml" copy
+- type: SUBSEQUENT_USE
+  description: Check if at least 10 organizations are using it in production
+  threshold:
+    min: 10
+```
+
+### Background
+
+The subsequent use check is a measure of the project's adoption in the community.
+
+Organizations can report to the openCode team that they are using a project in production. 
+In addition, the openCode team records subsequent use cases if a case becomes known in the
+context of projects, collaborations or similar that has not yet been recorded.
+
+The more organizations use a project, the more likely it is that the project is stable,
+well-documented, and has a good reputation. This is an important indicator for the
+sustainability and quality of a project.
\ No newline at end of file
diff --git a/src/pages/concepts/index.mdx b/src/pages/en/concepts/index.mdx
similarity index 93%
rename from src/pages/concepts/index.mdx
rename to src/pages/en/concepts/index.mdx
index b6910fa..ac65a24 100644
--- a/src/pages/concepts/index.mdx
+++ b/src/pages/en/concepts/index.mdx
@@ -18,7 +18,7 @@ The badges are displayed in the openCode software catalog and indicate the statu
 **security**, **maintenance**, and **reuse**.
 
 Each badge is based on a set of criteria that the repository must meet to receive the badge. The Badges and the criteria to 
-meet are defined in the [configuration](/concepts/configuration) section.
+meet are defined in the [configuration](/en/concepts/configuration) section.
 
 All criteria are evaluated bluntly like a checklist and must therefore lead to a true or false result. 
 As a result, some checks are evaluated based on thresholds (e.g. the issue reaction time). 
diff --git a/src/pages/en/index.mdx b/src/pages/en/index.mdx
new file mode 100644
index 0000000..d11ab69
--- /dev/null
+++ b/src/pages/en/index.mdx
@@ -0,0 +1,20 @@
+---
+title: Home
+---
+
+{/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+SPDX-License-Identifier: MIT */}
+
+import Hero from '../../components/landing-page/Hero'
+import ApiSmallDemo from '../../components/landing-page/ApiSmallDemo'
+
+export default function Home() {
+    return (
+        <div className="overflow-hidden">
+            <Hero />
+            <main>
+            <ApiSmallDemo />
+            </main>
+        </div>
+    )
+}
diff --git a/src/pages/introduction.mdx b/src/pages/en/introduction.mdx
similarity index 87%
rename from src/pages/introduction.mdx
rename to src/pages/en/introduction.mdx
index d64a17d..0356ee6 100644
--- a/src/pages/introduction.mdx
+++ b/src/pages/en/introduction.mdx
@@ -17,22 +17,22 @@ provide you a detailed explanation of the result too.
 
 ## Official Badges on openCode
 
-Learn about the different types of badges that are available on openCode and what they mean in the [Official Badges 🛡️](/official-badges) section.
+Learn about the different types of badges that are available on openCode and what they mean in the [Official Badges 🛡️](/en/official-badges/active-maintained-badge) section.
 
 ## Learn more
 
-Learn more about the ideas behind the Badge Programm, implemented checks, etc. in the [Concepts](/concepts) section.
+Learn more about the ideas behind the Badge Programm, implemented checks, etc. in the [Concepts](/en/concepts) section.
 
 ## Getting started 
 
 ### Try it out
 
-You can try out the Badge API by using the [API Live Demo](/#api-small-demo).
+You can try out the Badge API by using the [API Live Demo](/en/#api-small-demo).
 
 ### Use the API
 
 To use the Badge RESTful API, you can submit a repository URL to the API and receive badges based on the criteria that the repository meets. 
-See all available endpoints and how to use them in the [API documentation](/api-docs).
+See all available endpoints and how to use them in the [API documentation](/en/api-docs).
 
 ### Host the Badge API yourself
 
diff --git a/src/pages/official-badges/_meta.ts b/src/pages/en/official-badges/_meta.ts
similarity index 100%
rename from src/pages/official-badges/_meta.ts
rename to src/pages/en/official-badges/_meta.ts
diff --git a/src/pages/official-badges/active-maintained-badge.mdx b/src/pages/en/official-badges/active-maintained-badge.mdx
similarity index 70%
rename from src/pages/official-badges/active-maintained-badge.mdx
rename to src/pages/en/official-badges/active-maintained-badge.mdx
index 403df6b..8ddca48 100644
--- a/src/pages/official-badges/active-maintained-badge.mdx
+++ b/src/pages/en/official-badges/active-maintained-badge.mdx
@@ -23,19 +23,19 @@ The badge is based on the following criteria:
 
 The project meets the minimum requirements for a maintained project. It is being further developed and problems are responded to quickly.
 
-- [Commits](/concepts/implemented-checks/commits): A minimum of 5 commits within the last 6 months
-- [Issue Reaction Time](/concepts/implemented-checks/issue-reaction-time): The average reaction time to issues is less than 7 days for issues created within the last 3 months
+- [Commits](/en/concepts/implemented-checks/commits): A minimum of 5 commits within the last 6 months
+- [Issue Reaction Time](/en/concepts/implemented-checks/issue-reaction-time): The average reaction time to issues is less than 7 days for issues created within the last 3 months
 
 ### Level 2: Reliable maintenance (Silver)
 
 The project fulfills the requirements for a reliably maintained project. New versions are released regularly, problems are responded to quickly, and there is an active community.
 
 - All criteria from level 1
-- [Releases](/concepts/implemented-checks/releases): There was at least one release or tag created within the last 6 months
+- [Releases](/en/concepts/implemented-checks/releases): There was at least one release or tag created within the last 6 months
 
 ### Level 3: Crisis-proof maintenance (Gold)
 
 The project fulfills the requirements for a crisis-proof maintained project. New versions are released regularly, problems are responded to quickly and there is a broad and active community.
 
 - All criteria from levels 1 and 2
-- [Bus Factor](/concepts/implemented-checks/bus-factor): Multiple maintainers (individuals) are actively contributing to the project. The project has a bus factor of at least 2 in the last 6 months.
\ No newline at end of file
+- [Bus Factor](/en/concepts/implemented-checks/bus-factor): Multiple maintainers (individuals) are actively contributing to the project. The project has a bus factor of at least 2 in the last 6 months.
\ No newline at end of file
diff --git a/src/pages/official-badges/open-source-badge.mdx b/src/pages/en/official-badges/open-source-badge.mdx
similarity index 100%
rename from src/pages/official-badges/open-source-badge.mdx
rename to src/pages/en/official-badges/open-source-badge.mdx
diff --git a/src/pages/official-badges/reuse-badge.mdx b/src/pages/en/official-badges/reuse-badge.mdx
similarity index 68%
rename from src/pages/official-badges/reuse-badge.mdx
rename to src/pages/en/official-badges/reuse-badge.mdx
index f070e97..e4ff4ee 100644
--- a/src/pages/official-badges/reuse-badge.mdx
+++ b/src/pages/en/official-badges/reuse-badge.mdx
@@ -22,19 +22,19 @@ The badge is based on the following criteria:
 
 The project meets the requirements for subsequent use. Packages are provided for further use.
 
-- [Packages](/concepts/implemented-checks/packages): There has been at least one package published within the last 6 months
-- [CI-Pipelines](/concepts/implemented-checks/ci-pipeline): There has been at least one successful CI pipeline within the last 6 months
+- [Packages](/en/concepts/implemented-checks/packages): There has been at least one package published within the last 6 months
+- [CI-Pipelines](/en/concepts/implemented-checks/ci-pipeline): There has been at least one successful CI pipeline within the last 6 months
 
 ### Level 2: Actively Reused (Silver)
 
 The project is used productively by at least 1 organization.
 
 - All criteria from level 1
-- [Subsequent use](/concepts/implemented-checks/subsequent-use): At least one organization is actively using the project
+- [Subsequent use](/en/concepts/implemented-checks/subsequent-use): At least one organization is actively using the project
 
 ### Level 3: Frequently Actively Reused (Gold)
 
 The project is used productively by at least 10 organizations.
 
 - All criteria from levels 1 and 2
-- [Subsequent use](/concepts/implemented-checks/subsequent-use): At least 10 organizations are actively using the project
\ No newline at end of file
+- [Subsequent use](/en/concepts/implemented-checks/subsequent-use): At least 10 organizations are actively using the project
\ No newline at end of file
diff --git a/src/pages/official-badges/security-badge.mdx b/src/pages/en/official-badges/security-badge.mdx
similarity index 86%
rename from src/pages/official-badges/security-badge.mdx
rename to src/pages/en/official-badges/security-badge.mdx
index b3856cc..f3624da 100644
--- a/src/pages/official-badges/security-badge.mdx
+++ b/src/pages/en/official-badges/security-badge.mdx
@@ -15,12 +15,12 @@ import { Callout } from 'nextra/components'
     <img src="/assets/badges/SECURITY-3.svg" className="h-36 lg:h-48"/>
 </div>
 
-The active maintained badge is a badge that indicates the security status of a repository.
+The security badge indicates the security status of a repository.
 The badge is based on the following criteria:
 
 ### Level 1: Basic Security Practices (Bronze)
 - Bug-Report process in place: TBD
-- [Issue Reaction Time](/concepts/implemented-checks/issue-reaction-time): TBD
+- [Issue Reaction Time](/en/concepts/implemented-checks/issue-reaction-time): TBD
 - Branch protection: TBD
 - Vulnerability checks - CVE Age: TBD
 - Vulnerability checks - Remediation time: TBD
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
new file mode 100644
index 0000000..f430b7f
--- /dev/null
+++ b/src/pages/index.tsx
@@ -0,0 +1,12 @@
+import { useEffect } from 'react'
+import { useRouter } from 'next/router'
+
+export default function Home() {
+    const { replace } = useRouter()
+
+    useEffect(() => {
+        replace('/de')
+    }, [])
+
+    return null
+}
diff --git a/theme.config.tsx b/theme.config.tsx
index 6b99881..2ef784b 100644
--- a/theme.config.tsx
+++ b/theme.config.tsx
@@ -41,6 +41,10 @@ const config: DocsThemeConfig = {
         content: '🚧 Diese Dokumentation befindet sich aktuell im Aufbau.',
         dismissible: false,
     },
+    i18n: [
+        { locale: 'en', name: 'English' },
+        { locale: 'de', name: 'Deutsch' },
+    ],
     logo: (
         <span className="flex items-center space-x-2">
             <Image
@@ -103,7 +107,7 @@ const config: DocsThemeConfig = {
         extraContent: (
             <div className="flex items-center space-x-4">
                 <a
-                    href="/leichte-sprache"
+                    href="/de/leichte-sprache"
                     className="text-base font-medium hover:opacity-60"
                 >
                     <img
-- 
GitLab


From 210c6ad95cbfbae83deb738c3f7049fd8d96a1d7 Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 13:54:31 +0100
Subject: [PATCH 06/19] translates badges

---
 src/components/ResultGrid.tsx                |  2 +-
 src/components/ResultTable.tsx               | 64 +++++++++++++++++---
 src/components/landing-page/ApiSmallDemo.tsx |  8 ++-
 3 files changed, 60 insertions(+), 14 deletions(-)

diff --git a/src/components/ResultGrid.tsx b/src/components/ResultGrid.tsx
index 2452741..7f718de 100644
--- a/src/components/ResultGrid.tsx
+++ b/src/components/ResultGrid.tsx
@@ -71,7 +71,7 @@ export default function ResultGrid({ currentScan }: Props) {
                                             </div>
                                             <p
                                                 className={cn(
-                                                    'text-sm',
+                                                    'text-base',
                                                     !badge.badgeGranted &&
                                                         'opacity-50',
                                                 )}
diff --git a/src/components/ResultTable.tsx b/src/components/ResultTable.tsx
index feca39b..9a2ca8e 100644
--- a/src/components/ResultTable.tsx
+++ b/src/components/ResultTable.tsx
@@ -10,6 +10,44 @@ interface Props {
     currentScan: SarifApiResponse
 }
 
+const translateCriteriaStatus = (status: string) => {
+    switch (status) {
+        case 'open':
+            return 'Konnte nicht überprüft werden'
+        case 'pass':
+            return 'Bestanden'
+        case 'fail':
+            return 'Nicht bestanden'
+        default:
+            return status
+    }
+}
+
+const badgeTranslation: Record<string, Record<string, string>> = {
+    maintained: {
+        bronze: 'Aktive Wartung',
+        silver: 'Verlässliche Wartung',
+        gold: 'Krisensichere Wartung',
+    },
+    reused: {
+        bronze: 'Bereit zur Nutzung',
+        silver: 'Aktiv genutzt',
+        gold: 'Häufig aktiv genutzt',
+    },
+    'open-source': {
+        gold: 'Open Source lizenziert',
+    },
+}
+
+const translateBadge = (badgeId: string, level: string): string => {
+    if (badgeId in badgeTranslation) {
+        if (level in badgeTranslation[badgeId]) {
+            return badgeTranslation[badgeId][level]
+        }
+    }
+    return badgeId + ' ' + level
+}
+
 export default function ResultTable({ currentScan }: Props) {
     return (
         <div className="">
@@ -23,8 +61,10 @@ export default function ResultTable({ currentScan }: Props) {
                         <details className="">
                             <summary className="relative flex cursor-pointer flex-row justify-between text-lg font-medium text-gray-900">
                                 <span>
-                                    Details für: {badge.badgeId}{' '}
-                                    {badge.badgeLevel}
+                                    {translateBadge(
+                                        badge.badgeId,
+                                        badge.badgeLevel,
+                                    )}
                                     <Badge
                                         variant={
                                             badge.badgeGranted
@@ -34,12 +74,16 @@ export default function ResultTable({ currentScan }: Props) {
                                         className="ml-2"
                                     >
                                         {badge.badgeGranted
-                                            ? 'Granted'
-                                            : 'Not granted'}
+                                            ? 'Gewährt'
+                                            : 'Nicht gewährt'}
                                     </Badge>
                                 </span>
-
-                                <ChevronDownIcon className="w-5" />
+                                <div className="flex flex-row items-center gap-2">
+                                    <span className="text-sm text-gray-500">
+                                        Mehr informationen
+                                    </span>
+                                    <ChevronDownIcon className="w-4" />
+                                </div>
                             </summary>
                             <div className="mt-8">
                                 <div className="overflow-x-aut">
@@ -51,7 +95,7 @@ export default function ResultTable({ currentScan }: Props) {
                                                         scope="col"
                                                         className="col-span-1 py-3.5 pl-4 pr-3 text-left font-semibold sm:pl-6 lg:pl-8"
                                                     >
-                                                        Check
+                                                        Überprüfung
                                                     </th>
                                                     <th
                                                         scope="col"
@@ -121,9 +165,9 @@ export default function ResultTable({ currentScan }: Props) {
                                                                         ></span>
                                                                     </span>
                                                                     <div className="hidden sm:block">
-                                                                        {
-                                                                            criteria.status
-                                                                        }
+                                                                        {translateCriteriaStatus(
+                                                                            criteria.status,
+                                                                        )}
                                                                     </div>
                                                                 </div>
                                                             </td>
diff --git a/src/components/landing-page/ApiSmallDemo.tsx b/src/components/landing-page/ApiSmallDemo.tsx
index 8c7b546..3b7ad5e 100644
--- a/src/components/landing-page/ApiSmallDemo.tsx
+++ b/src/components/landing-page/ApiSmallDemo.tsx
@@ -18,7 +18,7 @@ export default function ApiSmallDemo() {
     return (
         <div className="mx-auto mt-16 max-w-7xl" id="api-small-demo">
             <Toaster />
-            <div className="relative isolate overflow-hidden bg-blue-900 px-6 py-24 shadow-2xl sm:rounded-3xl sm:px-24 xl:py-32">
+            <div className="relative isolate overflow-hidden bg-blue-900 px-6 py-24 shadow-2xl sm:px-24 xl:rounded-3xl xl:py-32">
                 <h2 className="mx-auto max-w-3xl text-center text-4xl font-semibold tracking-tight text-white sm:text-5xl">
                     Testen Sie die Badge API
                 </h2>
@@ -74,8 +74,10 @@ export default function ApiSmallDemo() {
                     </svg>
                 </div>
             </div>
-            <div>
-                <ResultGrid currentScan={currentScan} />
+            <div className="xl:py-10">
+                {Boolean(currentScan) && (
+                    <ResultGrid currentScan={currentScan} />
+                )}
             </div>
         </div>
     )
-- 
GitLab


From 4c0ef0d4f514e3566988d1656d59d90136b4d49d Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 14:08:54 +0100
Subject: [PATCH 07/19] grid ordering

---
 src/components/ResultGrid.tsx | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/components/ResultGrid.tsx b/src/components/ResultGrid.tsx
index 7f718de..5144557 100644
--- a/src/components/ResultGrid.tsx
+++ b/src/components/ResultGrid.tsx
@@ -2,7 +2,7 @@
 // SPDX-License-Identifier: MIT
 
 import Image from 'next/image'
-import { SarifApiResponse } from '../lib/apiClient'
+import { Badge, SarifApiResponse } from '../lib/apiClient'
 import { cn } from '../lib/utils'
 import ResultTable from './ResultTable'
 import { config } from '../config'
@@ -11,6 +11,23 @@ interface Props {
     currentScan: SarifApiResponse | null
 }
 
+const order = [
+    'maintained:bronze',
+    'maintained:silver',
+    'maintained:gold',
+    'reused:bronze',
+    'reused:silver',
+    'reused:gold',
+    'open-source:gold',
+]
+
+const sortBadges = (a: Badge, b: Badge): number => {
+    return (
+        order.indexOf(a.badgeId + ':' + a.badgeLevel) -
+        order.indexOf(b.badgeId + ':' + b.badgeLevel)
+    )
+}
+
 export default function ResultGrid({ currentScan }: Props) {
     return (
         <div className="py-10">
@@ -39,9 +56,7 @@ export default function ResultGrid({ currentScan }: Props) {
                         <div className="-mx-6 grid grid-cols-1 gap-0.5 overflow-hidden px-6 sm:mx-0 sm:rounded-2xl sm:px-0 md:grid-cols-3">
                             {currentScan.runs[0].properties.testedRepository &&
                                 currentScan?.runs[0].properties.badges
-                                    .sort((a, b) =>
-                                        a.badgeId.localeCompare(b.badgeId),
-                                    )
+                                    .sort(sortBadges)
                                     .map((badge) => (
                                         <div
                                             className="overflow-hidden rounded-xl bg-gray-400/10 p-10 sm:rounded-none"
-- 
GitLab


From 7c30d586235a03831194e46528d7f135c06e6779 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 14:24:40 +0100
Subject: [PATCH 08/19] Translated config

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 src/pages/de/concepts/configuration/index.mdx | 127 ++++++------------
 .../concepts/configuration/manual-checks.mdx  |  17 +--
 2 files changed, 50 insertions(+), 94 deletions(-)

diff --git a/src/pages/de/concepts/configuration/index.mdx b/src/pages/de/concepts/configuration/index.mdx
index c1f0431..3878787 100644
--- a/src/pages/de/concepts/configuration/index.mdx
+++ b/src/pages/de/concepts/configuration/index.mdx
@@ -6,24 +6,23 @@ import { Callout } from 'nextra/components'
 # Konfigurationsdatei
 
 <Callout type="info">
-  Die Konfigurationsdatei der offiziellen Instanz finden Sie [hier →](https://gitlab.opencode.de/open-code/badgebackend/badge-config/-/blob/main/.badge-api.yaml?ref_type=heads)
+  Die Konfigurationsdatei der offiziellen Instanz finden Sie [hier →](https://gitlab.opencode.de/open-code/badgebackend/badge-config/-/blob/main/.badge-api.yaml)
 </Callout>
 
+Die Badge-API wird mithilfe einer yaml-Konfigurationsdatei mit dem Namen `.badge-api.yaml` konfiguriert. Das Programm sucht diese Datei im aktuellen Arbeitsverzeichnis
+und in `/etc/badge-api/` oder frag diese aus einem Git-Repository ab.
 
+Die Konfigurationsdatei besteht aus mehreren Schlüsselabschnitten, darunter:
 
-The badge API is configured using a yaml configuration file with the name `.badge-api.yaml`. The program looks for this file in the current working directory and inside `/etc/badge-api/`.
+- **gitClients**: Enthält die Konfiguration für die Verbindung zu Git-Anbietern.
+- **badges**: Definiert die Abzeichen, ihre Stufen, Prüfungen und zugehörigen Schwellenwerte.
+- **personalEmailDomains**: Eine Liste persönlicher E-Mail-Domains (erforderlich für die Überprüfung des Elefanten- und Busfaktors).
+- **remoteConfigUrl**: URL zu einer Remote-Konfigurationsdatei (optional). Oder die Umgebungsvariable `REMOTE_CONFIG_URL`.
+- **subsequentUseApiDomain**: Die Domain der API für die nachfolgende Verwendung
 
-The configuration file consists of several key sections, including:
+### Git Clients Konfiguration
 
-- **gitClients**: Contains the configuration for connecting to git providers.
-- **badges**: Defines the badges, their levels, checks, and associated thresholds.
-- **personalEmailDomains**: A list of personal email domains (required by the elephant and bus factor check).
-- **remoteConfigUrl**: URL to a remote configuration file (optional). Or `REMOTE_CONFIG_URL` environment variable.
-- **subsequentUseApiDomain**: The domain of the subsequent use API
-
-### Git Clients Configuration
-
-The `gitClients` section defines how the Badge API connects to GitLab repositories.
+Der Abschnitt `gitClients` definiert, wie die Badge-API eine Verbindung zu GitLab-Repositorys herstellt.
 
 ```yaml
 gitClients:
@@ -33,25 +32,30 @@ gitClients:
     maxRequestsPerSecond: <requests_per_second>
 ```
 
-- `baseUrl`: The URL of your GitLab instance (e.g., https://gitlab.opencode.de).
+- `baseUrl`: Die URL Ihrer GitLab-Instanz (z. B., https://gitlab.opencode.de).
 - `tokenFile`: The file containing the access token (see Token Permissions).
 - `type`: The type of GitLab server (e.g., gitlab).
 - `maxRequestsPerSecond`: Maximum number of requests allowed per second to avoid rate-limiting.
 
 
-#### Token Permissions
-
-The token is used to authenticate the badge API against the git provider API. For regular usage the token does not need any special permissions. It is only used because even for open source projects **gitlab** requires authentication for `/member` endpoints.
-
-Nevertheless, there is a special case if you provide [manual checks](#manual-check-type) with a decision json file stored in a private repository. In this case, the badge api uses the provided token to access the json file as well (if the baseURL matches). For this operation the token needs to have at least the `read_repository` permission (project access token is fine as well). The same applies to `svgUrls` which are stored in private repositories.
+#### Token Rechte
 
+Ein Token wird verwendet, um die Badge-API gegenüber der API des Git-Providers zu authentifizieren. Für den regulären Gebrauch
+benötigt der Token keine besonderen Berechtigungen. Er wird nur verwendet, weil **GitLab** selbst für
+Open-Source-Projekte eine Authentifizierung für den Endpunkt `/member` erfordert.
 
-The API identifies the correct token by the provided `baseUrl` and `type` in the configuration file.
+Es gibt jedoch einen Sonderfall, wenn Sie [manuelle Prüfungen](/de/concepts/configuration/manual-checks) mit einer in einem privaten Repository
+gespeicherten Entscheidungs-JSON-Datei bereitstellen. In diesem Fall verwendet die Badge-API das bereitgestellte Token
+auch für den Zugriff auf die JSON-Datei (sofern die baseURL übereinstimmt). Für diesen Vorgang muss das Token mindestens
+über die Berechtigung `read_repository` verfügen (ein Projektzugriffstoken ist ebenfalls zulässig). Dasselbe gilt für
+`svgUrls`, die in privaten Repositorys gespeichert sind.
 
+Die API identifiziert das richtige Token anhand der bereitgestellten `baseUrl` und `type` in der Konfigurationsdatei.
 
-### Badges Configuration
+### Badges Konfiguration
 
-The `badges` section defines various badges, their levels, and checks. A badge can have multiple levels, each with associated checks.
+Im Abschnitt `badges` werden verschiedene Badges, ihre Level und Prüfungen definiert. Eine Badge
+kann mehrere Stufen haben, die jeweils mit Prüfungen verbunden sind.
 
 ```yaml
 badges:
@@ -68,24 +72,17 @@ badges:
               min: <minimum_value>
               max: <maximum_value>
 ```
+Jede Badge kann verschiedene Stufen haben (z. B. `bronze`, `silver`, `gold`). Für jede Stufe gibt es
+Prüfungen, die auf das Projekt angewendet werden. Die verfügbaren Prüfungen finden Sie im Abschnitt 
+[Implemnetierte Checks](/de/concepts/implemented-checks).
 
-Each badge can have different levels (e.g., `bronze`, `silver`, `gold`). For each level, there are checks that are applied to the project. A check can be based on the following types:
+Jeder Check hat einen Schwellenwert mit zwei optionalen Parametern:
 
-- `COMMITS`: Checks if the project has a minimum number of commits in a defined time range.
-- `ISSUE_REACTION_TIME`: Measures the average time to respond to issues.
-- `BUS_FACTOR`: Checks the number of maintainers involved.
-- `RELEASES`: Checks the number of releases made in a specified period.
-- `ELEPHANT_FACTOR`: Checks if multiple companies are contributing to the project.
-- `PACKAGES`: Checks the number of packages released.
-- `CI_PIPELINES`: Checks the number of successful CI pipelines.
+- `min`: Mindestwert (z. B. Anzahl der Commits, Maintainer).
+- `max`: Maximalwert (z. B. Antwortzeit auf Issues).
+- `timeRangeInMonths`: Zeitraum (in Monaten) zur Bewertung der Projektaktivität.
 
-Each check has a threshold with two optional parameters:
-
-- `min`: Minimum value required (e.g., number of commits, maintainers).
-- `max`: Maximum value allowed (e.g., issue response time).
-- `timeRangeInMonths`: Time period (in months) to evaluate the project activity.
-
-### Example configuration
+#### Beispiel Konfiguration
 
 ```yaml
 badges:
@@ -129,54 +126,12 @@ badges:
               min: 1
 ```
 
-### Manual check type
-
-Besides the predefined checks there is a `MANUAL` check type. This type of check requires external input or decision-making, which cannot be automatically evaluated by the API based on predefined metrics like commits, issues, or releases. Instead, it relies on an external JSON file to guide the decision-making process.
-
-Example of a manual check:
-
-```yaml
-badges:
-  - id: open-source
-    description: This badge checks if a project is open source.
-    levels:
-      - name: gold
-        svgUrl: https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/open-source.svg
-        checks:
-          - type: MANUAL
-            decisionJsonUrl: https://gitlab.opencode.de/open-code/badgebackend/manual-badges/-/raw/main/badges/open-source.json
-            description: Checks if a project is open source. This check is decided manually by the openCode team.
-```
-
-In this case, the decisionJsonUrl points to a file (open-source.json) that contains the rules or decision criteria for determining if a project is open source. The file is hosted on a GitLab server, and the Badge API will refresh it every 5 minutes.
-
-The JSON file should have the following structure:
-
-```json
-{
-  "granted": <List of repository urls that are granted the badge>,
-  "grantedRegex": <List of regex patterns that are granted the badge>,
-}
-```
-
-Example decision JSON file:
-
-```json
-{
-  "granted": [
-    "https://gitlab.opencode.de/open-code/badgebackend/badge-api",
-    "https://gitlab.opencode.de/open-code/badgebackend/badge-frontend"
-  ],
-  "grantedRegex": [
-    "https://gitlab.opencode.de/open-code/badgebackend/.*"
-  ]
-}
-```
-
-
-### Remote Configuration
-
-The `remoteConfigUrl` parameter allows you to specify a URL to a remote configuration file. This file will be fetched and used to override the local configuration. Only the `badges` and `personalEmailDomains` sections are respected from the remote configuration file. To update other values, a local file needs to be used.
-
-The remote configuration file might contain the special string `<badge-config-repo>`. This value will be replaced with the `remoteConfigUrl` base path. This is useful to validate remote configuration from a different branch and pass the url via an environment variable.
+### Remote-Konfiguration
+Mit dem Parameter `remoteConfigUrl` können Sie eine URL zu einer Remote-Konfigurationsdatei angeben. Diese
+Datei wird abgerufen und verwendet, um die lokale Konfiguration zu überschreiben. Nur die Abschnitte
+`badges` und `personalEmailDomains` werden aus der Remote-Konfigurationsdatei berücksichtigt. Um andere
+Werte zu aktualisieren, muss eine lokale Datei verwendet werden.
 
+Die Remote-Konfigurationsdatei kann die spezielle Zeichenfolge `<badge-config-repo>` enthalten. Dieser
+Wert wird durch den `remoteConfigUrl`-Basispfad ersetzt. Dies ist nützlich, um die Remote-Konfiguration
+von einem anderen Branch aus zu validieren und die URL über eine Umgebungsvariable zu übergeben.
diff --git a/src/pages/de/concepts/configuration/manual-checks.mdx b/src/pages/de/concepts/configuration/manual-checks.mdx
index 00aadff..7f2d99e 100644
--- a/src/pages/de/concepts/configuration/manual-checks.mdx
+++ b/src/pages/de/concepts/configuration/manual-checks.mdx
@@ -1,14 +1,15 @@
 {/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 SPDX-License-Identifier: MIT */}
 
-# Manual checks
+# Manuelle checks
 
-Manual checks are a special type of check that is not automatically evaluated by the badge API. 
-Instead, the result of the check is provided by a JSON file that is hosted on a server reachable by the Badge API Instance. 
-The JSON file contains a list of granted projects or a regex pattern for granted projects.
+Manuelle Prüfungen sind eine besondere Art von Prüfung, die nicht automatisch von der Badge-API ausgewertet wird. 
+Stattdessen wird das Ergebnis der Prüfung von einer JSON-Datei bereitgestellt, die auf einem Server gehostet wird,
+der von der Badge-API-Instanz aus erreichbar ist. 
+Die JSON-Datei enthält eine Liste der genehmigten Projekte oder ein Regex-Muster für genehmigte Projekte.
 
-You can provide a GitLab personal access token via the environment variable `GITLAB_TOKEN` to access a private repository 
-where the JSON file is stored.
+Sie können einen persönlichen GitLab-Zugriffstoken über die Umgebungsvariable `GITLAB_TOKEN` bereitstellen,
+um auf ein privates Repository zuzugreifen, in dem die JSON-Datei gespeichert ist.
 
 ```json filename="manual-check.json" copy
 {
@@ -19,5 +20,5 @@ where the JSON file is stored.
 }
 ```
 
-The file is referenced in the `.badge-api.yaml` configuration file of the badge. 
-See more details about the [configuration file](/en/concepts/configuration).
\ No newline at end of file
+Die Datei wird in der Konfigurationsdatei `.badge-api.yaml` des Badges referenziert. 
+Weitere Informationen zur Konfigurationsdatei finden Sie [hier](/de/concepts/configuration).
\ No newline at end of file
-- 
GitLab


From d57f1db54a5a50baf4ebf4c0b0b177bf4cd525b2 Mon Sep 17 00:00:00 2001
From: Tim Bastin <bastin.tim@gmail.com>
Date: Tue, 11 Mar 2025 14:30:26 +0100
Subject: [PATCH 09/19] responsive table

---
 src/components/ResultGrid.tsx  |  6 ++---
 src/components/ResultTable.tsx | 40 +++++++++++++++++++---------------
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/src/components/ResultGrid.tsx b/src/components/ResultGrid.tsx
index 5144557..f9ea230 100644
--- a/src/components/ResultGrid.tsx
+++ b/src/components/ResultGrid.tsx
@@ -53,7 +53,7 @@ export default function ResultGrid({ currentScan }: Props) {
                                 }
                             </a>
                         </div>
-                        <div className="-mx-6 grid grid-cols-1 gap-0.5 overflow-hidden px-6 sm:mx-0 sm:rounded-2xl sm:px-0 md:grid-cols-3">
+                        <div className="-mx-6 grid grid-cols-1 gap-0.5 overflow-hidden px-6 sm:mx-0 sm:grid-cols-2 sm:rounded-2xl sm:px-0 md:grid-cols-2 lg:grid-cols-3">
                             {currentScan.runs[0].properties.testedRepository &&
                                 currentScan?.runs[0].properties.badges
                                     .sort(sortBadges)
@@ -64,8 +64,8 @@ export default function ResultGrid({ currentScan }: Props) {
                                         >
                                             <div className="relative aspect-square">
                                                 {!badge.badgeGranted && (
-                                                    <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2 rotate-45 bg-red-600 px-10 py-2 text-xs font-bold text-white">
-                                                        Nicht gewährt
+                                                    <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2 rotate-45 bg-red-600 px-10 py-2 text-center text-xs font-bold text-white">
+                                                        Verweigert
                                                     </div>
                                                 )}
                                                 <Image
diff --git a/src/components/ResultTable.tsx b/src/components/ResultTable.tsx
index 9a2ca8e..99feeeb 100644
--- a/src/components/ResultTable.tsx
+++ b/src/components/ResultTable.tsx
@@ -13,7 +13,7 @@ interface Props {
 const translateCriteriaStatus = (status: string) => {
     switch (status) {
         case 'open':
-            return 'Konnte nicht überprüft werden'
+            return 'Offen'
         case 'pass':
             return 'Bestanden'
         case 'fail':
@@ -59,7 +59,7 @@ export default function ResultTable({ currentScan }: Props) {
                         className="mt-8 rounded-lg bg-gray-100 px-4 py-2"
                     >
                         <details className="">
-                            <summary className="relative flex cursor-pointer flex-row justify-between text-lg font-medium text-gray-900">
+                            <summary className="relative flex cursor-pointer flex-row justify-between font-medium text-gray-900 md:text-lg">
                                 <span>
                                     {translateBadge(
                                         badge.badgeId,
@@ -74,26 +74,26 @@ export default function ResultTable({ currentScan }: Props) {
                                         className="ml-2"
                                     >
                                         {badge.badgeGranted
-                                            ? 'Gewährt'
-                                            : 'Nicht gewährt'}
+                                            ? 'Verliehen'
+                                            : 'Verweigert'}
                                     </Badge>
                                 </span>
                                 <div className="flex flex-row items-center gap-2">
-                                    <span className="text-sm text-gray-500">
+                                    <span className="hidden text-sm text-gray-500 md:inline-block">
                                         Mehr informationen
                                     </span>
                                     <ChevronDownIcon className="w-4" />
                                 </div>
                             </summary>
-                            <div className="mt-8">
+                            <div className="md:mt-8">
                                 <div className="overflow-x-aut">
                                     <div className="inline-block min-w-full py-2 align-middle">
-                                        <table className="min-w-full divide-y divide-gray-400">
-                                            <thead>
+                                        <table className="flex min-w-full divide-gray-400 md:table md:divide-y">
+                                            <thead className="hidden md:table-header-group">
                                                 <tr className="grid grid-cols-6">
                                                     <th
                                                         scope="col"
-                                                        className="col-span-1 py-3.5 pl-4 pr-3 text-left font-semibold sm:pl-6 lg:pl-8"
+                                                        className="col-span-1 py-3.5 pr-3 text-left font-semibold lg:pl-8"
                                                     >
                                                         Überprüfung
                                                     </th>
@@ -122,13 +122,13 @@ export default function ResultTable({ currentScan }: Props) {
                                                     (criteria) => (
                                                         <tr
                                                             key={`${badge.badgeId}-${badge.badgeLevel}-${criteria.ruleId}`}
-                                                            className="grid grid-cols-6"
+                                                            className="grid grid-cols-1 md:grid-cols-6"
                                                         >
                                                             <td
                                                                 title={
                                                                     criteria.ruleId
                                                                 }
-                                                                className="col-span-1 overflow-hidden overflow-ellipsis whitespace-nowrap py-4 pl-4 pr-3 font-medium text-gray-900 sm:pl-6 lg:pl-8"
+                                                                className="col-span-1 overflow-hidden overflow-ellipsis whitespace-nowrap py-4 font-medium text-gray-900 md:pr-3 lg:pl-8"
                                                             >
                                                                 {
                                                                     criteria.ruleId.split(
@@ -136,8 +136,8 @@ export default function ResultTable({ currentScan }: Props) {
                                                                     )[0]
                                                                 }
                                                             </td>
-                                                            <td className="col-span-1 whitespace-nowrap px-3 py-4">
-                                                                <div className="flex items-center justify-end gap-x-2 sm:justify-start">
+                                                            <td className="col-span-1 whitespace-nowrap py-4 md:px-3">
+                                                                <div className="flex items-center justify-end gap-x-2 md:justify-start">
                                                                     <span className="relative flex size-2">
                                                                         <span
                                                                             className={cn(
@@ -164,19 +164,25 @@ export default function ResultTable({ currentScan }: Props) {
                                                                             )}
                                                                         ></span>
                                                                     </span>
-                                                                    <div className="hidden sm:block">
+                                                                    <span className="w-full">
                                                                         {translateCriteriaStatus(
                                                                             criteria.status,
                                                                         )}
-                                                                    </div>
+                                                                    </span>
                                                                 </div>
                                                             </td>
-                                                            <td className="col-span-2 px-3 py-4">
+                                                            <td className="col-span-2 py-4 md:px-3">
+                                                                <b className="md:hidden">
+                                                                    Beschreibung:{' '}
+                                                                </b>
                                                                 {
                                                                     criteria.description
                                                                 }
                                                             </td>
-                                                            <td className="col-span-2 px-3 py-4">
+                                                            <td className="col-span-2 py-4 md:px-3">
+                                                                <b className="md:hidden">
+                                                                    Nachweis:{' '}
+                                                                </b>
                                                                 {
                                                                     criteria.evidence
                                                                 }
-- 
GitLab


From 25ccad354e724b04df9377bfa44ef67a6fa06c09 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 15:06:42 +0100
Subject: [PATCH 10/19] Translates various checks

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 .../de/concepts/implemented-checks/_meta.ts   |  9 ++-
 .../implemented-checks/bus-factor.mdx         | 22 +++----
 .../implemented-checks/ci-pipeline.mdx        | 28 +++++----
 .../concepts/implemented-checks/commits.mdx   | 15 ++---
 .../implemented-checks/elephant-factor.mdx    | 22 ++++---
 .../de/concepts/implemented-checks/index.mdx  | 22 +++----
 .../issue-reaction-time.mdx                   | 61 ++++++++++---------
 .../concepts/implemented-checks/packages.mdx  | 31 +++++-----
 8 files changed, 114 insertions(+), 96 deletions(-)

diff --git a/src/pages/de/concepts/implemented-checks/_meta.ts b/src/pages/de/concepts/implemented-checks/_meta.ts
index b4b5580..46de217 100644
--- a/src/pages/de/concepts/implemented-checks/_meta.ts
+++ b/src/pages/de/concepts/implemented-checks/_meta.ts
@@ -2,5 +2,12 @@
 // SPDX-License-Identifier: MIT
 
 export default {
-    index: { title: 'Overview' },
+    index: { title: 'Ãœberblick' },
+    'bus-factor': { title: 'Bus-Faktor' },
+    'ci-pipeline': { title: 'CI-Pipeline' },
+    commits: { title: 'Commits' },
+    'elephant-factor': { title: 'Elephant-Faktor' },
+    'issue-reaction-time': { title: 'Reaktionszeit auf Issues' },
+    packages: { title: 'Pakete' },
+    'protected-branches': { title: 'Geschützte Branches' },
 }
diff --git a/src/pages/de/concepts/implemented-checks/bus-factor.mdx b/src/pages/de/concepts/implemented-checks/bus-factor.mdx
index 3a06a54..31ac053 100644
--- a/src/pages/de/concepts/implemented-checks/bus-factor.mdx
+++ b/src/pages/de/concepts/implemented-checks/bus-factor.mdx
@@ -3,14 +3,14 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Bus Factor
+# Bus Faktor
 
 <Callout type="default">
-  Check type: `BUS_FACTOR`
+  Check Typ: `BUS_FACTOR`
 </Callout>
 
-This check calculates the bus factor of a project for a given time range.
-The check passes if the bus factor is greater than or equal to the minimum threshold.
+Dieser Check berechnet den Busfaktor eines Projekts für einen bestimmten Zeitraum.
+Der Check gilt als bestanden, wenn der Busfaktor größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: BUS_FACTOR
@@ -20,13 +20,13 @@ The check passes if the bus factor is greater than or equal to the minimum thres
     min: 2
 ```
 
-### Background
+### Hintergrund
 
-The bus factor is a measure of the risk resulting from information and capabilities not being shared among team members.
+Der Bus-Faktor ist ein Maß für das Risiko, das entsteht, wenn Informationen und Fähigkeiten nicht unter den Teammitgliedern geteilt werden.
 
-Imagine there is a pretty precise bus that unfortunately hits always exactly one person. The bus factor is the number of people
-that need to be hit by the bus until half of the projects commits have no living producer anymore. The higher the bus factor,
-the lower the risk of the project failing due to the loss of a single person.
+Stellen Sie sich vor, es gibt einen ziemlich präzisen Bus, der leider immer genau eine Person überfährt. Der Bus-Faktor ist die Anzahl der
+Personen, die vom Bus überfahren werden müssen, bis die Hälfte der Commits im Projekt keinen lebenden Contributor mehr hat. Je höher der
+Bus-Faktor, desto geringer ist das Risiko, dass das Projekt aufgrund des Verlusts einer einzelnen Person scheitert.
 
-For example if a project has a bus factor of 2, it means that the 2 most important contributors are responsible for 50% of the commits
-and after both are gone, the project would be in danger.
\ No newline at end of file
+Wenn ein Projekt beispielsweise einen Bus-Faktor von 2 hat, bedeutet dies, dass die beiden wichtigsten Beitragenden für 50 % der
+Commits verantwortlich sind und das Projekt in Gefahr wäre, wenn beide wegfallen würden.
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/ci-pipeline.mdx b/src/pages/de/concepts/implemented-checks/ci-pipeline.mdx
index be4ba5e..2bcb29e 100644
--- a/src/pages/de/concepts/implemented-checks/ci-pipeline.mdx
+++ b/src/pages/de/concepts/implemented-checks/ci-pipeline.mdx
@@ -6,14 +6,14 @@ import { Callout } from 'nextra/components'
 # CI Pipeline
 
 <Callout type="default">
-  Check type: `CI_PIPELINE`
+  Check Typ: `CI_PIPELINE`
 </Callout>
 
-This check queries the GitLab API and counts the number of CI pipeline runs (whether successfull or failed)
-in the time range.
-The check passes if the number of commits is greater than or equal to the minimum threshold.
+Dieser Check fragt die GitLab-API ab und zählt die Anzahl der CI-Pipeline-Durchläufe (erfolgreich oder fehlgeschlagen) im Betrachtungszeitraum.
+Der Check gilt als bestanden, wenn die Anzahl der Commits größer oder gleich dem Mindestschwellenwert ist.
+
+Die Anzahl der erfolgreichen CI-Pipeline-Läufe wird als Information im Nachweis der API-Antwort bereitgestellt.
 
-The number of successfull CI pipeline runs is provided as info in the evidence of the API Response.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: CI_PIPELINE
@@ -23,14 +23,16 @@ The number of successfull CI pipeline runs is provided as info in the evidence o
     min: 1
 ```
 
-### Background
+### Hintergrund
 
-Measuring the number of CI pipeline runs can help gauge the stability and reliability of a project's 
-development process. A high number of successful pipeline runs indicates a well-maintained and 
-stable codebase, with regular testing and validation.
+Die Messung der Anzahl der CI-Pipeline-Durchläufe kann dabei helfen, die Stabilität und Zuverlässigkeit
+des Entwicklungsprozesses eines Projekts zu beurteilen. Eine hohe Anzahl erfolgreicher Pipeline-Durchläufe
+deutet auf eine gut gepflegte und stabile Codebasis mit regelmäßigen Tests und Validierungen hin.
 
-- Continuous Integration Health: Frequent CI pipeline runs indicates that the project is undergoing regular 
-automated testing, catching errors early, and ensuring the quality of the software.
+- Continuous Integration Ansatz: Häufige CI-Pipeline-Läufe deuten darauf hin, dass das Projekt regelmäßigen
+  automatisierten Tests unterzogen wird, wodurch Fehler frühzeitig erkannt und die Qualität der Software
+  sichergestellt werden.
 
-- Development Efficiency: A smooth CI pipeline also reflects the development team's efficiency in 
-integrating and testing new changes, improving the project's overall workflow and reducing the likelihood of issues in production.
\ No newline at end of file
+- Entwicklungseffizienz: Eine reibungslose CI-Pipeline spiegelt auch die Effizienz des Entwicklungsteams
+  bei der Integration und dem Testen neuer Änderungen wider, wodurch der Gesamt-Workflow des Projekts
+  verbessert und die Wahrscheinlichkeit von Problemen in der Produktion verringert wird.
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/commits.mdx b/src/pages/de/concepts/implemented-checks/commits.mdx
index c9418f1..9d22563 100644
--- a/src/pages/de/concepts/implemented-checks/commits.mdx
+++ b/src/pages/de/concepts/implemented-checks/commits.mdx
@@ -6,11 +6,11 @@ import { Callout } from 'nextra/components'
 # Commits
 
 <Callout type="default">
-  Check type: `COMMITS`
+  Check Typ: `COMMITS`
 </Callout>
 
-This check queries the GitLab API and counts the number of commits in a given time range. 
-The check passes if the number of commits is greater than or equal to the minimum threshold.
+Dieser Check fragt die GitLab-API ab und zählt die Anzahl der Commits in einem bestimmten Zeitraum. 
+Der Check gilt als bestanden, wenn die Anzahl der Commits größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: COMMITS
@@ -20,8 +20,9 @@ The check passes if the number of commits is greater than or equal to the minimu
     min: 5
 ```
 
-### Background
+### Hintergrund
 
-Counting commits within a time range can be part of measuring a project's activity and maintenance. 
-Frequent commits indicate active development, bug fixes, and ongoing improvements. A high commit 
-count can reflect engaged contributors and project evolution, while fewer commits may signal stagnation.
\ No newline at end of file
+Das Zählen von Commits innerhalb eines bestimmten Zeitraums kann Teil der Messung der Aktivität und Wartung eines Projekts sein. 
+Häufige Commits deuten auf eine aktive Entwicklung, Fehlerbehebungen und laufende Verbesserungen hin.
+Eine hohe Anzahl von Commits kann ferner auf engagierte Mitwirkende und eine positive Entwicklung des Projekts
+hinweisen, während eine geringere Anzahl von Commits auf eine Stagnation hindeuten kann.
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/elephant-factor.mdx b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
index 1caed0f..9c2b72a 100644
--- a/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
+++ b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
@@ -3,14 +3,14 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Elephant Factor
+# Elephant Faktor
 
 <Callout type="default">
-  Check type: `ELEPHANT_FACTOR`
+  Check Typ: `ELEPHANT_FACTOR`
 </Callout>
 
-This check calculates the elephant factor of a project for a given time range.
-The check passes if the elephant factor is greater than or equal to the minimum threshold.
+Dieser Check berechnet den Elefantenfaktor eines Projekts für einen bestimmten Zeitraum.
+Der Check gilt als bestanden, wenn der Elefantenfaktor größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: ELEPHANT_FACTOR
@@ -20,12 +20,14 @@ The check passes if the elephant factor is greater than or equal to the minimum
     min: 2
 ```
 
-### Background
+### Hintergrund
 
-The elephant factor is a measure of the risk resulting from information and capabilities not being shared among organizations.
+Der Elefantenfaktor ist ein Maß für das Risiko, das sich daraus ergibt, dass Informationen und Fähigkeiten
+nicht zwischen Organisationen ausgetauscht werden.
 
-It is similar to the [bus factor](/en/concepts/implemented-checks/bus-factor) but instead of measuring the risk of losing individuals,
-it measures the risk of losing organizations.
+Er ähnelt dem [Bus-Faktor](/de/concepts/implemented-checks/bus-factor), misst jedoch nicht das Risiko,
+Einzelpersonen zu verlieren, sondern das Risiko, Organisationen zu verlieren.
 
-For example, if a project has an elephant factor of 2, it means that the 2 most important organizations are responsible for 50% of the commits
-and after both are gone, the project would be in danger. 
\ No newline at end of file
+Wenn ein Projekt etwa einen Elefantenfaktor von 2 hat, bedeutet dies, dass die beiden wichtigsten
+Organisationen für 50 % der Commits verantwortlich sind und das Projekt in Gefahr wäre, wenn beide
+wegfallen würden. 
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/index.mdx b/src/pages/de/concepts/implemented-checks/index.mdx
index 040aaa8..179bdd1 100644
--- a/src/pages/de/concepts/implemented-checks/index.mdx
+++ b/src/pages/de/concepts/implemented-checks/index.mdx
@@ -1,16 +1,16 @@
 {/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 SPDX-License-Identifier: MIT */}
 
-# Overview of Implemented Checks
+# Überblick über implementierte Checks
 
-The following checks are implemented and can be used to generate badges:
+Die folgenden Checks sind implementiert und können zur Erstellung von Badges verwendet werden:
 
-- [`BUS_FACTOR` ↗](/en/concepts/implemented-checks/bus-factor)
-- [`CI_PIPELINE` ↗](/en/concepts/implemented-checks/ci-pipeline)
-- [`COMMITS` ↗](/en/concepts/implemented-checks/commits)
-- [`ELEPHANT_FACTOR` ↗](/en/concepts/implemented-checks/elephant-factor)
-- [`ISSUE_REACTION_TIME` ↗](/en/concepts/implemented-checks/issue-reaction-time)
-- [`PACKAGES` ↗](/en/concepts/implemented-checks/packages)
-- [`PROTECTED_BRANCHES` ↗](/en/concepts/implemented-checks/protected-branches)
-- [`RELEASES` ↗](/en/concepts/implemented-checks/releases)
-- [`SUBSEQUENT_USE` ↗](/en/concepts/implemented-checks/subsequent-use)
\ No newline at end of file
+- [`BUS_FACTOR` ↗](/de/concepts/implemented-checks/bus-factor)
+- [`CI_PIPELINE` ↗](/de/concepts/implemented-checks/ci-pipeline)
+- [`COMMITS` ↗](/de/concepts/implemented-checks/commits)
+- [`ELEPHANT_FACTOR` ↗](/de/concepts/implemented-checks/elephant-factor)
+- [`ISSUE_REACTION_TIME` ↗](/de/concepts/implemented-checks/issue-reaction-time)
+- [`PACKAGES` ↗](/de/concepts/implemented-checks/packages)
+- [`PROTECTED_BRANCHES` ↗](/de/concepts/implemented-checks/protected-branches)
+- [`RELEASES` ↗](/de/concepts/implemented-checks/releases)
+- [`SUBSEQUENT_USE` ↗](/de/concepts/implemented-checks/subsequent-use)
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx b/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
index 8ca4f1b..d83538e 100644
--- a/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
+++ b/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
@@ -3,14 +3,14 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Issue Reaction Time
+# Reaktionszeit auf Issues
 
 <Callout type="default">
-  Check type: `ISSUE_REACTION_TIME`
+  Check Typ: `ISSUE_REACTION_TIME`
 </Callout>
 
-This check queries the GitLab API for the minimum time it takes for a project member to react to an issue in the given time range.
-The check passes if the number of commits is greater than or equal to the minimum threshold.
+Dieser Check fragt die GitLab-API für den Betrachtungszeitraum nach der Mindestzeit ab, die Projektmitglieder benötigen, um auf ein Issue zu reagieren.
+Der Check gilt als bestanden, wenn die Anzahl der Commits größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: ISSUE_REACTION_TIME
@@ -19,37 +19,40 @@ The check passes if the number of commits is greater than or equal to the minimu
     timeRangeInMonths: 3
     max: 7
 ```
+Die Reaktionszeit auf ein Issue ist die Zeit zwischen der Erstellung eines Issues in einem Projekt und der ersten gültigen Reaktion.
 
-The issue response time is the time between the creation of an issue in a project and the first valid response.
+Ein **Projektmitglied** ist ein Benutzer, der eines der folgenden Kriterien erfüllt:
 
-A **project member** is a user matching one of the following criteria:
+- Ein Mitglied des Projekts (wie von der `members`-API von GitLab zurückgegeben)
+- Ein Benutzer, der mindestens 5 % (magische Zahl) aller Issues und/oder Commits im Projekt erstellt hat
 
-- A member of the project (as returned by the project member API of GitLab)
-- A user who has created at least 5% (magic number) of all issues and/or commits in the project
+**Die Bedingungen gelten gleichzeitig und nicht unabhängig voneinander:**
 
-**The conditions apply simultaneously and not independently of each other:**
+- Wenn ein Projekt keine Issue hat, gilt die Prüfung als bestanden.
+- Von Projektmitgliedern erstellte Issues werden nicht berücksichtigt.
+- Jede (automatische) Aktion im Stream eines Issues, mit Ausnahme von Kommentaren wie „In MR erwähnt“, „markiert“ oder „zugewiesen“ usw., wird als gültige Problemreaktion gewertet.
+- Ein Kommentar gilt als gültige Reaktion, wenn er von einem Projektmitglied abgesetzt wird.
+- Ein Kommentar wird nicht als gültige Reaktion betrachtet, wenn ein Nicht-Projektmitglied auf das Ticket eines Nicht-Projektmitglieds antwortet.
 
-- If a project does not have any issues, the check will pass.
-- Issues created by project members are not considered.
-- Every (automatic) action in the stream of an issue, except comments such as “Mentioned in MR” or “labeled” or “Assigned to” etc. are evaluated as a valid issue reaction.
-- A comment is considered a valid response if the comment is submitted by a project member.
-- A comment is not considered a valid response if a non-project member responds to the ticket of a non-project member.
 
-### Background
+### Hintergrund
 
-Measuring issue reaction time is a valuable metric for assessing a project's maintenance and responsiveness. 
-A quick reaction time indicates that project maintainers are actively monitoring and addressing issues, which 
-reflects good project health and responsiveness.
+Die Messung der Reaktionszeit auf Issues ist eine wertvolle Kennzahl für die Bewertung
+der Wartung und Reaktionsfähigkeit eines Projekts. Eine schnelle Reaktionszeit deutet darauf hin,
+dass die Projektmitglieder Issues aktiv überwachen und beheben, was auf einen guten Projektzustand
+und eine gute Reaktionsfähigkeit hindeutet.
 
-- Indicator of Active Maintenance: Fast issue responses signal that the project is being actively maintained, 
-with attention to bugs, feature requests, or other user concerns. Slow reactions might suggest neglect, 
-which could impact the user experience or drive away contributors.
+- Indikator für aktive Wartung: Schnelle Reaktionen auf Issues signalisieren, dass das Projekt
+  aktiv gewartet wird, wobei Fehler, Anfragen zu Funktionen oder andere Anliegen der Benutzer
+  berücksichtigt werden. Langsame Reaktionen könnten auf Vernachlässigung hindeuten, was sich auf die
+  Benutzererfahrung auswirken oder Mitwirkende abschrecken könnte.
+- Engagement der Community: Schnelle Reaktionen von Projektmitgliedern zeigen auch eine engagierte
+  und unterstützende Community. Sie zeigen, dass Maintainer oder Contributoren zur Verfügung stehen,
+  um zu helfen, und fördern so eine kollaborativere und produktivere Umgebung.
+- Vertrauen der Benutzer: Projekte mit kürzeren Reaktionszeiten auf Issues schaffen bei
+  den Benutzern mehr Vertrauen, da sie wissen, dass ihre Anliegen umgehend bearbeitet werden,
+  was das Projekt für die Übernahme und Mitwirkung attraktiver macht.
 
-- Community Engagement: Quick reactions from project members also demonstrate an engaged and supportive community.
-It shows that maintainers or contributors are available to help, fostering a more collaborative and productive environment.
-
-- User Confidence: Projects with shorter issue reaction times inspire greater confidence in users, as they know 
-their concerns will be addressed promptly, making the project more appealing for adoption and contribution.
-
-In summary, tracking issue reaction time helps gauge the level of active maintenance, community involvement, 
-and responsiveness, which are crucial for the long-term success and sustainability of a project.
\ No newline at end of file
+Zusammenfassend lässt sich sagen, dass die Untersuchung der Reaktionszeit auf Issues dabei hilft,
+den Grad der aktiven Wartung, des Engagements der Community und der Reaktionsfähigkeit zu messen, die
+für den langfristigen Erfolg und die Nachhaltigkeit eines Projekts von entscheidender Bedeutung sind.
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/packages.mdx b/src/pages/de/concepts/implemented-checks/packages.mdx
index ef198d0..ad2ee55 100644
--- a/src/pages/de/concepts/implemented-checks/packages.mdx
+++ b/src/pages/de/concepts/implemented-checks/packages.mdx
@@ -3,16 +3,16 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Packages
+# Pakete
 
 <Callout type="default">
-  Check type: `PACKAGES`
+  Check Typ: `PACKAGES`
 </Callout>
 
-The check passes if the project has a packaging system in place and used it the give times during the given time range.
-It checks the container registry, the package registry and the releases. It expects either a release to 
-have assets or packages inside those two registries.
+Der Check ist erfolgreich, wenn das Projekt über ein Packaging-System verfügt und dies im betrachteten Zeitraum genutzt wurde.
 
+Der Check überprüft die Container-Registry, das Packaging-System und Releases. Es wird erwartet, dass ein Release
+entweder Assets oder Pakete in einer der Registries enthält.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: PACKAGES
@@ -22,12 +22,15 @@ have assets or packages inside those two registries.
     max: 1
 ```
 
-### Background
-
-Packaging is a way to distribute software. It is important to have a packaging system in place to make it 
-easier for users to install and use the software. Packaging systems can help automate the process of 
-installing software, manage dependencies, and ensure that the software is installed correctly.
-Regularly updating these registries signals active maintenance, showing that the project is well-supported
-and evolving. Versioning helps users track updates and access stable releases, while consistent
-packaging enhances compatibility and consistency across environments. Overall, using packaging systems
-improves software accessibility, signals good project health, and fosters reliability and reuse.
\ No newline at end of file
+### Hintergrund
+
+Packaging ist ein Mechanismus, um Software zu verteilen und auszuliefern. Es ist wichtig, ein Paketsystem einzusetzen,
+um Benutzern die Installation und Verwendung der Software zu erleichtern. Paketsysteme können dabei helfen, den Prozess der
+Softwareinstallation zu automatisieren, Abhängigkeiten zu verwalten und sicherzustellen, dass die Software
+korrekt installiert wird.
+Regelmäßige Aktualisierungen der Paket-Register signalisieren eine aktive Wartung und zeigen, dass das Projekt
+gut unterstützt wird und sich weiterentwickelt. Die Versionierung hilft den Benutzern, Aktualisierungen zu
+verfolgen und auf stabile Versionen zuzugreifen, während eine konsistente Paketierung die Kompatibilität und
+Konsistenz in allen Umgebungen verbessert. Insgesamt verbessert die Verwendung von Paketierungssystemen die
+Zugänglichkeit von Software, signalisiert einen guten Projektzustand und fördert die Zuverlässigkeit und
+Wiederverwendung.
\ No newline at end of file
-- 
GitLab


From 25195fb7c32b93d3c852b929f7de106c58833c96 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 15:33:45 +0100
Subject: [PATCH 11/19] Translates various checks

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 .../de/concepts/implemented-checks/_meta.ts   |  2 +
 .../implemented-checks/protected-branches.mdx | 37 +++++++------
 .../concepts/implemented-checks/releases.mdx  | 54 ++++++++++---------
 .../implemented-checks/subsequent-use.mdx     | 25 +++++----
 4 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/src/pages/de/concepts/implemented-checks/_meta.ts b/src/pages/de/concepts/implemented-checks/_meta.ts
index 46de217..314e001 100644
--- a/src/pages/de/concepts/implemented-checks/_meta.ts
+++ b/src/pages/de/concepts/implemented-checks/_meta.ts
@@ -10,4 +10,6 @@ export default {
     'issue-reaction-time': { title: 'Reaktionszeit auf Issues' },
     packages: { title: 'Pakete' },
     'protected-branches': { title: 'Geschützte Branches' },
+    releases: { title: 'Releases' },
+    'subsequent-use': { title: 'Nachnutzung' },
 }
diff --git a/src/pages/de/concepts/implemented-checks/protected-branches.mdx b/src/pages/de/concepts/implemented-checks/protected-branches.mdx
index 64e9230..71ff5fe 100644
--- a/src/pages/de/concepts/implemented-checks/protected-branches.mdx
+++ b/src/pages/de/concepts/implemented-checks/protected-branches.mdx
@@ -3,15 +3,17 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Protected Branches
+# Geschützte Branches
 
 <Callout type="default">
-  Check type: `PROTECTED_BRANCHES`
+  Check Typ: `PROTECTED_BRANCHES`
 </Callout>
 
-This check verifies if the main branch is protected and if force push is disabled for default branches.
-The check passes if the main branch is protected and force push is disabled for default branches and 
-the minimum permission level for access to the main and default branch is greater than or equal to the minimum threshold.
+Mit diesem Check wird überprüft, ob der Haupt-Branch geschützt (protected) ist und ob die Möglichkeit zum
+„Force Push“ auf Standard-Branches deaktiviert ist.
+Der Check ist erfolgreich, wenn der Haupt-Branch geschützt ist und die erzwungene Weiterleitung für
+Standardzweige deaktiviert ist und die Mindestberechtigungsstufe für den Zugriff auf den Haupt- und
+Standardzweig größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: PROTECTED_BRANCHES
@@ -20,16 +22,21 @@ the minimum permission level for access to the main and default branch is greate
     min: 40 # 0: no access; 30: Developer access; 40: Maintainer access; 60: Admin access
 ```
 
-### Background
+### Hintergrund
 
-Protected branches are an important feature of Git repositories that help maintain the integrity of the codebase.
-By protecting branches, you can prevent accidental changes, enforce code review policies, and ensure that only
-authorized users can change the codebase.
+Geschützte Branches sind ein wichtiges Merkmal von Git-Repositorys, die dazu beitragen, die Integrität
+der Codebasis sicherzustellen.
 
-The main branch is often the default branch in a repository and serves as the primary
-branch for the project. Protecting the main branch ensures that only authorized users can push changes to it,
-reducing the risk of accidental changes or unauthorized modifications.
+Durch den Schutz von Branches können Sie versehentliche Änderungen verhindern, Richtlinien zur
+Codeüberprüfung durchsetzen und sicherstellen, dass nur autorisierte Benutzer die Codebasis
+ändern können.
 
-Force push is a Git operation that allows you to overwrite the history of a branch, potentially losing commits
-and making it difficult to track changes. Disabling force push for default branches helps maintain the integrity
-of the commit history and ensures that changes are tracked accurately.
\ No newline at end of file
+Der Haupt-Branch ist oft der Standard-Branch  (z. B. `main`) in einem Repository und dient als primärer Branch für das
+Projekt. Durch den Schutz des Haupt-Branches wird sichergestellt, dass nur autorisierte Benutzer
+Änderungen an diesem vornehmen können, wodurch das Risiko versehentlicher Änderungen oder nicht
+autorisierter Modifikationen verringert wird.
+
+„Force Push“ ist ein Git-Vorgang, mit dem Sie den Verlauf eines Branches überschreiben können, wodurch
+möglicherweise Commits verloren gehen und es schwierig wird, Änderungen nachzuverfolgen. Durch das
+Deaktivieren von „Force Push“ für Standard-Branches bleibt die Integrität des Commit-Verlaufs erhalten
+und es wird sichergestellt, dass Änderungen genau nachverfolgt werden können.
\ No newline at end of file
diff --git a/src/pages/de/concepts/implemented-checks/releases.mdx b/src/pages/de/concepts/implemented-checks/releases.mdx
index 3562e8e..e509bbf 100644
--- a/src/pages/de/concepts/implemented-checks/releases.mdx
+++ b/src/pages/de/concepts/implemented-checks/releases.mdx
@@ -6,11 +6,11 @@ import { Callout } from 'nextra/components'
 # Releases
 
 <Callout type="default">
-  Check type: `RELEASES`
+  Check Typ: `RELEASES`
 </Callout>
 
-This check queries the GitLab API and counts the number of tags/releases in the time range.
-The check passes if the number of tags/releases is greater than or equal to the minimum threshold.
+Dieser Check fragt die GitLab-API ab und zählt die Anzahl der Tags/Veröffentlichungen im Betrachtungszeitraum.
+Der Check ist erfolgreich, wenn die Anzahl der Tags/Veröffentlichungen größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: RELEASES
@@ -20,26 +20,30 @@ The check passes if the number of tags/releases is greater than or equal to the
     max: 1
 ```
 
-### Background
+### Hintergrund
+
+Die Verwendung von Tags und Releases in einem Projekt kann ein Indikator für dessen Wartung,
+Stabilität und einfache Wiederverwendbarkeit sein.
+
+Tags und Releases ermöglichen es Entwicklern, bestimmte Punkte in der Historie eines Projekts zu markieren,
+die häufig stabile Versionen, wichtige Aktualisierungen oder bedeutende Meilensteine darstellen.
+
+- Wartungsindikator: Regelmäßige Releases und Tags zeigen, dass ein Projekt aktiv gepflegt wird. Wenn
+  regelmäßig Releases veröffentlicht werden, deutet dies darauf hin, dass das Projekt von seinen Maintainern
+  beachtet und aktualisiert wird. Umgekehrt kann das Ausbleiben von Veröffentlichungen über einen längeren
+  Zeitraum darauf hindeuten, dass das Projekt aufgegeben wurde oder stagniert.
+- Versionierung und Stabilität: Tags entsprechen oft stabilen Punkten in der Entwicklung des Projekts. Sie 
+  helfen bei der Definition und Kommunikation bestimmter Versionen der Software und erleichtern die Nachverfolgung
+  von Änderungen im Laufe der Zeit. Benutzer oder andere Entwickler, die sich auf Ihr Projekt verlassen, können
+  sich auf die von Ihnen gesetzte Version verlassen, da sie wissen, dass es sich um einen definierten, stabilen
+  Zustand handelt.
+- Einfache Wiederverwendung: Projekte mit regelmäßigen, gut dokumentierten Releases lassen sich
+  leichter in anderen Projekten wiederverwenden. Wenn Entwickler klar erkennen können, welche Versionen eines
+  Projekts verfügbar sind, ist es viel einfacher, die Richtige auszuwählen. Darüber hinaus
+  ermöglicht eine ordnungsgemäße Kennzeichnung den Benutzern bei Bedarf den Zugriff auf neuere oder frühere
+  Versionen des Projekts, ohne dass das Risiko besteht, von kritischen Änderungen oder Problemeb betroffen zu sein.
+
+Kurz gesagt: Wenn Sie Tags und Releases ordentlich verwenden, wird Ihr Projekt für Mitwirkende,
+Benutzer und diejenigen, die es in ihre eigene Arbeit integrieren möchten, attraktiver. 
+Dies schafft Vertrauen, verbessert die Benutzerfreundlichkeit und stellt sicher, dass Ihr Projekt langfristig relevant bleibt.
 
-The use of tags and releases in a project can be an indicator of its maintenance, stability, and ease of reuse. 
-Tags and releases allow developers to mark specific points in a project's history, often representing stable versions, 
-important updates, or significant milestones.
-
-- Maintenance Indicator: Regular releases and tags show that a project is actively maintained. If releases are 
-consistently made, it indicates that the project is receiving attention and updates from its maintainers. 
-Conversely, a lack of releases over a prolonged period might suggest that the project is abandoned or in a stagnant state.
-
-- Versioning and Stability: Tags often correspond to stable points in the project's development. 
-They help define and communicate specific versions of the software, making it easier to track 
-changes over time. Users or other developers relying on your project can be confident in the 
-version they're using, knowing it's a defined, stable release.
-
-- Ease of Reuse: Projects with regular, well-documented releases are easier to reuse in other projects. 
-When developers can clearly see what versions of a project are available, it's much simpler to pick the right 
-one for their needs. Furthermore, proper tagging allows users to access more recent or earlier versions of the project, 
-if needed, without the risk of breaking changes or similar issues.
-
-In essence, keeping tags and releases up-to-date and within a sensible threshold makes your project 
-more attractive for contributors, users, and those looking to integrate it into their own work. 
-It builds trust, improves usability, and ensures your project remains relevant over time.
diff --git a/src/pages/de/concepts/implemented-checks/subsequent-use.mdx b/src/pages/de/concepts/implemented-checks/subsequent-use.mdx
index 8ddac1f..8721f3b 100644
--- a/src/pages/de/concepts/implemented-checks/subsequent-use.mdx
+++ b/src/pages/de/concepts/implemented-checks/subsequent-use.mdx
@@ -3,14 +3,14 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Subsequent Use
+# Nachnutzung
 
 <Callout type="default">
-  Check type: `SUBSEQUENT_USE`
+  Check Typ: `SUBSEQUENT_USE`
 </Callout>
 
-This check fetches the number of organizations that reported using the project in production.
-The check passes if the number of using organizations is greater than or equal to the minimum threshold.
+Dieser Check ermittelt die Anzahl der Organisationen, die angegeben haben, das Projekt produktiv zu verwenden.
+Der Check gilt als bestanden, wenn die Anzahl der nutzenden Organisationen größer oder gleich dem Mindestschwellenwert ist.
 
 ```yaml filename=".badge-api.yaml" copy
 - type: SUBSEQUENT_USE
@@ -19,14 +19,13 @@ The check passes if the number of using organizations is greater than or equal t
     min: 10
 ```
 
-### Background
+### Hintergrund
 
-The subsequent use check is a measure of the project's adoption in the community.
+Die Prüfung auf Nachnutzung ist ein Maß für die Akzeptanz des Projekts in der Community.
+Je mehr Organisationen ein Projekt nutzen, desto wahrscheinlicher ist es, dass das Projekt stabil und gut
+dokumentiert ist und einen guten Ruf hat. Dies ist ein wichtiger Indikator für die Nachhaltigkeit und
+Qualität eines Projekts.
 
-Organizations can report to the openCode team that they are using a project in production. 
-In addition, the openCode team records subsequent use cases if a case becomes known in the
-context of projects, collaborations or similar that has not yet been recorded.
-
-The more organizations use a project, the more likely it is that the project is stable,
-well-documented, and has a good reputation. This is an important indicator for the
-sustainability and quality of a project.
\ No newline at end of file
+Organisationen können dem openCode-Team melden, dass sie ein Projekt produktiv verwenden. Darüber
+hinaus erfasst das openCode-Team proaktiv Nachnutzungsfälle, wenn im Rahmen von Projekten, Kooperationen oder
+Ähnlichem ein Fall bekannt wird, der bisher nicht erfasst wurde.
\ No newline at end of file
-- 
GitLab


From 7ace7d3c19eef7e5339f877548d6bb143f567c77 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 16:01:56 +0100
Subject: [PATCH 12/19] Translates various checks

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 src/pages/de/api-docs/_meta.ts                |  2 +-
 src/pages/de/api-docs/index.mdx               | 16 +++++++-------
 src/pages/de/api-docs/v1/_meta.ts             |  5 +++--
 .../de/api-docs/v1/badge-explanation.mdx      | 16 +++++++-------
 src/pages/de/api-docs/v1/badges.mdx           | 17 +++++++--------
 .../api-docs/v1/sarif-per-repo-endpoint.mdx   | 21 ++++++++++---------
 6 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/src/pages/de/api-docs/_meta.ts b/src/pages/de/api-docs/_meta.ts
index 5ecd98b..c3e7383 100644
--- a/src/pages/de/api-docs/_meta.ts
+++ b/src/pages/de/api-docs/_meta.ts
@@ -2,6 +2,6 @@
 // SPDX-License-Identifier: MIT
 
 export default {
-    index: { title: 'Overview' },
+    index: { title: 'Ãœberblick' },
     v1: { title: 'API v1' },
 }
diff --git a/src/pages/de/api-docs/index.mdx b/src/pages/de/api-docs/index.mdx
index cfdcadc..423e215 100644
--- a/src/pages/de/api-docs/index.mdx
+++ b/src/pages/de/api-docs/index.mdx
@@ -12,24 +12,24 @@ import {
   EyeSlashIcon
 } from '@heroicons/react/24/outline'
 
-# API Documentation
+# API Dokumentation
 
-The ZenDiS Badge API repository scanner provides a JSON API to interact with. The following endpoints are available:
+Die Badge API bietet eine RESTful JSON-API an. Die folgenden Endpunkte sind verfügbar:
 
 <Cards>
   <Cards.Card
     icon={<EyeSlashIcon />}
-    title="SARIF Report per Repository"
-    href="api-docs/v1/sarif-per-repo-endpoint"
+    title="SARIF Report pro Repository"
+    href="/de/api-docs/v1/sarif-per-repo-endpoint"
   />
   <Cards.Card
     icon={<LinkIcon />}
-    title="Badge of a Repository as SVG"
-    href="api-docs/v1/badges#get-svg-badge"
+    title="Badge eines Repositorys als SVG"
+    href="/de/api-docs/v1/badges#get-svg-badge"
   />
   <Cards.Card
     icon={<CubeIcon />}
-    title="Explanation of a Badge of a Repository"
-    href="api-docs/v1/badges#get-badge-explanation"
+    title="Erklärung einer Badge eines Repositorys"
+    href="/de/api-docs/v1/badges#get-badge-explanation"
   />
 </Cards>
\ No newline at end of file
diff --git a/src/pages/de/api-docs/v1/_meta.ts b/src/pages/de/api-docs/v1/_meta.ts
index 5c939c3..eccddbe 100644
--- a/src/pages/de/api-docs/v1/_meta.ts
+++ b/src/pages/de/api-docs/v1/_meta.ts
@@ -2,6 +2,7 @@
 // SPDX-License-Identifier: MIT
 
 export default {
-    'sarif-per-repo-endpoint': { title: 'SARIF per Repo' },
-    badges: { title: 'Badge per Repo and BadgeId' },
+    'sarif-per-repo-endpoint': { title: 'SARIF pro Repo' },
+    badges: { title: 'Badge pro Repo and Badge-ID' },
+    'badge-explanation': { title: 'Erklärung einer Badge' },
 }
diff --git a/src/pages/de/api-docs/v1/badge-explanation.mdx b/src/pages/de/api-docs/v1/badge-explanation.mdx
index 2d41777..50c57b8 100644
--- a/src/pages/de/api-docs/v1/badge-explanation.mdx
+++ b/src/pages/de/api-docs/v1/badge-explanation.mdx
@@ -7,24 +7,24 @@ SPDX-License-Identifier: MIT */}
 
 import { Tabs, Callout } from 'nextra/components'
 
-# Badge Explanation
+# Erklärung einer Badge
 
-## Get the explanation of a badge
+## Erklärung zu einer Badge erhalten
 
 <Callout type="info">
   `GET /api/v1/repositories/{repositoryUrl}/badges/{badgeID}/sarif`
 </Callout>
 
-This endpoint returns the the explanation of a badge for the given repository URL and badge ID.
+Dieser Endpunkt gibt die Erklärung einer Badges für die angegebene Repository-URL und Badge-ID zurück.
 
-This endpoint gets parameterized with the repository URL and the badge ID. The repository URL is the URL of the repository that should 
-be or was already scanned. **The URL must be URL encoded** 
+Dieser Endpunkt wird mit der Repository-URL und der Badge-ID parametrisiert. Die Repository-URL ist die
+URL des Repositorys, das gescannt werden soll oder bereits gescannt wurde. **Die URL muss URL-encodiert sein.** 
 (`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
 
-The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
-[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
+Die Badge-ID ist der Titel der Badge, der zurückgegeben werden soll. Die verfügbaren Badges und damit die Badge-IDs werden in der
+[.badge-api.yaml](/de/concepts/configuration) der Instanz der API definiert.
 
-### Example Request
+### Beispiel Anfrage
 
 <Tabs items={['GO', 'JavaScript', 'curl']}>
     <Tabs.Tab>
diff --git a/src/pages/de/api-docs/v1/badges.mdx b/src/pages/de/api-docs/v1/badges.mdx
index 85e445f..fa9638b 100644
--- a/src/pages/de/api-docs/v1/badges.mdx
+++ b/src/pages/de/api-docs/v1/badges.mdx
@@ -7,25 +7,24 @@ SPDX-License-Identifier: MIT */}
 
 import { Tabs, Callout } from 'nextra/components'
 
-# Badges
+# Badge pro Repository und Badge-ID
 
-## Get SVG Badge
+## SVG einer Badge
 
 <Callout type="info">
   `GET /api/v1/repositories/{repositoryUrl}/badges/{badgeID}`
 </Callout>
 
-This endpoint returns the **SVG badge** for the given repository URL and badge ID.
+Dieser Endpunkt gibt die **SVG-Badge** für die angegebene Repository-URL und Badge-ID zurück.
 
-This endpoint gets parameterized with the repository URL and the badge ID. The repository URL is the URL of the repository that should 
-be or was already scanned. **The URL must be URL encoded** 
+Dieser Endpunkt wird mit der Repository-URL und der Badge-ID parametrisiert. Die Repository-URL ist die URL des Repositorys, das 
+gescannt werden soll oder bereits gescannt wurde. **Die URL muss URL-encodiert sein** 
 (`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
 
-The badge ID is the title of the badge that should be returned. The available badges and therefore the badge IDs are defined in the
-[.badge-api.yaml](/en/concepts/configuration) of the badge api instance.
-
-### Example Request
+Die Badge-ID ist der Titel der Badge, der zurückgegeben werden soll. Die verfügbaren Badges und damit die Badge-IDs werden in der
+[.badge-api.yaml](/de/concepts/configuration) der Instanz der API definiert.
 
+### Beispiel Anfrage
 <Tabs items={['GO', 'JavaScript', 'curl']}>
     <Tabs.Tab>
         ```go filename="main.go" copy
diff --git a/src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx b/src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx
index dc137c8..4bf213b 100644
--- a/src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx
+++ b/src/pages/de/api-docs/v1/sarif-per-repo-endpoint.mdx
@@ -7,24 +7,25 @@ SPDX-License-Identifier: MIT */}
 
 import { Tabs, Callout } from 'nextra/components'
 
-# SARIF per Repository
+# SARIF pro Repository
 
 <Callout type="info">
   `GET /api/v1/repositories/{repositoryUrl}/sarif`
 </Callout>
 
-This endpoint gets parameterized with the **full repository URL**. The repository URL is the URL of the repository that should be scanned.
-**The URL must be URL encoded** 
+Dieser Endpunkt wird mit der **vollständigen Repository-URL** parametrisiert. Die Repository-URL ist die URL des zu scannenden Repositorys.
+**Die URL muss URL-encodiert sein** 
 (`https://gitlab.opencode.de/zendis-repo-scanner` → `https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner`).
 
-Using this format opens the possibility to scan repositories from other platforms like GitHub, Bitbucket, etc. Besides 
-that, caching is simplified because the URL is unique (instead of using the project ID and a platform URL as query string for 
-example) and the URL is human-readable, at least after URL decoding. This might improve debugging in the future.
+Die Verwendung dieses Formats eröffnet die Möglichkeit, Repositorys von anderen Plattformen wie GitHub, Bitbucket usw.
+zu scannen. Außerdem wird das Caching vereinfacht, da die URL eindeutig ist (anstatt beispielsweise die Projekt-ID und
+eine Plattform-URL als Query-String zu verwenden) und die URL zumindest nach der URL-Dekodierung für Menschen
+lesbar ist. Dies könnte in Zukunft die Fehlerbehebung verbessern.
 
-The result is returned in [SARIF format](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning). 
-**SARIF simplifies possible later integration with other tools. It is an open standard and widely supported.**
+Die Antwort der API ist im [SARIF format](https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning). 
+**SARIF vereinfacht eine mögliche spätere Integration mit anderen Tools. Es handelt sich um einen offenen Standard, der breite Unterstützung findet.**
 
-### Example Request
+### Beispiel Anfrage
 
 <Tabs items={['GO', 'JavaScript', 'curl']}>
     <Tabs.Tab>
@@ -70,7 +71,7 @@ The result is returned in [SARIF format](https://docs.github.com/en/code-securit
     </Tabs.Tab>
 </Tabs>
 
-### Example JSON Response
+### Beispiel Antwort
 
 ```json
 {
-- 
GitLab


From 4d17635f00dbbcf4104aa81678b5262748c89bff Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 16:06:37 +0100
Subject: [PATCH 13/19] Corrects links

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 src/components/Footer.tsx                                | 6 +++---
 src/pages/de/_meta.ts                                    | 4 ++--
 src/pages/de/official-badges/active-maintained-badge.mdx | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
index f4bf1f9..32a9749 100644
--- a/src/components/Footer.tsx
+++ b/src/components/Footer.tsx
@@ -4,12 +4,12 @@ SPDX-License-Identifier: MIT */
 const navigation = {
     officialBadges: [
         {
-            name: 'Maintained Badge',
+            name: 'Aktive Wartungs Badge',
             href: '/de/official-badges/active-maintained-badge',
             external: false,
         },
         {
-            name: 'Reuse Badge',
+            name: 'Nachnutzungs Badge',
             href: '/de/official-badges/reuse-badge',
             external: false,
         },
@@ -65,7 +65,7 @@ const navigation = {
             external: false,
         },
         {
-            name: 'Reporting barriers',
+            name: 'Barriere melden',
             href: 'mailto:info@opencode.de',
             external: false,
         },
diff --git a/src/pages/de/_meta.ts b/src/pages/de/_meta.ts
index b7d2503..a2a0c19 100644
--- a/src/pages/de/_meta.ts
+++ b/src/pages/de/_meta.ts
@@ -15,12 +15,12 @@ export default {
     docs: {
         title: 'Dokumentation',
         type: 'page',
-        href: '/introduction',
+        href: '/de/introduction',
     },
     'live-demo': {
         title: 'Zur Live Demo 🚀',
         type: 'page',
-        href: '/#api-small-demo',
+        href: '/de/#api-small-demo',
     },
     'erklaerung-zur-barrierefreiheit': {
         display: 'hidden',
diff --git a/src/pages/de/official-badges/active-maintained-badge.mdx b/src/pages/de/official-badges/active-maintained-badge.mdx
index d8cbb55..c09b5cf 100644
--- a/src/pages/de/official-badges/active-maintained-badge.mdx
+++ b/src/pages/de/official-badges/active-maintained-badge.mdx
@@ -3,7 +3,7 @@ SPDX-License-Identifier: MIT */}
 
 import { Callout } from 'nextra/components'
 
-# Maintained Badge
+# Badge für aktive Wartung
 
 <Callout type="info" emoji="🛡️">
 **Offizielle Badge im openCode Software-Katalog**
-- 
GitLab


From 0755d565ed050a323c812241fd19e7bb203d961c Mon Sep 17 00:00:00 2001
From: Frederic Noppe <frederic.noppe@l3montree.com>
Date: Tue, 11 Mar 2025 16:08:55 +0100
Subject: [PATCH 14/19] updates documentation

Signed-off-by: Frederic Noppe <frederic.noppe@l3montree.com>
---
 package-lock.json             | 277 +++++-----------------------------
 package.json                  |   4 +-
 src/pages/_meta.ts            |   3 +
 src/pages/de/introduction.mdx |   2 +-
 4 files changed, 46 insertions(+), 240 deletions(-)
 create mode 100644 src/pages/_meta.ts

diff --git a/package-lock.json b/package-lock.json
index 6064816..b39e9c0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,7 +29,7 @@
                 "react-dom": "^18.3.1",
                 "react-hook-form": "^7.54.1",
                 "react-markdown": "^9.0.1",
-                "react-syntax-highlighter": "^15.6.1",
+                "react-syntax-highlighter": "^5.8.0",
                 "recharts": "^2.15.1",
                 "remark-gemoji": "^8.0.0",
                 "remark-gfm": "^4.0.0",
@@ -4655,6 +4655,22 @@
                 "@babel/core": "^7.0.0"
             }
         },
+        "node_modules/babel-runtime": {
+            "version": "6.26.0",
+            "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+            "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+            "license": "MIT",
+            "dependencies": {
+                "core-js": "^2.4.0",
+                "regenerator-runtime": "^0.11.0"
+            }
+        },
+        "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+            "version": "0.11.1",
+            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+            "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+            "license": "MIT"
+        },
         "node_modules/bail": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
@@ -5401,6 +5417,14 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/core-js": {
+            "version": "2.6.12",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+            "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+            "hasInstallScript": true,
+            "license": "MIT"
+        },
         "node_modules/cose-base": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
@@ -8236,16 +8260,6 @@
                 "url": "https://opencollective.com/unified"
             }
         },
-        "node_modules/hast-util-parse-selector": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
-            "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
-            "license": "MIT",
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/unified"
-            }
-        },
         "node_modules/hast-util-raw": {
             "version": "9.1.0",
             "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
@@ -8420,86 +8434,16 @@
                 "url": "https://opencollective.com/unified"
             }
         },
-        "node_modules/hastscript": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
-            "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
-            "license": "MIT",
-            "dependencies": {
-                "@types/hast": "^2.0.0",
-                "comma-separated-tokens": "^1.0.0",
-                "hast-util-parse-selector": "^2.0.0",
-                "property-information": "^5.0.0",
-                "space-separated-tokens": "^1.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/unified"
-            }
-        },
-        "node_modules/hastscript/node_modules/@types/hast": {
-            "version": "2.3.10",
-            "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
-            "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
-            "license": "MIT",
-            "dependencies": {
-                "@types/unist": "^2"
-            }
-        },
-        "node_modules/hastscript/node_modules/@types/unist": {
-            "version": "2.0.11",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
-            "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
-            "license": "MIT"
-        },
-        "node_modules/hastscript/node_modules/comma-separated-tokens": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
-            "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/hastscript/node_modules/property-information": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
-            "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
-            "license": "MIT",
-            "dependencies": {
-                "xtend": "^4.0.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/hastscript/node_modules/space-separated-tokens": {
-            "version": "1.1.5",
-            "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
-            "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
         "node_modules/highlight.js": {
-            "version": "10.7.3",
-            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
-            "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+            "version": "9.12.0",
+            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
+            "integrity": "sha512-qNnYpBDO/FQwYVur1+sQBQw7v0cxso1nOYLklqWh6af8ROwwTVoII5+kf/BVa8354WL4ad6rURHYGUXCbD9mMg==",
+            "deprecated": "Version no longer supported. Upgrade to @latest",
             "license": "BSD-3-Clause",
             "engines": {
                 "node": "*"
             }
         },
-        "node_modules/highlightjs-vue": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
-            "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
-            "license": "CC0-1.0"
-        },
         "node_modules/html-encoding-sniffer": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
@@ -10529,17 +10473,13 @@
             }
         },
         "node_modules/lowlight": {
-            "version": "1.20.0",
-            "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
-            "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+            "version": "1.9.2",
+            "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.9.2.tgz",
+            "integrity": "sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==",
             "license": "MIT",
             "dependencies": {
-                "fault": "^1.0.0",
-                "highlight.js": "~10.7.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
+                "fault": "^1.0.2",
+                "highlight.js": "~9.12.0"
             }
         },
         "node_modules/lru-cache": {
@@ -13152,15 +13092,6 @@
                 "url": "https://github.com/chalk/ansi-styles?sponsor=1"
             }
         },
-        "node_modules/prismjs": {
-            "version": "1.29.0",
-            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
-            "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
-            "license": "MIT",
-            "engines": {
-                "node": ">=6"
-            }
-        },
         "node_modules/prompts": {
             "version": "2.4.2",
             "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -13374,17 +13305,14 @@
             }
         },
         "node_modules/react-syntax-highlighter": {
-            "version": "15.6.1",
-            "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
-            "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+            "version": "5.8.0",
+            "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-5.8.0.tgz",
+            "integrity": "sha512-+FolT9NhFBqE4SsZDelSzsYJJS/JCnQqo4+GxLrFPoML548uvr8f4Eh5nnd5o6ERKFW7ryiygOX9SPnxdnlpkg==",
             "license": "MIT",
             "dependencies": {
-                "@babel/runtime": "^7.3.1",
-                "highlight.js": "^10.4.1",
-                "highlightjs-vue": "^1.0.0",
-                "lowlight": "^1.17.0",
-                "prismjs": "^1.27.0",
-                "refractor": "^3.6.0"
+                "babel-runtime": "^6.18.0",
+                "highlight.js": "~9.12.0",
+                "lowlight": "~1.9.1"
             },
             "peerDependencies": {
                 "react": ">= 0.14.0"
@@ -13568,122 +13496,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/refractor": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
-            "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
-            "license": "MIT",
-            "dependencies": {
-                "hastscript": "^6.0.0",
-                "parse-entities": "^2.0.0",
-                "prismjs": "~1.27.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/character-entities": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
-            "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/character-entities-legacy": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
-            "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/character-reference-invalid": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
-            "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/is-alphabetical": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
-            "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/is-alphanumerical": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
-            "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
-            "license": "MIT",
-            "dependencies": {
-                "is-alphabetical": "^1.0.0",
-                "is-decimal": "^1.0.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/is-decimal": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
-            "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/is-hexadecimal": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
-            "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
-            "license": "MIT",
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/parse-entities": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-            "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-            "license": "MIT",
-            "dependencies": {
-                "character-entities": "^1.0.0",
-                "character-entities-legacy": "^1.0.0",
-                "character-reference-invalid": "^1.0.0",
-                "is-alphanumerical": "^1.0.0",
-                "is-decimal": "^1.0.0",
-                "is-hexadecimal": "^1.0.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/refractor/node_modules/prismjs": {
-            "version": "1.27.0",
-            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
-            "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
-            "license": "MIT",
-            "engines": {
-                "node": ">=6"
-            }
-        },
         "node_modules/regenerator-runtime": {
             "version": "0.14.1",
             "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -16656,15 +16468,6 @@
                 "node": ">=0.1"
             }
         },
-        "node_modules/xtend": {
-            "version": "4.0.2",
-            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-            "license": "MIT",
-            "engines": {
-                "node": ">=0.4"
-            }
-        },
         "node_modules/y18n": {
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
diff --git a/package.json b/package.json
index 7d5615e..e2583cc 100644
--- a/package.json
+++ b/package.json
@@ -53,7 +53,7 @@
         "react-dom": "^18.3.1",
         "react-hook-form": "^7.54.1",
         "react-markdown": "^9.0.1",
-        "react-syntax-highlighter": "^15.6.1",
+        "react-syntax-highlighter": "^5.8.0",
         "recharts": "^2.15.1",
         "remark-gemoji": "^8.0.0",
         "remark-gfm": "^4.0.0",
@@ -74,4 +74,4 @@
         "tailwindcss": "^3.4.16",
         "typescript": "^5.7.2"
     }
-}
\ No newline at end of file
+}
diff --git a/src/pages/_meta.ts b/src/pages/_meta.ts
new file mode 100644
index 0000000..d617421
--- /dev/null
+++ b/src/pages/_meta.ts
@@ -0,0 +1,3 @@
+// Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
+// SPDX-License-Identifier: MIT
+
diff --git a/src/pages/de/introduction.mdx b/src/pages/de/introduction.mdx
index 735c136..1d99915 100644
--- a/src/pages/de/introduction.mdx
+++ b/src/pages/de/introduction.mdx
@@ -44,7 +44,7 @@ deren Verwendung finden Sie in der [API-Dokumentation](/de/api-docs).
 
 Sie können die Badge-API selbst hosten. Wir stellen ein [Helm-Chart zur Bereitstellung
 der Badge-API](https://gitlab.opencode.de/open-code/badgebackend/badge-api-helm-chart)
-auf einem Kubernetes-Cluster ⎈ zur Verfügung. 
+auf einem Kubernetes-Cluster zur Verfügung. 
 Alternativ können Sie die API lokal als Container oder Bare-Metal ausführen.
 
 ### Beitragen zum Badge-Programm
-- 
GitLab


From 28ea04b2c0e7f738ed468adb9641d2395e791eb0 Mon Sep 17 00:00:00 2001
From: Frederic Noppe <frederic.noppe@l3montree.com>
Date: Tue, 11 Mar 2025 16:16:02 +0100
Subject: [PATCH 15/19] updates documentation

Signed-off-by: Frederic Noppe <frederic.noppe@l3montree.com>
---
 src/pages/de/concepts/implemented-checks/commits.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/de/concepts/implemented-checks/commits.mdx b/src/pages/de/concepts/implemented-checks/commits.mdx
index 9d22563..cc0ae43 100644
--- a/src/pages/de/concepts/implemented-checks/commits.mdx
+++ b/src/pages/de/concepts/implemented-checks/commits.mdx
@@ -25,4 +25,4 @@ Der Check gilt als bestanden, wenn die Anzahl der Commits größer oder gleich d
 Das Zählen von Commits innerhalb eines bestimmten Zeitraums kann Teil der Messung der Aktivität und Wartung eines Projekts sein. 
 Häufige Commits deuten auf eine aktive Entwicklung, Fehlerbehebungen und laufende Verbesserungen hin.
 Eine hohe Anzahl von Commits kann ferner auf engagierte Mitwirkende und eine positive Entwicklung des Projekts
-hinweisen, während eine geringere Anzahl von Commits auf eine Stagnation hindeuten kann.
\ No newline at end of file
+hinweisen, während eine geringere Anzahl von Commits oder das Ausbleiben dieser auf eine Stagnation hindeuten kann.
\ No newline at end of file
-- 
GitLab


From 520a5f734f478d417c157f37ff92d8a918e84df2 Mon Sep 17 00:00:00 2001
From: Frederic Noppe <frederic.noppe@l3montree.com>
Date: Tue, 11 Mar 2025 16:17:52 +0100
Subject: [PATCH 16/19] updates documentation

Signed-off-by: Frederic Noppe <frederic.noppe@l3montree.com>
---
 src/pages/de/concepts/implemented-checks/elephant-factor.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/de/concepts/implemented-checks/elephant-factor.mdx b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
index 9c2b72a..e633305 100644
--- a/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
+++ b/src/pages/de/concepts/implemented-checks/elephant-factor.mdx
@@ -26,7 +26,7 @@ Der Elefantenfaktor ist ein Maß für das Risiko, das sich daraus ergibt, dass I
 nicht zwischen Organisationen ausgetauscht werden.
 
 Er ähnelt dem [Bus-Faktor](/de/concepts/implemented-checks/bus-factor), misst jedoch nicht das Risiko,
-Einzelpersonen zu verlieren, sondern das Risiko, Organisationen zu verlieren.
+Einzelpersonen zu verlieren, sondern das Risiko, am Projekt mitwirkende Organisationen zu verlieren.
 
 Wenn ein Projekt etwa einen Elefantenfaktor von 2 hat, bedeutet dies, dass die beiden wichtigsten
 Organisationen für 50 % der Commits verantwortlich sind und das Projekt in Gefahr wäre, wenn beide
-- 
GitLab


From a0f05c715c96e8b27054c7bf54e3d25c312c9a0c Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 16:17:57 +0100
Subject: [PATCH 17/19] Translates hero

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 src/components/landing-page/Hero.tsx | 38 ++++++++++++----------------
 src/pages/de/index.mdx               | 27 ++++++++++++++++++--
 src/pages/en/index.mdx               | 27 ++++++++++++++++++--
 3 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/src/components/landing-page/Hero.tsx b/src/components/landing-page/Hero.tsx
index dfe0850..ef9a192 100644
--- a/src/components/landing-page/Hero.tsx
+++ b/src/components/landing-page/Hero.tsx
@@ -3,7 +3,16 @@
 
 import Image from 'next/image'
 
-export default function Hero() {
+interface Props {
+    titleH1: string
+    greetingChildren: React.ReactNode
+    toDocs: string
+    toDocsHref: string
+    toDemo: string
+    toDemoHref: string
+}
+
+export default function Hero(props: Props) {
     return (
         <div className="bg-white">
             <main>
@@ -58,36 +67,21 @@ export default function Hero() {
                             <div className="mx-auto max-w-2xl gap-x-14 lg:mx-0 lg:flex lg:max-w-none lg:items-center">
                                 <div className="relative w-full lg:max-w-xl lg:shrink-0 xl:max-w-2xl">
                                     <h1 className="text-pretty text-5xl font-semibold tracking-tight text-zinc-900 sm:text-7xl">
-                                        Badge Programm - Vertrauen in Open
-                                        Source Software stärken
+                                        {props.titleH1}
                                     </h1>
-                                    <p className="mt-8 text-pretty text-lg font-medium text-zinc-600 sm:max-w-md sm:text-xl/8 lg:max-w-none">
-                                        Das Badge Programm prüft openCode
-                                        Repositories und vergibt Badges, die im{' '}
-                                        <a
-                                            target="_blank"
-                                            rel="noreferrer noopener"
-                                            href="https://opencode.de/en/software"
-                                            className="text-blue-500 underline"
-                                        >
-                                            openCode Softwarekatalog
-                                        </a>{' '}
-                                        angezeigt werden und den Status der
-                                        Repositories in Bezug auf Sicherheit,
-                                        Wartung und Wiederverwendung anzeigen.
-                                    </p>
+                                    {props.greetingChildren}
                                     <div className="mt-10 flex items-center gap-x-6">
                                         <a
-                                            href="/introduction"
+                                            href={props.toDocsHref}
                                             className="rounded-md bg-blue-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
                                         >
-                                            Zur Dokumentation
+                                            {props.toDocs}
                                         </a>
                                         <a
-                                            href="#api-small-demo"
+                                            href={props.toDemoHref}
                                             className="text-sm/6 font-semibold text-zinc-900"
                                         >
-                                            API Live Demo{' '}
+                                            {props.toDemo}{' '}
                                             <span aria-hidden="true">→</span>
                                         </a>
                                     </div>
diff --git a/src/pages/de/index.mdx b/src/pages/de/index.mdx
index d11ab69..0cb96b3 100644
--- a/src/pages/de/index.mdx
+++ b/src/pages/de/index.mdx
@@ -11,9 +11,32 @@ import ApiSmallDemo from '../../components/landing-page/ApiSmallDemo'
 export default function Home() {
     return (
         <div className="overflow-hidden">
-            <Hero />
+            <Hero
+                titleH1="Badge Programm - Vertrauen in Open Source Software stärken"
+                greetingChildren={
+                    <p className="mt-8 text-pretty text-lg font-medium text-zinc-600 sm:max-w-md sm:text-xl/8 lg:max-w-none">
+                        Das Badge Programm prüft openCode Repositories und
+                        vergibt Badges, die im{' '}
+                        <a
+                            target="_blank"
+                            rel="noreferrer noopener"
+                            href="https://opencode.de/en/software"
+                            className="text-blue-500 underline"
+                        >
+                            openCode Softwarekatalog
+                        </a>{' '}
+                        angezeigt werden und den Status der Repositories in
+                        Bezug auf Sicherheit, Wartung und Wiederverwendung
+                        anzeigen.
+                    </p>
+                }
+                toDocs="Zur Dokumentation"
+                toDocsHref="/de/introduction"
+                toDemo="API Live Demo"
+                toDemoHref="/de#api-small-demo"
+            />
             <main>
-            <ApiSmallDemo />
+                <ApiSmallDemo />
             </main>
         </div>
     )
diff --git a/src/pages/en/index.mdx b/src/pages/en/index.mdx
index d11ab69..5de8cb2 100644
--- a/src/pages/en/index.mdx
+++ b/src/pages/en/index.mdx
@@ -5,15 +5,38 @@ title: Home
 {/* Copyright 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH.
 SPDX-License-Identifier: MIT */}
 
+
 import Hero from '../../components/landing-page/Hero'
 import ApiSmallDemo from '../../components/landing-page/ApiSmallDemo'
 
 export default function Home() {
     return (
         <div className="overflow-hidden">
-            <Hero />
+            <Hero
+                titleH1="Badge Program - Building Trust in Open Source Software"
+                greetingChildren={
+                    <p className="mt-8 text-pretty text-lg font-medium text-zinc-600 sm:max-w-md sm:text-xl/8 lg:max-w-none">
+                        The badge program checks open-code repositories and
+                        awards badges that are displayed in the{' '}
+                        <a
+                            target="_blank"
+                            rel="noreferrer noopener"
+                            href="https://opencode.de/en/software"
+                            className="text-blue-500 underline"
+                        >
+                            open-code software catalogue
+                        </a>{' '}
+                        and indicate the status of the repositories in terms of
+                        security, maintenance and reuse.
+                    </p>
+                }
+                toDocs="To Documentation"
+                toDocsHref="/en/introduction"
+                toDemo="API Live Demo"
+                toDemoHref="/en#api-small-demo"
+            />
             <main>
-            <ApiSmallDemo />
+                <ApiSmallDemo />
             </main>
         </div>
     )
-- 
GitLab


From f049d6b9e2b3c0223b59ed932885e4584024636c Mon Sep 17 00:00:00 2001
From: Frederic Noppe <frederic.noppe@l3montree.com>
Date: Tue, 11 Mar 2025 16:19:54 +0100
Subject: [PATCH 18/19] updates documentation

Signed-off-by: Frederic Noppe <frederic.noppe@l3montree.com>
---
 .../de/concepts/implemented-checks/issue-reaction-time.mdx      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx b/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
index d83538e..4a144f2 100644
--- a/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
+++ b/src/pages/de/concepts/implemented-checks/issue-reaction-time.mdx
@@ -53,6 +53,6 @@ und eine gute Reaktionsfähigkeit hindeutet.
   den Benutzern mehr Vertrauen, da sie wissen, dass ihre Anliegen umgehend bearbeitet werden,
   was das Projekt für die Übernahme und Mitwirkung attraktiver macht.
 
-Zusammenfassend lässt sich sagen, dass die Untersuchung der Reaktionszeit auf Issues dabei hilft,
+Die Untersuchung der Reaktionszeit auf Issues hilft dabei,
 den Grad der aktiven Wartung, des Engagements der Community und der Reaktionsfähigkeit zu messen, die
 für den langfristigen Erfolg und die Nachhaltigkeit eines Projekts von entscheidender Bedeutung sind.
\ No newline at end of file
-- 
GitLab


From be844d7b9700fa78739f985ab44d5cee98e70783 Mon Sep 17 00:00:00 2001
From: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
Date: Tue, 11 Mar 2025 16:38:52 +0100
Subject: [PATCH 19/19] Translates api demo

Signed-off-by: Sebastian Kawelke <sebastian.kawelke@l3montree.com>
---
 package-lock.json                            | 24 ++++++------
 package.json                                 | 12 +++---
 src/components/CheckRepoForm.tsx             |  8 +++-
 src/components/ResultGrid.tsx                | 31 ++++++++++++++--
 src/components/ResultTable.tsx               | 34 +++++++++++++----
 src/components/landing-page/ApiSmallDemo.tsx | 39 ++++++++++++++++----
 src/pages/de/index.mdx                       | 16 +++++++-
 src/pages/en/index.mdx                       | 14 ++++++-
 8 files changed, 137 insertions(+), 41 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b39e9c0..056a64f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,26 +27,26 @@
                 "p-limit": "^6.1.0",
                 "react": "^18.3.1",
                 "react-dom": "^18.3.1",
-                "react-hook-form": "^7.54.1",
+                "react-hook-form": "^7.54.2",
                 "react-markdown": "^9.0.1",
                 "react-syntax-highlighter": "^5.8.0",
                 "recharts": "^2.15.1",
                 "remark-gemoji": "^8.0.0",
-                "remark-gfm": "^4.0.0",
+                "remark-gfm": "^4.0.1",
                 "sass": "^1.83.0",
                 "sharp": "^0.33.5",
-                "tailwind-merge": "^3.0.1",
+                "tailwind-merge": "^3.0.2",
                 "winston": "^3.17.0"
             },
             "devDependencies": {
                 "@types/node": "22.10.2",
-                "autoprefixer": "^10.4.20",
+                "autoprefixer": "^10.4.21",
                 "eslint-config-next": "^14.2.18",
-                "eslint-plugin-prettier": "^5.2.1",
+                "eslint-plugin-prettier": "^5.2.3",
                 "jest": "^29.7.0",
                 "jest-environment-jsdom": "^29.7.0",
                 "postcss": "^8.4.49",
-                "prettier-plugin-tailwindcss": "^0.6.9",
+                "prettier-plugin-tailwindcss": "^0.6.11",
                 "tailwindcss": "^3.4.16",
                 "typescript": "^5.7.2"
             }
@@ -4456,9 +4456,9 @@
             "license": "MIT"
         },
         "node_modules/autoprefixer": {
-            "version": "10.4.20",
-            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
-            "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+            "version": "10.4.21",
+            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+            "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
             "dev": true,
             "funding": [
                 {
@@ -4476,11 +4476,11 @@
             ],
             "license": "MIT",
             "dependencies": {
-                "browserslist": "^4.23.3",
-                "caniuse-lite": "^1.0.30001646",
+                "browserslist": "^4.24.4",
+                "caniuse-lite": "^1.0.30001702",
                 "fraction.js": "^4.3.7",
                 "normalize-range": "^0.1.2",
-                "picocolors": "^1.0.1",
+                "picocolors": "^1.1.1",
                 "postcss-value-parser": "^4.2.0"
             },
             "bin": {
diff --git a/package.json b/package.json
index e2583cc..373ad12 100644
--- a/package.json
+++ b/package.json
@@ -51,26 +51,26 @@
         "p-limit": "^6.1.0",
         "react": "^18.3.1",
         "react-dom": "^18.3.1",
-        "react-hook-form": "^7.54.1",
+        "react-hook-form": "^7.54.2",
         "react-markdown": "^9.0.1",
         "react-syntax-highlighter": "^5.8.0",
         "recharts": "^2.15.1",
         "remark-gemoji": "^8.0.0",
-        "remark-gfm": "^4.0.0",
+        "remark-gfm": "^4.0.1",
         "sass": "^1.83.0",
         "sharp": "^0.33.5",
-        "tailwind-merge": "^3.0.1",
+        "tailwind-merge": "^3.0.2",
         "winston": "^3.17.0"
     },
     "devDependencies": {
         "@types/node": "22.10.2",
-        "autoprefixer": "^10.4.20",
+        "autoprefixer": "^10.4.21",
         "eslint-config-next": "^14.2.18",
-        "eslint-plugin-prettier": "^5.2.1",
+        "eslint-plugin-prettier": "^5.2.3",
         "jest": "^29.7.0",
         "jest-environment-jsdom": "^29.7.0",
         "postcss": "^8.4.49",
-        "prettier-plugin-tailwindcss": "^0.6.9",
+        "prettier-plugin-tailwindcss": "^0.6.11",
         "tailwindcss": "^3.4.16",
         "typescript": "^5.7.2"
     }
diff --git a/src/components/CheckRepoForm.tsx b/src/components/CheckRepoForm.tsx
index 45e198b..601bca7 100644
--- a/src/components/CheckRepoForm.tsx
+++ b/src/components/CheckRepoForm.tsx
@@ -14,11 +14,15 @@ import { Label } from './ui/label'
 interface Props {
     onScanFinished: (response: SarifApiResponse) => void
     displayLabel?: boolean
+    pleaseWait: string
+    test: string
 }
 
 const CheckRepoForm: FunctionComponent<Props> = ({
     onScanFinished,
     displayLabel,
+    pleaseWait,
+    test,
 }) => {
     const form = useForm<{
         repositoryUrl: string
@@ -78,7 +82,7 @@ const CheckRepoForm: FunctionComponent<Props> = ({
                         {isPending ? (
                             <Button className="border-transparent" disabled>
                                 <Loader2 className="animate-spin" />
-                                Bitte warten
+                                {pleaseWait}
                             </Button>
                         ) : (
                             <Button
@@ -86,7 +90,7 @@ const CheckRepoForm: FunctionComponent<Props> = ({
                                 type="submit"
                                 variant={'default'}
                             >
-                                Testen
+                                {test}
                             </Button>
                         )}
                     </div>
diff --git a/src/components/ResultGrid.tsx b/src/components/ResultGrid.tsx
index f9ea230..434e4ae 100644
--- a/src/components/ResultGrid.tsx
+++ b/src/components/ResultGrid.tsx
@@ -9,6 +9,13 @@ import { config } from '../config'
 
 interface Props {
     currentScan: SarifApiResponse | null
+    resultTitle: string
+    deniedTitle: string
+    moreInfo: string
+    tableCheck: string
+    tableStatus: string
+    tableDescription: string
+    tableEvidence: string
 }
 
 const order = [
@@ -28,7 +35,16 @@ const sortBadges = (a: Badge, b: Badge): number => {
     )
 }
 
-export default function ResultGrid({ currentScan }: Props) {
+export default function ResultGrid({
+    currentScan,
+    resultTitle,
+    deniedTitle,
+    moreInfo,
+    tableCheck,
+    tableStatus,
+    tableDescription,
+    tableEvidence,
+}: Props) {
     return (
         <div className="py-10">
             {currentScan && (
@@ -36,7 +52,7 @@ export default function ResultGrid({ currentScan }: Props) {
                     <div className="mx-auto max-w-7xl px-6 lg:px-8">
                         <div className="mb-8">
                             <h2 className="mb-1 text-2xl font-semibold">
-                                Ergebnisse für:
+                                {resultTitle}:
                             </h2>
                             <a
                                 target="_blank"
@@ -65,7 +81,7 @@ export default function ResultGrid({ currentScan }: Props) {
                                             <div className="relative aspect-square">
                                                 {!badge.badgeGranted && (
                                                     <div className="absolute right-0 top-0 -translate-y-1/2 translate-x-1/2 rotate-45 bg-red-600 px-10 py-2 text-center text-xs font-bold text-white">
-                                                        Verweigert
+                                                        {deniedTitle}
                                                     </div>
                                                 )}
                                                 <Image
@@ -97,7 +113,14 @@ export default function ResultGrid({ currentScan }: Props) {
                                     ))}
                         </div>
                         <div className="mt-12">
-                            <ResultTable currentScan={currentScan} />
+                            <ResultTable
+                                currentScan={currentScan}
+                                moreInfo={moreInfo}
+                                tableCheck={tableCheck}
+                                tableStatus={tableStatus}
+                                tableDescription={tableDescription}
+                                tableEvidence={tableEvidence}
+                            />
                         </div>
                     </div>
                 </div>
diff --git a/src/components/ResultTable.tsx b/src/components/ResultTable.tsx
index 99feeeb..a2f3ac1 100644
--- a/src/components/ResultTable.tsx
+++ b/src/components/ResultTable.tsx
@@ -8,6 +8,11 @@ import { Badge } from './ui/badge'
 
 interface Props {
     currentScan: SarifApiResponse
+    moreInfo: string
+    tableCheck: string
+    tableStatus: string
+    tableDescription: string
+    tableEvidence: string
 }
 
 const translateCriteriaStatus = (status: string) => {
@@ -48,7 +53,14 @@ const translateBadge = (badgeId: string, level: string): string => {
     return badgeId + ' ' + level
 }
 
-export default function ResultTable({ currentScan }: Props) {
+export default function ResultTable({
+    currentScan,
+    moreInfo,
+    tableCheck,
+    tableStatus,
+    tableDescription,
+    tableEvidence,
+}: Props) {
     return (
         <div className="">
             {currentScan?.runs[0].properties.badges
@@ -80,7 +92,7 @@ export default function ResultTable({ currentScan }: Props) {
                                 </span>
                                 <div className="flex flex-row items-center gap-2">
                                     <span className="hidden text-sm text-gray-500 md:inline-block">
-                                        Mehr informationen
+                                        {moreInfo}
                                     </span>
                                     <ChevronDownIcon className="w-4" />
                                 </div>
@@ -95,25 +107,25 @@ export default function ResultTable({ currentScan }: Props) {
                                                         scope="col"
                                                         className="col-span-1 py-3.5 pr-3 text-left font-semibold lg:pl-8"
                                                     >
-                                                        Überprüfung
+                                                        {tableCheck}
                                                     </th>
                                                     <th
                                                         scope="col"
                                                         className="col-span-1 px-3 py-3.5 text-left font-semibold"
                                                     >
-                                                        Status
+                                                        {tableStatus}
                                                     </th>
                                                     <th
                                                         scope="col"
                                                         className="col-span-2 px-3 py-3.5 text-left font-semibold"
                                                     >
-                                                        Beschreibung
+                                                        {tableDescription}
                                                     </th>
                                                     <th
                                                         scope="col"
                                                         className="col-span-2 px-3 py-3.5 text-left font-semibold"
                                                     >
-                                                        Nachweis
+                                                        {tableEvidence}
                                                     </th>
                                                 </tr>
                                             </thead>
@@ -173,7 +185,10 @@ export default function ResultTable({ currentScan }: Props) {
                                                             </td>
                                                             <td className="col-span-2 py-4 md:px-3">
                                                                 <b className="md:hidden">
-                                                                    Beschreibung:{' '}
+                                                                    {
+                                                                        tableDescription
+                                                                    }
+                                                                    :{' '}
                                                                 </b>
                                                                 {
                                                                     criteria.description
@@ -181,7 +196,10 @@ export default function ResultTable({ currentScan }: Props) {
                                                             </td>
                                                             <td className="col-span-2 py-4 md:px-3">
                                                                 <b className="md:hidden">
-                                                                    Nachweis:{' '}
+                                                                    {
+                                                                        tableEvidence
+                                                                    }
+                                                                    :{' '}
                                                                 </b>
                                                                 {
                                                                     criteria.evidence
diff --git a/src/components/landing-page/ApiSmallDemo.tsx b/src/components/landing-page/ApiSmallDemo.tsx
index 3b7ad5e..d7881ce 100644
--- a/src/components/landing-page/ApiSmallDemo.tsx
+++ b/src/components/landing-page/ApiSmallDemo.tsx
@@ -7,7 +7,21 @@ import CheckRepoForm from '../CheckRepoForm'
 import { Toaster } from '../ui/toaster'
 import ResultGrid from '../ResultGrid'
 
-export default function ApiSmallDemo() {
+interface Props {
+    titleH2: string
+    description: string
+    resultTitle: string
+    deniedTitle: string
+    moreInfo: string
+    tableCheck: string
+    tableStatus: string
+    tableDescription: string
+    tableEvidence: string
+    pleaseWait: string
+    test: string
+}
+
+export default function ApiSmallDemo(props: Props) {
     const [currentScan, setCurrentScan] = useState<SarifApiResponse | null>(
         null,
     )
@@ -20,15 +34,17 @@ export default function ApiSmallDemo() {
             <Toaster />
             <div className="relative isolate overflow-hidden bg-blue-900 px-6 py-24 shadow-2xl sm:px-24 xl:rounded-3xl xl:py-32">
                 <h2 className="mx-auto max-w-3xl text-center text-4xl font-semibold tracking-tight text-white sm:text-5xl">
-                    Testen Sie die Badge API
+                    {props.titleH2}
                 </h2>
                 <p className="mx-auto mt-6 max-w-lg text-center text-lg text-zinc-200">
-                    Geben Sie die URL eines öffentlichen openCode-Repositorys
-                    ein, um zu sehen, welche der offiziellen Badges vergeben
-                    werden.
+                    {props.description}
                 </p>
                 <div className="mx-auto mt-12 max-w-4xl">
-                    <CheckRepoForm onScanFinished={handleScanFinished} />
+                    <CheckRepoForm
+                        onScanFinished={handleScanFinished}
+                        pleaseWait={props.pleaseWait}
+                        test={props.test}
+                    />
                 </div>
                 <div className="absolute inset-0 -z-20 size-[64rem] overflow-hidden bg-gradient-to-r from-blue-800">
                     <svg
@@ -76,7 +92,16 @@ export default function ApiSmallDemo() {
             </div>
             <div className="xl:py-10">
                 {Boolean(currentScan) && (
-                    <ResultGrid currentScan={currentScan} />
+                    <ResultGrid
+                        currentScan={currentScan}
+                        resultTitle={props.resultTitle}
+                        deniedTitle={props.deniedTitle}
+                        moreInfo={props.moreInfo}
+                        tableCheck={props.tableCheck}
+                        tableStatus={props.tableStatus}
+                        tableDescription={props.tableDescription}
+                        tableEvidence={props.tableEvidence}
+                    />
                 )}
             </div>
         </div>
diff --git a/src/pages/de/index.mdx b/src/pages/de/index.mdx
index 0cb96b3..a0b27fb 100644
--- a/src/pages/de/index.mdx
+++ b/src/pages/de/index.mdx
@@ -36,7 +36,21 @@ export default function Home() {
                 toDemoHref="/de#api-small-demo"
             />
             <main>
-                <ApiSmallDemo />
+                <ApiSmallDemo
+                    titleH2="Testen Sie die Badge API"
+                    description="Geben Sie die URL eines öffentlichen openCode-Repositorys
+                    ein, um zu sehen, welche der offiziellen Badges vergeben
+                    werden."
+                    resultTitle={'Ergebnisse für'}
+                    deniedTitle={'Verweigert'}
+                    moreInfo={'Mehr informationen'}
+                    tableCheck={'Überprüfung'}
+                    tableStatus={'Status'}
+                    tableDescription={'Beschreibung'}
+                    tableEvidence={'Nachweis'}
+                    pleaseWait={'Bitte warten'}
+                    test={'Testen'}
+                />
             </main>
         </div>
     )
diff --git a/src/pages/en/index.mdx b/src/pages/en/index.mdx
index 5de8cb2..c6b0397 100644
--- a/src/pages/en/index.mdx
+++ b/src/pages/en/index.mdx
@@ -36,7 +36,19 @@ export default function Home() {
                 toDemoHref="/en#api-small-demo"
             />
             <main>
-                <ApiSmallDemo />
+                <ApiSmallDemo
+                    titleH2="Try out the Badge API"
+                    description="Enter the URL of a public openCode repository to see which official badges are awarded to this project."
+                    resultTitle={'Results for'}
+                    deniedTitle={'Denied'}
+                    moreInfo={'More information'}
+                    tableCheck={'Check'}
+                    tableStatus={'Status'}
+                    tableDescription={'Description'}
+                    tableEvidence={'Evidence'}
+                    pleaseWait={'Please wait'}
+                    test={'Test'}
+                />
             </main>
         </div>
     )
-- 
GitLab