fix(i18n): hardkodierte Strings in Cluster/Users/Backups/Alerts bereinigen

- Cluster: statusTag() bekommt t-Parameter; Status-Labels (online/offline/
  joining/leaving/unknown) → cluster.status.* Keys
- Users: 'You'-Tag → t('users.you') / de: 'Ich'
- Backups: 'OK'-Status-Tag → t('backups.okTag')
- Alerts: Kanal-Kind-Labels + alle SMTP-Formular-Labels in t() überführt
- en/de: cluster.status.*, users.you, backups.okTag, alerts.smtp.*,
  alerts.kindWebhook/kindEmail ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-24 12:47:28 +02:00
parent 6e52dc0620
commit bb14d2ac6c
10 changed files with 62 additions and 24 deletions

View File

@@ -342,8 +342,8 @@ export default function AlertsPage() {
</Form.Item>
<Form.Item label={t('alerts.col.kind')} name="kind" rules={[{ required: true }]}>
<Select options={[
{ value: 'webhook', label: 'Webhook (Slack/Discord/Teams/HTTP-Endpoint)' },
{ value: 'email', label: 'Email (SMTP)' },
{ value: 'webhook', label: t('alerts.kindWebhook') },
{ value: 'email', label: t('alerts.kindEmail') },
]} />
</Form.Item>
<Form.Item label={kind === 'email' ? t('alerts.col.targetEmail') : t('alerts.col.targetWebhook')}
@@ -353,22 +353,22 @@ export default function AlertsPage() {
{kind === 'email' && (
<>
<Form.Item label="SMTP-Host" name="smtp_host" rules={[{ required: true }]}>
<Form.Item label={t('alerts.smtp.host')} name="smtp_host" rules={[{ required: true }]}>
<Input placeholder="smtp.gmail.com" />
</Form.Item>
<Form.Item label="SMTP-Port" name="smtp_port" rules={[{ required: true }]}>
<Form.Item label={t('alerts.smtp.port')} name="smtp_port" rules={[{ required: true }]}>
<InputNumber min={1} max={65535} style={{ width: '100%' }} />
</Form.Item>
<Form.Item label="From" name="from" rules={[{ required: true }]}>
<Form.Item label={t('alerts.smtp.from')} name="from" rules={[{ required: true }]}>
<Input placeholder="edgeguard@your-domain.tld" />
</Form.Item>
<Form.Item label="Username" name="username">
<Form.Item label={t('alerts.smtp.username')} name="username">
<Input />
</Form.Item>
<Form.Item label="Password" name="password">
<Form.Item label={t('alerts.smtp.password')} name="password">
<Input.Password />
</Form.Item>
<Form.Item label="STARTTLS" name="use_tls" valuePropName="checked">
<Form.Item label={t('alerts.smtp.starttls')} name="use_tls" valuePropName="checked">
<Switch />
</Form.Item>
</>

View File

@@ -187,7 +187,7 @@ export default function HistoryTab() {
title: t('backups.col.status'), dataIndex: 'status', width: 110,
render: (s: Backup['status'], row) =>
s === 'success'
? <Tag color="green">OK</Tag>
? <Tag color="green">{t('backups.okTag')}</Tag>
: (
<Tooltip title={row.error}>
<Tag color="red">{t('backups.failedTag')}</Tag>

View File

@@ -82,13 +82,13 @@ interface CertStatus {
peer?: CertInfo
}
function statusTag(s: HANode['status']) {
function statusTag(s: HANode['status'], t: (k: string) => string) {
switch (s) {
case 'online': return <Tag color="green">online</Tag>
case 'offline': return <Tag color="red">offline</Tag>
case 'joining': return <Tag color="blue">joining</Tag>
case 'leaving': return <Tag color="orange">leaving</Tag>
default: return <Tag>unknown</Tag>
case 'online': return <Tag color="green">{t('cluster.status.online')}</Tag>
case 'offline': return <Tag color="red">{t('cluster.status.offline')}</Tag>
case 'joining': return <Tag color="blue">{t('cluster.status.joining')}</Tag>
case 'leaving': return <Tag color="orange">{t('cluster.status.leaving')}</Tag>
default: return <Tag>{t('cluster.status.unknown')}</Tag>
}
}
@@ -208,7 +208,7 @@ export default function ClusterPage() {
},
{
title: t('cluster.col.status'), dataIndex: 'status', width: 110,
render: (s: HANode['status']) => statusTag(s),
render: (s: HANode['status']) => statusTag(s, t),
},
{ title: t('cluster.col.role'), dataIndex: 'role', width: 110,
render: (v: string) => <Tag color={v === 'primary' ? 'gold' : 'default'}>{v}</Tag> },
@@ -324,7 +324,7 @@ export default function ClusterPage() {
</Space>
</Descriptions.Item>
<Descriptions.Item label={t('cluster.col.status')}>
{statusTag(data.local_node.status)}
{statusTag(data.local_node.status, t)}
</Descriptions.Item>
<Descriptions.Item label={t('cluster.col.role')}>
<Tag color={data.local_node.role === 'primary' ? 'gold' : 'default'}>

View File

@@ -91,7 +91,7 @@ export default function UsersPage() {
render: (s: string) => (
<Space size={6}>
<span>{s}</span>
{me?.actor === s && <Tag style={{ fontSize: 11, padding: '0 4px' }}>You</Tag>}
{me?.actor === s && <Tag style={{ fontSize: 11, padding: '0 4px' }}>{t('users.you')}</Tag>}
</Space>
),
},