feat: SPA Roles screens

This commit is contained in:
Florian Sylvain committed 2026-10-27 23:05:04 +01:00
1 parent 907949aa12
commit 3db490a615
47 files changed
+6947 -9

No files matched your search

+220
View File
@@ -2917,6 +2917,226 @@ export const messages = {
'Save draft': 'Enregistrer le brouillon',
'The id of the role to give. Absent or 0 means the Writer role. The Owner role is refused.':
'L’identifiant du rôle à donner. Absent ou 0, c’est le rôle Rédacteur. Le rôle Propriétaire est refusé.',
Access: 'Accès',
Roles: 'Rôles',
"Built-in roles can't be deleted.": 'Les rôles intégrés ne peuvent pas être supprimés.',
'{0} members have this role. Move them to another role first. Then {1} can be deleted.':
'{0} membres ont ce rôle. Déplacez-les d’abord vers un autre rôle. Ensuite, {1} pourra être supprimé.',
"No one has this role. This can't be undone.":
'Personne n’a ce rôle. Cette action est irréversible.',
'Duplicate role': 'Dupliquer le rôle',
'Move {0} members and delete role': 'Déplacer {0} membres et supprimer le rôle',
'Delete role': 'Supprimer le rôle',
'Moving and deleting…': 'Déplacement et suppression…',
"Couldn't delete the role. Try again in a moment.":
'Impossible de supprimer le rôle. Réessayez dans un instant.',
'Move members to': 'Déplacer les membres vers',
'They keep their API keys. Keys follow the new role.':
'Ils gardent leurs clés d’API. Les clés suivent le nouveau rôle.',
'{0} is built in': '{0} est intégré',
'Duplicate it to make a custom role you can change or delete.':
'Dupliquez-le pour créer un rôle personnalisé que vous pouvez modifier ou supprimer.',
"Deleting a role doesn't affect content.": 'Supprimer un rôle n’affecte pas le contenu.',
Read: 'Lire',
Create: 'Créer',
Own: 'Les siennes',
'{0}, {1}, set to {2}.': '{0}, {1}, réglé sur {2}.',
'Content permissions': 'Permissions de contenu',
'Content type': 'Type de contenu',
'Sets every row': 'Règle toutes les lignes',
'Schema locked': 'Schéma verrouillé',
'{0}, set to {1}.': '{0}, réglé sur {1}.',
'{0} of {1} enabled': '{0} sur {1} activées',
'Only the owner can grant this.': 'Seul le propriétaire peut accorder cette permission.',
'Read only': 'Lecture seule',
'Write own': 'Écrire les siens',
'Full content': 'Contenu complet',
'Quick presets': 'Préréglages rapides',
Added: 'Ajouté',
Removed: 'Retiré',
'The Owner role is locked': 'Le rôle Propriétaire est verrouillé',
'It always has every permission. To hand it to someone else, transfer ownership from Users.':
'Il a toujours toutes les permissions. Pour le confier à quelqu’un d’autre, transférez la propriété depuis Utilisateurs.',
'Go to Users': 'Aller aux utilisateurs',
'Only the owner can edit built-in roles':
'Seul le propriétaire peut modifier les rôles intégrés',
'You can read what {0} allows. To change it, duplicate it into a custom role.':
'Vous pouvez lire ce que {0} autorise. Pour le modifier, dupliquez-le en rôle personnalisé.',
'You can see roles but not change them': 'Vous pouvez voir les rôles sans les modifier',
'Ask an owner or admin if a role needs to change.':
'Demandez à un propriétaire ou à un administrateur si un rôle doit changer.',
"You can't change the permissions of your own role. Ask another owner or admin.":
'Vous ne pouvez pas modifier les permissions de votre propre rôle. Demandez à un autre propriétaire ou administrateur.',
'Your access changed': 'Votre accès a changé',
"An owner changed your role while this page was open. You can still see roles, but you can't change them. Your edits weren't saved.":
'Un propriétaire a modifié votre rôle pendant que cette page était ouverte. Vous pouvez toujours voir les rôles, mais pas les modifier. Vos modifications n’ont pas été enregistrées.',
'This role has 1 member': 'Ce rôle a 1 membre',
'This role has {0} members': 'Ce rôle a {0} membres',
'Changes apply to all of them when you save, and to the API keys they created. Built-in roles can be restored with Reset to default.':
'Les changements s’appliquent à tous à l’enregistrement, ainsi qu’aux clés d’API qu’ils ont créées. Les rôles intégrés peuvent être restaurés avec Réinitialiser.',
'Reload role': 'Recharger le rôle',
'Review differences': 'Voir les différences',
"Your role can't assign a role with more power than yours.":
'Votre rôle ne peut pas attribuer un rôle plus puissant que le vôtre.',
'Choose a role': 'Choisir un rôle',
'What this role can do': 'Ce que ce rôle peut faire',
'A summary of what this role allows.': 'Un résumé de ce que ce rôle autorise.',
'Updates as you edit.': 'Se met à jour pendant vos modifications.',
'Everything else': 'Tout le reste',
'1 unsaved change. Save is off until you reload':
'1 modification non enregistrée. L’enregistrement est désactivé jusqu’au rechargement',
'{0} unsaved changes. Save is off until you reload':
'{0} modifications non enregistrées. L’enregistrement est désactivé jusqu’au rechargement',
'Name your role to save it': 'Nommez votre rôle pour l’enregistrer',
'1 unsaved change': '1 modification non enregistrée',
'{0} unsaved changes': '{0} modifications non enregistrées',
Members: 'Membres',
Locked: 'Verrouillé',
'{0} members': '{0} membres',
'This role changed while you were editing': 'Ce rôle a changé pendant que vous le modifiiez',
'{0} saved changes to {1} at {2}. Reload to see them, or review how they differ from your edits.':
'{0} a enregistré des modifications sur {1} à {2}. Rechargez pour les voir, ou comparez-les à vos modifications.',
Someone: 'Quelqu’un',
"Couldn't save the role": 'Impossible d’enregistrer le rôle',
'{0} is updated for 1 member.': '{0} est mis à jour pour 1 membre.',
'{0} is updated for {1} members.': '{0} est mis à jour pour {1} membres.',
'Give the role a name.': 'Donnez un nom au rôle.',
'A role named "{0}" already exists. Choose a different name.':
'Un rôle nommé « {0} » existe déjà. Choisissez un autre nom.',
'Role created': 'Rôle créé',
'{0} is ready. Assign it from Users.': '{0} est prêt. Attribuez-le depuis Utilisateurs.',
'Role saved': 'Rôle enregistré',
'Reset {0} to default?': 'Réinitialiser {0} ?',
'Its permissions go back to what RenewCMS ships with.':
'Ses permissions reviennent à celles fournies par RenewCMS.',
'Reset to default': 'Réinitialiser',
'Resetting…': 'Réinitialisation…',
'Role reset': 'Rôle réinitialisé',
'{0} is back to its defaults.': '{0} est revenu à ses valeurs par défaut.',
"Couldn't reset the role. Try again in a moment.":
'Impossible de réinitialiser le rôle. Réessayez dans un instant.',
read: 'lire',
update: 'modifier',
delete: 'supprimer',
publish: 'publier',
"Your role can {0} only entries you created, so All isn't available.":
'Votre rôle peut {0} uniquement les entrées que vous avez créées, donc Toutes n’est pas disponible.',
'The Owner role can’t be deleted.': 'Le rôle Propriétaire ne peut pas être supprimé.',
"Built-in roles can't be deleted. Duplicate it to make a custom role.":
'Les rôles intégrés ne peuvent pas être supprimés. Dupliquez-le pour créer un rôle personnalisé.',
'You can see roles, but only people who manage roles can create or change them.':
'Vous pouvez voir les rôles, mais seules les personnes qui gèrent les rôles peuvent les créer ou les modifier.',
'only their own': 'uniquement les siens',
'see content types and fields': 'voir les types de contenu et leurs champs',
'create and edit content types': 'créer et modifier des types de contenu',
'delete content types': 'supprimer des types de contenu',
'browse the media library': 'parcourir la médiathèque',
'upload files': 'téléverser des fichiers',
'delete files': 'supprimer des fichiers',
'see authors': 'voir les auteurs',
'create authors': 'créer des auteurs',
'edit authors': 'modifier des auteurs',
'delete authors': 'supprimer des auteurs',
'see activity': 'voir l’activité',
'export activity': 'exporter l’activité',
'see users': 'voir les utilisateurs',
'invite users': 'inviter des utilisateurs',
"change a user's role": 'changer le rôle d’un utilisateur',
'remove users': 'retirer des utilisateurs',
'see settings': 'voir les paramètres',
'edit general settings': 'modifier les paramètres généraux',
'manage sites': 'gérer les sites',
'delete a site': 'supprimer un site',
'see API keys': 'voir les clés d’API',
'create API keys': 'créer des clés d’API',
'revoke API keys': 'révoquer des clés d’API',
'see roles': 'voir les rôles',
'manage roles': 'gérer les rôles',
'edit roles with owner-only power': 'modifier les rôles à pouvoir réservé au propriétaire',
'apply software updates': 'appliquer les mises à jour du logiciel',
'edit activity retention': 'modifier la conservation de l’activité',
'transfer ownership': 'transférer la propriété',
'read any entry': 'lire n’importe quelle entrée',
'read only their own entries': 'lire uniquement leurs propres entrées',
'create entries': 'créer des entrées',
'edit any entry': 'modifier n’importe quelle entrée',
'edit only their own': 'modifier uniquement les leurs',
'delete any entry': 'supprimer n’importe quelle entrée',
'delete only their own entries': 'supprimer uniquement leurs propres entrées',
'publish any entry': 'publier n’importe quelle entrée',
'publish only their own entries': 'publier uniquement leurs propres entrées',
create: 'créer',
edit: 'modifier',
'No access to entries.': 'Aucun accès aux entrées.',
'Can {0}.': 'Peut {0}.',
"Can't {0}.": 'Ne peut pas {0}.',
'Applies to 1 member, and to the API keys they created.':
'S’applique à 1 membre, et aux clés d’API qu’il a créées.',
'Applies to {0} members, and to the API keys they created.':
'S’applique à {0} membres, et aux clés d’API qu’ils ont créées.',
'No access to {0}.': 'Aucun accès à {0}.',
'New role': 'Nouveau rôle',
"Couldn't load this role": 'Impossible de charger ce rôle',
'This role no longer exists': 'Ce rôle n’existe plus',
'It may have been deleted.': 'Il a peut-être été supprimé.',
'Back to Roles': 'Retour aux rôles',
'1 member': '1 membre',
'For example, Contributor': 'Par exemple, Contributeur',
'Description (optional)': 'Description (facultatif)',
'What this role is for': 'À quoi sert ce rôle',
'What this role can do with entries of each content type. Own means entries the person created.':
'Ce que ce rôle peut faire avec les entrées de chaque type de contenu. « Les siennes » désigne les entrées créées par la personne.',
'General permissions': 'Permissions générales',
'Everything outside entries.': 'Tout ce qui n’est pas une entrée.',
'Collapse all': 'Tout réduire',
'Expand all': 'Tout développer',
'Role deleted': 'Rôle supprimé',
'{0} is gone.': '{0} a été supprimé.',
'Who can do what on this site. Each user has one role.':
'Qui peut faire quoi sur ce site. Chaque utilisateur a un seul rôle.',
"Couldn't load roles": 'Impossible de charger les rôles',
'GET /v1/role failed. Check your connection and try again.':
'GET /v1/role a échoué. Vérifiez votre connexion et réessayez.',
'No custom roles yet': 'Aucun rôle personnalisé pour l’instant',
'The three built-in roles cover most sites. Create a role when someone needs something in between.':
'Les trois rôles intégrés couvrent la plupart des sites. Créez un rôle quand quelqu’un a besoin de quelque chose d’intermédiaire.',
'See entries of this type.': 'Voir les entrées de ce type.',
'Add new entries.': 'Ajouter des entrées.',
'Change existing entries.': 'Modifier les entrées existantes.',
'Remove entries.': 'Supprimer des entrées.',
'Make entries public.': 'Rendre des entrées publiques.',
'See content types and their fields.': 'Voir les types de contenu et leurs champs.',
'Add content types and change their fields.':
'Ajouter des types de contenu et modifier leurs champs.',
'Remove content types.': 'Supprimer des types de contenu.',
'Browse the images and files.': 'Parcourir les images et les fichiers.',
'Add images and files.': 'Ajouter des images et des fichiers.',
'Remove images and files.': 'Supprimer des images et des fichiers.',
'See the list of authors.': 'Voir la liste des auteurs.',
'Add authors.': 'Ajouter des auteurs.',
'Change author profiles.': 'Modifier les profils des auteurs.',
'Remove authors.': 'Supprimer des auteurs.',
'Read the log of who did what.': 'Lire le journal de qui a fait quoi.',
'Download the log as a CSV file.': 'Télécharger le journal en fichier CSV.',
'See who has an account.': 'Voir qui a un compte.',
'Send invitations by email.': 'Envoyer des invitations par e-mail.',
'Give someone another role.': 'Donner un autre rôle à quelqu’un.',
'Take away someone’s access.': 'Retirer l’accès de quelqu’un.',
'Read the site settings.': 'Lire les paramètres du site.',
'Change the site settings.': 'Modifier les paramètres du site.',
'Add, edit and remove sites.': 'Ajouter, modifier et supprimer des sites.',
'Remove a site and its content.': 'Supprimer un site et son contenu.',
'See the API keys.': 'Voir les clés d’API.',
'Make new API keys.': 'Créer de nouvelles clés d’API.',
'Stop an API key from working.': 'Empêcher une clé d’API de fonctionner.',
'See roles and what they allow.': 'Voir les rôles et ce qu’ils autorisent.',
'Create, edit, duplicate and delete roles.':
'Créer, modifier, dupliquer et supprimer des rôles.',
'Change a role that carries owner-only abilities.':
'Modifier un rôle qui porte des pouvoirs réservés au propriétaire.',
'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.',
} as const
export type MessageKey = keyof typeof messages
+63
View File
@@ -0,0 +1,63 @@
import { afterEach, describe, expect, it } from 'vitest'
import { messages } from './messages'
import { setLocale, t } from './index'
const ROLE_KEYS = [
'Access',
'Roles',
'New role',
'Who can do what on this site. Each user has one role.',
'No custom roles yet',
"Couldn't load roles",
'You can see roles but not change them',
'Content permissions',
'Quick presets',
'Read only',
'Write own',
'Full content',
'General permissions',
'Expand all',
'{0} unsaved changes',
'Give the role a name.',
'A role named "{0}" already exists. Choose a different name.',
'This role changed while you were editing',
'Your access changed',
'The Owner role is locked',
'Only the owner can edit built-in roles',
'What this role can do',
'Role created',
'{0} is ready. Assign it from Users.',
'Role saved',
'{0} members have this role. Move them to another role first. Then {1} can be deleted.',
'Move {0} members and delete role',
"No one has this role. This can't be undone.",
'Can {0}.',
"Can't {0}.",
] as const
const PLACEHOLDER = /\{\d+\}/g
afterEach(() => setLocale('en'))
describe('Roles screens copy', () => {
it.each(ROLE_KEYS)('"%s" has a French entry', (key) => {
expect((messages as Record<string, string>)[key]).toMatch(/\S/)
})
it('keeps the same placeholders in French as in English for every entry', () => {
const mismatches = Object.entries(messages).filter(([english, french]) => {
const expected = (english.match(PLACEHOLDER) ?? []).sort().join()
const actual = (french.match(PLACEHOLDER) ?? []).sort().join()
return expected !== actual
})
expect(mismatches.map(([english]) => english)).toEqual([])
})
it('renders French with its values', () => {
setLocale('fr')
expect(t('{0} unsaved changes', [3])).toBe('3 modifications non enregistrées')
expect(t('Roles')).toBe('Rôles')
})
})