fix(integration): missing french translations

This commit is contained in:
Florian Sylvain committed 2026-10-13 16:54:06 +02:00
1 parent c41e6dbca5
commit a1cdfce529
5 files changed
+108 -8

No files matched your search

+2 -2
View File
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { t } from '@/i18n'
import { t, translate } from '@/i18n'
import { computed } from 'vue'
import type { ApiField } from '@/data/apiCatalogue'
@@ -70,7 +70,7 @@ const columns = computed(() => [
{{ row.original.required ? t('Yes') : t('No') }}
</template>
<template #rule-cell="{ row }">
<span class="text-pretty">{{ row.original.rule }}</span>
<span class="text-pretty">{{ translate(row.original.rule) }}</span>
</template>
</UTable>
</template>
+2 -2
View File
@@ -17,7 +17,7 @@ const activeTab = ref('fetch')
const examples = computed(() => endpointExamples(props.endpoint, props.origin))
const rowLabel = computed(
() => `${props.endpoint.method} ${props.endpoint.path}. ${props.endpoint.description}`,
() => `${props.endpoint.method} ${props.endpoint.path}. ${translate(props.endpoint.description)}`,
)
const bodyTitle = computed(() => {
if (props.endpoint.bodyKind === 'multipart') {
@@ -62,7 +62,7 @@ const snippetTabs = computed(() => [
class="size-4 shrink-0 text-muted lg:hidden"
/>
</span>
<span class="min-w-0 text-toned lg:truncate">{{ endpoint.description }}</span>
<span class="min-w-0 text-toned lg:truncate">{{ translate(endpoint.description) }}</span>
<span class="flex flex-wrap gap-1.5">
<UBadge
:label="translate(endpoint.access)"
+10 -3
View File
@@ -2,7 +2,7 @@
import { t, translate } from '@/i18n'
import ApiRouteRow from '@/components/ApiRouteRow.vue'
import type { PublicRow, SessionGroup } from '@/data/apiCatalogue'
import { LOGIN_FAMILY_CAPTION, type PublicRow, type SessionGroup } from '@/data/apiCatalogue'
import { CHIP_CLASS } from '@/lib/apiReference'
defineProps<{
@@ -10,6 +10,13 @@ defineProps<{
publicRows: PublicRow[]
}>()
function describe(description: string) {
const suffix = `. ${LOGIN_FAMILY_CAPTION}`
return description.endsWith(suffix)
? `${translate(description.slice(0, -suffix.length))}. ${translate(LOGIN_FAMILY_CAPTION)}`
: translate(description)
}
const SUBGROUP_TITLE_CLASS =
'px-3.5 pt-2 pb-1 text-xs font-medium tracking-wide text-muted uppercase'
</script>
@@ -36,7 +43,7 @@ const SUBGROUP_TITLE_CLASS =
:key="`${row.method} ${row.path}`"
:method="row.method"
:path="row.path"
:description="row.description"
:description="describe(row.description)"
data-session-row
>
<UBadge
@@ -59,7 +66,7 @@ const SUBGROUP_TITLE_CLASS =
:key="`${row.method} ${row.path}`"
:method="row.method"
:path="row.path"
:description="row.description"
:description="translate(row.description)"
data-public-row
>
<UBadge
+93
View File
@@ -1593,6 +1593,99 @@ export const messages = {
Request: 'Requête',
'The variant image. Generated on first request.':
'L’image de la variante. Générée à la première requête.',
'markdown, html or json. Default markdown.': 'markdown, html ou json. Par défaut markdown.',
'A whole number from 1. Default 1.': 'Un nombre entier à partir de 1. Par défaut 1.',
'5, 25, 50 or 100. Default 25.': '5, 25, 50 ou 100. Par défaut 25.',
'Up to 200 characters, matched anywhere in the title, ignoring case and accents.':
'200 caractères maximum, recherchés n’importe où dans le titre, sans tenir compte de la casse ni des accents.',
'online or draft. Default both.': 'online ou draft. Par défaut les deux.',
'field:direction, with field title, status, created_at or updated_at and direction asc or desc. Default updated_at:desc.':
'champ:direction, avec le champ title, status, created_at ou updated_at et la direction asc ou desc. Par défaut updated_at:desc.',
'Search text.': 'Texte recherché.',
'SHA-256 of the content, lowercased.': 'SHA-256 du contenu, en minuscules.',
'The next_cursor of the previous page.': 'Le next_cursor de la page précédente.',
'all, unused or duplicates. Default all.': 'all, unused ou duplicates. Par défaut all.',
'newest, oldest, name or largest. Default newest.':
'newest, oldest, name ou largest. Par défaut newest.',
'1 to 100. Default 24.': 'De 1 à 100. Par défaut 24.',
"Read, write and publish articles. Titles can't be changed after creation.":
'Lire, écrire et publier des articles. Les titres ne peuvent pas être modifiés après la création.',
"3 to 200 characters. Can't be changed later.":
'De 3 à 200 caractères. Ne peut pas être modifié ensuite.',
'Up to 10 000 characters.': '10 000 caractères maximum.',
'The image library. One image can be used in many articles.':
'La médiathèque. Une même image peut servir dans plusieurs articles.',
'PNG, JPEG, WEBP or SVG.': 'PNG, JPEG, WEBP ou SVG.',
'The new filename.': 'Le nouveau nom de fichier.',
'Greater than 0. The image to keep.': 'Supérieur à 0. L’image à conserver.',
'At least 1, each greater than 0. Identical copies to delete. Articles switch to the kept image.':
'Au moins 1, chacun supérieur à 0. Copies identiques à supprimer. Les articles passent à l’image conservée.',
'Leave out to keep the current value.': 'À omettre pour conserver la valeur actuelle.',
'1 to 365. Leave out to keep the current value.':
'De 1 à 365. À omettre pour conserver la valeur actuelle.',
'The fingerprint of the preview. Without it, the purge runs on the current library.':
'L’empreinte de l’aperçu. Sans elle, la purge s’applique à la médiathèque actuelle.',
'People who can sign in, and pending invitations.':
'Les personnes qui peuvent se connecter, et les invitations en attente.',
'Up to 60 characters.': '60 caractères maximum.',
'A valid email address.': 'Une adresse e-mail valide.',
'Read the site settings, including the activity log retention.':
'Lire les paramètres du site, dont la conservation du journal d’activité.',
'Hello world.': 'Hello world.',
'Whether registration is open.': 'Indique si les inscriptions sont ouvertes.',
'Set a new password with the emailed code.':
'Définir un nouveau mot de passe avec le code reçu par e-mail.',
'Check an invite code.': 'Vérifier un code d’invitation.',
'Accept an invite.': 'Accepter une invitation.',
'Plain text "ok". Outside /v1.': 'Texte brut « ok ». En dehors de /v1.',
'Update status': 'État de la mise à jour',
'Check for update': 'Rechercher une mise à jour',
'Download update': 'Télécharger la mise à jour',
Register: 'Inscription',
'Verify email': 'Vérifier l’e-mail',
'Reset password': 'Réinitialiser le mot de passe',
'Change the activity log retention': 'Modifier la conservation du journal d’activité',
'List activity events': 'Lister les événements d’activité',
'Activity summary, owner and admin': 'Résumé de l’activité, propriétaire et administrateur',
'Export activity as CSV, owner and admin':
'Exporter l’activité en CSV, propriétaire et administrateur',
'List keys': 'Lister les clés',
'Create a key': 'Créer une clé',
'Revoke a key': 'Révoquer une clé',
'List one page of articles, newest update first, with the total and the tab counts. Anonymous callers get online articles only.':
'Liste une page d’articles, du plus récemment modifié au plus ancien, avec le total et les compteurs des onglets. Les appels anonymes ne reçoivent que les articles publiés.',
'Get one article. Drafts answer 404 to anonymous callers.':
'Récupère un article. Les brouillons répondent 404 aux appels anonymes.',
'Create a draft article.': 'Crée un article en brouillon.',
'Update the body of an article.': 'Modifie le corps d’un article.',
'Publish an article.': 'Publie un article.',
'Unpublish an article.': 'Dépublie un article.',
'Delete an article.': 'Supprime un article.',
'List images.': 'Liste les images.',
'Upload an image (multipart).': 'Téléverse une image (multipart).',
'Rename an image. The URL stays the same.': 'Renomme une image. L’URL reste la même.',
'Delete an image. Articles that use it show a broken image.':
'Supprime une image. Les articles qui l’utilisent affichent une image cassée.',
'Merge identical copies into one image.': 'Fusionne les copies identiques en une seule image.',
'List the articles that use an image.': 'Liste les articles qui utilisent une image.',
'Get the automatic duplicate purge settings.':
'Récupère les paramètres de la purge automatique des doublons.',
'Turn the automatic purge on or off, or change its interval.':
'Active ou désactive la purge automatique, ou modifie son intervalle.',
'Preview what a purge would merge. Nothing changes.':
'Prévisualise ce qu’une purge fusionnerait. Rien n’est modifié.',
'Merge every group of identical copies. Send the preview fingerprint to refuse a changed library.':
'Fusionne chaque groupe de copies identiques. Envoyez l’empreinte de l’aperçu pour refuser une médiathèque modifiée.',
'List users and invites.': 'Liste les utilisateurs et les invitations.',
'Update my profile.': 'Modifie mon profil.',
'Invite a user by email.': 'Invite un utilisateur par e-mail.',
'Cancel a pending invite.': 'Annule une invitation en attente.',
'Renew an expired invite.': 'Renouvelle une invitation expirée.',
"Get the current user. With a key, the key's owner.":
'Récupère l’utilisateur courant. Avec une clé, son propriétaire.',
'Get settings.': 'Récupère les paramètres.',
'Made for the browser. A key is ignored here, with no 403.':
'Prévue pour le navigateur. Une clé est ignorée ici, sans 403.',
} as const
export type MessageKey = keyof typeof messages
+1 -1
View File
@@ -287,7 +287,7 @@ const CARD_TITLE = 'text-md/6 font-semibold text-highlighted'
</h2>
<span class="text-muted">{{ routeCount(group.endpoints.length) }}</span>
</div>
<span class="text-pretty text-toned">{{ group.description }}</span>
<span class="text-pretty text-toned">{{ translate(group.description) }}</span>
<div class="border border-t-0 border-default bg-default">
<EndpointCard
v-for="endpoint in group.endpoints"