feat: roles SPA Users, Profile, API keys, Activity

This commit is contained in:
Florian Sylvain committed 2026-10-28 00:10:15 +01:00
1 parent 3db490a615
commit 34dffe222f
98 files changed
+4957 -434

No files matched your search

+1 -1
View File
@@ -18,7 +18,7 @@ const API_KEYS_MESSAGES = [
'Created {0} by {1}',
'Last used {0}',
'Expires {0}',
"Keys act as the user who created them. As an owner you see everyone's keys.",
"Keys act as the user who created them. You see everyone's keys.",
'Keys act as you, with your role. You only see your own keys.',
"Resetting a user's password revokes all of their keys.",
'No API keys yet',
+81 -4
View File
@@ -583,7 +583,8 @@ export const messages = {
"We'll email them a link to choose a username and password. The link expires after 3 days.":
'Nous lui enverrons un lien pour choisir un nom d’utilisateur et un mot de passe. Ce lien expire après 3 jours.',
'Invite sent': 'Invitation envoyée',
'{0} has 3 days to accept.': '{0} a 3 jours pour accepter.',
'{0} has {1} to accept.': '{0} a {1} pour accepter.',
'1 day': '1 jour',
'Too many invites. Wait a moment, then try again.':
'Trop d’invitations. Patientez, puis réessayez.',
"There's already a pending invite for this address.":
@@ -604,7 +605,7 @@ export const messages = {
'Renew invite': 'Renouveler l’invitation',
'Renewing…': 'Renouvellement…',
'Invite renewed': 'Invitation renouvelée',
'{0} has 3 days to accept the new link.': '{0} a 3 jours pour accepter le nouveau lien.',
'{0} has {1} to accept the new link.': '{0} a {1} pour accepter le nouveau lien.',
"Couldn't renew the invite": 'Impossible de renouveler l’invitation',
'Cancel invite': 'Annuler l’invitation',
'Cancel this invite?': 'Annuler cette invitation ?',
@@ -861,8 +862,8 @@ export const messages = {
'Created {0} by {1}': 'Créée le {0} par {1}',
'Last used {0}': 'Dernière utilisation : {0}',
'Expires {0}': 'Expire : {0}',
"Keys act as the user who created them. As an owner you see everyone's keys.":
'Les clés agissent comme l’utilisateur qui les a créées. En tant que propriétaire, vous voyez les clés de tout le monde.',
"Keys act as the user who created them. You see everyone's keys.":
'Les clés agissent comme l’utilisateur qui les a créées. Vous voyez les clés de tout le monde.',
'Keys act as you, with your role. You only see your own keys.':
'Les clés agissent en votre nom, avec votre rôle. Vous ne voyez que vos propres clés.',
"Resetting a user's password revokes all of their keys.":
@@ -3137,6 +3138,82 @@ export const messages = {
'Install a new version of RenewCMS.': 'Installer une nouvelle version de RenewCMS.',
'How long the activity log is kept.': 'Durée de conservation du journal d’activité.',
'Make another member the owner.': 'Faire d’un autre membre le propriétaire.',
'1 member has this role.': '1 membre a ce rôle.',
"A key can do what its creator's role can do, today. If the person's role changes, their keys change with it.":
'Une clé peut faire ce que le rôle de son créateur peut faire, aujourd’hui. Si le rôle de la personne change, ses clés changent avec lui.',
'A summary of your role, {0}. Read-only.': 'Un résumé de votre rôle, {0}. Lecture seule.',
'Assigned by {0}': 'Attribué par {0}',
'Change role': 'Changer le rôle',
'Change role for {0}': 'Changer le rôle de {0}',
'Changed the role of {0}': 'A changé le rôle de {0}',
'Changing…': 'Modification…',
'Choose who becomes the owner. Only members can be chosen.':
'Choisissez qui devient propriétaire. Seuls les membres peuvent être choisis.',
Continue: 'Continuer',
"Couldn't change the role. Try again in a moment.":
'Impossible de changer le rôle. Réessayez dans un instant.',
"Couldn't transfer ownership. Try again in a moment.":
'Impossible de transférer la propriété. Réessayez dans un instant.',
'Failed to change the role of {0}': 'Échec du changement de rôle de {0}',
'Failed to create the role {0}': 'Échec de la création du rôle {0}',
'Failed to delete the role {0}': 'Échec de la suppression du rôle {0}',
'Failed to edit the role {0}': 'Échec de la modification du rôle {0}',
'Failed to move the members of the role {0}': 'Échec du déplacement des membres du rôle {0}',
'Failed to transfer ownership to {0}': 'Échec du transfert de la propriété à {0}',
'Follows role': 'Suit le rôle',
"Keys follow their creator's role": 'Les clés suivent le rôle de leur créateur',
'Moved the members of the role {0}': 'A déplacé les membres du rôle {0}',
'Only the owner can apply updates, delete a site and change activity retention.':
'Seul le propriétaire peut appliquer les mises à jour, supprimer un site et modifier la conservation de l’activité.',
'Ownership changed meanwhile': 'La propriété a changé entre-temps',
'Ownership transferred': 'Propriété transférée',
'Ownership transferred from {0} to {1}': 'Propriété transférée de {0} à {1}',
'Role changed': 'Rôle modifié',
'Role {0} created': 'Rôle {0} créé',
'Role {0} deleted': 'Rôle {0} supprimé',
'Role {0} edited': 'Rôle {0} modifié',
'See what I can do': 'Voir ce que je peux faire',
'That email does not match. Check it and try again.':
'Cet e-mail ne correspond pas. Vérifiez-le et réessayez.',
"That person can't become the owner. Choose another member.":
'Cette personne ne peut pas devenir propriétaire. Choisissez un autre membre.',
"That role isn't available anymore. Choose another one.":
'Ce rôle n’est plus disponible. Choisissez-en un autre.',
'That user no longer exists': 'Cet utilisateur n’existe plus',
'The email must match exactly.': 'L’e-mail doit correspondre exactement.',
'The list was refreshed.': 'La liste a été actualisée.',
"The owner can't be changed or removed. Transfer ownership first.":
'Le propriétaire ne peut être ni modifié ni retiré. Transférez d’abord la propriété.',
'Their API keys follow the new role.': 'Ses clés d’API suivent le nouveau rôle.',
'Their role changed meanwhile': 'Son rôle a changé entre-temps',
'There is one owner. Transfer ownership to change who it is.':
'Il n’y a qu’un propriétaire. Transférez la propriété pour changer de propriétaire.',
'They get an email with a link to set a password.':
'La personne reçoit un e-mail avec un lien pour définir un mot de passe.',
'This takes effect straight away.': 'Cela prend effet immédiatement.',
'Transfer ownership to {0}': 'Transférer la propriété à {0}',
'Transferring…': 'Transfert…',
'Type {0} to confirm': 'Saisissez {0} pour confirmer',
'What changed': 'Ce qui a changé',
'What you can do': 'Ce que vous pouvez faire',
'Writer is the default. You can change a role later.':
'Writer est le rôle par défaut. Vous pourrez le changer plus tard.',
"You become an Admin. You can't take ownership back unless they transfer it.":
'Vous devenez Admin. Vous ne pourrez pas reprendre la propriété sauf si cette personne vous la transfère.',
"You can't change your own role. Ask another owner or admin.":
'Vous ne pouvez pas changer votre propre rôle. Demandez à un autre propriétaire ou administrateur.',
'You need permission to view roles to change a role.':
'Il faut pouvoir consulter les rôles pour changer un rôle.',
'Your API keys follow this role. If your role changes, they change too.':
'Vos clés d’API suivent ce rôle. Si votre rôle change, elles changent aussi.',
'Your API keys follow your new role.': 'Vos clés d’API suivent votre nouveau rôle.',
'Your role': 'Votre rôle',
'{0} becomes the owner.': '{0} devient propriétaire.',
'{0} is now the owner. You are an Admin.': '{0} est maintenant propriétaire. Vous êtes Admin.',
'{0} members have this role.': '{0} membres ont ce rôle.',
'{0} now has the {1} role.': '{0} a maintenant le rôle {1}.',
'{0}: {1} → {2}': '{0} : {1} → {2}',
"{0}'s role changed from {1} to {2}": 'Le rôle de {0} est passé de {1} à {2}',
} as const
export type MessageKey = keyof typeof messages
+36
View File
@@ -61,3 +61,39 @@ describe('Roles screens copy', () => {
expect(t('Roles')).toBe('Rôles')
})
})
const USERS_ROLES_KEYS = [
'Assigned by {0}',
'Your role',
'See what I can do',
'What you can do',
'A summary of your role, {0}. Read-only.',
'Change role',
'Change role for {0}',
'Their API keys follow the new role.',
'Transfer ownership to {0}',
'Type {0} to confirm',
'The email must match exactly.',
"Keys follow their creator's role",
'Follows role',
'What changed',
'Role {0} created',
'Role {0} edited',
'Role {0} deleted',
"{0}'s role changed from {1} to {2}",
'Ownership transferred from {0} to {1}',
'They get an email with a link to set a password.',
'Writer is the default. You can change a role later.',
] as const
describe('Users, Profile, API keys and Activity copy for roles', () => {
it.each(USERS_ROLES_KEYS)('"%s" has a French entry', (key) => {
expect((messages as Record<string, string>)[key]).toMatch(/\S/)
})
it('renders "Assigned by {0}" in both languages', () => {
expect(t('Assigned by {0}', ['Marta Alves'])).toBe('Assigned by Marta Alves')
setLocale('fr')
expect(t('Assigned by {0}', ['Marta Alves'])).toBe('Attribué par Marta Alves')
})
})