Add Domains to Administration

A role that can read domains now finds a Domains section beside Accounts:
list and search with each domain's account count and whether its DNS, DKIM
and certificate are managed automatically; add a domain; edit its
description, other names, catch-all address and plus addressing; copy its
DNS records one at a time or as a zone file; see its DKIM keys and their
stage; and remove it once no accounts use it.

The records come from the zone file Stalwart computes per domain. A long
DKIM record, which the BIND serialiser splits into quoted chunks, is joined
back into the single value a DNS provider's form wants.

Removing a domain takes its DKIM keys first, in the same request, because the
server will not remove a domain its keys still name. Removal is not offered
while accounts use the domain, or when the role cannot remove the keys.

The Administration nav is now built from the sections the role can read, and
the menu appears when there is at least one. The mock gains domains, DKIM
keys and zone files.

61 new strings, translated in all nine catalogues; strings falling back to
English stay at 16.
This commit is contained in:
2026-09-13 15:39:16 -07:00
parent d279fe8f90
commit 1dafb4bc79
23 changed files with 1783 additions and 30 deletions
+64
View File
@@ -55,6 +55,63 @@ import type { Catalog } from "@/lib/i18n";
*/
export const catalog: Catalog = {
strings: {
// ── Administration: domains ────────────────────────────────────
"Domains": "Domains",
"By hand": "Manuell",
"Signing": "Signiert",
"Published, not signing yet": "Veröffentlicht, signiert noch nicht",
"Retiring": "Wird ausgemustert",
"Retired": "Ausgemustert",
"This domain no longer exists. Someone may have removed it.": "Diese Domain existiert nicht mehr. Möglicherweise hat sie jemand entfernt.",
"That doesn't look like a domain name, such as example.com.": "Das sieht nicht nach einem Domainnamen wie example.com aus.",
"Added {name}. Its DNS records are ready to copy.": "{name} hinzugefügt. Die DNS-Einträge können kopiert werden.",
"Saved {name}": "{name} gespeichert",
"Add domain": "Domain hinzufügen",
"Added {date}": "Hinzugefügt am {date}",
"This domain is disabled on the server.": "Diese Domain ist auf dem Server deaktiviert.",
"Your role lets you view domains but not change them.": "Ihre Rolle erlaubt es, Domains anzusehen, aber nicht zu ändern.",
"New domains sign their mail with DKIM keys the server creates and rotates. Its DNS records appear here once it's added.": "Neue Domains signieren ihre E-Mails mit DKIM-Schlüsseln, die der Server erstellt und wechselt. Die DNS-Einträge erscheinen hier, sobald die Domain hinzugefügt ist.",
"Other names": "Weitere Namen",
"Delivery": "Zustellung",
"Catch-all address": "Sammeladresse",
"Mail to an address nobody has on this domain is delivered here. Leave it empty to refuse that mail.": "E-Mails an eine Adresse, die auf dieser Domain niemand hat, werden hierher zugestellt. Leer lassen, um sie abzulehnen.",
"Plus addressing": "Plus-Adressierung",
"Set by a custom rule on the server.": "Durch eine eigene Regel auf dem Server festgelegt.",
"Mail to name+anything@ is delivered to name@.": "E-Mails an name+beliebig@ werden an name@ zugestellt.",
"DNS records": "DNS-Einträge",
"Published automatically through {provider}.": "Automatisch über {provider} veröffentlicht.",
"Published automatically by the server.": "Automatisch vom Server veröffentlicht.",
"Add these where this domain's DNS is hosted. Mail isn't delivered or trusted until they're in place.": "Tragen Sie diese dort ein, wo das DNS dieser Domain verwaltet wird. Bis dahin werden E-Mails weder zugestellt noch als vertrauenswürdig eingestuft.",
"Copy {type} record for {name}": "{type}-Eintrag für {name} kopieren",
"Copy value": "Wert kopieren",
"Copied the zone file": "Zonendatei kopiert",
"Copy all as a zone file": "Alles als Zonendatei kopieren",
"The server returned no records for this domain.": "Der Server hat für diese Domain keine Einträge geliefert.",
"DKIM keys": "DKIM-Schlüssel",
"The server creates and rotates these keys itself.": "Der Server erstellt und wechselt diese Schlüssel selbst.",
"These keys are managed by hand on the server.": "Diese Schlüssel werden auf dem Server manuell verwaltet.",
"No DKIM keys, so mail from this domain isn't signed and is more likely to be marked as spam.": "Keine DKIM-Schlüssel: E-Mails von dieser Domain werden nicht signiert und landen eher im Spam.",
"Managed by the server": "Vom Server verwaltet",
"Certificate": "Zertifikat",
"Another name for this domain": "Weiterer Name für diese Domain",
"Mail to the same address at any of these names reaches the same account. Changes apply when you save.": "E-Mails an dieselbe Adresse unter einem dieser Namen erreichen dasselbe Konto. Änderungen gelten nach dem Speichern.",
"Its DKIM keys have to be removed first, and your role can't remove them.": "Zuerst müssen die DKIM-Schlüssel entfernt werden, und Ihre Rolle darf sie nicht entfernen.",
"The server stops accepting mail for this domain.": "Der Server nimmt keine E-Mails mehr für diese Domain an.",
"Remove domain…": "Domain entfernen…",
"Remove {name}?": "{name} entfernen?",
"Removed {name}": "{name} entfernt",
"The server kept the domain: it is still used by {things}.": "Der Server hat die Domain behalten: Sie wird noch verwendet von {things}.",
"Remove domain": "Domain entfernen",
"The server stops accepting mail for this domain. This can't be undone.": "Der Server nimmt keine E-Mails mehr für diese Domain an. Dies kann nicht rückgängig gemacht werden.",
"Where your addresses live, and the DNS records that let mail arrive and be trusted.": "Wo Ihre Adressen liegen, und die DNS-Einträge, damit E-Mails ankommen und als vertrauenswürdig gelten.",
"Search domains": "Domains durchsuchen",
"No domains match": "Keine passenden Domains",
"No domains yet": "Noch keine Domains",
"DKIM": "DKIM",
"Tenant": "Mandant",
"Disabled": "Deaktiviert",
"also {names}": "auch {names}",
"The server did not say whether the domain was created.": "Der Server hat nicht mitgeteilt, ob die Domain angelegt wurde.",
// ── Administration: accounts ───────────────────────────────────
"Change your own password in {settings}.": "Ihr eigenes Passwort ändern Sie unter {settings}.",
"Administration": "Verwaltung",
@@ -1444,6 +1501,13 @@ export const catalog: Catalog = {
"no address": "keine Adresse",
},
plurals: {
// ── Administration: domains ────────────────────────────────────
"{n} accounts use this domain. Move or delete them first.": { one: "{n} Konto verwendet diese Domain. Verschieben oder löschen Sie es zuerst.", other: "{n} Konten verwenden diese Domain. Verschieben oder löschen Sie sie zuerst." },
"The server stops accepting mail for this domain, and its {n} DKIM keys are deleted. This can't be undone.": { one: "Der Server nimmt keine E-Mails mehr für diese Domain an, und ihr {n} DKIM-Schlüssel wird gelöscht. Dies kann nicht rückgängig gemacht werden.", other: "Der Server nimmt keine E-Mails mehr für diese Domain an, und ihre {n} DKIM-Schlüssel werden gelöscht. Dies kann nicht rückgängig gemacht werden." },
"{n} domains": { one: "{n} Domain", other: "{n} Domains" },
"{n} mailing lists": { one: "{n} Mailingliste", other: "{n} Mailinglisten" },
"{n} DKIM keys": { one: "{n} DKIM-Schlüssel", other: "{n} DKIM-Schlüssel" },
"{n} other items": { one: "{n} weiteres Objekt", other: "{n} weitere Objekte" },
// ── Administration ────────────────────────────────────────────────
"{n} accounts": { one: "{n} Konto", other: "{n} Konten" },
// ── Third pass ─────────────────────────────────────────────────────