feat: integration page (PART 3/3)

This commit is contained in:
fsylvain committed 2026-10-05 02:03:24 +02:00
1 parent 514a082c96
commit acd392c29d
20 files changed
+3115 -409

No files matched your search

+66
View File
@@ -884,6 +884,72 @@ export const messages = {
'That key no longer exists.': 'Cette clé n’existe plus.',
'Manage API keys': 'Gérer les clés d’API',
'Loading API keys': 'Chargement des clés d’API',
Required: 'Obligatoire',
Rule: 'Règle',
Yes: 'Oui',
No: 'Non',
'Request body · multipart/form-data, 1 file field':
'Corps de la requête · multipart/form-data, 1 champ fichier',
'Request body · JSON': 'Corps de la requête · JSON',
'Request body': 'Corps de la requête',
'API key OK': 'Clé d’API acceptée',
'Query parameters': 'Paramètres d’URL',
'No query parameters.': 'Aucun paramètre d’URL.',
'No request body.': 'Aucun corps de requête.',
Errors: 'Erreurs',
'On this page': 'Sur cette page',
'Jump to section': 'Aller à la section',
'Jump to': 'Aller à',
'These routes are made for a signed-in browser session. With an API key, verify, DELETE /auth/register, /api-key/* and /system/* answer 403 "This action needs a real session."':
'Ces routes sont prévues pour une session de navigateur connectée. Avec une clé d’API, verify, DELETE /auth/register, /api-key/* et /system/* répondent 403 « This action needs a real session. »',
'Session only': 'Session uniquement',
'Public auth flow': 'Parcours d’authentification public',
Public: 'Public',
'Verified user': 'Utilisateur vérifié',
'Owner only': 'Propriétaire uniquement',
Authentication: 'Authentification',
Notes: 'Notes',
'Users and invites': 'Utilisateurs et invitations',
'System · owner only': 'Système · propriétaire uniquement',
'Sign in and account': 'Connexion et compte',
'API key management': 'Gestion des clés d’API',
'Bad request': 'Requête invalide',
Unauthorized: 'Non autorisé',
Forbidden: 'Interdit',
Conflict: 'Conflit',
'Server error': 'Erreur serveur',
'This route is rate limited. Too many requests answer 429.':
'Cette route est limitée en fréquence. Trop de requêtes reçoivent la réponse 429.',
Message: 'Message',
'{0} route': '{0} route',
'{0} routes': '{0} routes',
'{0} routes, made for a browser session': '{0} routes, prévues pour une session de navigateur',
'API reference': 'Référence de l’API',
'Everything a developer needs to build on RenewCMS.':
'Tout ce dont une personne développeuse a besoin pour construire sur RenewCMS.',
'RenewCMS is headless: it stores your content and your own code displays it. There are two ways in. Public read-only access lets a website read online articles. API keys let a script or service manage articles, media and users without the back-office.':
'RenewCMS est headless : il stocke votre contenu et votre propre code l’affiche. Il y a deux façons d’y accéder. L’accès public en lecture seule permet à un site de lire les articles publiés. Les clés d’API permettent à un script ou à un service de gérer les articles, les médias et les utilisateurs sans le back-office.',
'No key': 'Sans clé',
'No key needed. Two read-only routes, and only online articles are returned.':
'Aucune clé nécessaire. Deux routes en lecture seule, et seuls les articles publiés sont renvoyés.',
'API key': 'Clé d’API',
'Full access': 'Accès complet',
"Send `Authorization: Bearer rcms_…`. Requests act as the user who created the key, with that user's role (owner or admin). A key never has more rights than its creator.":
'Envoyez `Authorization: Bearer rcms_…`. Les requêtes agissent comme la personne qui a créé la clé, avec son rôle (propriétaire ou administrateur). Une clé n’a jamais plus de droits que son créateur.',
'Keys start with `rcms_` and are shown in full once, when you create them.':
'Les clés commencent par `rcms_` et ne sont affichées en entier qu’une fois, à leur création.',
'A key can\'t create, list or revoke API keys, verify or cancel a registration, or call anything under `/v1/system`. Those routes answer 403 "This action needs a real session." An invalid, unknown, expired or revoked key answers 401, even on public routes, and so does a key whose user was deleted or unverified.':
'Une clé ne peut pas créer, lister ni révoquer de clés d’API, vérifier ou annuler une inscription, ni appeler quoi que ce soit sous `/v1/system`. Ces routes répondent 403 « This action needs a real session. » Une clé invalide, inconnue, expirée ou révoquée reçoit 401, même sur les routes publiques, tout comme une clé dont l’utilisateur a été supprimé ou n’est pas vérifié.',
'Each key can make 120 requests per minute. Beyond that the API answers 429 with a `Retry-After` header.':
'Chaque clé peut faire 120 requêtes par minute. Au-delà, l’API répond 429 avec un en-tête `Retry-After`.',
'Every error is a plain-text body with a single sentence. The status code is in the HTTP status line, and the Content-Type is text/plain.':
'Chaque erreur est un corps en texte brut d’une seule phrase. Le code d’état est dans la ligne d’état HTTP, et le Content-Type est text/plain.',
'Error response · text/plain': 'Réponse d’erreur · text/plain',
'Images in `body` use paths like `/static/uploadedImages/<uuid>.png`. Prefix them with the base URL before rendering.':
'Les images dans `body` utilisent des chemins comme `/static/uploadedImages/<uuid>.png`. Ajoutez l’URL de base devant avant l’affichage.',
'Article routes accept `?format=markdown`, `?format=html` or `?format=json` to choose how `body` is returned. With `json`, `body` is the stored JSON structure. Articles have `body_format: markdown` by default.':
'Les routes d’articles acceptent `?format=markdown`, `?format=html` ou `?format=json` pour choisir le format de `body`. Avec `json`, `body` est la structure JSON stockée. Les articles ont `body_format: markdown` par défaut.',
Meaning: 'Signification',
} as const
export type MessageKey = keyof typeof messages
+4 -1
View File
@@ -391,9 +391,12 @@ describe('Hardener localization outcomes', () => {
document.body.textContent?.includes('/v1/article/'),
document.body.textContent?.includes('GET'),
]).toEqual([window.location.origin, true, true, true])
document.body
.querySelector<HTMLButtonElement>('button[aria-label^="GET /v1/article/. "]')!
.click()
await vi.waitFor(() =>
expect(document.body.textContent).toContain(
`const res = await fetch('${window.location.origin}/v1/article/?format=html')`,
`const res = await fetch('${window.location.origin}/v1/article/')`,
),
)
vi.unstubAllGlobals()