Add Groups to Administration

A group is a shared address and mailbox and the people who share it. To
Stalwart it is an x:Account of type Group, behind the same sysAccount*
permissions as a person, so it sits under Directory beside Accounts:
search, a page of fifty with each group's member count, and a panel to
create, edit and delete one.

Membership lives on the member, not the group. Members are the users whose
memberGroupIds name it, and adding or removing one is a single
memberGroupIds/<group> pointer on that user's account -- true or null --
which leaves their other groups alone. Changes apply straight away rather
than riding on Save, so the list is always what the server has. Nobody can
add or remove themselves, the same line the account panel draws at one's
own role.

A group's role is Default or Custom, not a person's User or Admin, and it
is what the group may do: in 0.16 a user's permissions come from their own
roles only, and a group gives its members what is shared with it. Only
roles the viewer could grant are offered.

Delete takes the members out first and then deletes the group, the order
a domain's keys go before the domain, because the registry keeps anything
another object names. A role that cannot change the members' accounts is
not offered a delete it could only half finish.

The mock's groups had a person's roles, accepted a memberGroupIds filter
without applying it, and answered a linked delete with the wrong shape;
all three follow the source now, and it refuses nested groups and
memberships of things that are not groups.

Nothing about groups has been run against a live server yet: production
has none, and every operation is a write. KNOWN-ISSUES says what was read
from source.

Thirty-five new strings, two of them plurals, in all nine catalogues.
This commit is contained in:
2026-09-15 08:31:36 -07:00
parent 4787e8bf12
commit e2a531b615
27 changed files with 1462 additions and 18 deletions
+35
View File
@@ -144,6 +144,39 @@ export const catalog: Catalog = {
"Could not be loaded": "Não foi possível carregar",
"Detailed metrics, the delivery queue, logs and server settings are in Stalwart's own administration.": "Métricas detalhadas, a fila de entrega, os logs e as configurações do servidor ficam na administração do próprio Stalwart.",
"Open Stalwart admin": "Abrir a administração do Stalwart",
"Default group role": "Função padrão de grupo",
"A group needs an address.": "Um grupo precisa de um endereço.",
"New group": "Novo grupo",
"Your role lets you view groups but not change them.": "Sua função permite ver os grupos, mas não alterá-los.",
"No domains are available to create a group on.": "Não há domínios disponíveis para criar um grupo.",
"Mail to these addresses is delivered to this group. Changes apply when you save.": "Os e-mails para estes endereços são entregues a este grupo. As alterações valem ao salvar.",
"What the group itself may do. Members keep their own roles: a group gives them what is shared with it, not its permissions. Only roles whose permissions you hold yourself are offered.": "O que o próprio grupo pode fazer. Os membros mantêm suas próprias funções: um grupo lhes dá o que é compartilhado com ele, não suas permissões. Só são oferecidas funções cujas permissões você mesmo tem.",
"Loading the group's members…": "Carregando os membros do grupo…",
"This group has more members than can be taken out at once.": "Este grupo tem mais membros do que é possível retirar de uma vez.",
"Deleting a group takes its members out of it first, and your role can't change their accounts.": "Excluir um grupo retira primeiro os membros dele, e sua função não pode alterar as contas deles.",
"Create group": "Criar grupo",
"Added {address} to the group": "{address} adicionado ao grupo",
"Removed {address} from the group": "{address} retirado do grupo",
"Remove {address} from the group": "Retirar {address} do grupo",
"You can't change your own group memberships.": "Você não pode alterar suas próprias participações em grupos.",
"Remove from group": "Retirar do grupo",
"No members yet": "Nenhum membro ainda",
"Showing {shown} of {total} members.": "Mostrando {shown} de {total} membros.",
"Members get what is shared with the group, such as its mailbox. Changes apply straight away.": "Os membros recebem o que é compartilhado com o grupo, como a caixa de correio dele. As alterações valem na hora.",
"Add a member by name or address": "Adicionar um membro por nome ou endereço",
"Add a member": "Adicionar um membro",
"No one else matches": "Mais ninguém corresponde",
"Deletes the group and its mailbox. Its members' own accounts stay.": "Exclui o grupo e a caixa de correio dele. As contas dos membros continuam.",
"Delete group…": "Excluir grupo…",
"Delete group": "Excluir grupo",
"The group's own mail is removed in the background, and it can't be undone.": "Os e-mails do grupo são removidos em segundo plano, e isso não pode ser desfeito.",
"Shared addresses and mailboxes, and the people who share them.": "Endereços e caixas de correio compartilhados, e as pessoas que os compartilham.",
"Search groups": "Pesquisar grupos",
"No groups match": "Nenhum grupo corresponde",
"No groups yet": "Nenhum grupo ainda",
"Your organisation has reached the number of groups it is allowed.": "Sua organização atingiu o número de grupos permitido.",
"This group no longer exists. Someone may have deleted it.": "Este grupo não existe mais. Alguém pode tê-lo excluído.",
"The server did not say whether the group was created.": "O servidor não informou se o grupo foi criado.",
"User": "Usuário",
"Administrator": "Administrador",
"Custom role": "Função personalizada",
@@ -1536,6 +1569,8 @@ export const catalog: Catalog = {
"{n} accounts use this domain. Move or delete them first.": { one: "{n} conta usa este domínio. Mova-a ou exclua-a primeiro.", other: "{n} contas usam este domínio. Mova-as ou exclua-as primeiro." },
"The server stops accepting mail for this domain, and its {n} DKIM keys are deleted. This can't be undone.": { one: "O servidor deixa de aceitar e-mails para este domínio, e a {n} chave DKIM dele é excluída. Não é possível desfazer.", other: "O servidor deixa de aceitar e-mails para este domínio, e as {n} chaves DKIM dele são excluídas. Não é possível desfazer." },
"{n} domains": { one: "{n} domínio", other: "{n} domínios" },
"{n} groups": { one: "{n} grupo", other: "{n} grupos" },
"Its {n} members are taken out of the group first, and lose what was shared with it. The group's own mail is removed in the background, and it can't be undone.": { one: "O {n} membro é retirado do grupo primeiro e perde o que era compartilhado com ele. Os e-mails do grupo são removidos em segundo plano, e isso não pode ser desfeito.", other: "Os {n} membros são retirados do grupo primeiro e perdem o que era compartilhado com ele. Os e-mails do grupo são removidos em segundo plano, e isso não pode ser desfeito." },
"{n} mailing lists": { one: "{n} lista de e-mails", other: "{n} listas de e-mails" },
"{n} DKIM keys": { one: "{n} chave DKIM", other: "{n} chaves DKIM" },
"{n} other items": { one: "{n} outro item", other: "{n} outros itens" },