Add Administration, starting with accounts

An account whose Stalwart role manages accounts now finds Administration in
the account menu. It lists, searches, creates and edits accounts -- display
name, other addresses, role, storage limit -- sets a new password, and
deletes, each offered only when the role holds the matching permission.

The server keeps the permissions list from GET /api/account, which it
already called for the edition and threw the rest away. Everything else is
JMAP x:Account, x:Domain and x:Role calls through the existing /api/jmap
proxy, so nothing new is stored and Stalwart decides every call.

Stalwart checks a grant against the caller's permissions but not a password
change or a delete, so an account that outranks the viewer is shown
read-only. Your own password is changed in Settings, which re-seals the
session; changing it here would strand it.

The mock server gains a directory behind the same permission names, with
MOCK_ROLE choosing admin, tenant-admin, helpdesk or user.

68 new strings, translated in all nine catalogues; strings falling back to
English stay at 16.
This commit is contained in:
2026-09-13 15:11:55 -07:00
parent b0564679e6
commit 82e217155b
34 changed files with 2684 additions and 22 deletions
+71
View File
@@ -52,6 +52,75 @@ import type { Catalog } from "@/lib/i18n";
*/
export const catalog: Catalog = {
strings: {
// ── Administration: accounts ───────────────────────────────────
"Change your own password in {settings}.": "Modifiez votre propre mot de passe dans {settings}.",
"Administration": "Administration",
"Directory": "Annuaire",
"User": "Utilisateur",
"Administrator": "Administrateur",
"Custom role": "Rôle personnalisé",
"New account": "Nouveau compte",
"The people who sign in to mail on the domains you manage.": "Les personnes qui se connectent à leur messagerie sur les domaines que vous gérez.",
"Search by name or address": "Rechercher par nom ou adresse",
"Search accounts": "Rechercher des comptes",
"No accounts match": "Aucun compte correspondant",
"No accounts yet": "Aucun compte pour linstant",
"Nothing on your domains matches “{query}”.": "Rien ne correspond à « {query} » sur vos domaines.",
"Open {address}": "Ouvrir {address}",
"{from}{to} of {total}": "{from}{to} sur {total}",
"Previous page": "Page précédente",
"Next page": "Page suivante",
"Storage": "Stockage",
"Groups": "Groupes",
"{used} · no limit": "{used} · sans limite",
"Profile": "Profil",
"Domain": "Domaine",
"No domains are available to create an account on.": "Aucun domaine nest disponible pour créer un compte.",
"Sign-in": "Connexion",
"Other addresses": "Autres adresses",
"Not in any group": "Membre daucun groupe",
"You can't change your own role.": "Vous ne pouvez pas modifier votre propre rôle.",
"Only roles whose permissions you hold yourself are offered. On an account inside a tenant, Administrator means administrator of that tenant.": "Seuls les rôles dont vous détenez vous-même les autorisations sont proposés. Pour un compte au sein dun locataire, Administrateur signifie administrateur de ce locataire.",
"Limit in GB": "Limite en Go",
"No limit": "Sans limite",
"This account has permissions yours doesn't, so you can view it but not change it.": "Ce compte a des autorisations que le vôtre na pas : vous pouvez le consulter, mais pas le modifier.",
"Your role lets you view accounts but not change them.": "Votre rôle vous permet de consulter les comptes, mais pas de les modifier.",
"This account has permissions yours doesn't.": "Ce compte a des autorisations que le vôtre na pas.",
"You can't delete the account you're signed in with.": "Vous ne pouvez pas supprimer le compte avec lequel vous êtes connecté.",
"Create account": "Créer le compte",
"An account needs an address.": "Un compte doit avoir une adresse.",
"Created {address}": "{address} créé",
"Saved {address}": "{address} enregistré",
"Generate a password": "Générer un mot de passe",
"Pass it on some way other than email to this address.": "Transmettez-le autrement que par e-mail à cette adresse.",
"This account has no password. It may sign in through a directory or single sign-on.": "Ce compte na pas de mot de passe. Il se connecte peut-être via un annuaire ou une authentification unique.",
"Set a new password…": "Définir un nouveau mot de passe…",
"{name} will be signed out of every app and device using the old password.": "{name} sera déconnecté de toutes les applications et de tous les appareils qui utilisent lancien mot de passe.",
"New password set for {address}": "Nouveau mot de passe défini pour {address}",
"Set password": "Définir le mot de passe",
"Remove {address}": "Retirer {address}",
"New address": "Nouvelle adresse",
"another name": "autre nom",
"Mail to these addresses is delivered to this account. Changes apply when you save.": "Les messages envoyés à ces adresses sont remis à ce compte. Les modifications sappliquent à lenregistrement.",
"Deletes the mailbox and everything in it.": "Supprime la boîte aux lettres et tout son contenu.",
"Delete account…": "Supprimer le compte…",
"Delete {address}?": "Supprimer {address} ?",
"This deletes the mail, calendars, contacts and files in this account. The server removes them in the background, and it can't be undone.": "Cette action supprime les messages, agendas, contacts et fichiers de ce compte. Le serveur les efface en arrière-plan, et cest irréversible.",
"Type {address} to confirm": "Saisissez {address} pour confirmer",
"Delete account": "Supprimer le compte",
"Deleted {address}": "{address} supprimé",
"The server did not say whether the account was created.": "Le serveur na pas indiqué si le compte a été créé.",
"The mail server refused this. Your role may not allow it.": "Le serveur de messagerie a refusé. Votre rôle ne le permet peut-être pas.",
"The mail server refused this: {reason}": "Le serveur de messagerie a refusé : {reason}",
"That address is already in use on this server, as an account, a list or an alias.": "Cette adresse est déjà utilisée sur ce serveur, par un compte, une liste ou un alias.",
"One of the chosen domain, role or group can't be used for this account.": "Le domaine, le rôle ou le groupe choisi ne peut pas être utilisé pour ce compte.",
"Your organisation has reached the number of accounts it is allowed.": "Votre organisation a atteint le nombre de comptes autorisé.",
"Something still depends on this, so the server kept it.": "Un autre élément en dépend encore, le serveur la donc conservé.",
"This account no longer exists. Someone may have deleted it.": "Ce compte nexiste plus. Quelquun la peut-être supprimé.",
"The password was not accepted: {reason}": "Le mot de passe a été refusé : {reason}",
"The password was not accepted.": "Le mot de passe a été refusé.",
"The mail server rejected a value: {reason}": "Le serveur de messagerie a refusé une valeur : {reason}",
"The mail server rejected a value.": "Le serveur de messagerie a refusé une valeur.",
"Go to folder…": "Aller au dossier…",
"Set for everyone here. You cannot change this.": "Défini pour tout le monde ici. Vous ne pouvez pas le modifier.",
"Export iCAL file": "Exporter un fichier iCAL",
@@ -1353,6 +1422,8 @@ export const catalog: Catalog = {
"no address": "aucune adresse",
},
plurals: {
// ── Administration ────────────────────────────────────────────────
"{n} accounts": { one: "{n} compte", other: "{n} comptes" },
// ── Third pass ─────────────────────────────────────────────────────
"Delete {n} items": { one: "Supprimer {n} élément", other: "Supprimer {n} éléments" },
"Delete {n} items?": { one: "Supprimer {n} élément ?", other: "Supprimer {n} éléments ?" },