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
@@ -46,6 +46,63 @@ import type { Catalog } from "@/lib/i18n";
*/
export const catalog: Catalog = {
strings: {
// ── Administration: domains ────────────────────────────────────
"Domains": "ドメイン",
"By hand": "手動",
"Signing": "署名中",
"Published, not signing yet": "公開済み(まだ署名なし)",
"Retiring": "廃止中",
"Retired": "廃止済み",
"This domain no longer exists. Someone may have removed it.": "このドメインはもう存在しません。誰かが削除した可能性があります。",
"That doesn't look like a domain name, such as example.com.": "example.com のようなドメイン名ではないようです。",
"Added {name}. Its DNS records are ready to copy.": "{name} を追加しました。DNS レコードをコピーできます。",
"Saved {name}": "{name} を保存しました",
"Add domain": "ドメインを追加",
"Added {date}": "{date} に追加",
"This domain is disabled on the server.": "このドメインはサーバーで無効になっています。",
"Your role lets you view domains but not change them.": "あなたのロールでは、ドメインの閲覧はできますが変更はできません。",
"New domains sign their mail with DKIM keys the server creates and rotates. Its DNS records appear here once it's added.": "新しいドメインは、サーバーが作成・更新する DKIM 鍵でメールに署名します。DNS レコードはドメインを追加するとここに表示されます。",
"Other names": "別名",
"Delivery": "配信",
"Catch-all address": "キャッチオールアドレス",
"Mail to an address nobody has on this domain is delivered here. Leave it empty to refuse that mail.": "このドメインで誰も持っていないアドレス宛てのメールをここに配信します。空欄にすると、そのメールは拒否されます。",
"Plus addressing": "プラスアドレス",
"Set by a custom rule on the server.": "サーバーのカスタムルールで設定されています。",
"Mail to name+anything@ is delivered to name@.": "名前+任意@ 宛てのメールは 名前@ に配信されます。",
"DNS records": "DNS レコード",
"Published automatically through {provider}.": "{provider} を通じて自動で公開されます。",
"Published automatically by the server.": "サーバーが自動で公開します。",
"Add these where this domain's DNS is hosted. Mail isn't delivered or trusted until they're in place.": "このドメインの DNS を管理している場所に追加してください。追加されるまで、メールは配信されず信頼もされません。",
"Copy {type} record for {name}": "{name} の {type} レコードをコピー",
"Copy value": "値をコピー",
"Copied the zone file": "ゾーンファイルをコピーしました",
"Copy all as a zone file": "すべてゾーンファイルとしてコピー",
"The server returned no records for this domain.": "サーバーはこのドメインのレコードを返しませんでした。",
"DKIM keys": "DKIM 鍵",
"The server creates and rotates these keys itself.": "サーバーがこれらの鍵を自動で作成・更新します。",
"These keys are managed by hand on the server.": "これらの鍵はサーバーで手動管理されています。",
"No DKIM keys, so mail from this domain isn't signed and is more likely to be marked as spam.": "DKIM 鍵がないため、このドメインのメールは署名されず、迷惑メールと判定されやすくなります。",
"Managed by the server": "サーバーによる管理",
"Certificate": "証明書",
"Another name for this domain": "このドメインの別名",
"Mail to the same address at any of these names reaches the same account. Changes apply when you save.": "これらのいずれの名前でも、同じアドレス宛てのメールは同じアカウントに届きます。変更は保存時に反映されます。",
"Its DKIM keys have to be removed first, and your role can't remove them.": "先に DKIM 鍵を削除する必要がありますが、あなたのロールでは削除できません。",
"The server stops accepting mail for this domain.": "サーバーはこのドメイン宛てのメールを受け付けなくなります。",
"Remove domain…": "ドメインを削除…",
"Remove {name}?": "{name} を削除しますか?",
"Removed {name}": "{name} を削除しました",
"The server kept the domain: it is still used by {things}.": "サーバーはドメインを削除しませんでした。まだ {things} が使用しています。",
"Remove domain": "ドメインを削除",
"The server stops accepting mail for this domain. This can't be undone.": "サーバーはこのドメイン宛てのメールを受け付けなくなります。元に戻すことはできません。",
"Where your addresses live, and the DNS records that let mail arrive and be trusted.": "アドレスの置き場所と、メールが届き信頼されるための DNS レコードです。",
"Search domains": "ドメインを検索",
"No domains match": "一致するドメインはありません",
"No domains yet": "ドメインはまだありません",
"DKIM": "DKIM",
"Tenant": "テナント",
"Disabled": "無効",
"also {names}": "別名: {names}",
"The server did not say whether the domain was created.": "ドメインが作成されたかどうか、サーバーから応答がありませんでした。",
// ── Administration: accounts ───────────────────────────────────
"Change your own password in {settings}.": "ご自身のパスワードは{settings}で変更してください。",
"Administration": "管理",
@@ -1425,6 +1482,13 @@ export const catalog: Catalog = {
"no address": "アドレスなし",
},
plurals: {
// ── Administration: domains ────────────────────────────────────
"{n} accounts use this domain. Move or delete them first.": { other: "{n} 件のアカウントがこのドメインを使用しています。先に移動または削除してください。" },
"The server stops accepting mail for this domain, and its {n} DKIM keys are deleted. This can't be undone.": { other: "サーバーはこのドメイン宛てのメールを受け付けなくなり、{n} 個の DKIM 鍵も削除されます。元に戻すことはできません。" },
"{n} domains": { other: "{n} 件のドメイン" },
"{n} mailing lists": { other: "{n} 件のメーリングリスト" },
"{n} DKIM keys": { other: "{n} 個の DKIM 鍵" },
"{n} other items": { other: "その他 {n} 件" },
// ── Administration ────────────────────────────────────────────────
"{n} accounts": { other: "{n} 件のアカウント" },
// ── Third pass ─────────────────────────────────────────────────────