localization

This commit is contained in:
overcuriousity 2025-07-26 00:09:57 +02:00
parent 1419f64ab9
commit 4454046d22
2 changed files with 25 additions and 25 deletions

View File

@ -132,7 +132,7 @@ const { authenticated, userEmail, userId } = authResult;
<p style="margin-bottom: 1.5rem; line-height: 1.6;"> <p style="margin-bottom: 1.5rem; line-height: 1.6;">
Wenn ihr einen umfangreicheren Beitrag zu einem Tool, einer Methode oder einem Kozept habt, könnt ihr ihn hier einreichen. Wenn ihr einen umfangreicheren Beitrag zu einem Tool, einer Methode oder einem Kozept habt, könnt ihr ihn hier einreichen.
Dazu müsst ihr ein kurzes Formular ausfüllen, zusätzlich könnt ihr Dateien einreichen. Der Upload von beliebigen Dateien und Unterlagen ist hier möglich, und wird manuell von mir integriert.
</p> </p>
<div style="display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.5rem;"> <div style="display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.5rem;">
@ -200,7 +200,7 @@ const { authenticated, userEmail, userId } = authResult;
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem;">
<div> <div>
<h4 style="margin-bottom: 0.75rem; color: var(--color-primary);">Qualitätsstandards</h4> <h4 style="margin-bottom: 0.75rem; color: var(--color-primary);">Empfehlungen</h4>
<ul style="margin: 0; padding-left: 1.5rem; line-height: 1.6;"> <ul style="margin: 0; padding-left: 1.5rem; line-height: 1.6;">
<li>Informationen sollten stets korrekt und up-to-date sein</li> <li>Informationen sollten stets korrekt und up-to-date sein</li>
<li>Nutzt klare, verständliche Sprache</li> <li>Nutzt klare, verständliche Sprache</li>
@ -212,7 +212,7 @@ const { authenticated, userEmail, userId } = authResult;
</div> </div>
<div> <div>
<h4 style="margin-bottom: 0.75rem; color: var(--color-accent);">QS</h4> <h4 style="margin-bottom: 0.75rem; color: var(--color-accent);">Review</h4>
<ul style="margin: 0; padding-left: 1.5rem; line-height: 1.6;"> <ul style="margin: 0; padding-left: 1.5rem; line-height: 1.6;">
<li>Alle Beiträge werden transparent als Pull Requests in unserem Git veröffentlicht</li> <li>Alle Beiträge werden transparent als Pull Requests in unserem Git veröffentlicht</li>
<li>Die Inforamtionen werden teilweise automatisiert validiert</li> <li>Die Inforamtionen werden teilweise automatisiert validiert</li>

View File

@ -35,11 +35,11 @@ const isEdit = !!editTool;
<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}` : 'Contribute New Tool/Method/Concept'}</h1>
<p style="margin: 0.5rem 0; opacity: 0.9;"> <p style="margin: 0.5rem 0; opacity: 0.9;">
{isEdit {isEdit
? 'Update the information for this tool. Your changes will be submitted as a pull request.' ? 'Passt die Informationen für dieses Tool/Methode/Konzept an. Dein Beitrag wird als Git-Issue veröffentlicht.'
: 'Add a new tool, method, or concept to the database. Your contribution will be submitted as a pull request.' : 'Füge ein neues Tool, Methode oder Konzept in unsere Datenbank hinzu. Dein Beitrag wird als Git-Issue veröffentlicht.'
} }
</p> </p>
{userEmail && <p style="margin: 0.5rem 0; opacity: 0.8;"><strong>Submitting as:</strong> {userEmail}</p>} {userEmail && <p style="margin: 0.5rem 0; opacity: 0.8;"><strong>Eingeloggt als:</strong> {userEmail}</p>}
</div> </div>
<!-- Validation Error Display --> <!-- Validation Error Display -->
@ -54,7 +54,7 @@ const isEdit = !!editTool;
<!-- Basic Information --> <!-- Basic Information -->
<div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;"> <div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;">
<h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Basic Information</h3> <h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Grundlegende Infos</h3>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem;">
<div> <div>
@ -62,8 +62,8 @@ const isEdit = !!editTool;
<select id="type" name="type" required> <select id="type" name="type" required>
<option value="">Select type...</option> <option value="">Select type...</option>
<option value="software" selected={editTool?.type === 'software'}>Software/Tool</option> <option value="software" selected={editTool?.type === 'software'}>Software/Tool</option>
<option value="method" selected={editTool?.type === 'method'}>Method/Process</option> <option value="method" selected={editTool?.type === 'method'}>Methode/Prozess</option>
<option value="concept" selected={editTool?.type === 'concept'}>Concept/Knowledge</option> <option value="concept" selected={editTool?.type === 'concept'}>Konzept/Wissen</option>
</select> </select>
</div> </div>
@ -93,9 +93,9 @@ const isEdit = !!editTool;
</div> </div>
<div style="margin-bottom: 1.5rem;"> <div style="margin-bottom: 1.5rem;">
<label for="description" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Description <span style="color: var(--color-error);">*</span></label> <label for="description" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Beschreibung <span style="color: var(--color-error);">*</span></label>
<textarea id="description" name="description" rows="4" maxlength="1000" required <textarea id="description" name="description" rows="4" maxlength="1000" required
placeholder="Clear, concise description of what this tool/method/concept does and its purpose">{editTool?.description || ''}</textarea> placeholder="Klare, kurze Beschreibung, was dein Tool/Methode/Konzept tut, was sein Zweck ist und was es einzigartig macht.">{editTool?.description || ''}</textarea>
<div style="text-align: right; font-size: 0.75rem; color: var(--color-text-secondary); margin-top: 0.25rem;"> <div style="text-align: right; font-size: 0.75rem; color: var(--color-text-secondary); margin-top: 0.25rem;">
<span id="description-count">0</span>/1000 <span id="description-count">0</span>/1000
</div> </div>
@ -105,17 +105,17 @@ const isEdit = !!editTool;
<label for="url" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Primary URL <span style="color: var(--color-error);">*</span></label> <label for="url" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Primary URL <span style="color: var(--color-error);">*</span></label>
<input type="url" id="url" name="url" value={editTool?.url || ''} <input type="url" id="url" name="url" value={editTool?.url || ''}
placeholder="https://example.com" required /> placeholder="https://example.com" required />
<small style="display: block; margin-top: 0.25rem; color: var(--color-text-secondary); font-size: 0.8125rem;">Homepage, documentation, or primary source</small> <small style="display: block; margin-top: 0.25rem; color: var(--color-text-secondary); font-size: 0.8125rem;">Homepage, Dokumentation, oder Primärquelle</small>
</div> </div>
</div> </div>
<!-- Categories --> <!-- Categories -->
<div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;"> <div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;">
<h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Categories</h3> <h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Kategorien</h3>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
<div> <div>
<label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Forensic Domains</label> <label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Forensische Domänen</label>
<div style="display: grid; gap: 0.5rem;"> <div style="display: grid; gap: 0.5rem;">
{domains.map(domain => ( {domains.map(domain => (
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
@ -128,7 +128,7 @@ const isEdit = !!editTool;
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Investigation Phases</label> <label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Phasen der Ermittlung</label>
<div style="display: grid; gap: 0.5rem;"> <div style="display: grid; gap: 0.5rem;">
{phases.map(phase => ( {phases.map(phase => (
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
@ -148,7 +148,7 @@ const isEdit = !!editTool;
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-bottom: 1.5rem;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-bottom: 1.5rem;">
<div> <div>
<label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Platforms <span id="platforms-required" style="color: var(--color-error);">*</span></label> <label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Betrieb auf: <span id="platforms-required" style="color: var(--color-error);">*</span></label>
<div style="display: grid; gap: 0.5rem;"> <div style="display: grid; gap: 0.5rem;">
{['Windows', 'macOS', 'Linux', 'Web', 'Mobile', 'Cross-platform'].map(platform => ( {['Windows', 'macOS', 'Linux', 'Web', 'Mobile', 'Cross-platform'].map(platform => (
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
@ -161,7 +161,7 @@ const isEdit = !!editTool;
</div> </div>
<div> <div>
<label for="license" style="display: block; margin-bottom: 0.75rem; font-weight: 600;">License <span id="license-required" style="color: var(--color-error);">*</span></label> <label for="license" style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Lizenzmodell <span id="license-required" style="color: var(--color-error);">*</span></label>
<input type="text" id="license" name="license" value={editTool?.license || ''} <input type="text" id="license" name="license" value={editTool?.license || ''}
placeholder="MIT, Apache 2.0, GPL v3, Proprietary" list="license-options" /> placeholder="MIT, Apache 2.0, GPL v3, Proprietary" list="license-options" />
<datalist id="license-options"> <datalist id="license-options">
@ -177,7 +177,7 @@ const isEdit = !!editTool;
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 2rem;">
<div> <div>
<label for="accessType" style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Access Type</label> <label for="accessType" style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Zugriff über:</label>
<select id="accessType" name="accessType"> <select id="accessType" name="accessType">
<option value="">Select access type...</option> <option value="">Select access type...</option>
<option value="download" selected={editTool?.accessType === 'download'}>Download</option> <option value="download" selected={editTool?.accessType === 'download'}>Download</option>
@ -189,7 +189,7 @@ const isEdit = !!editTool;
</div> </div>
<div> <div>
<label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Domain-Agnostic Categories</label> <label style="display: block; margin-bottom: 0.75rem; font-weight: 600;">Domänenübergreifende Kategorien</label>
<div style="display: grid; gap: 0.5rem;"> <div style="display: grid; gap: 0.5rem;">
{domainAgnosticSoftware.map(cat => ( {domainAgnosticSoftware.map(cat => (
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
@ -205,7 +205,7 @@ const isEdit = !!editTool;
<!-- Related Concepts --> <!-- Related Concepts -->
<div id="concepts-fields" style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem; display: none;"> <div id="concepts-fields" style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem; display: none;">
<h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Related Concepts</h3> <h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Konzepte im Zusammenhang</h3>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.5rem;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.5rem;">
{existingTools.filter(tool => tool.type === 'concept').map(concept => ( {existingTools.filter(tool => tool.type === 'concept').map(concept => (
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
@ -219,26 +219,26 @@ const isEdit = !!editTool;
<!-- Additional Information --> <!-- Additional Information -->
<div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;"> <div style="border: 1px solid var(--color-border); border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 2rem;">
<h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Additional Information</h3> <h3 style="margin: 0 0 1.5rem 0; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">Zusatzinfos</h3>
<div style="margin-bottom: 1.5rem;"> <div style="margin-bottom: 1.5rem;">
<label for="tags" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Tags</label> <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(', ') || ''} <input type="text" id="tags" name="tags" value={editTool?.tags?.join(', ') || ''}
placeholder="gui, forensics, network-analysis (comma-separated)" /> placeholder="Komma-getrennt: Passede Begriffe, nach denen ihr suchen würdet." />
</div> </div>
<div style="margin-bottom: 1.5rem;"> <div style="margin-bottom: 1.5rem;">
<label class="checkbox-wrapper"> <label class="checkbox-wrapper">
<input type="checkbox" id="knowledgebase" name="knowledgebase" <input type="checkbox" id="knowledgebase" name="knowledgebase"
checked={editTool?.knowledgebase} /> checked={editTool?.knowledgebase} />
<span>Has knowledgebase article</span> <span>Der Beitrag soll später einen Knowledgebase-Artikel haben</span>
</label> </label>
</div> </div>
<div> <div>
<label for="reason" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Reason for Contribution (Optional)</label> <label for="reason" style="display: block; margin-bottom: 0.5rem; font-weight: 600;">Grund für den Beitrag (Optional)</label>
<textarea id="reason" name="reason" rows="3" maxlength="500" <textarea id="reason" name="reason" rows="3" maxlength="500"
placeholder="Why are you adding/updating this? Any context for reviewers..."></textarea> placeholder="Hier kannst du noch deine Motivation und sonstige Infos beschreiben."></textarea>
<div style="text-align: right; font-size: 0.75rem; color: var(--color-text-secondary); margin-top: 0.25rem;"> <div style="text-align: right; font-size: 0.75rem; color: var(--color-text-secondary); margin-top: 0.25rem;">
<span id="reason-count">0</span>/500 <span id="reason-count">0</span>/500
</div> </div>