fix(i18n): hardkodierte Strings in DNS/RoutingRules/Settings/Backends bereinigen

- DNS Settings: Loopback/allIPv4/allIPv6 Interface-Labels in t() überführt
- RoutingRules: UP/DOWN-Tags + fehlende onError-Handler in create/update
- Settings: t-Variable-Shadowing in top_tables-Map behoben (t → tbl)
- Backends: 'Live'-Spaltenheader → t('backends.server.live')
- common.up/down + dns.settings.allIPv4/allIPv6/loopback in en+de ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-24 12:30:43 +02:00
parent e04bddd574
commit 519522b8ee
10 changed files with 30 additions and 16 deletions

View File

@@ -367,7 +367,8 @@
"backup": "Backup",
"backupHint": "Backup-Server werden nur angesprochen, wenn alle primären Server (non-backup) down sind.",
"empty": "Noch keine Server im Pool. „Server hinzufügen\" startet damit.",
"deleteConfirm": "Server {{name}} wirklich löschen?"
"deleteConfirm": "Server {{name}} wirklich löschen?",
"live": "Live"
}
},
"routing": {
@@ -868,7 +869,10 @@
"dnssec": "DNSSEC validieren",
"qnameMin": "QName-Minimisation (privacy)",
"cacheMin": "Cache min-TTL",
"cacheMax": "Cache max-TTL"
"cacheMax": "Cache max-TTL",
"allIPv4": "alle IPv4-Interfaces",
"allIPv6": "alle IPv6-Interfaces",
"loopback": "Loopback"
}
},
"fwd": {
@@ -934,6 +938,8 @@
"copied": "Kopiert",
"close": "Schließen",
"refresh": "Aktualisieren",
"up": "UP",
"down": "DOWN",
"relTime": {
"Xs": "vor {{n}}s",
"Xm": "vor {{n}}m",

View File

@@ -367,7 +367,8 @@
"backup": "Backup",
"backupHint": "Backup servers receive traffic only when every primary (non-backup) server is down.",
"empty": "No servers in the pool yet. Click “Add server” to get started.",
"deleteConfirm": "Really delete server {{name}}?"
"deleteConfirm": "Really delete server {{name}}?",
"live": "Live"
}
},
"routing": {
@@ -868,7 +869,10 @@
"dnssec": "DNSSEC validation",
"qnameMin": "QName minimisation (privacy)",
"cacheMin": "Cache min-TTL",
"cacheMax": "Cache max-TTL"
"cacheMax": "Cache max-TTL",
"allIPv4": "all IPv4 interfaces",
"allIPv6": "all IPv6 interfaces",
"loopback": "Loopback"
}
},
"fwd": {
@@ -934,6 +938,8 @@
"copied": "Copied",
"close": "Close",
"refresh": "Refresh",
"up": "UP",
"down": "DOWN",
"relTime": {
"Xs": "{{n}}s ago",
"Xm": "{{n}}m ago",

View File

@@ -309,7 +309,7 @@ function ServerPanel({ backendID, haproxyStats }: { backendID: number; haproxySt
),
},
{
title: 'Live', key: 'live', width: 160,
title: t('backends.server.live'), key: 'live', width: 160,
render: (_, r) => {
const stat = haproxyStats.find(
s => s.backend === `eg_backend_${backendID}` && s.server === r.name

View File

@@ -442,10 +442,10 @@ function SettingsTab() {
// Mode "tags" damit der Operator notfalls auch eine IP eintippen kann
// die der Kernel noch nicht meldet (z.B. eine geplante VIP).
const ipOptions: { value: string; label: string }[] = []
ipOptions.push({ value: '0.0.0.0', label: '0.0.0.0 — alle IPv4-Interfaces' })
ipOptions.push({ value: '::', label: ':: — alle IPv6-Interfaces' })
ipOptions.push({ value: '127.0.0.1', label: '127.0.0.1 — Loopback IPv4' })
ipOptions.push({ value: '::1', label: '::1 — Loopback IPv6' })
ipOptions.push({ value: '0.0.0.0', label: `0.0.0.0 — ${t('dns.settings.allIPv4')}` })
ipOptions.push({ value: '::', label: `:: — ${t('dns.settings.allIPv6')}` })
ipOptions.push({ value: '127.0.0.1', label: `127.0.0.1 — ${t('dns.settings.loopback')} IPv4` })
ipOptions.push({ value: '::1', label: `::1 — ${t('dns.settings.loopback')} IPv6` })
for (const i of sys ?? []) {
if (i.ifname === 'lo') continue
for (const a of i.addr_info ?? []) {

View File

@@ -106,6 +106,7 @@ export default function RoutingRulesPage() {
form.resetFields()
void qc.invalidateQueries({ queryKey: ['routing-rules'] })
},
onError: (e: Error) => message.error(e.message),
})
const update = useMutation({
mutationFn: async ({ id, v }: { id: number; v: RuleFormValues }) => {
@@ -117,6 +118,7 @@ export default function RoutingRulesPage() {
form.resetFields()
void qc.invalidateQueries({ queryKey: ['routing-rules'] })
},
onError: (e: Error) => message.error(e.message),
})
const del = useMutation({
mutationFn: async (id: number) => { await apiClient.delete(`/routing-rules/${id}`) },
@@ -144,7 +146,7 @@ export default function RoutingRulesPage() {
<span>{backendLabel(id)}</span>
{h && (
<Tooltip title={tip}>
<Tag color={h.up ? 'green' : 'red'} style={{ margin: 0 }}>{h.up ? 'UP' : 'DOWN'}</Tag>
<Tag color={h.up ? 'green' : 'red'} style={{ margin: 0 }}>{h.up ? t('common.up') : t('common.down')}</Tag>
</Tooltip>
)}
</Space>

View File

@@ -326,8 +326,8 @@ export default function SettingsPage() {
{dbSize.top_tables.length > 0 && (
<Typography.Text type="secondary" style={{ fontSize: 11 }}>
{t('settings.dbSizeTop')}:{' '}
{dbSize.top_tables.slice(0, 3).map(t =>
`${t.name} (${t.human_size})`
{dbSize.top_tables.slice(0, 3).map(tbl =>
`${tbl.name} (${tbl.human_size})`
).join(', ')}
</Typography.Text>
)}