-
{t(_dimensionLabel(group.dimension))}
+
{_dimensionLabel(group.dimension, t)}
{Math.round(group.latest.score)}/100
{group.latest.trend === 'improving' ? 'steigend' : group.latest.trend === 'declining' ? 'sinkend' : 'stabil'}
@@ -926,13 +926,15 @@ function _groupScoresByDimension(scores: any[]): ScoreGroup[] {
return Object.values(groups);
}
-function _dimensionLabel(dim: string): string {
- const labels: Record = {
- empathy: 'Einfühlungsvermögen', clarity: 'Klarheit',
- assertiveness: 'Durchsetzung', listening: 'Zuhören',
- selfReflection: 'Selbstreflexion',
- };
- return labels[dim] || dim;
+function _dimensionLabel(dim: string, t: (k: string) => string): string {
+ switch (dim) {
+ case 'empathy': return t('Einfühlungsvermögen');
+ case 'clarity': return t('Klarheit');
+ case 'assertiveness': return t('Durchsetzung');
+ case 'listening': return t('Zuhören');
+ case 'selfReflection': return t('Selbstreflexion');
+ default: return dim;
+ }
}
function _formatToolPayload(payload: Record): string {
diff --git a/src/pages/views/graphicalEditor/GraphicalEditorWorkflowsTasksPage.tsx b/src/pages/views/graphicalEditor/GraphicalEditorWorkflowsTasksPage.tsx
index 96daa7f..bbf2427 100644
--- a/src/pages/views/graphicalEditor/GraphicalEditorWorkflowsTasksPage.tsx
+++ b/src/pages/views/graphicalEditor/GraphicalEditorWorkflowsTasksPage.tsx
@@ -30,15 +30,18 @@ import styles from './Automation2WorkflowsTasks.module.css';
import { useLanguage } from '../../../providers/language/LanguageContext';
-const NODE_TYPE_LABELS: Record = {
- 'input.form': 'Formular',
- 'input.approval': 'Genehmigung',
- 'input.upload': 'Upload',
- 'input.comment': 'Kommentar',
- 'input.review': 'Prüfung',
- 'input.selection': 'Auswahl',
- 'input.confirmation': 'Bestätigung',
-};
+function _nodeTypeLabel(nodeType: string, t: (k: string) => string): string {
+ switch (nodeType) {
+ case 'input.form': return t('Formular');
+ case 'input.approval': return t('Genehmigung');
+ case 'input.upload': return t('Upload');
+ case 'input.comment': return t('Kommentar');
+ case 'input.review': return t('Prüfung');
+ case 'input.selection': return t('Auswahl');
+ case 'input.confirmation': return t('Bestätigung');
+ default: return nodeType;
+ }
+}
function formatTimestamp(ts?: number): string {
if (ts == null || ts <= 0) return '—';
@@ -941,7 +944,7 @@ const TaskCard: React.FC = ({
{t('Typ')}
- {t(NODE_TYPE_LABELS[nodeType] ?? nodeType)}
+ {_nodeTypeLabel(nodeType, t)}
diff --git a/src/pages/views/trustee/TrusteeAbschlussView.tsx b/src/pages/views/trustee/TrusteeAbschlussView.tsx
index 6418a87..0aa0612 100644
--- a/src/pages/views/trustee/TrusteeAbschlussView.tsx
+++ b/src/pages/views/trustee/TrusteeAbschlussView.tsx
@@ -30,14 +30,19 @@ const _TABS: TabDef[] = [
{ id: 'year-end', templateTag: 'template:trustee-year-end-check', icon: '\u2705', color: '#795548' },
];
-const _TAB_LABEL_KEYS: Record = {
- 'year-end': 'Jahresabschluss prüfen',
-};
+function _tabLabel(tabId: string, t: (k: string) => string): string {
+ switch (tabId) {
+ case 'year-end': return t('Jahresabschluss prüfen');
+ default: return tabId;
+ }
+}
-const _TAB_DESCRIPTION_KEYS: Record = {
- 'year-end':
- 'Automatische Prüfungen für den Jahresabschluss: Saldovalidierung, Vorjahresvergleich, gesetzliche Checks.',
-};
+function _tabDescription(tabId: string, t: (k: string) => string): string {
+ switch (tabId) {
+ case 'year-end': return t('Automatische Prüfungen für den Jahresabschluss: Saldovalidierung, Vorjahresvergleich, gesetzliche Checks.');
+ default: return '';
+ }
+}
// ---------------------------------------------------------------------------
// Types
@@ -225,7 +230,7 @@ export const TrusteeAbschlussView: React.FC = () => {
}}
>
{tab.icon}
- {t(_TAB_LABEL_KEYS[tab.id] || tab.id)}
+ {_tabLabel(tab.id, t)}
))}
@@ -234,7 +239,7 @@ export const TrusteeAbschlussView: React.FC = () => {
{/* Tab content */}
- {_TAB_DESCRIPTION_KEYS[activeTab] ? t(_TAB_DESCRIPTION_KEYS[activeTab]) : ''}
+ {_tabDescription(activeTab, t)}
{workflowsLoading ? (
diff --git a/src/pages/views/trustee/TrusteeAnalyseView.tsx b/src/pages/views/trustee/TrusteeAnalyseView.tsx
index cae4a3a..c32883f 100644
--- a/src/pages/views/trustee/TrusteeAnalyseView.tsx
+++ b/src/pages/views/trustee/TrusteeAnalyseView.tsx
@@ -33,19 +33,25 @@ const _TABS: TabDef[] = [
{ id: 'forecast', templateTag: 'template:trustee-forecast', icon: '\uD83D\uDCC8', color: '#E91E63' },
];
-const _TAB_LABEL_KEYS: Record
= {
- budget: 'Budget-Vergleich',
- kpi: 'KPI-Dashboard',
- cashflow: 'Cashflow-Rechnung',
- forecast: 'Prognose',
-};
+function _tabLabel(tabId: string, t: (k: string) => string): string {
+ switch (tabId) {
+ case 'budget': return t('Budget-Vergleich');
+ case 'kpi': return t('KPI-Dashboard');
+ case 'cashflow': return t('Cashflow-Rechnung');
+ case 'forecast': return t('Prognose');
+ default: return tabId;
+ }
+}
-const _TAB_DESCRIPTION_KEYS: Record = {
- budget: 'Soll/Ist-Vergleich der Buchhaltung mit Budget-Excel',
- kpi: 'Kennzahlen berechnen und visualisieren',
- cashflow: 'Cashflow berechnen und analysieren',
- forecast: 'Trend-Analyse und Prognose der nächsten Monate',
-};
+function _tabDescription(tabId: string, t: (k: string) => string): string {
+ switch (tabId) {
+ case 'budget': return t('Soll/Ist-Vergleich der Buchhaltung mit Budget-Excel');
+ case 'kpi': return t('Kennzahlen berechnen und visualisieren');
+ case 'cashflow': return t('Cashflow berechnen und analysieren');
+ case 'forecast': return t('Trend-Analyse und Prognose der nächsten Monate');
+ default: return '';
+ }
+}
// ---------------------------------------------------------------------------
// Types
@@ -240,7 +246,7 @@ export const TrusteeAnalyseView: React.FC = () => {
}}
>
{tab.icon}
- {t(_TAB_LABEL_KEYS[tab.id] || tab.id)}
+ {_tabLabel(tab.id, t)}
))}
@@ -248,7 +254,7 @@ export const TrusteeAnalyseView: React.FC = () => {
{/* Tab content */}
- {_TAB_DESCRIPTION_KEYS[activeTab] ? t(_TAB_DESCRIPTION_KEYS[activeTab]) : ''}
+ {_tabDescription(activeTab, t)}
{workflowsLoading ? (
diff --git a/src/pages/views/workspace/ToolActivityLog.tsx b/src/pages/views/workspace/ToolActivityLog.tsx
index 6e405ca..1758c87 100644
--- a/src/pages/views/workspace/ToolActivityLog.tsx
+++ b/src/pages/views/workspace/ToolActivityLog.tsx
@@ -7,7 +7,7 @@
* - Full details shown on error for debugging
*/
-import React, { useState, useCallback } from 'react';
+import React, { useState} from 'react';
import type { ToolActivity } from './useWorkspace';
import { useLanguage } from '../../../providers/language/LanguageContext';
@@ -124,7 +124,7 @@ export const ToolActivityLog: React.FC
= ({ activities })
const { t } = useLanguage();
const [expandedId, setExpandedId] = useState(null);
- const translate = useCallback((key, params) => t(key, params), [t]);
+ const translate: TranslateFn = t;
if (!activities.length) {
return (
diff --git a/src/pages/views/workspace/WorkspaceRagInsightsPage.tsx b/src/pages/views/workspace/WorkspaceRagInsightsPage.tsx
index a411fee..0079c41 100644
--- a/src/pages/views/workspace/WorkspaceRagInsightsPage.tsx
+++ b/src/pages/views/workspace/WorkspaceRagInsightsPage.tsx
@@ -25,16 +25,19 @@ import { formatBinaryDataSizeBytes } from '../../../utils/formatDataSize';
import { useLanguage } from '../../../providers/language/LanguageContext';
-const MIME_LABELS: Record = {
- pdf: 'PDF',
- office_doc: 'Office (Text)',
- office_sheet: 'Office (Tabellen)',
- office_slides: 'Office (Folien)',
- text: 'Text',
- image: 'Bild',
- html: 'HTML',
- other: 'Sonstige',
-};
+function _mimeLabel(key: string, t: (k: string) => string): string {
+ switch (key) {
+ case 'pdf': return t('PDF');
+ case 'office_doc': return t('Office (Text)');
+ case 'office_sheet': return t('Office (Tabellen)');
+ case 'office_slides': return t('Office (Folien)');
+ case 'text': return t('Text');
+ case 'image': return t('Bild');
+ case 'html': return t('HTML');
+ case 'other': return t('Sonstige');
+ default: return key;
+ }
+}
const CHART_COLORS = ['#1976d2', '#00897b', '#6a1b9a', '#e65100', '#5d4037', '#455a64', '#c62828'];
@@ -118,7 +121,7 @@ export const WorkspaceRagInsightsPage: React.FC = () => {
const kpis = stats?.kpis;
const timeline = stats?.timelineIndexedDocuments ?? [];
const mimeRows = Object.entries(stats?.documentsByMimeCategory ?? {}).map(([key, value]) => ({
- name: t(MIME_LABELS[key] ?? key),
+ name: _mimeLabel(key, t),
value,
}));
const statusRows = Object.entries(stats?.indexedDocumentsByStatus ?? {}).map(([name, value]) => ({
diff --git a/src/providers/language/LanguageContext.tsx b/src/providers/language/LanguageContext.tsx
index 8521b6d..9a51550 100644
--- a/src/providers/language/LanguageContext.tsx
+++ b/src/providers/language/LanguageContext.tsx
@@ -10,7 +10,7 @@ type TranslateParams = Record void;
- t: (key: string, paramsOrFallback?: TranslateParams | string) => string;
+ t: (key: string, params?: TranslateParams) => string;
isLoading: boolean;
reloadLanguage: () => Promise;
availableLanguages: I18nCodeInfo[];
@@ -123,18 +123,8 @@ export const LanguageProvider: React.FC = ({ children })
return out;
};
- const t = (key: string, paramsOrFallback?: TranslateParams | string): string => {
- let params: TranslateParams | undefined;
- if (typeof paramsOrFallback === 'string') {
- params = undefined;
- } else {
- params = paramsOrFallback;
- }
-
- const resolved =
- translations[key] ??
- (typeof paramsOrFallback === 'string' ? paramsOrFallback : undefined) ??
- `[${key}]`;
+ const t = (key: string, params?: TranslateParams): string => {
+ const resolved = translations[key] ?? `[${key}]`;
return _applyParams(resolved, params);
};