-
{currentLanguage === 'de' ? 'Feature Store' : currentLanguage === 'fr' ? t('store.featureStore') : t('store.featureStore')}
+
{t('Feature Store')}
- {currentLanguage === 'de'
- ? 'Aktiviere Features fuer dein Konto. Deine Daten sind isoliert und nur fuer dich sichtbar.'
- : currentLanguage === 'fr'
- ? t('store.activezDesFonctionnalitesPourVotre')
- : t('store.activateFeaturesForYourAccount')}
+ {t(
+ 'Aktiviere Features für dein Konto. Deine Daten sind isoliert und nur für dich sichtbar.',
+ t('store.activateFeaturesForYourAccount')
+ )}
{subscriptionInfo && subscriptionInfo.plan && (
- Plan: {subscriptionInfo.plan}
- {subscriptionInfo.maxFeatureInstances != null && (
-
- {currentLanguage === 'de' ? 'Instanzen' : 'Instances'}: {subscriptionInfo.currentFeatureInstances}/{subscriptionInfo.maxFeatureInstances}
-
- )}
+ {t('Plan:')} {subscriptionInfo.plan}
+
+ {subscriptionInfo.maxFeatureInstances != null
+ ? <>{t('Module')}: {subscriptionInfo.currentFeatureInstances}/{subscriptionInfo.maxFeatureInstances}>
+ : <>{subscriptionInfo.currentFeatureInstances} {t('Module aktiv')}
+ {subscriptionInfo.includedModules != null && subscriptionInfo.includedModules > 0 && (
+ <> ({subscriptionInfo.includedModules} {t('inklusive')})>
+ )}
+ >
+ }
+
{subscriptionInfo.maxDataVolumeMB != null && (
- {currentLanguage === 'de' ? 'Speicher' : 'Storage'}:{' '}
+ {t('Speicher')}:{' '}
{formatBinaryDataSizeFromMebibytes(subscriptionInfo.maxDataVolumeMB)}
)}
- {subscriptionInfo.budgetAiCHF != null && subscriptionInfo.budgetAiCHF > 0 && (
+ {subscriptionInfo.budgetAiPerUserCHF != null && subscriptionInfo.budgetAiPerUserCHF > 0 && (
- {currentLanguage === 'de' ? 'AI-Budget' : 'AI budget'}: {subscriptionInfo.budgetAiCHF} CHF
+ {t('AI-Budget')}: {subscriptionInfo.budgetAiPerUserCHF} CHF / User
)}
{subscriptionInfo.status === 'TRIALING' && subscriptionInfo.trialEndsAt && (
- {currentLanguage === 'de' ? t('store.trialEndet') : t('store.trialEnds')}: {new Date(subscriptionInfo.trialEndsAt).toLocaleDateString()}
+ {t('store.trialEndet', t('store.trialEnds'))}: {new Date(subscriptionInfo.trialEndsAt).toLocaleDateString()}
)}
@@ -199,13 +173,11 @@ const StorePage: React.FC = () => {
{loading ? (
- {currentLanguage === 'de' ? t('store.ladeFeatures') : t('store.loadingFeatures')}
+ {t('store.ladeFeatures', t('store.loadingFeatures'))}
) : features.length === 0 ? (
- {currentLanguage === 'de'
- ? t('store.keineFeaturesImStoreVerfuegbar')
- : t('store.noFeaturesAvailableInThe')}
+ {t('store.keineFeaturesImStoreVerfuegbar', t('store.noFeaturesAvailableInThe'))}
) : (
@@ -213,7 +185,6 @@ const StorePage: React.FC = () => {
string): string {
+ return t(labelAsI18nKey(feature.label, feature.code));
}
export interface InstanceWithStats extends FeatureInstance {
@@ -168,7 +166,7 @@ export const AccessManagementHub: React.FC = () => {
instance,
mandateId: mandateId || '',
mandateName: mandate ? getMandateName(mandate) : mandateId || '',
- featureLabel: feature ? getFeatureLabel(feature) : instance.featureCode,
+ featureLabel: feature ? getFeatureLabel(feature, t) : instance.featureCode,
});
};
@@ -302,7 +300,7 @@ export const AccessManagementHub: React.FC = () => {
};
}),
};
- }, [selectedMandateId, mandates, filteredInstances, features]);
+ }, [selectedMandateId, mandates, filteredInstances, features, t]);
if (error && !selectedMandateId) {
return (
@@ -364,7 +362,7 @@ export const AccessManagementHub: React.FC = () => {
{t('accessManagementHub.alle')}
{features.map((f) => (
- {getFeatureLabel(f)}
+ {getFeatureLabel(f, t)}
))}
@@ -527,7 +525,7 @@ export const AccessManagementHub: React.FC = () => {
- {getFeatureLabel(features.find((f) => f.code === inst.featureCode) || { code: inst.featureCode, label: inst.featureCode })}
+ {getFeatureLabel(features.find((f) => f.code === inst.featureCode) || { code: inst.featureCode, label: inst.featureCode }, t)}
{inst.userCount ?? '—'} Benutzer
{inst.roleCount ?? '—'} Rollen
diff --git a/src/pages/admin/AdminFeatureAccessPage.tsx b/src/pages/admin/AdminFeatureAccessPage.tsx
index 23d7ea1..85fb2b7 100644
--- a/src/pages/admin/AdminFeatureAccessPage.tsx
+++ b/src/pages/admin/AdminFeatureAccessPage.tsx
@@ -20,6 +20,7 @@ import { TextField } from '../../components/UiComponents/TextField';
import styles from './Admin.module.css';
import { useLanguage } from '../../providers/language/LanguageContext';
+import { labelAsI18nKey } from '../../types/mandate';
export const AdminFeatureAccessPage: React.FC = () => {
const { t } = useLanguage();
@@ -93,10 +94,7 @@ export const AdminFeatureAccessPage: React.FC = () => {
render: (value: string) => {
const feature = features.find(f => f.code === value);
if (feature) {
- const label = typeof feature.label === 'object'
- ? (feature.label.de || feature.label.en || value)
- : feature.label;
- return label;
+ return t(labelAsI18nKey(feature.label, value));
}
return value;
}
@@ -327,9 +325,7 @@ export const AdminFeatureAccessPage: React.FC = () => {
const getFeatureLabel = (code: string) => {
const feature = features.find(f => f.code === code);
if (feature) {
- return typeof feature.label === 'object'
- ? (feature.label.de || feature.label.en || code)
- : (feature.label || code);
+ return t(labelAsI18nKey(feature.label, code));
}
return code;
};
@@ -514,9 +510,7 @@ export const AdminFeatureAccessPage: React.FC = () => {
({
id: f.code,
- label: typeof f.label === 'object'
- ? (f.label.de || f.label.en || f.code)
- : (f.label || f.code),
+ label: t(labelAsI18nKey(f.label, f.code)),
value: f.code
}))}
selectedItemId={createFeatureCode}
diff --git a/src/pages/admin/AdminFeatureInstanceUsersPage.tsx b/src/pages/admin/AdminFeatureInstanceUsersPage.tsx
index 6fe73de..ad0d2cf 100644
--- a/src/pages/admin/AdminFeatureInstanceUsersPage.tsx
+++ b/src/pages/admin/AdminFeatureInstanceUsersPage.tsx
@@ -17,6 +17,7 @@ import api from '../../api';
import styles from './Admin.module.css';
import { useLanguage } from '../../providers/language/LanguageContext';
+import { labelAsI18nKey } from '../../types/mandate';
export const AdminFeatureInstanceUsersPage: React.FC = () => {
const { t } = useLanguage();
@@ -368,9 +369,7 @@ export const AdminFeatureInstanceUsersPage: React.FC = () => {
const getFeatureLabel = (code: string) => {
const feature = features.find(f => f.code === code);
if (feature) {
- return typeof feature.label === 'object'
- ? (feature.label.de || feature.label.en || code)
- : (feature.label || code);
+ return t(labelAsI18nKey(feature.label, code));
}
return code;
};
diff --git a/src/pages/admin/AdminFeatureRolesPage.tsx b/src/pages/admin/AdminFeatureRolesPage.tsx
index 1ac8c8e..1e0f238 100644
--- a/src/pages/admin/AdminFeatureRolesPage.tsx
+++ b/src/pages/admin/AdminFeatureRolesPage.tsx
@@ -263,8 +263,11 @@ export const AdminFeatureRolesPage: React.FC = () => {
setEditingRole(role);
};
- // Get feature name - Backend uses 'label' field
- const getFeatureName = (feature: Feature) => getTextValue(feature.label || feature.name);
+ // Get feature name - Backend uses 'label' field (German i18n key or legacy multilingual)
+ const getFeatureName = (feature: Feature) => {
+ const raw = getTextValue(feature.label || feature.name);
+ return raw === '-' ? '-' : t(raw);
+ };
if (error && !selectedFeatureCode) {
return (
diff --git a/src/pages/admin/wizards/AdminMandateWizardPage.tsx b/src/pages/admin/wizards/AdminMandateWizardPage.tsx
index 725ee29..fbd8e86 100644
--- a/src/pages/admin/wizards/AdminMandateWizardPage.tsx
+++ b/src/pages/admin/wizards/AdminMandateWizardPage.tsx
@@ -22,6 +22,7 @@ import { FormGeneratorForm } from '../../../components/FormGenerator/FormGenerat
import styles from '../Admin.module.css';
import { useLanguage } from '../../../providers/language/LanguageContext';
+import { labelAsI18nKey } from '../../../types/mandate';
const TOTAL_STEPS = 4;
const STEP_LABELS = ['Mandant', 'Benutzer', 'Instances', 'Feature-Benutzer'];
@@ -115,9 +116,7 @@ export const AdminMandateWizardPage: React.FC = () => {
const getFeatureLabel = (code: string): string => {
const f = features.find(feat => feat.code === code);
if (f) {
- return typeof f.label === 'object'
- ? (f.label.de || f.label.en || code)
- : (f.label || code);
+ return t(labelAsI18nKey(f.label, code));
}
return code;
};
diff --git a/src/pages/admin/wizards/FeatureInstanceWizard.tsx b/src/pages/admin/wizards/FeatureInstanceWizard.tsx
index bfc93c0..2b17c8d 100644
--- a/src/pages/admin/wizards/FeatureInstanceWizard.tsx
+++ b/src/pages/admin/wizards/FeatureInstanceWizard.tsx
@@ -15,17 +15,13 @@ import styles from '../Admin.module.css';
import wizardStyles from './FeatureInstanceWizard.module.css';
import { useLanguage } from '../../../providers/language/LanguageContext';
+import { labelAsI18nKey } from '../../../types/mandate';
function getMandateName(m: Mandate): string {
if (typeof m.name === 'object') return m.name.de || m.name.en || Object.values(m.name)[0] || m.id;
return m.name || m.id;
}
-function getFeatureLabel(f: Feature): string {
- if (typeof f.label === 'object') return f.label.de || f.label.en || f.code;
- return f.label || f.code;
-}
-
export interface FeatureInstanceWizardProps {
mandateId: string;
mandates: Mandate[];
@@ -63,8 +59,8 @@ export const FeatureInstanceWizard: React.FC = ({ ma
const [selectedUserRoles, setSelectedUserRoles] = useState>([]);
const featureOptions = useMemo(
- () => features.map((f) => ({ value: f.code, label: getFeatureLabel(f) })),
- [features]
+ () => features.map((f) => ({ value: f.code, label: t(labelAsI18nKey(f.label, f.code)) })),
+ [features, t]
);
const mandateOptions = useMemo(
() => mandates.map((m) => ({ value: m.id, label: getMandateName(m) })),
diff --git a/src/pages/billing/AdminSubscriptionsPage.tsx b/src/pages/billing/AdminSubscriptionsPage.tsx
index aa0d390..b743b6a 100644
--- a/src/pages/billing/AdminSubscriptionsPage.tsx
+++ b/src/pages/billing/AdminSubscriptionsPage.tsx
@@ -16,12 +16,12 @@ function _getColumns(t: (key: string) => string): ColumnConfig[] {
{ key: 'status', label: t('adminSubscriptions.status'), type: 'text', sortable: true, filterable: true, width: 110 },
{ key: 'recurring', label: t('adminSubscriptions.wiederkehrend'), type: 'boolean', sortable: true, filterable: true, width: 120 },
{ key: 'activeUsers', label: t('adminSubscriptions.user'), type: 'number', sortable: true, width: 70 },
- { key: 'activeInstances', label: t('adminSubscriptions.instanzen'), type: 'number', sortable: true, width: 90 },
+ { key: 'activeInstances', label: t('adminSubscriptions.module'), type: 'number', sortable: true, width: 90 },
{ key: 'monthlyRevenueCHF', label: t('adminSubscriptions.revenueProMonat'), type: 'number', sortable: true, width: 140 },
{ key: 'startedAt', label: t('adminSubscriptions.gestartet'), type: 'date', sortable: true, filterable: true, width: 130 },
{ key: 'currentPeriodEnd', label: t('adminSubscriptions.periodenende'), type: 'date', sortable: true, filterable: true, width: 130 },
{ key: 'snapshotPricePerUserCHF', label: t('adminSubscriptions.preisProUser'), type: 'number', sortable: true, width: 100 },
- { key: 'snapshotPricePerInstanceCHF', label: t('adminSubscriptions.preisProInstanz'), type: 'number', sortable: true, width: 110 },
+ { key: 'snapshotPricePerInstanceCHF', label: t('adminSubscriptions.preisProModul'), type: 'number', sortable: true, width: 110 },
];
}
diff --git a/src/pages/billing/SubscriptionTab.tsx b/src/pages/billing/SubscriptionTab.tsx
index 2c6551c..95aedc0 100644
--- a/src/pages/billing/SubscriptionTab.tsx
+++ b/src/pages/billing/SubscriptionTab.tsx
@@ -109,20 +109,29 @@ const PlanCard: React.FC = ({ plan, isCurrent, onActivate, activa
{!isFreePlan && (
User: {_formatCurrency(plan.pricePerUserCHF)} / {periodLabel[plan.billingPeriod] || plan.billingPeriod}
-
Instanz: {_formatCurrency(plan.pricePerFeatureInstanceCHF)} / {periodLabel[plan.billingPeriod] || plan.billingPeriod}
+
+ Module inkl.: {plan.includedModules ?? 0}
+ {(plan.pricePerFeatureInstanceCHF ?? 0) > 0 && (
+ <> · Zusatzmodul: {_formatCurrency(plan.pricePerFeatureInstanceCHF)} / Monat>
+ )}
+
- AI-Budget (inkl.): {_formatCurrency(plan.budgetAiCHF ?? 0)} / Periode
+ AI-Budget: {_formatCurrency(plan.budgetAiPerUserCHF ?? 0)} / User / Monat
{' · '}
- Speicher (inkl.):{' '}
+ Speicher:{' '}
{plan.maxDataVolumeMB == null
? 'unbegrenzt'
: formatBinaryDataSizeFromMebibytes(plan.maxDataVolumeMB)}
-
- Speicher über Plan: {_formatCurrency(storageOverageChfPerGbMonth)} / GB / Monat
-
+ {plan.maxUsers != null && (
+
+ Max. User: {plan.maxUsers}
+ {' · '}
+ Speicher über Plan: {_formatCurrency(storageOverageChfPerGbMonth)} / GB / Monat
+
+ )}
)}
@@ -130,13 +139,13 @@ const PlanCard: React.FC = ({ plan, isCurrent, onActivate, activa
{plan.trialDays} Tage kostenlos
{plan.maxUsers && <> · max. {plan.maxUsers} User>}
- {plan.maxFeatureInstances && <> · max. {plan.maxFeatureInstances} Instanzen>}
- {(plan.maxDataVolumeMB != null || (plan.budgetAiCHF ?? 0) > 0) && (
+ {(plan.includedModules ?? 0) > 0 && <> · {plan.includedModules} Module inkl.>}
+ {(plan.maxDataVolumeMB != null || (plan.budgetAiPerUserCHF ?? 0) > 0) && (
<>
{plan.maxDataVolumeMB != null && (
- <> · Speicher inkl. {formatBinaryDataSizeFromMebibytes(plan.maxDataVolumeMB)}>
+ <> · Speicher {formatBinaryDataSizeFromMebibytes(plan.maxDataVolumeMB)}>
)}
- {(plan.budgetAiCHF ?? 0) > 0 && <> · AI-Budget { _formatCurrency(plan.budgetAiCHF ?? 0)}>}
+ {(plan.budgetAiPerUserCHF ?? 0) > 0 && <> · AI-Budget {_formatCurrency(plan.budgetAiPerUserCHF ?? 0)} / User>}
>
)}
@@ -252,15 +261,16 @@ const SubInfoCard: React.FC = ({ sub, plan, label, onCancel, onRea
)}
{plan && (
<>
- AI-Budget (inkl.): {_formatCurrency(plan.budgetAiCHF ?? 0)} / Periode
+ AI-Budget: {_formatCurrency(plan.budgetAiPerUserCHF ?? 0)} / User / Monat
+ Module inkl.: {plan.includedModules ?? 0}
- Speicher (inkl.):{' '}
+ Speicher:{' '}
{plan.maxDataVolumeMB == null
? 'unbegrenzt'
: formatBinaryDataSizeFromMebibytes(plan.maxDataVolumeMB)}
-
- Speicher über Plan: {_formatCurrency(storageOverageChfPerGbMonth)} / GB / Monat (High-Watermark)
+
+ Speicher über Plan: {_formatCurrency(storageOverageChfPerGbMonth)} / GB / Monat
>
)}
diff --git a/src/pages/views/trustee/TrusteeAbschlussView.tsx b/src/pages/views/trustee/TrusteeAbschlussView.tsx
index ffe62a3..0740f6b 100644
--- a/src/pages/views/trustee/TrusteeAbschlussView.tsx
+++ b/src/pages/views/trustee/TrusteeAbschlussView.tsx
@@ -30,15 +30,13 @@ const _TABS: TabDef[] = [
{ id: 'year-end', templateTag: 'template:trustee-year-end-check', icon: '\u2705', color: '#795548' },
];
-const _TAB_LABELS: Record> = {
- 'year-end': { de: 'Jahresabschluss prüfen', en: 'Year-End Review', fr: 'Contrôle de clôture' },
+const _TAB_LABEL_KEYS: Record = {
+ 'year-end': 'Jahresabschluss prüfen',
};
-const _TAB_DESCRIPTIONS: Record> = {
- 'year-end': {
- de: 'Automatische Prüfungen für den Jahresabschluss: Saldovalidierung, Vorjahresvergleich, gesetzliche Checks.',
- en: 'Automated year-end review: balance validation, prior-year comparison, legal compliance checks.',
- },
+const _TAB_DESCRIPTION_KEYS: Record = {
+ 'year-end':
+ 'Automatische Prüfungen für den Jahresabschluss: Saldovalidierung, Vorjahresvergleich, gesetzliche Checks.',
};
// ---------------------------------------------------------------------------
@@ -58,8 +56,7 @@ type RunState = 'idle' | 'starting' | 'running' | 'completed' | 'error';
// ---------------------------------------------------------------------------
export const TrusteeAbschlussView: React.FC = () => {
- const { t, currentLanguage } = useLanguage();
- const lang = currentLanguage || 'de';
+ const { t } = useLanguage();
const { instanceId } = useCurrentInstance();
const { showSuccess, showError } = useToast();
const [searchParams, setSearchParams] = useSearchParams();
@@ -228,7 +225,7 @@ export const TrusteeAbschlussView: React.FC = () => {
}}
>
{tab.icon}
- {_TAB_LABELS[tab.id]?.[lang] || _TAB_LABELS[tab.id]?.de || tab.id}
+ {t(_TAB_LABEL_KEYS[tab.id] || tab.id)}
))}
@@ -237,7 +234,7 @@ export const TrusteeAbschlussView: React.FC = () => {
{/* Tab content */}
- {_TAB_DESCRIPTIONS[activeTab]?.[lang] || _TAB_DESCRIPTIONS[activeTab]?.de || ''}
+ {_TAB_DESCRIPTION_KEYS[activeTab] ? t(_TAB_DESCRIPTION_KEYS[activeTab]) : ''}
{workflowsLoading ? (
diff --git a/src/pages/views/trustee/TrusteeAnalyseView.tsx b/src/pages/views/trustee/TrusteeAnalyseView.tsx
index f2862a9..61edc90 100644
--- a/src/pages/views/trustee/TrusteeAnalyseView.tsx
+++ b/src/pages/views/trustee/TrusteeAnalyseView.tsx
@@ -33,18 +33,18 @@ const _TABS: TabDef[] = [
{ id: 'forecast', templateTag: 'template:trustee-forecast', icon: '\uD83D\uDCC8', color: '#E91E63' },
];
-const _TAB_LABELS: Record
> = {
- budget: { de: 'Budget-Vergleich', en: 'Budget Comparison', fr: 'Comparaison budgétaire' },
- kpi: { de: 'KPI-Dashboard', en: 'KPI Dashboard', fr: 'Tableau de bord KPI' },
- cashflow: { de: 'Cashflow-Rechnung', en: 'Cash Flow Statement', fr: 'Flux de trésorerie' },
- forecast: { de: 'Prognose', en: 'Forecast', fr: 'Prévision' },
+const _TAB_LABEL_KEYS: Record = {
+ budget: 'Budget-Vergleich',
+ kpi: 'KPI-Dashboard',
+ cashflow: 'Cashflow-Rechnung',
+ forecast: 'Prognose',
};
-const _TAB_DESCRIPTIONS: Record> = {
- budget: { de: 'Soll/Ist-Vergleich der Buchhaltung mit Budget-Excel', en: 'Compare actuals vs. budget from Excel' },
- kpi: { de: 'Kennzahlen berechnen und visualisieren', en: 'Calculate and visualize key metrics' },
- cashflow: { de: 'Cashflow berechnen und analysieren', en: 'Calculate and analyze cash flow' },
- forecast: { de: 'Trend-Analyse und Prognose der nächsten Monate', en: 'Trend analysis and forecast for coming months' },
+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',
};
// ---------------------------------------------------------------------------
@@ -64,8 +64,7 @@ type RunState = 'idle' | 'starting' | 'running' | 'completed' | 'error';
// ---------------------------------------------------------------------------
export const TrusteeAnalyseView: React.FC = () => {
- const { t, currentLanguage } = useLanguage();
- const lang = currentLanguage || 'de';
+ const { t } = useLanguage();
const { instanceId } = useCurrentInstance();
const { showSuccess, showError } = useToast();
const [searchParams, setSearchParams] = useSearchParams();
@@ -241,7 +240,7 @@ export const TrusteeAnalyseView: React.FC = () => {
}}
>
{tab.icon}
- {_TAB_LABELS[tab.id]?.[lang] || _TAB_LABELS[tab.id]?.de || tab.id}
+ {t(_TAB_LABEL_KEYS[tab.id] || tab.id)}
))}
@@ -249,7 +248,7 @@ export const TrusteeAnalyseView: React.FC = () => {
{/* Tab content */}
- {_TAB_DESCRIPTIONS[activeTab]?.[lang] || _TAB_DESCRIPTIONS[activeTab]?.de || ''}
+ {_TAB_DESCRIPTION_KEYS[activeTab] ? t(_TAB_DESCRIPTION_KEYS[activeTab]) : ''}
{workflowsLoading ? (
diff --git a/src/pages/views/trustee/TrusteeDashboardView.tsx b/src/pages/views/trustee/TrusteeDashboardView.tsx
index d52856b..a7cad66 100644
--- a/src/pages/views/trustee/TrusteeDashboardView.tsx
+++ b/src/pages/views/trustee/TrusteeDashboardView.tsx
@@ -100,7 +100,7 @@ export const TrusteeDashboardView: React.FC = () => {
{isLoading ? '...' : positions.length}
-
Positionen
+
{t('Positionen')}
@@ -110,7 +110,7 @@ export const TrusteeDashboardView: React.FC = () => {
{isLoading ? '...' : (
accountingConfig?.configured
- ? <>{syncedCount} synced{syncErrorCount > 0 && / {syncErrorCount} errors }>
- : 'Not configured'
+ ? <>{syncedCount} {t('synchronisiert')}{syncErrorCount > 0 && / {syncErrorCount} {t('Fehler')} }>
+ : t('Nicht konfiguriert')
)}
-
-
Instanz-Details
+
{t('Instanz-Details')}
- Instanz:
+ {t('Instanz:')}
{instance?.instanceLabel}
@@ -167,7 +167,7 @@ export const TrusteeDashboardView: React.FC = () => {
{accountingConfig?.configured && (
-
Buchhaltungssystem:
+
{t('Buchhaltungssystem:')}
{accountingConfig.displayLabel || accountingConfig.connectorType}
{accountingConfig.lastSyncStatus && ` (${accountingConfig.lastSyncStatus})`}
diff --git a/src/pages/views/trustee/TrusteeDocumentsView.tsx b/src/pages/views/trustee/TrusteeDocumentsView.tsx
index c5acccf..a530346 100644
--- a/src/pages/views/trustee/TrusteeDocumentsView.tsx
+++ b/src/pages/views/trustee/TrusteeDocumentsView.tsx
@@ -140,7 +140,7 @@ export const TrusteeDocumentsView: React.FC = () => {
window.URL.revokeObjectURL(url);
} catch (err) {
console.error('Download error:', err);
- showError('Fehler', 'Fehler beim Herunterladen des Dokuments.');
+ showError(t('Fehler'), t('Fehler beim Herunterladen des Dokuments.'));
} finally {
setDownloadingId(null);
}
@@ -172,9 +172,9 @@ export const TrusteeDocumentsView: React.FC = () => {
⚠️
-
Fehler beim Laden der Dokumente: {error}
+
{t('Fehler beim Laden der Dokumente: {detail}', { detail: String(error) })}
refetch()}>
- Erneut versuchen
+ {t('Erneut versuchen')}
@@ -193,14 +193,14 @@ export const TrusteeDocumentsView: React.FC = () => {
onClick={() => refetch()}
disabled={loading}
>
- Aktualisieren
+ {t('Aktualisieren')}
{canCreate && (
- + Neues Dokument
+ + {t('Neues Dokument')}
)}
diff --git a/src/pages/views/trustee/TrusteeInstanceRolesView.tsx b/src/pages/views/trustee/TrusteeInstanceRolesView.tsx
index 4d324f9..b7c794b 100644
--- a/src/pages/views/trustee/TrusteeInstanceRolesView.tsx
+++ b/src/pages/views/trustee/TrusteeInstanceRolesView.tsx
@@ -57,13 +57,13 @@ export const TrusteeInstanceRolesView: React.FC = () => {
const rolesList = response.data?.items || response.data || [];
setRoles(Array.isArray(rolesList) ? rolesList : []);
} catch (err: any) {
- const errorMsg = err.response?.data?.detail || err.message || 'Fehler beim Laden der Rollen';
+ const errorMsg = err.response?.data?.detail || err.message || t('Fehler beim Laden der Rollen');
setError(errorMsg);
console.error('Error loading instance roles:', err);
} finally {
setLoading(false);
}
- }, [instance?.id, instance?.mandateId]);
+ }, [instance?.id, instance?.mandateId, t]);
useEffect(() => {
fetchRoles();
@@ -96,7 +96,7 @@ export const TrusteeInstanceRolesView: React.FC = () => {
{error}
- Erneut versuchen
+ {t('Erneut versuchen')}
@@ -109,7 +109,7 @@ export const TrusteeInstanceRolesView: React.FC = () => {
- Verwalten Sie die Berechtigungen für die Rollen dieser Trustee-Instanz
+ {t('Verwalten Sie die Berechtigungen für die Rollen dieser Trustee-Instanz')}
@@ -122,8 +122,7 @@ export const TrusteeInstanceRolesView: React.FC = () => {
- Diese Rollen wurden von den Feature-Templates kopiert.
- Änderungen hier gelten nur für diese Instanz.
+ {t('Diese Rollen wurden von den Feature-Templates kopiert. Änderungen hier gelten nur für diese Instanz.')}
@@ -132,7 +131,7 @@ export const TrusteeInstanceRolesView: React.FC = () => {
{t('trusteeInstanceRoles.keineInstanzrollenGefunden')}
- Instanz-Rollen werden automatisch erstellt, wenn Benutzer dieser Instanz zugewiesen werden.
+ {t('Instanz-Rollen werden automatisch erstellt, wenn Benutzer dieser Instanz zugewiesen werden.')}
) : (
@@ -154,7 +153,7 @@ export const TrusteeInstanceRolesView: React.FC = () => {