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
@@ -47,6 +47,63 @@ import type { Catalog } from "@/lib/i18n";
*/
export const catalog: Catalog = {
strings: {
// ── Administration: domains ────────────────────────────────────
"Domains": "Dominios",
"By hand": "Manual",
"Signing": "Firmando",
"Published, not signing yet": "Publicada, aún no firma",
"Retiring": "Retirándose",
"Retired": "Retirada",
"This domain no longer exists. Someone may have removed it.": "Este dominio ya no existe. Puede que alguien lo haya quitado.",
"That doesn't look like a domain name, such as example.com.": "Eso no parece un nombre de dominio, como example.com.",
"Added {name}. Its DNS records are ready to copy.": "{name} añadido. Sus registros DNS están listos para copiar.",
"Saved {name}": "{name} guardado",
"Add domain": "Añadir dominio",
"Added {date}": "Añadido el {date}",
"This domain is disabled on the server.": "Este dominio está desactivado en el servidor.",
"Your role lets you view domains but not change them.": "Su rol le permite ver los dominios, pero no modificarlos.",
"New domains sign their mail with DKIM keys the server creates and rotates. Its DNS records appear here once it's added.": "Los dominios nuevos firman su correo con claves DKIM que el servidor crea y renueva. Sus registros DNS aparecen aquí una vez añadido.",
"Other names": "Otros nombres",
"Delivery": "Entrega",
"Catch-all address": "Dirección comodín",
"Mail to an address nobody has on this domain is delivered here. Leave it empty to refuse that mail.": "El correo a una dirección que nadie tiene en este dominio se entrega aquí. Déjelo vacío para rechazarlo.",
"Plus addressing": "Subdirecciones con +",
"Set by a custom rule on the server.": "Definido por una regla personalizada en el servidor.",
"Mail to name+anything@ is delivered to name@.": "El correo a nombre+loquesea@ se entrega a nombre@.",
"DNS records": "Registros DNS",
"Published automatically through {provider}.": "Publicados automáticamente mediante {provider}.",
"Published automatically by the server.": "Publicados automáticamente por el servidor.",
"Add these where this domain's DNS is hosted. Mail isn't delivered or trusted until they're in place.": "Añádalos donde esté alojado el DNS de este dominio. El correo no se entrega ni se considera fiable hasta que estén.",
"Copy {type} record for {name}": "Copiar el registro {type} de {name}",
"Copy value": "Copiar valor",
"Copied the zone file": "Archivo de zona copiado",
"Copy all as a zone file": "Copiar todo como archivo de zona",
"The server returned no records for this domain.": "El servidor no devolvió registros para este dominio.",
"DKIM keys": "Claves DKIM",
"The server creates and rotates these keys itself.": "El servidor crea y renueva estas claves por sí mismo.",
"These keys are managed by hand on the server.": "Estas claves se gestionan manualmente en el servidor.",
"No DKIM keys, so mail from this domain isn't signed and is more likely to be marked as spam.": "No hay claves DKIM, así que el correo de este dominio no se firma y es más probable que se marque como spam.",
"Managed by the server": "Gestionado por el servidor",
"Certificate": "Certificado",
"Another name for this domain": "Otro nombre para este dominio",
"Mail to the same address at any of these names reaches the same account. Changes apply when you save.": "El correo a la misma dirección con cualquiera de estos nombres llega a la misma cuenta. Los cambios se aplican al guardar.",
"Its DKIM keys have to be removed first, and your role can't remove them.": "Primero hay que quitar sus claves DKIM, y su rol no puede quitarlas.",
"The server stops accepting mail for this domain.": "El servidor deja de aceptar correo para este dominio.",
"Remove domain…": "Quitar dominio…",
"Remove {name}?": "¿Quitar {name}?",
"Removed {name}": "{name} quitado",
"The server kept the domain: it is still used by {things}.": "El servidor ha conservado el dominio: todavía lo usa {things}.",
"Remove domain": "Quitar dominio",
"The server stops accepting mail for this domain. This can't be undone.": "El servidor deja de aceptar correo para este dominio. No se puede deshacer.",
"Where your addresses live, and the DNS records that let mail arrive and be trusted.": "Dónde viven sus direcciones y los registros DNS que permiten que el correo llegue y sea de confianza.",
"Search domains": "Buscar dominios",
"No domains match": "Ningún dominio coincide",
"No domains yet": "Todavía no hay dominios",
"DKIM": "DKIM",
"Tenant": "Inquilino",
"Disabled": "Desactivado",
"also {names}": "también {names}",
"The server did not say whether the domain was created.": "El servidor no indicó si el dominio se creó.",
// ── Administration: accounts ───────────────────────────────────
"Change your own password in {settings}.": "Cambie su propia contraseña en {settings}.",
"Administration": "Administración",
@@ -1417,6 +1474,13 @@ export const catalog: Catalog = {
"no address": "ninguna dirección",
},
plurals: {
// ── Administration: domains ────────────────────────────────────
"{n} accounts use this domain. Move or delete them first.": { one: "{n} cuenta usa este dominio. Muévala o elimínela primero.", other: "{n} cuentas usan este dominio. Muévalas o elimínelas primero." },
"The server stops accepting mail for this domain, and its {n} DKIM keys are deleted. This can't be undone.": { one: "El servidor deja de aceptar correo para este dominio y se elimina su {n} clave DKIM. No se puede deshacer.", other: "El servidor deja de aceptar correo para este dominio y se eliminan sus {n} claves DKIM. No se puede deshacer." },
"{n} domains": { one: "{n} dominio", other: "{n} dominios" },
"{n} mailing lists": { one: "{n} lista de correo", other: "{n} listas de correo" },
"{n} DKIM keys": { one: "{n} clave DKIM", other: "{n} claves DKIM" },
"{n} other items": { one: "{n} elemento más", other: "{n} elementos más" },
// ── Administration ────────────────────────────────────────────────
"{n} accounts": { one: "{n} cuenta", other: "{n} cuentas" },
// ── Third pass ─────────────────────────────────────────────────────