Follow what the live server does with tenants and domains

A run on the production server with throwaway tenants, a role, lists and a
domain, all removed, found three things the source reading had not:

- Something in a tenant has to be on a domain in that tenant (a list in a
  tenant on an unassigned domain is invalidForeignKey), while something in
  no tenant may be on a tenant's domain. The account panel's tenant choice
  offered every tenant; it offers only the domain's now, and a new account
  starts in the tenant of the domain it is made on. The domain list reads
  memberTenantId for it.
- A domain created in a tenant puts its DKIM keys there too, and they keep
  the tenant from being deleted. They are counted with the rest, so Delete
  is not offered while any remain.
- Stalwart lets a domain leave a tenant while the tenant still has accounts
  on it, stranding them. The panel asks first and refuses while any are
  there.

The refusal to delete a tenant that holds anything was confirmed, as were
tenant create, quota pointers, logo and rename. The mock follows the domain
rule, filters DKIM keys by tenant, and KNOWN-ISSUES records the run.

The non-Enterprise notice is now just "Tenants are a Stalwart Enterprise
feature." Two sentences were reworded and one plural added, in all nine
catalogues, and the old sentences are gone.
This commit is contained in:
2026-09-15 09:37:00 -07:00
parent ce5eb04c2d
commit 40df0f658b
21 changed files with 211 additions and 48 deletions
+4 -3
View File
@@ -251,7 +251,7 @@ export const catalog: Catalog = {
"The server did not say whether the role was created.": "服务器未说明角色是否已创建。",
"No tenant": "无租户",
"You can't move your own account into a tenant.": "您不能将自己的账户移入租户。",
"An account in a tenant is limited by the tenant's role and counts towards its limits, and Administrator means administrator of that tenant.": "租户中的账户受租户角色限制,并计入租户的限额;管理员指该租户的管理员。",
"An account can be in the tenant its domain is in. In a tenant it is limited by the tenant's role and counts towards its limits, and Administrator means administrator of that tenant.": "账户只能位于其域名所属的租户中。在租户中,账户受租户角色限制,并计入租户的限额;管理员指该租户的管理员。",
"Tenants": "租户",
"Storage in GB": "存储 (GB)",
"Default tenant roles": "默认租户角色",
@@ -274,13 +274,13 @@ export const catalog: Catalog = {
"Take {domain} out of the tenant": "将 {domain} 移出租户",
"No domains in this tenant yet": "此租户中还没有域名",
"Domain to add": "要添加的域名",
"Only domains in no tenant can be added. The accounts already on a domain stay where they are; move each from its own panel.": "只能添加不属于任何租户的域名。域名上已有的账户保持不变;请在各自的面板中移动。",
"Only domains in no tenant can be added, and the accounts already on one stay where they are. A domain comes out only once none of this tenant's accounts are on it.": "只能添加不属于任何租户的域名,其上已有的账户保持不变。只有当此租户在该域名上没有任何账户时,才能将域名移出。",
"An empty tenant can be deleted.": "空租户可以删除。",
"Delete tenant…": "删除租户…",
"Still holds {things}. Move them out first.": "仍包含 {things}。请先将其移出。",
"Delete tenant": "删除租户",
"Separate organisations on one server, each with its own people, domains and limits.": "同一服务器上相互独立的组织,各有自己的成员、域名和限额。",
"Tenants are a Stalwart Enterprise feature. This server does not report Enterprise, so anyone inside a tenant has only an ordinary user's permissions.": "租户是 Stalwart Enterprise 的功能。此服务器未报告为 Enterprise,因此租户中的任何人都只有普通用户的权限。",
"Tenants are a Stalwart Enterprise feature.": "租户是 Stalwart Enterprise 的功能。",
"Search tenants": "搜索租户",
"No tenants match": "没有匹配的租户",
"No tenants yet": "还没有租户",
@@ -1696,6 +1696,7 @@ export const catalog: Catalog = {
"Grants {n} permissions": { other: "授予 {n} 项权限" },
"{n} roles": { other: "{n} 个角色" },
"{n} tenants": { other: "{n} 个租户" },
"{n} accounts in this tenant are still on {domain}. Move them or delete them before taking the domain out.": { other: "此租户仍有 {n} 个账户位于 {domain}。移出该域名前,请先移动或删除这些账户。" },
"{n} DKIM keys": { other: "{n} 个 DKIM 密钥" },
"{n} other items": { other: "其他 {n} 项" },
// ── Administration ────────────────────────────────────────────────