fix(i18n): Beschreibung-generieren-Button + Fehler-Toasts uebersetzbar

- Button-Span enhance-btn-text bekommt data-i18n.
- app.js: Loading-State Wird generiert... / Generating... per T().
- Vier Fehler-Toasts (Default, 503, 429, 504) per T() lokalisiert.
- Neue Keys enhance.* in de.json + en.json.
- Cache-Buster app.js auf v=20260513c gebumpt.
Dieser Commit ist enthalten in:
Claude Code
2026-05-13 21:39:36 +00:00
Ursprung 10805dff15
Commit b214249a34
4 geänderte Dateien mit 18 neuen und 8 gelöschten Zeilen

Datei anzeigen

@@ -341,7 +341,7 @@
<div class="description-label-row"> <div class="description-label-row">
<label for="inc-description">Beschreibung / Kontext <span class="info-icon tooltip-below" id="description-info-icon" data-tooltip="Beschreibe den Vorfall möglichst genau: Was ist passiert? Wo? Wer ist beteiligt? Je präziser, desto bessere Ergebnisse."><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></span></label> <label for="inc-description">Beschreibung / Kontext <span class="info-icon tooltip-below" id="description-info-icon" data-tooltip="Beschreibe den Vorfall möglichst genau: Was ist passiert? Wo? Wer ist beteiligt? Je präziser, desto bessere Ergebnisse."><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg></span></label>
<button type="button" class="btn btn-secondary btn-small" id="btn-enhance-description" onclick="App.generateDescription()" disabled> <button type="button" class="btn btn-secondary btn-small" id="btn-enhance-description" onclick="App.generateDescription()" disabled>
<span id="enhance-btn-text">Beschreibung generieren</span> <span id="enhance-btn-text" data-i18n="modal.new_incident.enhance">Beschreibung generieren</span>
<span id="enhance-spinner" class="spinner-inline" style="display:none;"></span> <span id="enhance-spinner" class="spinner-inline" style="display:none;"></span>
</button> </button>
</div> </div>
@@ -729,7 +729,7 @@
<script src="/static/js/components.js?v=20260513a"></script> <script src="/static/js/components.js?v=20260513a"></script>
<script src="/static/js/layout.js?v=20260316b"></script> <script src="/static/js/layout.js?v=20260316b"></script>
<script src="/static/js/pipeline.js?v=20260501i"></script> <script src="/static/js/pipeline.js?v=20260501i"></script>
<script src="/static/js/app.js?v=20260513b"></script> <script src="/static/js/app.js?v=20260513c"></script>
<script src="/static/js/cluster-data.js?v=20260322f"></script> <script src="/static/js/cluster-data.js?v=20260322f"></script>
<script src="/static/js/tutorial.js?v=20260316z"></script> <script src="/static/js/tutorial.js?v=20260316z"></script>
<script src="/static/js/chat.js?v=20260422a"></script> <script src="/static/js/chat.js?v=20260422a"></script>

Datei anzeigen

@@ -21,6 +21,11 @@
"modal.new_incident.title_field": "Titel des Vorfalls", "modal.new_incident.title_field": "Titel des Vorfalls",
"modal.new_incident.description": "Beschreibung / Kontext", "modal.new_incident.description": "Beschreibung / Kontext",
"modal.new_incident.enhance": "Beschreibung generieren", "modal.new_incident.enhance": "Beschreibung generieren",
"modal.new_incident.enhance_loading": "Wird generiert...",
"enhance.error_default": "Beschreibung konnte nicht generiert werden",
"enhance.error_unavailable": "KI-Zugang aktuell nicht verfügbar. Bitte Administrator kontaktieren.",
"enhance.error_busy": "KI ist gerade ausgelastet. Bitte kurz warten und erneut versuchen.",
"enhance.error_timeout": "KI antwortet gerade nicht. Bitte erneut versuchen.",
"modal.new_incident.visibility": "Sichtbarkeit", "modal.new_incident.visibility": "Sichtbarkeit",
"modal.new_incident.visibility_public": "Öffentlich", "modal.new_incident.visibility_public": "Öffentlich",
"modal.new_incident.visibility_private": "Privat", "modal.new_incident.visibility_private": "Privat",

Datei anzeigen

@@ -21,6 +21,11 @@
"modal.new_incident.title_field": "Incident title", "modal.new_incident.title_field": "Incident title",
"modal.new_incident.description": "Description / context", "modal.new_incident.description": "Description / context",
"modal.new_incident.enhance": "Generate description", "modal.new_incident.enhance": "Generate description",
"modal.new_incident.enhance_loading": "Generating...",
"enhance.error_default": "Description could not be generated",
"enhance.error_unavailable": "AI access currently unavailable. Please contact your administrator.",
"enhance.error_busy": "AI is currently busy. Please wait briefly and try again.",
"enhance.error_timeout": "AI is not responding. Please try again.",
"modal.new_incident.visibility": "Visibility", "modal.new_incident.visibility": "Visibility",
"modal.new_incident.visibility_public": "Public", "modal.new_incident.visibility_public": "Public",
"modal.new_incident.visibility_private": "Private", "modal.new_incident.visibility_private": "Private",

Datei anzeigen

@@ -1906,7 +1906,7 @@ async generateDescription() {
this._enhanceController = new AbortController(); this._enhanceController = new AbortController();
btn.disabled = true; btn.disabled = true;
btnText.textContent = 'Wird generiert...'; btnText.textContent = (typeof T === 'function') ? T('modal.new_incident.enhance_loading', 'Wird generiert...') : 'Wird generiert...';
spinner.style.display = ''; spinner.style.display = '';
textarea.readOnly = true; textarea.readOnly = true;
textarea.classList.add('textarea--loading'); textarea.classList.add('textarea--loading');
@@ -1919,15 +1919,15 @@ async generateDescription() {
if (err.name === 'AbortError') { if (err.name === 'AbortError') {
// still // still
} else { } else {
let msg = 'Beschreibung konnte nicht generiert werden'; let msg = (typeof T === 'function') ? T('enhance.error_default', 'Beschreibung konnte nicht generiert werden') : 'Beschreibung konnte nicht generiert werden';
if (err.status === 503) msg = 'KI-Zugang aktuell nicht verfügbar. Bitte Administrator kontaktieren.'; if (err.status === 503) msg = (typeof T === 'function') ? T('enhance.error_unavailable', 'KI-Zugang aktuell nicht verfügbar. Bitte Administrator kontaktieren.') : 'KI-Zugang aktuell nicht verfügbar. Bitte Administrator kontaktieren.';
else if (err.status === 429) msg = 'KI ist gerade ausgelastet. Bitte kurz warten und erneut versuchen.'; else if (err.status === 429) msg = (typeof T === 'function') ? T('enhance.error_busy', 'KI ist gerade ausgelastet. Bitte kurz warten und erneut versuchen.') : 'KI ist gerade ausgelastet. Bitte kurz warten und erneut versuchen.';
else if (err.status === 504) msg = 'KI antwortet gerade nicht. Bitte erneut versuchen.'; else if (err.status === 504) msg = (typeof T === 'function') ? T('enhance.error_timeout', 'KI antwortet gerade nicht. Bitte erneut versuchen.') : 'KI antwortet gerade nicht. Bitte erneut versuchen.';
else if (err.status === 403) msg = err.detail || 'Zugriff verweigert.'; else if (err.status === 403) msg = err.detail || 'Zugriff verweigert.';
UI.showToast(msg, 'error'); UI.showToast(msg, 'error');
} }
} finally { } finally {
btnText.textContent = 'Beschreibung generieren'; btnText.textContent = (typeof T === 'function') ? T('modal.new_incident.enhance', 'Beschreibung generieren') : 'Beschreibung generieren';
spinner.style.display = 'none'; spinner.style.display = 'none';
btn.disabled = title.length < 3; btn.disabled = title.length < 3;
textarea.readOnly = false; textarea.readOnly = false;