localization

This commit is contained in:
overcuriousity 2025-07-26 00:31:23 +02:00
parent 4454046d22
commit 10331b9ece
8 changed files with 116 additions and 111 deletions

File diff suppressed because one or more lines are too long

View File

@ -261,7 +261,7 @@ tools:
icon: "📦"
type: "software"
description: "Die führende Open-Source-Alternative zu kommerziellen Forensik-Suiten"
domains: ["incident-response", "law-enforcement"]
domains: ["incident-response", "static-investigations"]
phases: ["examination", "analysis"]
platforms: ["Windows", "Linux"]
skillLevel: "intermediate"
@ -282,7 +282,7 @@ tools:
icon: "📋"
type: "method"
description: "Standardisiertes Verfahren zur forensisch korrekten Akquisition des Arbeitsspeichers"
domains: ["incident-response", "law-enforcement"]
domains: ["incident-response", "static-investigations"]
phases: ["data-collection"]
platforms: [] # Methoden haben keine Plattformen
skillLevel: "advanced"
@ -319,7 +319,7 @@ tools:
**Domänen:**
- `incident-response` - Incident Response & Breach-Untersuchung
- `law-enforcement` - Strafverfolgung & Kriminalermittlung
- `static-investigations` - Datenträgerforensik & Ermittlungen
- `malware-analysis` - Malware-Analyse & Reverse Engineering
- `fraud-investigation` - Betrugs- & Finanzkriminalität
- `network-forensics` - Netzwerk-Forensik & Traffic-Analyse

View File

@ -5,7 +5,7 @@ description: "Das Rückgrat des modernen Threat-Intelligence-Sharings mit über
last_updated: 2025-07-20
author: "CC24-Team"
difficulty: "intermediate"
categories: ["incident-response", "law-enforcement", "malware-analysis", "network-forensics", "cloud-forensics"]
categories: ["incident-response", "static-investigations", "malware-analysis", "network-forensics", "cloud-forensics"]
tags: ["web-based", "threat-intelligence", "api", "correlation", "ioc-sharing", "automation"]
sections:
overview: true

View File

@ -20,7 +20,7 @@ tools:
icon: 📦
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- mobile-forensics
- cloud-forensics
@ -49,7 +49,7 @@ tools:
Formatunterstützung.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
phases:
@ -88,7 +88,7 @@ tools:
Kollaborations-Lösungen am Markt.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
phases:
@ -125,7 +125,7 @@ tools:
SIEMs, Firewalls und andere Sicherheitssysteme.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
- cloud-forensics
@ -159,7 +159,7 @@ tools:
mehreren Analysten und Millionen von Zeitstempeln.
domains:
- incident-response
- law-enforcement
- static-investigations
- network-forensics
- cloud-forensics
phases:
@ -235,7 +235,7 @@ tools:
für Behörden und Großunternehmen interessant.
domains:
- incident-response
- law-enforcement
- static-investigations
- mobile-forensics
- cloud-forensics
phases:
@ -271,7 +271,7 @@ tools:
Visualisierung verständlich. Mit Preisen im sechsstelligen Bereich und
ethischen Bedenken bezüglich der Käuferauswahl nicht unumstritten.
domains:
- law-enforcement
- static-investigations
- mobile-forensics
phases:
- data-collection
@ -374,7 +374,7 @@ tools:
unübertroffen.
domains:
- incident-response
- law-enforcement
- static-investigations
- network-forensics
- cloud-forensics
phases:
@ -410,7 +410,7 @@ tools:
für CTF-Challenges und tägliche Forensik-Aufgaben gleichermaßen.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
phases:
@ -445,7 +445,7 @@ tools:
Effizienzgewinne bei großen Infrastrukturen sind enorm.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -487,7 +487,7 @@ tools:
Untersuchungen.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
phases:
@ -525,7 +525,7 @@ tools:
Monitoring Operations.
domains:
- incident-response
- law-enforcement
- static-investigations
- network-forensics
- cloud-forensics
phases:
@ -560,7 +560,7 @@ tools:
schnelle Übersichten, an Grenzen bei verschlüsseltem Traffic.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
phases:
@ -596,7 +596,7 @@ tools:
Dokumenten-Untersuchungen.
domains:
- incident-response
- law-enforcement
- static-investigations
- fraud-investigation
- mobile-forensics
phases:
@ -633,7 +633,7 @@ tools:
ersten Wahl für Behörden. Lizenzkosten im sechsstelligen Bereich
limitieren den Zugang auf Großorganisationen.
domains:
- law-enforcement
- static-investigations
- fraud-investigation
phases:
- analysis
@ -666,7 +666,7 @@ tools:
Organisations-Strukturen. Die Community Edition limitiert auf einen
Benutzer - für Teams ist die kommerzielle Version nötig.
domains:
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -706,7 +706,7 @@ tools:
ermöglicht automatisierte Analysen großer Datensätze. Unverzichtbar wenn
Fahrzeuge, Drohnen oder mobile Geräte mit Standortdaten involviert sind.
domains:
- law-enforcement
- static-investigations
- fraud-investigation
- mobile-forensics
phases:
@ -742,7 +742,7 @@ tools:
vom Raspberry Pi für kleine Teams bis zur High-Availability-Installation.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -847,7 +847,7 @@ tools:
überall einsetzbar.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -906,7 +906,7 @@ tools:
bedacht werden.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -948,7 +948,7 @@ tools:
für kleine Teams. Ideal für Organisationen, die Blockchain-Analysen ohne
US-Cloud-Abhängigkeit benötigen.
domains:
- law-enforcement
- static-investigations
- fraud-investigation
phases:
- analysis
@ -981,7 +981,7 @@ tools:
angestaubt in der Oberfläche, aber bewährt in tausenden Gerichtsverfahren.
Freeware, aber nicht open source.
domains:
- law-enforcement
- static-investigations
- incident-response
phases:
- data-collection
@ -1014,7 +1014,7 @@ tools:
solide Technik unter der Haube hinweg.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- data-collection
platforms:
@ -1046,7 +1046,7 @@ tools:
Updates bei neuen macOS-Versionen.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- data-collection
platforms:
@ -1077,7 +1077,7 @@ tools:
LEAPP-Familie, ständig aktualisiert für neue Android-Versionen.
domains:
- incident-response
- law-enforcement
- static-investigations
- mobile-forensics
phases:
- examination
@ -1113,7 +1113,7 @@ tools:
iOS-Änderungen und neuen Artefakten.
domains:
- incident-response
- law-enforcement
- static-investigations
- mobile-forensics
phases:
- examination
@ -1147,7 +1147,7 @@ tools:
unverzichtbar bei Unfallrekonstruktionen und Kriminalfällen. Die
Unterstützung für verschiedene Hersteller wächst mit der Community.
domains:
- law-enforcement
- static-investigations
- ics-forensics
phases:
- examination
@ -1181,7 +1181,7 @@ tools:
Tool-Sammlung auf dem neuesten Stand.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- fraud-investigation
- network-forensics
@ -1217,7 +1217,7 @@ tools:
Zuverlässigkeit für Forensik-Puristen.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- data-collection
platforms:
@ -1249,7 +1249,7 @@ tools:
langer Imaging-Vorgänge rettet Nerven und Zeit.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- data-collection
platforms:
@ -1281,7 +1281,7 @@ tools:
Austausch mit kommerziellen Tools.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- data-collection
platforms:
@ -1313,7 +1313,7 @@ tools:
TestDisk repariert zusätzlich beschädigte Partitionen.
domains:
- incident-response
- law-enforcement
- static-investigations
- fraud-investigation
phases:
- examination
@ -1379,7 +1379,7 @@ tools:
Forensik-Suite. Freeware, aber nicht open source.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- examination
platforms:
@ -1410,7 +1410,7 @@ tools:
einem System vorhanden waren. Die einfache GUI macht es auch für weniger
technische Ermittler zugänglich.
domains:
- law-enforcement
- static-investigations
- fraud-investigation
phases:
- examination
@ -1443,7 +1443,7 @@ tools:
manueller Registry-Analyse und findet oft übersehene Artefakte.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- examination
@ -1575,7 +1575,7 @@ tools:
Tool-Sammlung aktuell.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
- mobile-forensics
@ -1609,7 +1609,7 @@ tools:
Live-System-Umgebung ermöglicht.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- mobile-forensics
skillLevel: intermediate
@ -1639,7 +1639,7 @@ tools:
Neuinstallation.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- network-forensics
skillLevel: intermediate
@ -1670,7 +1670,7 @@ tools:
Ansicht. Ständige Updates für neue Windows-Versionen und Cloud-Artefakte.
domains:
- incident-response
- law-enforcement
- static-investigations
phases:
- examination
- analysis
@ -1770,7 +1770,7 @@ tools:
ab, Profis schwören darauf. Deutlich günstiger als US-Konkurrenz bei
vergleichbarer Funktionalität.
domains:
- law-enforcement
- static-investigations
- incident-response
phases:
- examination
@ -1801,7 +1801,7 @@ tools:
Automatisierung. Die Zertifizierung (EnCE) ist in vielen Behörden
Einstellungsvoraussetzung.
domains:
- law-enforcement
- static-investigations
- incident-response
phases:
- data-collection
@ -1835,7 +1835,7 @@ tools:
gleichzeitig. Für High-Volume-Labs die Investition wert, für
Gelegenheitsnutzer Overkill.
domains:
- law-enforcement
- static-investigations
- incident-response
phases:
- data-collection
@ -1894,7 +1894,7 @@ tools:
Netzwerkverbindungen und Verschlüsselungsschlüssel.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- data-collection
@ -1928,7 +1928,7 @@ tools:
Unternehmensumgebungen mit gemischten Betriebssystem-Landschaften.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- data-collection
@ -1964,7 +1964,7 @@ tools:
erstellt durchsuchbare Ausgabeformate für effiziente Analyse.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- data-collection
@ -2060,7 +2060,7 @@ tools:
SHA, and digital signature validation.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- cloud-forensics
phases:
@ -2084,8 +2084,8 @@ tools:
domains:
- id: incident-response
name: Incident Response & Breach-Untersuchung
- id: law-enforcement
name: Strafverfolgung & Kriminalermittlung
- id: static-investigations
name: Datenträgerforensik & Ermittlungen
- id: malware-analysis
name: Malware-Analyse & Reverse Engineering
- id: fraud-investigation

View File

@ -12,7 +12,7 @@
Unternehmensumgebungen mit gemischten Betriebssystem-Landschaften.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- data-collection
@ -48,7 +48,7 @@
erstellt durchsuchbare Ausgabeformate für effiziente Analyse.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
phases:
- data-collection
@ -144,7 +144,7 @@
SHA, and digital signature validation.
domains:
- incident-response
- law-enforcement
- static-investigations
- malware-analysis
- cloud-forensics
phases:
@ -168,8 +168,8 @@
domains:
- id: incident-response
name: Incident Response & Breach-Untersuchung
- id: law-enforcement
name: Strafverfolgung & Kriminalermittlung
- id: static-investigations
name: Datenträgerforensik & Ermittlungen
- id: malware-analysis
name: Malware-Analyse & Reverse Engineering
- id: fraud-investigation

View File

@ -141,7 +141,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</div>
<p style="margin-bottom: 1rem; line-height: 1.7;">
Falls eine Anwendung nicht wie vorgesehen funktioniert, ihr Unterstützung braucht, der Speicherplatz ausgeht
oder sonstige Probleme auftreten: <strong>Schreibt mir einfach auf Signal!</strong>
oder sonstige Probleme auftreten: <strong>Schreibt mir einfach auf Signal</strong> oder an <a href="mailto:mstoeck3@hs-mittweida.de">mstoeck3@hs-mittweida.de</a>.
</p>
<!-- Special Note Box -->
@ -179,6 +179,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</div>
<!-- Contributing Section -->
<!-- Contribution Section -->
<div class="card" style="margin-bottom: 2rem; border-left: 4px solid var(--color-accent);">
<div style="display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1rem;">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="var(--color-accent)" stroke-width="2">
@ -187,40 +188,43 @@ import BaseLayout from '../layouts/BaseLayout.astro';
<line x1="20" y1="8" x2="20" y2="14"/>
<line x1="23" y1="11" x2="17" y2="11"/>
</svg>
<h2 style="margin: 0; color: var(--color-accent);">Mitmachen und Beitragen</h2>
<h2 style="margin: 0; color: var(--color-accent);">Mitmachen &amp; Beitragen</h2>
</div>
<div style="display: grid; gap: 1.25rem;">
<!-- Suggestions -->
<div style="background-color: var(--color-bg-secondary); padding: 1.25rem; border-radius: 0.5rem;">
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">🔍 Vorschläge</h4>
<p style="margin: 0;">
Ich suche stets nach Ergänzungen für die Liste. Falls euch interessante Tools oder Methoden einfallen
schreibt mir gerne auf Signal oder an <a href="mailto:mstoeck3@hs-mittweida.de">mstoeck3@hs-mittweida.de</a>.
Du hast eine Idee, wie wir den Hub erweitern können? Reiche deinen Vorschlag unkompliziert
über unsere <a href="/contribute#vorschlaege">/contribute</a>-Seite ein.
</p>
</div>
<!-- Corrections & Updates -->
<div style="background-color: var(--color-bg-secondary); padding: 1.25rem; border-radius: 0.5rem;">
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">🔧 Korrekturen & Updates</h4>
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">🔧 Korrekturen &amp; Updates</h4>
<p style="margin: 0;">
Sollte eine Anwendung/Methode nicht mehr aktuell, veraltet oder falsch repräsentiert sein,
gebt mir unbedingt Bescheid.
Ist eine Anwendung veraltet oder falsch dargestellt? Teile uns das bitte direkt unter
<a href="/contribute#korrekturen">/contribute</a> mit.
</p>
</div>
<!-- Code Contributions -->
<div style="background-color: var(--color-bg-secondary); padding: 1.25rem; border-radius: 0.5rem;">
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">💻 Code-Beiträge</h4>
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">💻 CodeBeiträge</h4>
<p style="margin-bottom: 0.75rem;">
Ihr könnt auch direkt am Sourcecode mitarbeiten:
Möchtest du direkt am Sourcecode mitarbeiten? Schau dir die Anleitung unter
<a href="/contribute#code">/contribute</a> an oder besuche unser Repository:
</p>
<a href="https://git.cc24.dev/mstoeck3/cc24-hub" target="_blank" rel="noopener noreferrer"
style="display: inline-flex; align-items: center; gap: 0.5rem; color: var(--color-accent); font-weight: 500;">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg>
Git-Repository besuchen
GitRepository besuchen
</a>
</div>
<div style="background-color: var(--color-bg-secondary); padding: 1.25rem; border-radius: 0.5rem;">
<h4 style="margin: 0 0 0.5rem 0; color: var(--color-accent);">⚡ Unterstützung</h4>
<p style="margin: 0;">

View File

@ -23,10 +23,10 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<div class="container" style="max-width: 900px; margin: 0 auto; padding: 2rem 1rem;">
<!-- Header -->
<div class="hero-section">
<h1>Submit Knowledge Base Article</h1>
<p>Share documentation, tutorials, or insights about DFIR tools and methods. Your contribution will be submitted as an issue for maintainer review.</p>
{userEmail && <p><strong>Submitting as:</strong> {userEmail}</p>}
<div style="text-align: center; margin-bottom: 2rem; padding: 2rem; background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%); color: white; border-radius: 1rem;">
<h1 style="margin-bottom: 1rem; font-size: 2rem;">Knowledgebase-Artikel</h1>
<p style="margin: 0.5rem 0; opacity: 0.9;">Danke für deinen Beitrag!</p>
{userEmail && <p style="margin: 0.5rem 0; opacity: 0.8;"><strong>Eingeloggt als:</strong> {userEmail}</p>}
</div>
<!-- Main Form -->
@ -35,13 +35,13 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<!-- Basic Information -->
<div class="form-section">
<h3 class="section-title">Basic Information</h3>
<h3 class="section-title">Grundinformationen</h3>
<div class="form-grid-2">
<div class="form-group">
<label for="tool-name" class="form-label">Related Tool (Optional)</label>
<label for="tool-name" class="form-label">Zusammenhang zu Tool / Methode / Konzept (Optional)</label>
<select id="tool-name" name="toolName" class="form-input">
<option value="">Select a tool...</option>
<option value="">Auswählen...</option>
{sortedTools.map(tool => (
<option value={tool.name}>{tool.name} ({tool.type})</option>
))}
@ -49,9 +49,9 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
</div>
<div class="form-group">
<label for="difficulty" class="form-label">Difficulty Level (Optional)</label>
<label for="difficulty" class="form-label">Schwierigkeitsniveau (Optional)</label>
<select id="difficulty" name="difficulty" class="form-input">
<option value="">Select difficulty...</option>
<option value="">Niveau wählen...</option>
<option value="novice">Novice</option>
<option value="beginner">Beginner</option>
<option value="intermediate">Intermediate</option>
@ -60,27 +60,28 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
</select>
</div>
</div>
<br>
<div class="form-group">
<label for="title" class="form-label">Article Title (Optional)</label>
<label for="title" class="form-label">Titel des Artikels (Optional)</label>
<input
type="text"
id="title"
name="title"
maxlength="100"
placeholder="Clear, descriptive title for your article"
placeholder="Klarer, deskriptiver Titel"
class="form-input"
/>
</div>
<div class="form-group">
<label for="description" class="form-label">Description (Optional)</label>
<label for="description" class="form-label">Kurzbeschreibung (Optional)</label>
<textarea
id="description"
name="description"
maxlength="300"
rows="3"
placeholder="Brief summary of what this article covers"
placeholder="Kurze Zusammenfassung, worum es in dem Artikel geht"
class="form-input"
></textarea>
</div>
@ -88,21 +89,21 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<!-- Content -->
<div class="form-section">
<h3 class="section-title">Content</h3>
<h3 class="section-title">Inhalt</h3>
<div class="form-group">
<label for="content" class="form-label">Article Content (Optional)</label>
<label for="content" class="form-label">Inhalt (Optional)</label>
<textarea
id="content"
name="content"
rows="8"
placeholder="Provide your content, documentation, tutorial steps, or notes here..."
placeholder="Schreibt hier so viel Text, wie ihr wollt. Die Formatierung wird später redaktionell angepasst."
class="form-input"
></textarea>
</div>
<div class="form-group">
<label for="external-link" class="form-label">External Link (Optional)</label>
<label for="external-link" class="form-label">Link (z.B. Primärquelle) (Optional)</label>
<input
type="url"
id="external-link"
@ -115,10 +116,10 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<!-- File Upload -->
<div class="form-section">
<h3 class="section-title">Upload Files</h3>
<h3 class="section-title">Dateien hochladen</h3>
<div class="form-group">
<label class="form-label">Documents, Images, Videos (Optional)</label>
<label class="form-label">Dokumente, Bilder, Videos (Optional)</label>
<div class="upload-area" id="upload-area">
<input type="file" id="file-input" multiple accept=".pdf,.doc,.docx,.txt,.md,.zip,.png,.jpg,.jpeg,.gif,.mp4,.webm" style="display: none;">
<div class="upload-placeholder">
@ -127,12 +128,12 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<polyline points="7 10 12 15 17 10"/>
<line x1="12" y1="15" x2="12" y2="3"/>
</svg>
<p>Click to select files or drag & drop</p>
<small>PDFs, documents, images, archives, etc.</small>
<p>Klicken, um Dateien auszuwählen oder Drag&Drop</p>
<small>Die Dateien landen in der CC24-Cloud. Keine Malware.</small>
</div>
</div>
<div id="file-list" class="file-list" style="display: none;">
<h5>Selected Files</h5>
<h5>Ausgewählte Dateien</h5>
<div id="files-container"></div>
</div>
</div>
@ -140,11 +141,11 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<!-- Additional Information -->
<div class="form-section">
<h3 class="section-title">Additional Information</h3>
<h3 class="section-title">Zusatzinformation</h3>
<div class="form-grid-2">
<div class="form-group">
<label for="categories" class="form-label">Categories (Optional)</label>
<label for="categories" class="form-label">Kategorien (Optional)</label>
<input
type="text"
id="categories"
@ -152,7 +153,7 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
placeholder="setup, configuration, troubleshooting"
class="form-input"
/>
<small class="form-help">Comma-separated categories</small>
<small class="form-help">Komma-getrennte Kategorien</small>
</div>
<div class="form-group">
@ -164,17 +165,17 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
placeholder="installation, docker, linux, windows"
class="form-input"
/>
<small class="form-help">Comma-separated tags</small>
<small class="form-help">Komma-getrennte Tags</small>
</div>
</div>
<div class="form-group">
<label for="reason" class="form-label">Reason for Contribution (Optional)</label>
<label for="reason" class="form-label">Grund für den Beitrag (Optional)</label>
<textarea
id="reason"
name="reason"
rows="3"
placeholder="Why are you submitting this article? What problem does it solve?"
placeholder="Möchtest du sonst noch etwas mitteilen? Welches Problem wurde für dich gelöst??"
class="form-input"
></textarea>
</div>
@ -182,9 +183,9 @@ const sortedTools = data.tools.sort((a: any, b: any) => a.name.localeCompare(b.n
<!-- Submit Button -->
<div class="form-actions">
<a href="/" class="btn btn-secondary">Cancel</a>
<a href="/" class="btn btn-secondary">Abbruch</a>
<button type="submit" id="submit-btn" class="btn btn-accent">
<span id="submit-text">Submit Article</span>
<span id="submit-text">Abschicken</span>
<span id="submit-spinner" style="display: none;">⏳</span>
</button>
</div>

View File

@ -32,7 +32,7 @@ const isEdit = !!editTool;
<!-- Header -->
<div style="text-align: center; margin-bottom: 2rem; padding: 2rem; background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%); color: white; border-radius: 1rem;">
<h1 style="margin-bottom: 1rem; font-size: 2rem;">{isEdit ? `Edit: ${editTool?.name}` : 'Contribute New Tool/Method/Concept'}</h1>
<h1 style="margin-bottom: 1rem; font-size: 2rem;">{isEdit ? `Edit: ${editTool?.name}` : 'Tool / Methode / Konzept beitragen'}</h1>
<p style="margin: 0.5rem 0; opacity: 0.9;">
{isEdit
? 'Passt die Informationen für dieses Tool/Methode/Konzept an. Dein Beitrag wird als Git-Issue veröffentlicht.'
@ -58,9 +58,9 @@ const isEdit = !!editTool;
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem;">
<div>
<label for="type" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Type <span style="color: var(--color-error);">*</span></label>
<label for="type" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Typ <span style="color: var(--color-error);">*</span></label>
<select id="type" name="type" required>
<option value="">Select type...</option>
<option value="">Auswählen...</option>
<option value="software" selected={editTool?.type === 'software'}>Software/Tool</option>
<option value="method" selected={editTool?.type === 'method'}>Methode/Prozess</option>
<option value="concept" selected={editTool?.type === 'concept'}>Konzept/Wissen</option>
@ -70,7 +70,7 @@ const isEdit = !!editTool;
<div>
<label for="skillLevel" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Skill Level <span style="color: var(--color-error);">*</span></label>
<select id="skillLevel" name="skillLevel" required>
<option value="">Select level...</option>
<option value="">Auswählen...</option>
<option value="novice" selected={editTool?.skillLevel === 'novice'}>Novice</option>
<option value="beginner" selected={editTool?.skillLevel === 'beginner'}>Beginner</option>
<option value="intermediate" selected={editTool?.skillLevel === 'intermediate'}>Intermediate</option>
@ -224,7 +224,7 @@ const isEdit = !!editTool;
<div style="margin-bottom: 1.5rem;">
<label for="tags" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Tags</label>
<input type="text" id="tags" name="tags" value={editTool?.tags?.join(', ') || ''}
placeholder="Komma-getrennt: Passede Begriffe, nach denen ihr suchen würdet." />
placeholder="Komma-getrennt: Passende Begriffe, nach denen ihr suchen würdet." />
</div>
<div style="margin-bottom: 1.5rem;">