Files
SnapOtter/packages/shared/src/i18n/fr.ts
T
SnapOtterandGitHub b4375e558d fix: harden install queue/dispatcher lifecycle and repair review-sweep regressions (#395)
Fixes 15 defects found by a max-effort multi-agent review of the last 6
merged PRs (#388, #390, #391, #392, #393, #394), all adversarially
verified before fixing.

Install queue + dispatcher (the serious cluster):

- features.ts: finalize the installer child exactly once. A failed spawn
  fires both "error" and "close", and the second event released the file
  lock and active slot that pump() had just handed to the next queued
  bundle, letting two pip processes write the same venv concurrently.
  Outcome recording now happens before pump() so the next bundle's first
  progress frame cannot race the previous install's bookkeeping.
- feature-status.ts: keep failed-install errors in a per-bundle map
  instead of the single progress slot. With the queue auto-starting the
  next install, the slot was overwritten within seconds and a failed
  install vanished without ever surfacing to GET /features.
- bridge.ts: scope child lifecycle per process (stopped-children set +
  request generation tags) instead of an instance-wide shuttingDown flag
  that the next spawn reset. A stale SIGTERMed child's late close event
  could record a phantom crash (5 of which permanently disable the
  dispatcher), null out the freshly spawned child, and reject the new
  child's pending requests. The request-timeout kill path still counts
  as a real crash.
- install_feature.py: the pre-write disk re-check measured ai_dir's
  filesystem even when budgeting the cross-filesystem copy that lands on
  the venv's disk; now each budget is checked against the filesystem the
  bytes actually land on, so ENOSPC cannot strike mid-write and leave
  site-packages half overwritten.

Behavior regressions:

- embed-subtitles: preserve pre-existing subtitle tracks (0:s?) and MKV
  attachments (0:t?) that the -map 0:v:0/0:a? rewrite silently dropped;
  data streams stay unmapped on purpose (the actual MPEG remux fix). The
  new subtitle maps first so the language tag hits the right stream.
- usage-survey-overlay: fail closed when the settings fetch fails; the
  fail-open path rendered the blocking survey against an unhealthy API
  and soft-locked admins, the lock-out class #392 fixed.
- features-store: queued bundles poll instead of each holding an SSE
  connection (Install All could pin 7 EventSources and exhaust the
  browser's 6-per-origin HTTP/1.1 limit, hanging the whole app);
  listenToProgress closes any prior stream and stops any poll before
  subscribing; installAll skips bundles already installing or queued.

Contracts, tests, i18n:

- openapi.yaml: add "queued" to the features status enum and document
  downloadBytes/installedBytes (Schemathesis conformance).
- feature-lifecycle e2e: queue transcription (~0.5 GB) instead of ocr
  (~6 GB) and give the test a budget that covers both install drains
  (the stacked waits exceeded the old 900s timeout).
- docker-compose.qa.yml: parameterize the host port (QA_APP_PORT) so
  QA_PROJECT_NAME concurrent stacks can actually bind.
- compare + watermark-image: restore per-input error attribution
  ("Invalid first/second image", "Invalid watermark image") lost in the
  shared-handler migration.
- ai-features-section: the "{size} on disk" suffix now goes through
  i18n; key added to all 21 locales.
- watermark-image + content-aware-resize: migrate to the shared
  inputHandlerFor("image") chain like compare/vectorize/compose, fixing
  drift in the inline copies (no SVG sanitize, no RAW extension hint,
  no AVIF probe).

Verified: typecheck across 9 workspaces, Biome clean on all changed
files, 584 targeted unit tests and 249 integration tests green
(including real-ffmpeg embed-subtitles runs). One unit test updated to
the new poll-while-queued contract with a single-EventSource assertion.

Claude-Session: https://claude.ai/code/session_017mR1HiHaf3a1BmUtrHX4j3
2026-07-03 13:47:15 +08:00

3993 lines
147 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TranslationKeys } from "./en.js";
export const fr: TranslationKeys = {
common: {
upload: "Importer depuis l'ordinateur",
process: "Traiter",
download: "Télécharger",
cancel: "Annuler",
save: "Enregistrer",
delete: "Supprimer",
settings: "Paramètres",
search: "Rechercher des outils...",
dropFiles: "Déposez des fichiers ici ou cliquez sur le bouton d'import",
loading: "Chargement...",
saving: "Enregistrement…",
error: "Une erreur est survenue",
confirm: "Confirmer",
close: "Fermer",
back: "Retour",
next: "Suivant",
clear: "Effacer",
copy: "Copier",
copied: "Copié !",
noResults: "Aucun résultat trouvé",
showLess: "Afficher moins",
showMore: "Afficher {count} de plus",
experimental: "Expérimental",
enabled: "Activé",
disabled: "Désactivé",
rename: "Renommer",
edit: "Modifier",
actions: "Actions",
create: "Créer",
or: "ou",
goHome: "Retour à l'accueil",
somethingWentWrong: "Quelque chose s'est mal passé",
unexpectedError: "Une erreur inattendue est survenue.",
retry: "Réessayer",
privacyPolicy: "Politique de confidentialité",
pageNotFound: "Page introuvable",
pageNotFoundDescription: "La page que vous recherchez nexiste pas ou a été déplacée.",
},
feedback: {
navLabel: "Share feedback",
dialogTitle: "Share feedback",
toolDialogTitle: "How did this tool work?",
failedDialogTitle: "Report a tool issue",
adminDialogTitle: "How was setup?",
closeLabel: "Close feedback dialog",
privacyNote:
"Feedback is sent only when you submit it. SnapOtter does not include your files, file contents, file names, or private outputs.",
typeLabel: "Feedback type",
sentimentLabel: "Quick rating",
messageLabel: "Feedback",
messagePlaceholder: "Tell us what worked, what broke, or what would make SnapOtter better.",
improveFirstLabel: "What should we improve first?",
improveFirstPlaceholder: "Tell us what made setup harder than it should be.",
contactOkLabel: "You can contact me about this feedback.",
emailPlaceholder: "Email (optional)",
namePlaceholder: "Name (optional)",
companyPlaceholder: "Company or org (optional)",
submit: "Send feedback",
submitting: "Sending...",
submitFailed: "Feedback could not be sent. Please try again.",
searchMissTitle: "Demander un outil",
searchMissContext: "Vous avez recherché : {query}",
searchMissDiscussionsFallback:
"Nous n'avons pas pu l'enregistrer. Ouvrez une demande dans Discussions.",
thanksTitle: "Thanks for the feedback.",
thanksDescription: "It helps us improve SnapOtter without collecting files or private content.",
quickThanks: "Thanks for the signal.",
reportIssue: "Report issue",
toolPromptTitle: "How did this tool work?",
toolPromptDescription: "One quick signal helps us improve SnapOtter.",
dismissPrompt: "Dismiss feedback prompt",
workedWell: "Worked well",
dontAskAgain: "Don't ask again",
shareFeedback: "Share feedback",
remindLater: "Remind me later",
adminCardTitle: "How was setup?",
adminCardDescription:
"A quick note from admins helps us improve Docker, source installs, and docs.",
installMethodLabel: "Install method",
frictionAreaLabel: "Hardest setup area",
importantAreasLabel: "Most important areas",
sentiments: {
great: "Great",
okay: "Okay",
issue: "Had an issue",
missing: "Missing something",
bug: "Bug",
idea: "Idea",
other: "Other",
},
types: {
bug: "Bug",
feature_request: "Feature request",
confusing_ux: "Confusing UX",
performance: "Performance",
other: "Other",
},
installMethods: {
docker: "Docker",
docker_compose: "Docker Compose",
source: "Built from source",
cloud: "Cloud/demo",
other: "Other",
},
usageTypes: {
personal: "Juste moi",
team_internal: "Petite équipe",
business_workflow: "Entreprise ou organisation",
education: "Education",
evaluating: "Evaluating",
},
frictionAreas: {
smooth: "Nothing, setup was smooth",
docker: "Docker/container setup",
environment_variables: "Environment variables",
auth: "Authentication/SSO",
storage: "Storage/uploads",
workers: "Workers/queues",
ai_tools: "AI tools",
docs: "Documentation",
performance: "Performance/resources",
other: "Other",
},
importantAreas: {
images: "Images",
pdf_docs: "PDF/docs",
video_audio: "Video/audio",
batch_workflows: "Batch workflows",
ai_tools: "AI tools",
},
},
onboarding: {
usageSurveyTitle: "Comment utilisez-vous SnapOtter ?",
usageSurveyToolsLabel: "Qu'est-ce qui compte le plus pour vous ?",
pickAnyHint: "(plusieurs choix possibles)",
continueLabel: "Continuer",
},
categories: {
essentials: "Essentiels",
adjustments: "Réglages",
enhance: "Amélioration & AI",
watermark: "Filigrane et superposition",
layout: "Mise en page et composition",
utilities: "Utilitaires",
optimization: "Optimisation",
format: "Format et conversion",
"video-edit": "Vidéo",
"video-convert": "Convertir",
"video-effects": "Effets & composition",
"video-subtitles": "Sous-titres",
"video-metadata": "Métadonnées",
"audio-edit": "Éditer",
"audio-convert": "Convertir",
"audio-effects": "Effets & composition",
"audio-metadata": "Métadonnées",
"pdf-organize": "Organiser",
"pdf-edit": "Éditer & annoter",
"pdf-security": "Sécurité",
"pdf-optimize": "Optimiser",
"doc-convert": "Convertir",
data: "Fichiers",
archives: "Archives",
},
modalities: {
image: "Image",
video: "Vidéo",
audio: "Audio",
documentsAndFiles: "PDF & fichiers",
},
tools: {
// BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
"jpg-to-png": {
name: "JPG en PNG",
description: "Convertir JPG en PNG en ligne. Rapide, gratuit et privé.",
},
"png-to-jpg": {
name: "PNG en JPG",
description: "Convertir PNG en JPG en ligne. Rapide, gratuit et privé.",
},
"jpg-to-webp": {
name: "JPG en WebP",
description: "Convertir JPG en WebP en ligne. Rapide, gratuit et privé.",
},
"png-to-webp": {
name: "PNG en WebP",
description: "Convertir PNG en WebP en ligne. Rapide, gratuit et privé.",
},
"webp-to-jpg": {
name: "WebP en JPG",
description: "Convertir WebP en JPG en ligne. Rapide, gratuit et privé.",
},
"webp-to-png": {
name: "WebP en PNG",
description: "Convertir WebP en PNG en ligne. Rapide, gratuit et privé.",
},
"jpg-to-avif": {
name: "JPG en AVIF",
description: "Convertir JPG en AVIF en ligne. Rapide, gratuit et privé.",
},
"png-to-avif": {
name: "PNG en AVIF",
description: "Convertir PNG en AVIF en ligne. Rapide, gratuit et privé.",
},
"webp-to-avif": {
name: "WebP en AVIF",
description: "Convertir WebP en AVIF en ligne. Rapide, gratuit et privé.",
},
"heic-to-jpg": {
name: "HEIC en JPG",
description: "Convertir HEIC en JPG en ligne. Rapide, gratuit et privé.",
},
"heic-to-png": {
name: "HEIC en PNG",
description: "Convertir HEIC en PNG en ligne. Rapide, gratuit et privé.",
},
"heic-to-avif": {
name: "HEIC en AVIF",
description: "Convertir HEIC en AVIF en ligne. Rapide, gratuit et privé.",
},
"jpg-to-gif": {
name: "JPG en GIF",
description: "Convertir JPG en GIF en ligne. Rapide, gratuit et privé.",
},
"png-to-gif": {
name: "PNG en GIF",
description: "Convertir PNG en GIF en ligne. Rapide, gratuit et privé.",
},
"gif-to-jpg": {
name: "GIF en JPG",
description: "Convertir GIF en JPG en ligne. Rapide, gratuit et privé.",
},
"gif-to-png": {
name: "GIF en PNG",
description: "Convertir GIF en PNG en ligne. Rapide, gratuit et privé.",
},
"webp-to-gif": {
name: "WebP en GIF",
description: "Convertir WebP en GIF en ligne. Rapide, gratuit et privé.",
},
"jpg-to-tiff": {
name: "JPG en TIFF",
description: "Convertir JPG en TIFF en ligne. Rapide, gratuit et privé.",
},
"png-to-tiff": {
name: "PNG en TIFF",
description: "Convertir PNG en TIFF en ligne. Rapide, gratuit et privé.",
},
"tiff-to-jpg": {
name: "TIFF en JPG",
description: "Convertir TIFF en JPG en ligne. Rapide, gratuit et privé.",
},
"tiff-to-png": {
name: "TIFF en PNG",
description: "Convertir TIFF en PNG en ligne. Rapide, gratuit et privé.",
},
"psd-to-jpg": {
name: "PSD en JPG",
description: "Convertir PSD en JPG en ligne. Rapide, gratuit et privé.",
},
"psd-to-png": {
name: "PSD en PNG",
description: "Convertir PSD en PNG en ligne. Rapide, gratuit et privé.",
},
"png-to-eps": {
name: "PNG en EPS",
description: "Convertir PNG en EPS en ligne. Rapide, gratuit et privé.",
},
"jpg-to-eps": {
name: "JPG en EPS",
description: "Convertir JPG en EPS en ligne. Rapide, gratuit et privé.",
},
"eps-to-png": {
name: "EPS en PNG",
description: "Convertir EPS en PNG en ligne. Rapide, gratuit et privé.",
},
"eps-to-jpg": {
name: "EPS en JPG",
description: "Convertir EPS en JPG en ligne. Rapide, gratuit et privé.",
},
"png-to-svg": {
name: "PNG en SVG",
description: "Convertir PNG en SVG en ligne. Rapide, gratuit et privé.",
},
"jpg-to-svg": {
name: "JPG en SVG",
description: "Convertir JPG en SVG en ligne. Rapide, gratuit et privé.",
},
"tiff-to-svg": {
name: "TIFF en SVG",
description: "Convertir TIFF en SVG en ligne. Rapide, gratuit et privé.",
},
"psd-to-svg": {
name: "PSD en SVG",
description: "Convertir PSD en SVG en ligne. Rapide, gratuit et privé.",
},
"eps-to-svg": {
name: "EPS en SVG",
description: "Convertir EPS en SVG en ligne. Rapide, gratuit et privé.",
},
"svg-to-png": {
name: "SVG en PNG",
description: "Convertir SVG en PNG en ligne. Rapide, gratuit et privé.",
},
"svg-to-jpg": {
name: "SVG en JPG",
description: "Convertir SVG en JPG en ligne. Rapide, gratuit et privé.",
},
"jpg-to-pdf": {
name: "JPG en PDF",
description: "Convertir JPG en PDF en ligne. Rapide, gratuit et privé.",
},
"png-to-pdf": {
name: "PNG en PDF",
description: "Convertir PNG en PDF en ligne. Rapide, gratuit et privé.",
},
"heic-to-pdf": {
name: "HEIC en PDF",
description: "Convertir HEIC en PDF en ligne. Rapide, gratuit et privé.",
},
"tiff-to-pdf": {
name: "TIFF en PDF",
description: "Convertir TIFF en PDF en ligne. Rapide, gratuit et privé.",
},
"webp-to-pdf": {
name: "WebP en PDF",
description: "Convertir WebP en PDF en ligne. Rapide, gratuit et privé.",
},
"gif-to-pdf": {
name: "GIF en PDF",
description: "Convertir GIF en PDF en ligne. Rapide, gratuit et privé.",
},
"eps-to-pdf": {
name: "EPS en PDF",
description: "Convertir EPS en PDF en ligne. Rapide, gratuit et privé.",
},
"pdf-to-jpg": {
name: "PDF en JPG",
description: "Convertir PDF en JPG en ligne. Rapide, gratuit et privé.",
},
"pdf-to-png": {
name: "PDF en PNG",
description: "Convertir PDF en PNG en ligne. Rapide, gratuit et privé.",
},
"pdf-to-tiff": {
name: "PDF en TIFF",
description: "Convertir PDF en TIFF en ligne. Rapide, gratuit et privé.",
},
"mov-to-mp4": {
name: "MOV en MP4",
description: "Convertir MOV en MP4 en ligne. Rapide, gratuit et privé.",
},
"webm-to-mp4": {
name: "WEBM en MP4",
description: "Convertir WEBM en MP4 en ligne. Rapide, gratuit et privé.",
},
"mkv-to-mp4": {
name: "MKV en MP4",
description: "Convertir MKV en MP4 en ligne. Rapide, gratuit et privé.",
},
"avi-to-mp4": {
name: "AVI en MP4",
description: "Convertir AVI en MP4 en ligne. Rapide, gratuit et privé.",
},
"mp4-to-mov": {
name: "MP4 en MOV",
description: "Convertir MP4 en MOV en ligne. Rapide, gratuit et privé.",
},
"mp4-to-webm": {
name: "MP4 en WEBM",
description: "Convertir MP4 en WEBM en ligne. Rapide, gratuit et privé.",
},
"webm-to-mov": {
name: "WEBM en MOV",
description: "Convertir WEBM en MOV en ligne. Rapide, gratuit et privé.",
},
"mkv-to-mov": {
name: "MKV en MOV",
description: "Convertir MKV en MOV en ligne. Rapide, gratuit et privé.",
},
"avi-to-mov": {
name: "AVI en MOV",
description: "Convertir AVI en MOV en ligne. Rapide, gratuit et privé.",
},
"mp4-to-avi": {
name: "MP4 en AVI",
description: "Convertir MP4 en AVI en ligne. Rapide, gratuit et privé.",
},
"mov-to-avi": {
name: "MOV en AVI",
description: "Convertir MOV en AVI en ligne. Rapide, gratuit et privé.",
},
"mkv-to-avi": {
name: "MKV en AVI",
description: "Convertir MKV en AVI en ligne. Rapide, gratuit et privé.",
},
"avi-to-mkv": {
name: "AVI en MKV",
description: "Convertir AVI en MKV en ligne. Rapide, gratuit et privé.",
},
"mp4-to-gif": {
name: "MP4 en GIF",
description: "Convertir MP4 en GIF en ligne. Rapide, gratuit et privé.",
},
"mov-to-gif": {
name: "MOV en GIF",
description: "Convertir MOV en GIF en ligne. Rapide, gratuit et privé.",
},
"mkv-to-gif": {
name: "MKV en GIF",
description: "Convertir MKV en GIF en ligne. Rapide, gratuit et privé.",
},
"avi-to-gif": {
name: "AVI en GIF",
description: "Convertir AVI en GIF en ligne. Rapide, gratuit et privé.",
},
"gif-to-mp4": {
name: "GIF en MP4",
description: "Convertir GIF en MP4 en ligne. Rapide, gratuit et privé.",
},
"gif-to-webm": {
name: "GIF en WEBM",
description: "Convertir GIF en WEBM en ligne. Rapide, gratuit et privé.",
},
"gif-to-mov": {
name: "GIF en MOV",
description: "Convertir GIF en MOV en ligne. Rapide, gratuit et privé.",
},
"mp4-to-mp3": {
name: "MP4 en MP3",
description: "Convertir MP4 en MP3 en ligne. Rapide, gratuit et privé.",
},
"mov-to-mp3": {
name: "MOV en MP3",
description: "Convertir MOV en MP3 en ligne. Rapide, gratuit et privé.",
},
"mkv-to-mp3": {
name: "MKV en MP3",
description: "Convertir MKV en MP3 en ligne. Rapide, gratuit et privé.",
},
"webm-to-mp3": {
name: "WEBM en MP3",
description: "Convertir WEBM en MP3 en ligne. Rapide, gratuit et privé.",
},
"avi-to-mp3": {
name: "AVI en MP3",
description: "Convertir AVI en MP3 en ligne. Rapide, gratuit et privé.",
},
"mp4-to-wav": {
name: "MP4 en WAV",
description: "Convertir MP4 en WAV en ligne. Rapide, gratuit et privé.",
},
"mov-to-wav": {
name: "MOV en WAV",
description: "Convertir MOV en WAV en ligne. Rapide, gratuit et privé.",
},
"mp4-to-ogg": {
name: "MP4 en OGG",
description: "Convertir MP4 en OGG en ligne. Rapide, gratuit et privé.",
},
"m4a-to-mp3": {
name: "M4A en MP3",
description: "Convertir M4A en MP3 en ligne. Rapide, gratuit et privé.",
},
"m4a-to-wav": {
name: "M4A en WAV",
description: "Convertir M4A en WAV en ligne. Rapide, gratuit et privé.",
},
"aac-to-mp3": {
name: "AAC en MP3",
description: "Convertir AAC en MP3 en ligne. Rapide, gratuit et privé.",
},
"aac-to-wav": {
name: "AAC en WAV",
description: "Convertir AAC en WAV en ligne. Rapide, gratuit et privé.",
},
"aac-to-flac": {
name: "AAC en FLAC",
description: "Convertir AAC en FLAC en ligne. Rapide, gratuit et privé.",
},
"ogg-to-mp3": {
name: "OGG en MP3",
description: "Convertir OGG en MP3 en ligne. Rapide, gratuit et privé.",
},
"ogg-to-wav": {
name: "OGG en WAV",
description: "Convertir OGG en WAV en ligne. Rapide, gratuit et privé.",
},
"wav-to-mp3": {
name: "WAV en MP3",
description: "Convertir WAV en MP3 en ligne. Rapide, gratuit et privé.",
},
"mp3-to-wav": {
name: "MP3 en WAV",
description: "Convertir MP3 en WAV en ligne. Rapide, gratuit et privé.",
},
"flac-to-mp3": {
name: "FLAC en MP3",
description: "Convertir FLAC en MP3 en ligne. Rapide, gratuit et privé.",
},
"excel-to-csv": {
name: "Excel en CSV",
description: "Convertir Excel en CSV en ligne. Rapide, gratuit et privé.",
},
// END conversion-presets
resize: {
name: "Redimensionner",
description: "Redimensionnez par pixels, pourcentage ou presets pour réseaux sociaux",
},
crop: {
name: "Recadrer",
description: "Recadrage libre, presets de ratio, recadrage par forme",
},
rotate: {
name: "Rotation et miroir",
description: "Rotation, miroir et redressement d'images",
},
convert: { name: "Convertir", description: "Convertissez entre formats d'image" },
compress: {
name: "Compresser",
description: "Réduisez la taille du fichier par qualité ou taille cible",
},
"optimize-for-web": {
name: "Optimiser pour le web",
description:
"Optimisez les images pour le web avec conversion de format, contrôle de qualité et aperçu en direct",
},
"strip-metadata": {
name: "Supprimer les métadonnées",
description: "Supprimez EXIF, GPS et informations de l'appareil photo",
},
"edit-metadata": {
name: "Modifier les métadonnées",
description: "Modifiez EXIF, IPTC, XMP, GPS, mots-clés et dates",
},
"bulk-rename": {
name: "Renommage par lot",
description: "Renommez plusieurs fichiers avec des motifs",
},
"image-to-pdf": {
name: "Image vers PDF",
description: "Combinez des images dans un document PDF",
},
"pdf-to-image": {
name: "PDF vers image",
description: "Convertissez des pages PDF en images",
},
favicon: {
name: "Générateur de Favicon",
description: "Générez toutes les tailles de favicon et d'icônes d'application",
},
"adjust-colors": {
name: "Ajuster les couleurs",
description: "Luminosité, contraste, exposition, saturation, température, netteté et effets",
},
sharpening: {
name: "Netteté",
description: "Netteté adaptative, masque flou et passe-haut avec presets",
},
"replace-color": {
name: "Remplacer et inverser la couleur",
description: "Remplacez des couleurs spécifiques ou inversez",
},
"color-blindness": {
name: "Simulation du daltonisme",
description:
"Simulez l'apparence des images avec différents types de déficience de la vision des couleurs",
},
"remove-background": {
name: "Supprimer l'arrière-plan",
description: "Suppression d'arrière-plan par AI",
},
upscale: {
name: "Agrandissement d'image",
description: "Amélioration par super-résolution AI",
},
"erase-object": {
name: "Effaceur d'objets",
description: "Supprimez les objets indésirables avec l'AI",
},
ocr: {
name: "Extraire le texte d'une image (OCR)",
description: "Extrayez du texte à partir d'images avec une précision alimentée par l'AI",
},
"ocr-pdf": {
name: "OCR de PDF",
description: "Extrayez du texte de documents PDF avec OCR alimenté par l'IA",
},
"blur-faces": {
name: "Floutage de visages / données sensibles",
description: "Détectez et floutez automatiquement les visages et informations sensibles",
},
"enhance-faces": {
name: "Amélioration des visages",
description: "Restaurez et améliorez les visages avec l'AI",
},
"smart-crop": {
name: "Recadrage intelligent",
description: "Recadrage intelligent par sujet, visage ou rognage automatique",
},
"image-enhancement": {
name: "Amélioration d'image",
description:
"Amélioration automatique en un clic : exposition, contraste, couleur et netteté intelligents",
},
"noise-removal": {
name: "Suppression du bruit",
description: "Suppression du bruit et du grain par AI",
},
"red-eye-removal": {
name: "Correction des yeux rouges",
description: "Détection et correction des yeux rouges par AI pour les photos au flash",
},
"restore-photo": {
name: "Restauration de photos",
description:
"Réparation de rayures, déchirures et dommages sur les photos anciennes avec l'AI",
},
"content-aware-resize": {
name: "Redimensionnement intelligent",
description:
"Redimensionnez les images de manière intelligente tout en préservant le contenu important",
},
"ai-canvas-expand": {
name: "Extension de canevas AI",
description: "Étendez le canevas avec un remplissage généré par AI",
},
colorize: {
name: "Colorisation AI",
description:
"Convertissez les photos noir et blanc en couleur à l'aide de modèles d'apprentissage profond AI",
},
"passport-photo": {
name: "Photo d'identité",
description:
"Créez des photos de passeport, visa et pièces d'identité conformes aux normes officielles avec détection automatique du visage",
},
"transcribe-audio": {
name: "Transcrire l'audio",
description: "Convertir la parole en texte avec la transcription par IA",
},
"auto-subtitles": {
name: "Sous-titres automatiques",
description: "Générer des fichiers de sous-titres à partir des pistes audio vidéo",
},
"transparency-fixer": {
name: "Correcteur de transparence PNG",
description: "Corrigez les PNG à fausse transparence en un clic",
},
"background-replace": {
name: "Remplacement du fond",
description: "Remplacer le fond par une couleur unie",
},
"blur-background": {
name: "Flou d'arrière-plan",
description: "Flouter le fond en gardant le sujet net",
},
"watermark-text": {
name: "Filigrane texte",
description: "Ajoutez un filigrane textuel en superposition",
},
"watermark-image": {
name: "Filigrane image",
description: "Superposez un logo en filigrane",
},
"text-overlay": {
name: "Texte en superposition",
description: "Ajoutez du texte stylisé aux images",
},
compose: {
name: "Composition d'image",
description: "Superposez des images avec position et opacité",
},
"meme-generator": {
name: "Générateur de Mème",
description:
"Créez des mèmes avec des modèles populaires ou vos propres images. Texte classique style Impact avec polices, couleurs et positionnement personnalisables.",
},
info: {
name: "Info image",
description: "Consultez toutes les métadonnées et propriétés de l'image",
},
compare: {
name: "Comparer des images",
description: "Comparaison côte à côte de deux images",
},
"find-duplicates": {
name: "Trouver les doublons",
description: "Détectez les images en double et quasi-identiques",
},
"color-palette": {
name: "Palette de couleurs",
description: "Extrayez les couleurs dominantes d'une image",
},
"qr-generate": {
name: "Générateur de codes QR",
description: "Générez des codes QR stylisés avec couleurs, motifs et logos personnalisés",
},
"html-to-image": {
name: "HTML vers image",
description: "Capturez des pages web en images haute qualité",
},
"barcode-read": {
name: "Lecteur de codes-barres",
description: "Scannez les images pour détecter les codes QR, codes-barres et codes 2D",
},
collage: {
name: "Collage / Grille",
description: "Combinez des images en de magnifiques collages avec plus de 25 modèles",
},
stitch: {
name: "Assembler / Combiner",
description: "Assemblez des images côte à côte, empilées ou en grille",
},
split: {
name: "Découpage d'image",
description: "Découpez des images en grille ou par taille en pixels avec aperçu en direct",
},
border: {
name: "Bordure et cadre",
description:
"Ajoutez des bordures, du rembourrage, des coins arrondis et des ombres avec des presets en un clic",
},
beautify: {
name: "Embellir une capture d'écran",
description:
"Ajoutez des fonds dégradés, des cadres d'appareils, des ombres et des tailles pour réseaux sociaux aux captures d'écran",
},
"circle-crop": {
name: "Recadrage circulaire",
description: "Recadrez limage en cercle centré avec coins transparents",
},
duotone: {
name: "Bichromie",
description:
"Appliquez un effet bichromie avec des couleurs dombre et de lumière personnalisées",
},
"image-pad": {
name: "Marge dimage",
description:
"Ajoutez des marges pour atteindre un ratio daspect cible avec un arrière-plan uni",
},
pixelate: {
name: "Pixeliser",
description: "Appliquez un effet de pixelisation sur limage entière ou une zone spécifique",
},
vignette: {
name: "Vignette",
description: "Ajoutez un effet de vignette avec intensité et couleur réglables",
},
"gif-webp": {
name: "Convertisseur GIF/WebP",
description:
"Convertissez un GIF animé en WebP et inversement, en préservant toutes les images",
},
histogram: {
name: "Histogramme",
description: "Générez un histogramme RGB à partir dune image",
},
"lqip-placeholder": {
name: "Espace réservé LQIP",
description: "Générez une miniature basse qualité avec URI de données base64",
},
"sprite-sheet": {
name: "Planche de sprites",
description: "Combinez plusieurs images en une grille de sprites unique",
},
"svg-to-raster": {
name: "SVG vers raster",
description:
"Convertissez SVG en PNG, JPEG, WebP, AVIF, TIFF, GIF ou HEIF à une échelle et un DPI personnalisés",
},
vectorize: {
name: "Image vers SVG",
description: "Convertissez des images en graphiques vectoriels redimensionnables",
},
"gif-tools": {
name: "Outils GIF",
description:
"Redimensionnez, optimisez, changez la vitesse, inversez, extrayez des images et faites pivoter des GIFs animés",
},
"image-to-base64": {
name: "Image vers Base64",
description:
"Convertissez des images en chaînes Base64 pour les intégrer dans HTML, CSS et plus",
},
"barcode-generate": {
name: "Générateur de codes-barres",
description:
"Générez des codes-barres aux formats Code 128, EAN-13, UPC-A, Code 39, ITF-14 et Data Matrix",
},
"chart-maker": {
name: "Créateur de graphiques",
description:
"Créez des graphiques en barres, en lignes ou circulaires à partir de données CSV ou JSON",
},
"convert-video": {
name: "Convertir une vidéo",
description: "Convertissez des vidéos entre MP4, MOV et WebM",
},
"compress-video": {
name: "Compresser une vidéo",
description: "Réduisez la taille du fichier vidéo avec contrôle de qualité",
},
"trim-video": {
name: "Couper une vidéo",
description: "Découpez un extrait dune vidéo",
},
"mute-video": {
name: "Couper le son",
description: "Supprimez la piste audio dune vidéo",
},
"video-to-gif": {
name: "Vidéo vers GIF",
description: "Transformez un extrait vidéo en GIF animé",
},
"resize-video": {
name: "Redimensionner une vidéo",
description: "Redimensionnez une vidéo vers une nouvelle résolution ou taille prédéfinie",
},
"crop-video": {
name: "Recadrer une vidéo",
description: "Recadrez une zone dune vidéo",
},
"rotate-video": {
name: "Pivoter une vidéo",
description: "Pivotez ou retournez une vidéo",
},
"change-fps": {
name: "Modifier les fps",
description: "Modifiez la fréquence dimages dune vidéo",
},
"video-color": {
name: "Couleur vidéo",
description: "Ajustez la luminosité, le contraste, la saturation et le gamma",
},
"video-speed": {
name: "Vitesse vidéo",
description: "Accélérez ou ralentissez une vidéo",
},
"reverse-video": {
name: "Inverser une vidéo",
description: "Lisez un extrait vidéo à lenvers",
},
"video-loudnorm": {
name: "Normaliser laudio",
description: "Normalisez le volume audio de la vidéo au standard de diffusion",
},
"aspect-pad": {
name: "Marge de ratio",
description: "Ajoutez des bandes de couleur unie pour atteindre un ratio daspect cible",
},
"blur-pad": {
name: "Marge floue",
description: "Remplissez les bandes avec une copie floue de la vidéo",
},
"watermark-video": {
name: "Filigrane vidéo",
description: "Incrustez un filigrane texte sur les images de la vidéo",
},
"stabilize-video": {
name: "Stabiliser une vidéo",
description: "Réduisez les tremblements de caméra avec une stabilisation en deux passes",
},
"gif-to-video": {
name: "GIF vers vidéo",
description: "Convertissez un GIF animé en vidéo MP4 ou WebM",
},
"video-to-webp": {
name: "Vidéo vers WebP",
description: "Convertissez un extrait vidéo en image WebP animée",
},
"video-to-frames": {
name: "Vidéo vers images",
description: "Extrayez les images dune vidéo sous forme de ZIP",
},
"merge-videos": {
name: "Fusionner des vidéos",
description: "Assemblez plusieurs extraits vidéo en un seul fichier",
},
"replace-audio": {
name: "Remplacer laudio",
description: "Remplacez la piste audio dune vidéo par un autre fichier",
},
"burn-subtitles": {
name: "Incruster les sous-titres",
description: "Incrustez les sous-titres de manière permanente sur les images de la vidéo",
},
"embed-subtitles": {
name: "Intégrer les sous-titres",
description: "Intégrez une piste de sous-titres dans le conteneur vidéo",
},
"extract-subtitles": {
name: "Extraire les sous-titres",
description: "Extrayez la piste de sous-titres dune vidéo au format SRT",
},
"images-to-video": {
name: "Images vers vidéo",
description: "Transformez un ensemble dimages en vidéo diaporama",
},
"video-metadata": {
name: "Nettoyer les métadonnées vidéo",
description: "Supprimez les métadonnées dune vidéo et affichez ce qui a été trouvé",
},
"convert-audio": {
name: "Convertir laudio",
description: "Convertissez laudio entre MP3, WAV, OGG et plus",
},
"trim-audio": {
name: "Couper laudio",
description: "Découpez une section dun fichier audio",
},
"extract-audio": {
name: "Extraire laudio",
description: "Extrayez la piste audio dune vidéo",
},
"volume-adjust": {
name: "Réglage du volume",
description: "Augmentez ou diminuez le volume audio dun gain fixe",
},
"normalize-audio": {
name: "Normaliser laudio",
description: "Uniformisez le volume au standard de diffusion",
},
"fade-audio": {
name: "Fondu audio",
description: "Ajoutez des effets de fondu douverture et de fermeture à laudio",
},
"reverse-audio": {
name: "Inverser laudio",
description: "Lisez laudio à lenvers",
},
"audio-speed": {
name: "Vitesse audio",
description: "Accélérez ou ralentissez la lecture audio",
},
"pitch-shift": {
name: "Changement de tonalité",
description: "Augmentez ou baissez la tonalité par demi-tons sans modifier la vitesse",
},
"audio-channels": {
name: "Canaux audio",
description: "Convertissez entre mono, stéréo ou inversez les canaux gauche et droit",
},
"silence-removal": {
name: "Suppression des silences",
description: "Supprimez les sections silencieuses de laudio",
},
"noise-reduction": {
name: "Réduction du bruit",
description: "Réduisez le bruit de fond avec un débruitage basé sur FFT",
},
"merge-audio": {
name: "Fusionner laudio",
description: "Combinez plusieurs fichiers audio en un seul",
},
"split-audio": {
name: "Diviser laudio",
description: "Divisez laudio par durée, parts égales ou détection de silence",
},
"ringtone-maker": {
name: "Créateur de sonnerie",
description: "Créez un extrait de sonnerie à partir de nimporte quel fichier audio",
},
"waveform-image": {
name: "Image de forme donde",
description: "Générez une visualisation de forme donde en image PNG",
},
"audio-metadata": {
name: "Métadonnées audio",
description: "Consultez, modifiez ou supprimez les tags audio (ID3)",
},
"merge-pdf": {
name: "Fusionner des PDF",
description: "Combinez plusieurs PDF en un seul",
},
"split-pdf": {
name: "Diviser un PDF",
description: "Extrayez des pages ou divisez en parties",
},
"compress-pdf": {
name: "Compresser un PDF",
description: "Réduisez la taille du fichier PDF",
},
"rotate-pdf": {
name: "Pivoter un PDF",
description: "Pivotez les pages dun PDF",
},
"convert-document": {
name: "Convertir un document",
description: "Convertissez entre les formats Word, OpenDocument, RTF et texte brut",
},
"convert-presentation": {
name: "Convertir une présentation",
description: "Convertissez entre les formats de présentation PowerPoint et OpenDocument",
},
"convert-spreadsheet": {
name: "Convertir un tableur",
description:
"Convertissez entre les formats Excel, OpenDocument et CSV. Les classeurs multi-feuilles exportent la première feuille en CSV.",
},
"excel-to-pdf": {
name: "Excel vers PDF",
description:
"Convertissez des tableurs en PDF. Les feuilles larges peuvent se répartir sur plusieurs pages.",
},
"word-to-pdf": {
name: "Word vers PDF",
description: "Convertissez des documents Word en PDF",
},
"extract-pages": {
name: "Extraire des pages",
description: "Extrayez les pages sélectionnées dans un nouveau PDF",
},
"remove-pages": {
name: "Supprimer des pages",
description: "Supprimez des pages spécifiques dun PDF",
},
"organize-pdf": {
name: "Organiser un PDF",
description: "Réordonnez les pages selon un ordre explicite",
},
"protect-pdf": {
name: "Protéger un PDF",
description: "Ajoutez une protection par mot de passe (chiffrement AES-256)",
},
"unlock-pdf": {
name: "Déverrouiller un PDF",
description: "Supprimez la protection par mot de passe dun PDF",
},
"repair-pdf": {
name: "Réparer un PDF",
description: "Tentez de réparer un PDF endommagé ou corrompu",
},
"linearize-pdf": {
name: "Optimiser PDF pour le web",
description: "Linéarisez un PDF pour un affichage web rapide",
},
"grayscale-pdf": {
name: "PDF en niveaux de gris",
description: "Convertissez toutes les couleurs en niveaux de gris",
},
"pdfa-convert": {
name: "Conversion PDF/A",
description: "Convertissez au format darchivage PDF/A-2",
},
"crop-pdf": {
name: "Recadrer un PDF",
description: "Recadrez toutes les pages avec une marge uniforme",
},
"nup-pdf": {
name: "PDF N-up",
description: "Disposez plusieurs pages par feuille",
},
"booklet-pdf": {
name: "PDF livret",
description: "Disposez les pages pour un pliage en livret",
},
"watermark-pdf": {
name: "Filigrane PDF",
description: "Ajoutez un filigrane texte à chaque page",
},
"pdf-page-numbers": {
name: "Numéros de page PDF",
description: "Ajoutez des numéros de page à chaque page",
},
"flatten-pdf": {
name: "Aplatir un PDF",
description: "Intégrez les formulaires et annotations dans le contenu des pages",
},
"redact-pdf": {
name: "Caviarder un PDF",
description: "Supprimez définitivement des occurrences de texte (caviardage vérifié)",
},
"pdf-to-text": {
name: "PDF vers texte",
description: "Extrayez le texte brut dun PDF",
},
"pdf-to-word": {
name: "PDF vers Word",
description: "Idéal pour les PDF textuels ; les pages numérisées nécessitent lOCR",
},
"pdf-metadata": {
name: "Métadonnées PDF",
description: "Consultez et modifiez les métadonnées du document PDF",
},
"powerpoint-to-pdf": {
name: "PowerPoint vers PDF",
description: "Convertissez des présentations en PDF",
},
"html-to-pdf": {
name: "HTML vers PDF",
description:
"Convertissez un fichier HTML en PDF. Les ressources distantes sont désactivées pour la confidentialité.",
},
"markdown-to-docx": {
name: "Markdown vers Word",
description: "Convertissez un fichier Markdown en document Word (DOCX)",
},
"markdown-to-html": {
name: "Markdown vers HTML",
description:
"Convertissez un fichier Markdown en page HTML autonome. Les images distantes du source sont conservées telles quelles.",
},
"markdown-to-pdf": {
name: "Markdown vers PDF",
description:
"Convertissez un fichier Markdown en PDF stylisé. Les ressources distantes sont désactivées pour la confidentialité.",
},
"epub-convert": {
name: "Convertir un EPUB",
description:
"Convertissez un EPUB en PDF, DOCX, HTML ou Markdown. Les ressources distantes du livre ne sont pas récupérées.",
},
"to-epub": {
name: "Convertir en EPUB",
description: "Convertissez des fichiers Word, Markdown, HTML ou texte brut en EPUB",
},
"csv-excel": {
name: "CSV vers Excel",
description: "Convertissez entre CSV et Excel (XLSX), dans les deux sens",
},
"csv-json": {
name: "CSV vers JSON",
description: "Convertissez entre CSV et JSON, dans les deux sens",
},
"json-xml": {
name: "JSON vers XML",
description: "Convertissez entre JSON et XML, dans les deux sens",
},
"split-csv": {
name: "Diviser un CSV",
description: "Divisez un CSV en fichiers plus petits par nombre de lignes",
},
"merge-csvs": {
name: "Fusionner des CSV",
description:
"Combinez plusieurs fichiers CSV ou TSV avec des colonnes correspondantes en un seul",
},
"yaml-json": {
name: "YAML / JSON",
description: "Convertissez entre YAML et JSON, dans les deux sens",
},
"xml-to-csv": {
name: "XML vers CSV",
description: "Extrayez les éléments répétitifs dun XML vers un tableau CSV",
},
"create-zip": {
name: "Créer un ZIP",
description: "Regroupez plusieurs fichiers dans une seule archive ZIP",
},
"extract-zip": {
name: "Extraire un ZIP",
description:
"Extrayez les fichiers dune archive ZIP en toute sécurité avec protection anti-bombe. Les archives à fichier unique renvoient le fichier directement.",
},
pipeline: {
name: "Constructeur de Pipeline",
description: "Enchaînez plusieurs outils dans un flux de travail",
},
processing: { canceled: "Traitement annulé" },
mediaPlayer: {
unsupported: "Votre navigateur ne prend pas en charge ce format multimédia.",
},
documentView: {
loadFailed: "Impossible de charger le document.",
previousPage: "Page précédente",
nextPage: "Page suivante",
inputNotPreviewable: "Aperçu non disponible pour ce type de fichier",
},
},
toolSettings: {
compress: {
compressionMode: "Mode de compression",
targetSize: "Taille cible",
quality: "Qualité",
smallestFile: "Fichier le plus petit",
bestQuality: "Meilleure qualité",
submit: "Compresser",
submitBatch: "Compresser ({count} fichiers)",
progressLabel: "Compression en cours",
original: "Original : {size} KB",
processed: "Traité : {size} KB",
saved: "Économie : {percent}%",
},
resize: {
customSize: "Taille personnalisée",
scale: "Échelle",
presets: "Préréglages",
contentAware: "Intelligent",
widthPx: "Largeur (px)",
heightPx: "Hauteur (px)",
fitMode: "Mode d'ajustement",
cropToFit: "Recadrer pour ajuster",
fitInside: "Ajuster à l'intérieur",
stretch: "Étirer",
limitToOriginalSize: "Limiter à la taille d'origine",
limitToOriginalSizeHint:
"Si votre image est déjà plus petite que la cible, elle est conservée telle quelle au lieu d'être agrandie",
scalePercent: "Échelle (%)",
resizeToSquare: "Redimensionner en carré",
protectFaces: "Protéger les visages",
smoothing: "Lissage",
edgeSensitivity: "Sensibilité des contours",
submit: "Redimensionner",
submitBatch: "Redimensionner ({count} fichiers)",
progressLabel: "Redimensionnement en cours",
},
crop: {
aspectRatio: "Ratio d'aspect",
custom: "Personnalisé",
positionAndSize: "Position et taille",
ruleOfThirds: "Règle des tiers",
leftOffsetPx: "Décalage gauche (px)",
topOffsetPx: "Décalage haut (px)",
submit: "Recadrer",
submitBatch: "Recadrer ({count} fichiers)",
progressLabel: "Recadrage en cours",
},
rotate: {
rotate: "Rotation",
angle: "Angle",
straighten: "Redresser",
flip: "Miroir",
horizontal: "Horizontal",
vertical: "Vertical",
resetAllChanges: "Réinitialiser toutes les modifications",
submit: "Appliquer",
submitBatch: "Appliquer ({count} fichiers)",
progressLabel: "Application en cours",
},
convert: {
targetFormat: "Format cible",
sourceFormat: "Format source",
quality: "Qualité",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion en cours",
},
"optimize-for-web": {
outputFormat: "Format de sortie",
quality: "Qualité",
smallestFile: "Fichier le plus petit",
bestQuality: "Meilleure qualité",
maxDimensions: "Dimensions maximales",
maxWidth: "Largeur maximale",
maxHeight: "Hauteur maximale",
stripMetadata: "Supprimer les métadonnées",
sizeComparison: "Comparaison de taille",
optimized: "Optimisé :",
smaller: "{percent}% plus petit",
larger: "{percent}% plus grand",
submit: "Traiter et télécharger",
submitBatch: "Traiter et télécharger ({count} fichiers)",
progressLabel: "Optimisation en cours",
},
"strip-metadata": {
currentMetadata: "Métadonnées actuelles",
readingMetadata: "Lecture des métadonnées...",
noMetadataFound: "Aucune métadonnée trouvée dans cette image.",
removeAllMetadata: "Supprimer toutes les métadonnées",
selectSpecific: "Ou sélectionnez des métadonnées spécifiques :",
stripExif: "Supprimer EXIF (info appareil, date, exposition)",
stripGps: "Supprimer GPS (données de localisation)",
stripIcc: "Supprimer ICC (profil colorimétrique)",
stripXmp: "Supprimer XMP (métadonnées extensibles)",
locationFound: "localisation trouvée",
locationWarning:
"Cette image contient votre localisation précise. Pensez à supprimer les données GPS avant de la partager.",
metadataSections: "{count} section de métadonnées trouvée",
metadataSectionsPlural: "{count} sections de métadonnées trouvées",
metadataRemoved: "Métadonnées supprimées : {size} KB",
submit: "Supprimer les métadonnées",
progressLabel: "Suppression des métadonnées",
},
"edit-metadata": {
readingMetadata: "Lecture des métadonnées...",
couldNotReadMetadata: "Impossible de lire les métadonnées - les champs seront vides.",
basicInfo: "Informations de base",
description: "Description",
artist: "Artiste",
copyright: "Copyright",
software: "Logiciel",
iptc: "IPTC",
title: "Titre",
headline: "Titre principal",
city: "Ville",
stateProvince: "État/Province",
country: "Pays",
dateAndTime: "Date et heure",
editDates: "Modifier les dates",
shiftAllDates: "Décaler toutes les dates",
dateModified: "Date de modification",
dateTaken: "Date de prise de vue",
shiftHint:
"Décalez tous les champs de date d'un décalage (utile pour les corrections de fuseau horaire)",
direction: "Direction",
forward: "+ En avant",
backward: "- En arrière",
hoursMinutes: "Heures:Minutes",
locationGps: "Localisation (GPS)",
locationDataFound: "Données de localisation trouvées",
noGpsData: "Aucune donnée GPS. Ajoutez des coordonnées ci-dessous.",
latitude: "Latitude",
longitude: "Longitude",
altitudeMeters: "Altitude (mètres)",
removeAllGpsData: "Supprimer toutes les données GPS",
keywords: "Mots-clés",
addKeywordPlaceholder: "Ajoutez un mot-clé et appuyez sur Entrée",
addToExisting: "Ajouter aux existants",
replaceAll: "Tout remplacer",
allMetadata: "Toutes les métadonnées",
templates: "Modèles",
templateNamePlaceholder: "Nom du modèle",
uploadPrompt: "Importez une image pour modifier ses métadonnées.",
changes: "{count} modifications :",
modified: "{count} modifié(s)",
removed: "{count} supprimé(s)",
gpsCleared: "GPS effacé",
gpsAdded: "GPS ajouté",
datesShifted: "dates décalées",
submit: "Appliquer les métadonnées",
progressLabel: "Écriture des métadonnées",
},
"bulk-rename": {
pattern: "Motif",
patternHint: "Variables : {{index}}, {{padded}}, {{original}}",
startIndex: "Index de départ",
preview: "Aperçu",
andMore: "... et {count} de plus",
renaming: "Renommage en cours...",
submit: "Renommer {count} fichiers",
zipDownloaded: "ZIP téléchargé avec succès",
},
"image-to-pdf": {
imageCount: "{count} image sera convertie en {mode}",
imageCountPlural: "{count} images seront converties en {mode}",
singlePdfMode: "un seul PDF, une image par page",
separatePdfMode: "des PDFs séparés, un par image",
combineAllImages: "Combiner toutes les images en un PDF",
pageSize: "Taille de page",
orientation: "Orientation",
portrait: "Portrait",
landscape: "Paysage",
margin: "Marge",
targetSizeLabel: "Taille de fichier cible (optionnel)",
targetSizePlaceholder: "ex. 2",
targetSizeHint: "Laissez vide pour une qualité maximale",
targetSizeMet: "Objectif atteint",
targetSizeNotMet:
"Impossible d'atteindre l'objectif. Fichier compressé à la qualité minimale.",
targetSizeTooSmall: "L'objectif doit être d'au moins 50KB",
jpegQualityLabel: "Qualité JPEG utilisée",
noImage: "Aucune image",
submitCollate: "Créer le PDF ({count} pages)",
submitSeparate: "Créer {count} PDFs",
downloadPdf: "Télécharger le PDF",
downloadZip: "Télécharger le ZIP",
progressLabel: "Création du PDF",
uploadingImages: "Import des images...",
processingPages: "Traitement de {count} pages...",
},
"pdf-to-image": {
dropPdf: "Déposez un PDF ici ou cliquez pour sélectionner",
readingPdf: "Lecture du PDF...",
pageCount: "{count} page",
pageCountPlural: "{count} pages",
outputFormat: "Format de sortie",
quality: "Qualité",
resolutionDpi: "Résolution (DPI)",
dpiScreen: "Écran",
dpiStandard: "Standard",
dpiPrint: "Impression",
dpiHighQuality: "Haute qualité",
colorMode: "Mode couleur",
colorModeColor: "Couleur",
colorModeGrayscale: "Niveaux de gris",
colorModeBw: "N&B",
pages: "Pages",
allPages: "Toutes les pages",
pagesHint: "ex. 1-3, 5, 8-10 (le document contient {count} pages)",
converting: "Conversion en cours...",
submit: "Convertir {count} page",
submitPlural: "Convertir {count} pages",
downloadAllZip: "Tout télécharger (ZIP)",
},
favicon: {
uploadHint:
"Importez des images carrées (512x512 ou plus recommandé) pour générer toutes les tailles de favicon et d'icônes d'application.",
multipleHint: "Chacune des {count} images obtient son propre dossier dans le ZIP.",
generatedSizes: "Tailles générées (par image)",
plusManifest: "+ manifest.json + extrait HTML",
submit: "Générer les Favicons ({count} image)",
submitPlural: "Générer les Favicons ({count} images)",
downloadZip: "Télécharger le ZIP des Favicons",
progressLabel: "Génération des Favicons",
},
"adjust-colors": {
light: "Lumière",
brightness: "Luminosité",
contrast: "Contraste",
exposure: "Exposition",
color: "Couleur",
saturation: "Saturation",
temperature: "Température",
temperatureHint: "froid / chaud",
tint: "Teinte",
tintHint: "vert / magenta",
hue: "Teinte chromatique",
detail: "Détail",
sharpness: "Netteté",
effects: "Effets",
none: "aucun",
grayscale: "niveaux de gris",
sepia: "sépia",
invert: "inverser",
colorChannels: "Canaux de couleur",
channelModified: "modifié",
red: "Rouge",
green: "Vert",
blue: "Bleu",
resetAll: "Tout réinitialiser",
submit: "Appliquer",
submitBatch: "Appliquer ({count} fichiers)",
progressLabel: "Ajustement des couleurs",
},
sharpening: {
method: "Méthode",
adaptive: "Adaptatif",
unsharpMask: "Masque flou",
highPass: "Passe-haut",
presets: "Préréglages",
textureAmount: "Quantité de texture",
amount: "Quantité",
strength: "Intensité",
noiseReduction: "Réduction du bruit",
off: "désactivé",
lightDenoise: "léger",
mediumDenoise: "moyen",
strongDenoise: "fort",
advancedControls: "Contrôles avancés",
radius: "Rayon",
flatProtection: "Protection des aplats",
detailThreshold: "Seuil de détail",
haloLimitLight: "Limite de halo (clair)",
haloLimitDark: "Limite de halo (sombre)",
threshold: "Seuil",
kernelSize: "Taille du noyau",
submit: "Accentuer",
submitBatch: "Accentuer ({count} fichiers)",
progressLabel: "Accentuation en cours",
},
"replace-color": {
sourceColor: "Couleur source (à remplacer)",
targetColor: "Couleur cible (remplacement)",
makeTransparent: "Rendre transparent à la place",
tolerance: "Tolérance",
exactMatch: "Correspondance exacte",
wideRange: "Plage étendue",
submit: "Remplacer la couleur",
submitBatch: "Remplacer la couleur ({count} fichiers)",
progressLabel: "Remplacement de la couleur",
},
"color-blindness": {
simulationType: "Type de simulation",
redGreen: "Rouge-Vert",
blueYellow: "Bleu-Jaune",
monochromatic: "Monochromatique",
submit: "Simuler",
submitBatch: "Simuler ({count} fichiers)",
progressLabel: "Simulation du daltonisme",
},
"remove-background": {
subject: "Sujet",
people: "Personnes",
products: "Produits",
general: "Général",
passportIdPhoto: "Photo de passeport / pièce d'identité",
quality: "Qualité",
fast: "Rapide",
hd: "HD",
max: "Max",
ultra: "Ultra",
background: "Arrière-plan",
transparent: "Transparent",
bgColor: "Couleur",
gradient: "Dégradé",
image: "Image",
gradientDirection: "Direction",
chooseBackgroundImage: "Choisir une image d'arrière-plan",
effectsSection: "Effets",
effectsActive: "actifs",
blurBackground: "Flouter l'arrière-plan",
intensity: "Intensité",
addShadow: "Ajouter une ombre",
opacity: "Opacité",
outputFormat: "Format de sortie",
edgeSmoothing: "Lissage des bords",
edgeSmoothingOff: "Désactivé",
edgeSmoothingLight: "Léger",
edgeSmoothingMedium: "Moyen",
edgeSmoothingStrong: "Fort",
colorDecontamination: "Décontamination des couleurs",
rendering: "Rendu en cours...",
submit: "Supprimer l'arrière-plan",
submitBatch: "Supprimer l'arrière-plan ({count} fichiers)",
progressLabel: "Suppression de l'arrière-plan",
},
upscale: {
scaleFactor: "Facteur d'échelle",
quality: "Qualité",
enhanceFaces: "Améliorer les visages",
noiseReduction: "Réduction du bruit",
noiseReductionHint:
"Lisse le grain et le bruit. Des valeurs plus élevées suppriment davantage de bruit mais peuvent adoucir les détails.",
outputFormat: "Format de sortie",
submit: "Agrandir {scale}x",
submitBatch: "Agrandir {scale}x ({count} fichiers)",
progressLabel: "Agrandissement de l'image",
progressLabelBatch: "Agrandissement de {count} images",
},
"erase-object": {
brushSize: "Taille du pinceau",
fine: "Fin",
wide: "Large",
undo: "Annuler",
clear: "Effacer",
outputFormat: "Format de sortie",
quality: "Qualité",
paintHint:
"Peignez sur les objets que vous souhaitez supprimer. Utilisez Ctrl+Z pour annuler.",
submit: "Effacer l'objet",
submitBatch: "Tout effacer ({count})",
progressLabel: "Effacement de l'objet",
},
ocr: {
quality: "Qualité",
enhanceBeforeScanning: "Améliorer avant le scan",
enhanceHint:
"Redresse, améliore le contraste, supprime le bruit et agrandit automatiquement l'image avant le scan pour une meilleure précision.",
language: "Langue",
autoDetect: "Détection automatique",
extractedText: "Texte extrait",
noTextDetected: "Aucun texte détecté dans cette image",
characters: "{count} caractères",
submit: "Extraire le texte",
submitBatch: "Extraire le texte ({count} fichiers)",
progressLabel: "Extraction du texte",
},
"ocr-pdf": {
quality: "Qualité",
language: "Langue",
autoDetect: "Détection automatique",
pages: "Pages",
pagesPlaceholder: "tout, 1-3, 5",
pagesHint: "Entrez des numéros de pages ou des plages (ex. 1-3, 5, 8-10). Max 50 pages.",
submit: "Extraire le texte",
submitBatch: "Extraire le texte ({count} fichiers)",
progressLabel: "Extraction du texte du PDF",
},
"blur-faces": {
blurRadius: "Rayon du flou",
blurLight: "Léger",
blurHeavy: "Fort",
detectionSensitivity: "Sensibilité de détection",
moreFaces: "Plus de visages",
fewerFaces: "Moins de visages",
submit: "Flouter les visages",
progressLabel: "Floutage des visages",
},
"enhance-faces": {
quality: "Qualité",
enhancementStrength: "Intensité de l'amélioration",
onlyCenterFace: "Visage central uniquement",
detectionSensitivity: "Sensibilité de détection",
submit: "Améliorer les visages",
submitBatch: "Améliorer les visages ({count} fichiers)",
progressLabel: "Amélioration des visages",
},
"smart-crop": {
subjectFocus: "Mise au point sur le sujet",
faceFocus: "Mise au point sur le visage",
autoTrim: "Rognage automatique",
customSize: "Taille personnalisée",
socialPresets: "Presets pour réseaux sociaux",
detectionStrategy: "Stratégie de détection",
detectionStrategyHint:
"L'attention trouve la région visuellement la plus saillante. L'entropie trouve la zone avec le plus de détails et d'informations.",
attention: "Attention",
entropy: "Entropie",
padding: "Marge intérieure",
paddingHint: "Espace supplémentaire autour de la zone de mise au point",
outputQuality: "Qualité de sortie",
outputQualityHint: "Pour les sorties JPEG et WebP. Le PNG est toujours sans perte.",
subjectDescription:
"Détecte la région la plus intéressante par analyse de saillance et recadre à la taille souhaitée.",
framing: "Cadrage",
facePadding: "Marge autour du visage",
facePaddingHint: "Espace supplémentaire autour des visages détectés",
fewerFalsePositives: "Moins de faux positifs",
faceDescription:
"Utilise la détection faciale AI pour garder les visages bien cadrés. Se replie sur la mise au point sur le sujet si aucun visage n'est détecté.",
trimTolerance: "Tolérance",
trimDescription:
"À quel point un pixel de bordure peut différer de la couleur du bord et être quand même rogné. Plus élevé = plus agressif.",
padToSquare: "Remplir en carré",
targetSizePx: "Taille cible (px)",
padColor: "Couleur de remplissage",
trimHint:
'Supprime les bordures de couleur uniforme autour du sujet. Activez "Remplir en carré" pour des images prêtes pour le e-commerce.',
submitSubject: "Recadrage intelligent",
submitFace: "Recadrage par visage",
submitTrim: "Rogner les bordures",
},
imageEnhancement: {
enhancementMode: "Mode d'amélioration",
auto: "Automatique",
portrait: "Portrait",
landscape: "Paysage",
lowLight: "Faible luminosité",
food: "Nourriture",
document: "Document",
intensity: "Intensité",
deepEnhance: "Amélioration profonde (AI)",
deepEnhanceDescription: "Supprime le bruit et les artefacts avec l'AI",
deepEnhanceRequires: "Nécessite le pack Agrandissement et amélioration",
analyzingImage: "Analyse de l'image...",
detectedIssues: "Problèmes détectés",
imageLooksGood: "L'image semble bonne. Ajustez avec le curseur d'intensité.",
issueUnderexposed: "Sous-exposition",
issueOverexposed: "Surexposition",
issueLowContrast: "Contraste plat",
issueColorCast: "Dominante de couleur",
issueDesaturated: "Désaturée",
issueSoftFocus: "Mise au point douce",
issueNoisy: "Bruitée",
submit: "Améliorer",
submitDeep: "Amélioration profonde",
submitBatch: "Améliorer ({count} fichiers)",
submitDeepBatch: "Amélioration profonde ({count} fichiers)",
progressLabel: "Amélioration de l'image",
progressLabelBatch: "Amélioration de {count} images",
},
"noise-removal": {
denoisingTier: "Niveau de débruitage",
quick: "Rapide",
balanced: "Équilibré",
quality: "Qualité",
maximum: "Maximum",
quickDesc: "Rapide et léger",
balancedDesc: "Bonne qualité, vitesse modérée",
qualityDesc: "Par AI, lent",
maximumDesc: "Meilleur modèle AI, le plus lent",
strength: "Intensité",
subtle: "Subtil",
aggressive: "Agressif",
detailPreservation: "Préservation des détails",
smooth: "Lisse",
sharp: "Net",
colorNoise: "Bruit de couleur",
heavy: "Intense",
outputFormat: "Format de sortie",
gifAiWarning:
"Le débruitage AI sur les fichiers GIF ne traite que la première image. Pour les GIFs animés, utilisez le niveau Rapide ou Équilibré.",
submit: "Supprimer le bruit",
submitBatch: "Supprimer le bruit ({count} fichiers)",
progressLabel: "Suppression du bruit",
progressLabelBatch: "Suppression du bruit de {count} images",
},
"red-eye-removal": {
sensitivity: "Sensibilité",
strict: "Stricte",
aggressive: "Agressif",
correctionStrength: "Intensité de la correction",
subtle: "Subtil",
dark: "Sombre",
outputFormat: "Format de sortie",
quality: "Qualité",
submit: "Corriger les yeux rouges",
submitBatch: "Corriger les yeux rouges ({count} fichiers)",
progressLabel: "Correction des yeux rouges",
progressLabelBatch: "Correction des yeux rouges dans {count} images",
},
"restore-photo": {
scratchRemoval: "Suppression des rayures",
scratchRemovalDesc: "Détecte et répare les rayures, déchirures et taches",
faceEnhancement: "Amélioration des visages",
faceEnhancementDesc: "Restaure les visages dégradés avec CodeFormer AI",
faceFidelity: "Fidélité du visage",
enhanced: "Amélioré",
faithful: "Fidèle",
noiseReduction: "Réduction du bruit",
noiseReductionDesc: "Supprime le grain et le bruit des photos anciennes",
denoiseStrength: "Intensité du débruitage",
autoColorize: "Colorisation automatique",
autoColorizeDesc: "Ajoutez de la couleur aux photos N&B avec DDColor AI",
colorizeStrength: "Intensité de la colorisation",
vivid: "Vif",
submit: "Restaurer la photo",
submitBatch: "Restaurer les photos ({count})",
progressLabel: "Restauration de la photo",
progressLabelBatch: "Restauration de {count} photos",
},
"content-aware-resize": {
widthPx: "Largeur (px)",
heightPx: "Hauteur (px)",
resizeToSquare: "Redimensionner en carré",
protectFaces: "Protéger les visages",
protectFacesHint:
"Détecte et protège les zones de visage de la suppression de coutures par détection faciale",
smoothing: "Lissage",
edgeSensitivity: "Sensibilité des contours",
submit: "Redimensionner",
submitBatch: "Redimensionner ({count} fichiers)",
progressLabel: "Redimensionnement intelligent",
},
"ai-canvas-expand": {
quality: "Qualité",
fast: "Rapide",
balanced: "Équilibré",
highQuality: "Haute qualité",
fastDesc: "Aperçu rapide, moins de passes AI",
balancedDesc: "Bonne qualité, vitesse modérée",
highQualityDesc: "Meilleurs résultats, plus lent",
extendToAspectRatio: "Étendre au ratio d'aspect",
extendByPixels: "Étendre de (pixels)",
top: "Haut",
right: "Droite",
bottom: "Bas",
left: "Gauche",
newSize: "Nouvelle taille : {width} x {height}",
submit: "Étendre le canevas",
submitBatch: "Étendre ({count} fichiers)",
progressLabel: "Extension du canevas",
},
colorize: {
aiModel: "Modèle AI",
fast: "Rapide",
fastDesc: "Résultats rapides",
balanced: "Équilibré",
balancedDesc: "Le meilleur disponible",
best: "Optimal",
bestDesc: "La plus haute qualité",
colorIntensity: "Intensité des couleurs",
grayscaleLabel: "Niveaux de gris",
subtleLabel: "Subtil",
naturalLabel: "Naturel",
vividLabel: "Vif",
intensityHint: "Des valeurs plus basses produisent des couleurs plus douces, style vintage.",
strength: "Intensité de la colorisation",
submit: "Coloriser",
submitBatch: "Coloriser ({count} fichiers)",
progressLabel: "Colorisation en cours",
progressLabelBatch: "Colorisation de {count} images",
},
"passport-photo": {
country: "Pays",
searchCountries: "Rechercher des pays...",
noCountriesFound: "Aucun pays trouvé",
customDimensions: "Dimensions personnalisées",
documentType: "Type de document",
dimensionsMm: "Dimensions (mm)",
dpi: "DPI",
pixelsPerInch: "pixels par pouce",
backgroundColor: "Couleur de fond",
maxFileSize: "Taille de fichier maximale",
noLimit: "Sans limite",
customKb: "Personnalisé KB...",
uploadPortrait: "Importez une photo portrait",
uploadHint:
"Déposez ou importez une image dans le panneau de gauche pour prévisualiser votre photo d'identité",
analyzingPhoto: "Analyse de la photo",
detectingLandmarks: "Détection des repères faciaux et suppression de l'arrière-plan...",
generatePassportPhoto: "Générer la photo d'identité",
generating: "Génération en cours...",
downloadPhoto: "Télécharger la photo",
faceCentered: "Visage centré",
headLevel: "Tête droite",
lookingStraight: "Regard face caméra",
faceSize: "Taille du visage",
whatYouSee: "Ce que vous voyez est ce que vous téléchargez",
dragToAdjust: "Glissez pour ajuster",
scrollToZoom: "Faites défiler pour zoomer",
photoGenerated: "Photo générée. Téléchargez-la depuis le panneau de gauche.",
},
"transcribe-audio": {
language: "Langue",
autoDetect: "Détection automatique",
outputFormat: "Format de sortie",
plainText: "Texte brut",
submit: "Transcrire",
submitBatch: "Transcrire ({count} fichiers)",
progressLabel: "Transcription de l'audio",
},
"auto-subtitles": {
language: "Langue",
autoDetect: "Détection automatique",
format: "Format des sous-titres",
submit: "Générer les sous-titres",
submitBatch: "Générer les sous-titres ({count} fichiers)",
progressLabel: "Génération des sous-titres",
},
"transparency-fixer": {
description:
"Importez un PNG avec un faux fond transparent et nous le corrigeons en un clic.",
removeWatermark: "Supprimer le filigrane",
removeWatermarkHelp: "Détecte et supprime les filigranes semi-transparents",
requiresEraser: "Nécessite le pack Effaceur d'objets",
advanced: "Avancé",
defringe: "Supprimer les franges",
outputFormat: "Format de sortie",
submit: "Corriger la transparence",
submitBatch: "Corriger la transparence ({count} fichiers)",
progressLabel: "Correction de la transparence",
},
"background-replace": {
color: "Couleur de fond",
submit: "Remplacer le fond",
submitBatch: "Remplacer le fond ({count} fichiers)",
progressLabel: "Remplacement du fond",
},
"blur-background": {
intensity: "Intensité du flou",
submit: "Flouter le fond",
submitBatch: "Flouter le fond ({count} fichiers)",
progressLabel: "Floutage du fond",
},
"watermark-text": {
watermarkText: "Texte du filigrane",
fontSize: "Taille de police",
color: "Couleur",
opacity: "Opacité",
position: "Position",
rotation: "Rotation",
center: "Centre",
topLeft: "Haut gauche",
topRight: "Haut droite",
bottomLeft: "Bas gauche",
bottomRight: "Bas droite",
tiled: "Mosaïque",
submit: "Ajouter le filigrane",
submitBatch: "Ajouter le filigrane ({count} fichiers)",
progressLabel: "Ajout du filigrane",
},
"watermark-image": {
uploadWatermark: "Importer l'image du filigrane",
position: "Position",
opacity: "Opacité",
scale: "Échelle",
submit: "Appliquer le filigrane",
submitBatch: "Appliquer le filigrane ({count} fichiers)",
},
"text-overlay": {
text: "Texte",
fontSize: "Taille de police",
color: "Couleur",
position: "Position",
top: "Haut",
center: "Centre",
bottom: "Bas",
backgroundBox: "Boîte de fond",
backgroundColor: "Couleur de fond",
shadow: "Ombre",
submit: "Ajouter le texte",
submitBatch: "Ajouter le texte ({count} fichiers)",
progressLabel: "Ajout du texte en superposition",
download: "Télécharger",
defaultText: "Votre texte ici",
},
compose: {
uploadOverlay: "Importer l'image de superposition",
xPosition: "Position X",
yPosition: "Position Y",
opacity: "Opacité",
blendMode: "Mode de fusion",
submit: "Composer",
},
"meme-generator": {
selectTemplate:
"Sélectionnez un modèle dans la galerie ou importez votre propre image pour commencer.",
chooseLayout: "Choisissez une disposition de texte pour votre image personnalisée.",
textContent: "Contenu du texte",
textStyle: "Style du texte",
font: "Police",
fontSize: "Taille de police",
textColor: "Couleur du texte",
strokeColor: "Couleur du contour",
allCaps: "MAJUSCULES",
generate: "Générer le Mème",
generating: "Génération en cours...",
downloadMeme: "Télécharger le Mème",
backToGallery: "Retour à la galerie",
},
info: {
loadingInfo: "Chargement des informations...",
filename: "Nom du fichier",
fileSize: "Taille du fichier",
dimensions: "Dimensions",
format: "Format",
channels: "Canaux",
colorSpace: "Espace colorimétrique",
density: "Densité",
bitDepth: "Profondeur de bits",
progressive: "Progressif",
pages: "Pages",
hasAlpha: "Canal alpha",
hasProfile: "Profil",
hasExif: "EXIF",
hasIcc: "ICC",
hasXmp: "XMP",
readInfo: "Lire les infos",
reading: "Lecture...",
channelStats: "Statistiques des canaux",
yes: "Oui",
no: "Non",
na: "N/D",
failedToRead: "Impossible de lire les infos",
},
compare: {
uploadSecondImage: "Importer une seconde image",
similarity: "Similarité : {percent}%",
submit: "Comparer",
downloadDiff: "Télécharger la différence",
},
"find-duplicates": {
preset: "Préréglage",
exact: "Exact",
similar: "Similaire",
loose: "Large",
exactDesc: "Copies identiques au pixel près, même image dans différents formats.",
similarDesc: "Copies redimensionnées, recompressées ou légèrement modifiées.",
looseDesc: "Images visuellement liées, recadrages légers, expositions différentes.",
threshold: "Seuil",
submit: "Rechercher les doublons",
scanning: "Analyse en cours...",
},
"color-palette": {
submit: "Extraire la palette",
extracting: "Extraction en cours...",
dominantColors: "Couleurs dominantes",
clickToCopy: "Cliquez pour copier",
},
"qr-generate": {
contentType: "Type de contenu",
url: "URL",
text: "Texte",
wifi: "WiFi",
vcard: "vCard",
email: "Email",
phone: "Téléphone",
sms: "SMS",
styling: "Style",
dotStyle: "Style des points",
cornerSquareStyle: "Style du carré d'angle",
cornerDotStyle: "Style du point d'angle",
foregroundColor: "Couleur de premier plan",
bgColor: "Couleur de fond",
logo: "Logo",
downloadFormat: "Format de téléchargement",
submit: "Générer le code QR",
download: "Télécharger le code QR",
},
"html-to-image": {
modeUrl: "URL",
modeHtml: "Fichier HTML",
htmlFile: "Fichier HTML",
url: "URL",
urlPlaceholder: "https://snapotter.com",
format: "Format de sortie",
quality: "Qualité",
devicePreset: "Appareil",
viewportWidth: "Largeur",
viewportHeight: "Hauteur",
fullPage: "Page entière",
submit: "Capturer",
download: "Télécharger la capture",
capturing: "Capture de la page...",
errorTimeout: "La page a mis trop de temps à charger",
errorBlocked: "Cette URL ne peut pas être capturée",
errorUnavailable: "Le service de capture n'est pas disponible",
errorFailed: "Impossible de capturer la page",
placeholder: "Saisissez une URL et cliquez sur Capturer",
presets: {
desktop: "Bureau",
tablet: "Tablette",
mobile: "Mobile",
custom: "Personnalisé",
},
},
"barcode-read": {
submit: "Scanner les codes-barres",
submitBatch: "Scanner ({count} fichiers)",
scanning: "Analyse en cours...",
noBarcodesFound: "Aucun code-barres trouvé",
barcodesFound: "{count} code-barres trouvé",
barcodesFoundPlural: "{count} codes-barres trouvés",
},
collage: {
template: "Modèle",
aspectRatio: "Ratio d'aspect",
gap: "Espacement",
cornerRadius: "Rayon d'angle",
backgroundColor: "Couleur de fond",
outputFormat: "Format de sortie",
quality: "Qualité",
submit: "Créer le collage",
downloadCollage: "Télécharger le collage",
},
stitch: {
direction: "Direction",
horizontal: "Horizontal",
vertical: "Vertical",
grid: "Grille",
gridColumns: "Colonnes de grille",
resizeMode: "Mode de redimensionnement",
fit: "Ajuster",
original: "Original",
stretchMode: "Étirer",
cropMode: "Recadrer",
alignment: "Alignement",
start: "Début",
center: "Centre",
end: "Fin",
gap: "Espacement",
border: "Bordure",
cornerRadius: "Rayon d'angle",
backgroundColor: "Couleur de fond",
outputFormat: "Format de sortie",
quality: "Qualité",
submit: "Assembler les images",
},
split: {
modeGrid: "Grille",
modeTileSize: "Taille des tuiles",
presets: "Préréglages",
columns: "Colonnes",
rows: "Lignes",
tileWidth: "Largeur de tuile",
tileHeight: "Hauteur de tuile",
outputFormat: "Format de sortie",
quality: "Qualité",
submit: "Découper l'image",
downloadAll: "Tout télécharger (ZIP)",
},
border: {
presets: "Préréglages",
borderWidth: "Largeur de bordure",
borderColor: "Couleur de bordure",
padding: "Marge intérieure",
paddingColor: "Couleur de marge",
cornerRadius: "Rayon d'angle",
shadow: "Ombre",
shadowBlur: "Flou de l'ombre",
shadowOffsetX: "Décalage X de l'ombre",
shadowOffsetY: "Décalage Y de l'ombre",
shadowColor: "Couleur de l'ombre",
shadowOpacity: "Opacité de l'ombre",
submit: "Ajouter la bordure",
submitBatch: "Ajouter la bordure ({count} fichiers)",
progressLabel: "Ajout de la bordure",
},
beautify: {
preset: "Préréglage",
backgroundType: "Type de fond",
solidColor: "Couleur unie",
linearGradient: "Dégradé linéaire",
radialGradient: "Dégradé radial",
customImage: "Image personnalisée",
gradientAngle: "Angle du dégradé",
padding: "Marge intérieure",
borderRadius: "Rayon de bordure",
shadowPreset: "Preset d'ombre",
deviceFrame: "Cadre d'appareil",
submit: "Embellir",
submitBatch: "Embellir ({count} fichiers)",
progressLabel: "Embellissement de la capture d'écran",
},
"circle-crop": {
submit: "Recadrage circulaire",
submitBatch: "Recadrage circulaire ({count} fichiers)",
progressLabel: "Recadrage en cercle",
},
duotone: {
shadow: "Couleur des ombres",
highlight: "Couleur des hautes lumières",
submit: "Appliquer la bichromie",
submitBatch: "Appliquer la bichromie ({count} fichiers)",
progressLabel: "Application de la bichromie",
},
"image-pad": {
target: "Ratio cible",
color: "Couleur d'arrière-plan",
submit: "Ajouter des marges",
submitBatch: "Ajouter des marges ({count} fichiers)",
progressLabel: "Ajout de marges",
},
pixelate: {
blockSize: "Taille des blocs",
submit: "Pixéliser",
submitBatch: "Pixéliser ({count} fichiers)",
progressLabel: "Pixélisation",
},
vignette: {
strength: "Intensité",
color: "Couleur du vignettage",
submit: "Appliquer le vignettage",
submitBatch: "Appliquer le vignettage ({count} fichiers)",
progressLabel: "Application du vignettage",
},
"gif-webp": {
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion de l'animation",
},
histogram: {
submit: "Générer l'histogramme",
submitBatch: "Générer l'histogramme ({count} fichiers)",
progressLabel: "Génération de l'histogramme",
},
"lqip-placeholder": {
width: "Largeur",
blur: "Flou",
submit: "Générer l'aperçu",
submitBatch: "Générer l'aperçu ({count} fichiers)",
progressLabel: "Génération de l'aperçu",
},
"sprite-sheet": {
columns: "Colonnes",
padding: "Espacement",
background: "Couleur d'arrière-plan",
submit: "Créer la feuille de sprites",
submitBatch: "Créer la feuille de sprites",
progressLabel: "Création de la feuille de sprites",
},
"svg-to-raster": {
outputFormat: "Format de sortie",
sizing: "Dimensionnement",
scaleMode: "Échelle",
customMode: "Personnalisé",
scalePresets: "Presets d'échelle",
dpiPresets: "Presets de DPI",
customWidth: "Largeur (px)",
customHeight: "Hauteur (px)",
background: "Arrière-plan",
bgTransparent: "Transparent",
bgColor: "Couleur",
quality: "Qualité",
submit: "Convertir le SVG",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion du SVG",
},
vectorize: {
preset: "Préréglage",
logo: "Logo",
illustration: "Illustration",
photo: "Photo",
sketch: "Croquis",
customPreset: "Personnalisé",
colorMode: "Mode couleur",
bw: "N&B",
colorModeColor: "Couleur",
threshold: "Seuil",
colorPrecision: "Précision des couleurs",
layerDifference: "Différence de calque",
filterSpeckle: "Filtrer les taches",
pathMode: "Mode de tracé",
cornerThreshold: "Seuil d'angle",
invertColors: "Inverser les couleurs",
submit: "Vectoriser",
submitBatch: "Vectoriser ({count} fichiers)",
progressLabel: "Vectorisation en cours",
},
"gif-tools": {
mode: "Mode",
resize: "Redimensionner",
optimize: "Optimiser",
speed: "Vitesse",
reverse: "Inverser",
extract: "Extraire",
rotateMode: "Rotation",
pixel: "Pixel",
percentage: "Pourcentage",
colors: "Couleurs",
dither: "Tramage",
effort: "Effort",
speedFactor: "Facteur de vitesse",
loopControl: "Contrôle de boucle",
infinite: "Infini",
once: "Une fois",
customLoop: "Personnalisé",
loopCount: "Nombre de boucles",
extractSingle: "Unique",
extractRange: "Plage",
extractAll: "Tout",
frameNumber: "Numéro d'image",
frameStart: "Image de début",
frameEnd: "Image de fin",
extractFormat: "Format",
submit: "Traiter le GIF",
submitBatch: "Traiter ({count} fichiers)",
progressLabel: "Traitement du GIF",
},
"image-to-base64": {
outputFormat: "Format de sortie",
keepOriginal: "Conserver l'original",
quality: "Qualité",
maxWidth: "Largeur maximale",
maxHeight: "Hauteur maximale",
submit: "Convertir en Base64",
submitBatch: "Convertir ({count} fichiers)",
copyBase64: "Copier Base64",
copyDataUri: "Copier Data URI",
copyImgTag: "Copier la balise <img>",
copyCssUrl: "Copier CSS url()",
},
"barcode-generate": {
text: "Texte",
type: "Type de code-barres",
scale: "Échelle",
includeText: "Inclure le texte",
submit: "Générer le code-barres",
download: "Télécharger le code-barres",
},
"chart-maker": {
kind: "Type de graphique",
title: "Titre",
width: "Largeur",
height: "Hauteur",
submit: "Créer le graphique",
submitBatch: "Créer le graphique ({count} fichiers)",
progressLabel: "Création du graphique",
},
"enhance-faces-standalone": {
model: "Modèle",
fast: "Rapide",
balanced: "Équilibré",
best: "Optimal",
},
"convert-video": {
format: "Format de sortie",
quality: "Qualité",
high: "Haute",
balanced: "Équilibrée",
small: "Minimale",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"compress-video": {
quality: "Compression",
light: "Légère",
balanced: "Équilibrée",
strong: "Forte",
resolution: "Résolution",
original: "Originale",
submit: "Compresser",
submitBatch: "Compresser ({count} fichiers)",
progressLabel: "Compression",
},
"trim-video": {
start: "Début (secondes)",
end: "Fin (secondes)",
precise: "Coupe précise (réencodage)",
submit: "Découper",
submitBatch: "Découper ({count} fichiers)",
progressLabel: "Découpage",
},
"mute-video": {
submit: "Supprimer l'audio",
submitBatch: "Supprimer l'audio ({count} fichiers)",
progressLabel: "Suppression de l'audio",
},
"video-to-gif": {
fps: "Images par seconde",
width: "Largeur (px)",
start: "Début (secondes)",
duration: "Durée (secondes)",
submit: "Créer le GIF",
submitBatch: "Créer les GIF ({count} fichiers)",
progressLabel: "Création du GIF",
},
"resize-video": {
preset: "Préréglage",
width: "Largeur (px)",
height: "Hauteur (px)",
hint: "Laissez une dimension vide pour conserver le ratio",
submit: "Redimensionner",
submitBatch: "Redimensionner ({count} fichiers)",
progressLabel: "Redimensionnement",
},
"crop-video": {
width: "Largeur (px)",
height: "Hauteur (px)",
x: "Décalage X",
y: "Décalage Y",
submit: "Recadrer",
submitBatch: "Recadrer ({count} fichiers)",
progressLabel: "Recadrage",
},
"rotate-video": {
transform: "Transformation",
cw90: "Rotation 90° horaire",
ccw90: "Rotation 90° antihoraire",
rotate180: "Rotation 180°",
hflip: "Miroir horizontal",
vflip: "Miroir vertical",
submit: "Pivoter",
submitBatch: "Pivoter ({count} fichiers)",
progressLabel: "Rotation",
},
"change-fps": {
fps: "Images par seconde",
submit: "Modifier le FPS",
submitBatch: "Modifier le FPS ({count} fichiers)",
progressLabel: "Modification du FPS",
},
"video-color": {
brightness: "Luminosité",
contrast: "Contraste",
saturation: "Saturation",
gamma: "Gamma",
submit: "Appliquer",
submitBatch: "Appliquer ({count} fichiers)",
progressLabel: "Ajustement des couleurs",
},
"video-speed": {
factor: "Facteur de vitesse",
keepPitch: "Conserver la hauteur d'origine",
submit: "Modifier la vitesse",
submitBatch: "Modifier la vitesse ({count} fichiers)",
progressLabel: "Modification de la vitesse",
},
"reverse-video": {
hint: "Limité aux clips de 5 minutes maximum",
submit: "Inverser",
submitBatch: "Inverser ({count} fichiers)",
progressLabel: "Inversion",
},
"video-loudnorm": {
hint: "Normalise l'audio selon la norme de diffusion EBU R128",
submit: "Normaliser",
submitBatch: "Normaliser ({count} fichiers)",
progressLabel: "Normalisation",
},
"aspect-pad": {
target: "Ratio cible",
color: "Couleur d'arrière-plan",
colorHint: "Couleur HEX, ex. #000000",
submit: "Ajouter des marges",
submitBatch: "Ajouter des marges ({count} fichiers)",
progressLabel: "Ajout de marges",
},
"blur-pad": {
target: "Ratio cible",
blur: "Intensité du flou",
submit: "Ajouter des marges",
submitBatch: "Ajouter des marges ({count} fichiers)",
progressLabel: "Ajout de marges",
},
"watermark-video": {
text: "Texte du filigrane",
position: "Position",
fontSize: "Taille de police",
opacity: "Opacité",
color: "Couleur",
colorHint: "Couleur HEX, ex. #ffffff",
submit: "Filigraner",
submitBatch: "Filigraner ({count} fichiers)",
progressLabel: "Application du filigrane",
},
"stabilize-video": {
smoothing: "Lissage",
hint: "Effectue deux passes et prend plus de temps que la plupart des outils",
submit: "Stabiliser",
submitBatch: "Stabiliser ({count} fichiers)",
progressLabel: "Stabilisation",
},
"gif-to-video": {
format: "Format de sortie",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"video-to-webp": {
fps: "Images par seconde",
width: "Largeur (px)",
quality: "Qualité",
loop: "Boucler l'animation",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"video-to-frames": {
mode: "Mode d'extraction",
modeAll: "Toutes les images",
modeNth: "Une image sur N",
modeTimestamps: "Horodatages spécifiques",
n: "Prendre une image sur N",
timestamps: "Horodatages (secondes)",
timestampsHint: "Séparés par des virgules, ex. 0.5, 2, 4.5",
format: "Format d'image",
submit: "Extraire les images",
submitBatch: "Extraire les images ({count} fichiers)",
progressLabel: "Extraction des images",
},
"merge-videos": {
hint: "Les fichiers sont assemblés dans l'ordre d'envoi",
submit: "Fusionner",
submitBatch: "Fusionner ({count} fichiers)",
progressLabel: "Fusion",
},
"replace-audio": {
hint: "Envoyez d'abord la vidéo, puis l'audio",
submit: "Remplacer l'audio",
submitBatch: "Remplacer l'audio ({count} fichiers)",
progressLabel: "Remplacement de l'audio",
},
"burn-subtitles": {
fontSize: "Taille de police",
hint: "Importez une vidéo et un fichier de sous-titres (.srt ou .vtt)",
submit: "Incruster les sous-titres",
submitBatch: "Incruster les sous-titres ({count} fichiers)",
progressLabel: "Incrustation des sous-titres",
},
"embed-subtitles": {
language: "Code langue",
languageHint: "Code ISO 639-2 à trois lettres, ex. eng, spa, fra",
submit: "Intégrer les sous-titres",
submitBatch: "Intégrer les sous-titres ({count} fichiers)",
progressLabel: "Intégration des sous-titres",
},
"extract-subtitles": {
submit: "Extraire les sous-titres",
submitBatch: "Extraire les sous-titres ({count} fichiers)",
progressLabel: "Extraction des sous-titres",
},
"images-to-video": {
secondsPerImage: "Secondes par image",
resolution: "Résolution",
fps: "Images par seconde",
submit: "Créer la vidéo",
submitBatch: "Créer la vidéo ({count} fichiers)",
progressLabel: "Création du diaporama",
},
"video-metadata": {
hint: "Le rapport de métadonnées apparaît dans le résultat",
submit: "Supprimer les métadonnées",
submitBatch: "Supprimer les métadonnées ({count} fichiers)",
progressLabel: "Suppression des métadonnées",
},
"convert-audio": {
format: "Format de sortie",
bitrate: "Débit (kbps)",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"trim-audio": {
start: "Début (secondes)",
end: "Fin (secondes)",
submit: "Couper",
submitBatch: "Couper ({count} fichiers)",
progressLabel: "Découpage",
},
"extract-audio": {
format: "Format de sortie",
submit: "Extraire",
submitBatch: "Extraire ({count} fichiers)",
progressLabel: "Extraction",
},
"volume-adjust": {
"gain-db": "Gain (dB)",
submit: "Ajuster le volume",
submitBatch: "Ajuster le volume ({count} fichiers)",
progressLabel: "Ajustement du volume",
},
"normalize-audio": {
hint: "Normalisation du volume EBU R128",
submit: "Normaliser",
submitBatch: "Normaliser ({count} fichiers)",
progressLabel: "Normalisation",
},
"fade-audio": {
"fade-in-s": "Fondu d'ouverture (secondes)",
"fade-out-s": "Fondu de fermeture (secondes)",
submit: "Appliquer le fondu",
submitBatch: "Appliquer le fondu ({count} fichiers)",
progressLabel: "Application du fondu",
},
"reverse-audio": {
submit: "Inverser",
submitBatch: "Inverser ({count} fichiers)",
progressLabel: "Inversion",
},
"audio-speed": {
factor: "Facteur de vitesse",
submit: "Changer la vitesse",
submitBatch: "Changer la vitesse ({count} fichiers)",
progressLabel: "Changement de vitesse",
},
"pitch-shift": {
semitones: "Demi-tons",
hint: "0 demi-ton n'est pas autorisé",
submit: "Modifier la hauteur",
submitBatch: "Modifier la hauteur ({count} fichiers)",
progressLabel: "Modification de la hauteur",
},
"audio-channels": {
mode: "Mode canal",
"stereo-to-mono": "Stéréo vers mono",
"mono-to-stereo": "Mono vers stéréo",
swap: "Inverser gauche/droite",
submit: "Convertir les canaux",
submitBatch: "Convertir les canaux ({count} fichiers)",
progressLabel: "Conversion des canaux",
},
"silence-removal": {
"threshold-db": "Seuil de silence (dB)",
"min-silence-s": "Durée minimale du silence (secondes)",
submit: "Supprimer le silence",
submitBatch: "Supprimer le silence ({count} fichiers)",
progressLabel: "Suppression du silence",
},
"noise-reduction": {
strength: "Intensité",
light: "Légère",
medium: "Moyenne",
strong: "Forte",
submit: "Réduire le bruit",
submitBatch: "Réduire le bruit ({count} fichiers)",
progressLabel: "Réduction du bruit",
},
"merge-audio": {
format: "Format de sortie",
mp3: "MP3",
wav: "WAV",
flac: "FLAC",
m4a: "M4A",
"order-hint": "Les fichiers seront joints dans l'ordre de téléversement",
submit: "Fusionner l'audio",
submitBatch: "Fusionner l'audio ({count} fichiers)",
progressLabel: "Fusion de l'audio",
},
"split-audio": {
mode: "Mode de division",
time: "Par durée",
parts: "Parties égales",
silence: "Par silence",
"segment-s": "Durée du segment (secondes)",
"num-parts": "Nombre de parties",
"threshold-db": "Seuil de silence (dB)",
"min-silence-s": "Durée minimale du silence (secondes)",
submit: "Diviser l'audio",
submitBatch: "Diviser l'audio ({count} fichiers)",
progressLabel: "Division de l'audio",
},
"ringtone-maker": {
"start-s": "Début (secondes)",
"duration-s": "Durée (secondes)",
"max-hint": "30 secondes maximum",
submit: "Créer la sonnerie",
submitBatch: "Créer la sonnerie ({count} fichiers)",
progressLabel: "Création de la sonnerie",
},
"waveform-image": {
width: "Largeur (px)",
height: "Hauteur (px)",
color: "Couleur de la forme d'onde",
submit: "Générer la forme d'onde",
submitBatch: "Générer la forme d'onde ({count} fichiers)",
progressLabel: "Génération de la forme d'onde",
},
"audio-metadata": {
strip: "Supprimer toutes les métadonnées",
title: "Titre",
artist: "Artiste",
album: "Album",
submit: "Appliquer les métadonnées",
submitBatch: "Appliquer les métadonnées ({count} fichiers)",
progressLabel: "Application des métadonnées",
},
"merge-pdf": {
addFiles: "Ajouter des PDF à fusionner",
needTwo: "Au moins deux PDF sont requis",
orderHint: "{count} PDF seront fusionnés dans cet ordre",
submit: "Fusionner",
submitBatch: "Fusionner ({count} fichiers)",
progressLabel: "Fusion",
},
"split-pdf": {
mode: "Mode de division",
range: "Plage de pages",
rangeHint: "ex. 1-3, 5, 7-z",
everyN: "Pages par partie",
submit: "Diviser",
submitBatch: "Diviser ({count} fichiers)",
progressLabel: "Division",
},
"compress-pdf": {
preset: "Préréglage de qualité",
screen: "Écran (le plus petit)",
ebook: "Ebook (équilibré)",
printer: "Imprimante (meilleure qualité)",
submit: "Compresser",
submitBatch: "Compresser ({count} fichiers)",
progressLabel: "Compression",
},
"rotate-pdf": {
angle: "Angle de rotation",
range: "Plage de pages",
rangeHint: "ex. 1-3, 5, 1-z (toutes les pages)",
submit: "Pivoter",
submitBatch: "Pivoter ({count} fichiers)",
progressLabel: "Rotation",
},
"convert-document": {
format: "Format de sortie",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"convert-presentation": {
format: "Format de sortie",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"convert-spreadsheet": {
format: "Format de sortie",
hint: "Les classeurs multi-feuilles exportent la première feuille en CSV.",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"excel-to-pdf": {
submit: "Convertir en PDF",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"powerpoint-to-pdf": {
submit: "Convertir en PDF",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"word-to-pdf": {
submit: "Convertir en PDF",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"extract-pages": {
range: "Plage de pages",
rangeHint: "ex. 1-3, 5, 7-z",
submit: "Extraire",
submitBatch: "Extraire ({count} fichiers)",
progressLabel: "Extraction",
},
"remove-pages": {
pages: "Pages à supprimer",
pagesHint: "ex. 2, 4-6, z (dernière page)",
submit: "Supprimer",
submitBatch: "Supprimer ({count} fichiers)",
progressLabel: "Suppression",
},
"organize-pdf": {
order: "Ordre des pages",
orderHint: "ex. 3,1,2 ou 1-z (identique)",
submit: "Réorganiser",
submitBatch: "Réorganiser ({count} fichiers)",
progressLabel: "Réorganisation",
},
"protect-pdf": {
userPassword: "Mot de passe utilisateur",
ownerPassword: "Mot de passe propriétaire (optionnel)",
ownerPasswordHint: "Par défaut, le mot de passe utilisateur est utilisé",
submit: "Protéger",
submitBatch: "Protéger ({count} fichiers)",
progressLabel: "Chiffrement",
},
"unlock-pdf": {
password: "Mot de passe",
submit: "Déverrouiller",
submitBatch: "Déverrouiller ({count} fichiers)",
progressLabel: "Déchiffrement",
},
"repair-pdf": {
submit: "Réparer",
submitBatch: "Réparer ({count} fichiers)",
progressLabel: "Réparation",
},
"linearize-pdf": {
submit: "Optimiser",
submitBatch: "Optimiser ({count} fichiers)",
progressLabel: "Linéarisation",
},
"grayscale-pdf": {
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"pdfa-convert": {
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"crop-pdf": {
margin: "Marge (points)",
submit: "Recadrer",
submitBatch: "Recadrer ({count} fichiers)",
progressLabel: "Recadrage",
},
"nup-pdf": {
perSheet: "Pages par feuille",
submit: "Disposer",
submitBatch: "Disposer ({count} fichiers)",
progressLabel: "Disposition",
},
"booklet-pdf": {
perSheet: "Pages par feuille",
submit: "Créer un livret",
submitBatch: "Créer un livret ({count} fichiers)",
progressLabel: "Création du livret",
},
"watermark-pdf": {
text: "Texte du filigrane",
position: "Position",
fontSize: "Taille de police",
opacity: "Opacité",
rotation: "Rotation",
submit: "Filigraner",
submitBatch: "Filigraner ({count} fichiers)",
progressLabel: "Application du filigrane",
},
"pdf-page-numbers": {
position: "Position",
fontSize: "Taille de police",
submit: "Ajouter la numérotation",
submitBatch: "Ajouter la numérotation ({count} fichiers)",
progressLabel: "Numérotation",
},
"flatten-pdf": {
submit: "Aplatir",
submitBatch: "Aplatir ({count} fichiers)",
progressLabel: "Aplatissement",
},
"sign-pdf": {
yourSignatures: "Vos signatures",
newSignature: "Nouvelle",
clickToPlace: "Cliquez sur une signature pour la placer sur la page actuelle.",
selectedSignature: "Signature sélectionnée",
dragToAdjust: "Faites glisser les poignées pour redimensionner ou pivoter.",
disclaimer:
"Ajoute une image de signature visible. Ce n'est pas une signature numérique basée sur un certificat.",
signing: "Signature en cours…",
signingPercent: "Signature en cours… {percent}%",
downloadSigned: "Télécharger le PDF signé",
addFirst: "Ajoutez au moins une signature avant de télécharger.",
pad: {
title: "Créer une signature",
draw: "Dessiner",
type: "Saisir",
upload: "Importer",
color: "Couleur",
pen: "Stylo",
namePlaceholder: "Saisissez votre nom",
yourName: "Votre nom",
remember: "Mémoriser sur cet appareil",
save: "Enregistrer et placer",
uploadHint:
"Déposez un PNG / JPG ou cliquez pour choisir. Un PNG transparent fonctionne le mieux.",
},
},
"redact-pdf": {
terms: "Termes à masquer",
termsHint: "Un terme par ligne (max 50)",
caseSensitive: "Sensible à la casse",
submit: "Masquer",
submitBatch: "Masquer ({count} fichiers)",
progressLabel: "Masquage",
},
"pdf-to-text": {
submit: "Extraire le texte",
submitBatch: "Extraire le texte ({count} fichiers)",
progressLabel: "Extraction",
},
"pdf-to-word": {
hint: "Idéal pour les PDF textuels ; les pages numérisées nécessitent l'OCR",
submit: "Convertir en Word",
submitBatch: "Convertir en Word ({count} fichiers)",
progressLabel: "Conversion",
},
"pdf-metadata": {
title: "Titre",
author: "Auteur",
subject: "Sujet",
keywords: "Mots-clés",
submit: "Définir les métadonnées",
submitBatch: "Définir les métadonnées ({count} fichiers)",
progressLabel: "Définition des métadonnées",
},
"html-to-pdf": {
hint: "Les ressources distantes sont désactivées pour la confidentialité.",
submit: "Convertir en PDF",
submitBatch: "Convertir en PDF ({count} fichiers)",
progressLabel: "Conversion",
},
"markdown-to-docx": {
submit: "Convertir en DOCX",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"markdown-to-html": {
hint: "Les images distantes dans la source sont conservées telles quelles dans le résultat.",
submit: "Convertir en HTML",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"markdown-to-pdf": {
hint: "Les ressources distantes sont désactivées pour la confidentialité.",
submit: "Convertir en PDF",
submitBatch: "Convertir en PDF ({count} fichiers)",
progressLabel: "Conversion",
},
"epub-convert": {
format: "Format de sortie",
hint: "Les ressources distantes dans le livre ne sont pas récupérées.",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"to-epub": {
submit: "Convertir en EPUB",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"csv-excel": {
sheet: "Numéro de feuille",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"csv-json": {
pretty: "Mise en forme",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"json-xml": {
pretty: "Mise en forme",
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"split-csv": {
rowsPerFile: "Lignes par fichier",
keepHeader: "Conserver l'en-tête dans chaque fichier",
submit: "Diviser",
submitBatch: "Diviser ({count} fichiers)",
progressLabel: "Division",
},
"merge-csvs": {
submit: "Fusionner",
submitBatch: "Fusionner ({count} fichiers)",
progressLabel: "Fusion",
},
"yaml-json": {
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"xml-to-csv": {
submit: "Convertir",
submitBatch: "Convertir ({count} fichiers)",
progressLabel: "Conversion",
},
"create-zip": {
submit: "Créer un ZIP",
submitBatch: "Créer un ZIP ({count} fichiers)",
progressLabel: "Compression",
},
"extract-zip": {
submit: "Extraire",
submitBatch: "Extraire ({count} fichiers)",
progressLabel: "Extraction",
},
},
urlImport: {
title: "Importer depuis des URLs",
placeholder: "Collez des URLs d'images, une par ligne...",
importButton: "Importer les URLs",
addButton: "Ajouter {count} fichiers",
adding: "Ajout en cours...",
retryButton: "Réessayer",
cancelButton: "Annuler",
readyCount: "{count} prêts",
failedStatus: "Échec",
},
comparison: {
original: "Original",
processed: "Traité",
before: "Avant",
after: "Après",
savings: "Économie",
},
toolPage: {
emptyPrompt: "Déposez ou importez une image pour commencer",
filesCount: "Fichiers ({count})",
addMore: "+ Ajouter",
clearAll: "Tout effacer",
acceptDescription: "Fichiers {exts} uniquement",
notFound: "Outil introuvable",
configureAndGenerate: "Configurez les paramètres et générez.",
processingFailed: "Échec du traitement pour ce fichier",
conversionComplete: "Conversion terminée",
cannotPreviewDownload:
"Les fichiers {type} ne peuvent pas être prévisualisés dans le navigateur. Utilisez le bouton de téléchargement pour enregistrer votre fichier.",
generatingPreview: "Génération de l'aperçu...",
cannotPreviewWillProcess:
"Les fichiers {ext} ne peuvent pas être prévisualisés dans le navigateur. L'outil traitera ce fichier normalement.",
previousImage: "Fichier précédent",
nextImage: "Fichier suivant",
imageCounter: "{current} / {total}",
settingsLabel: "Paramètres",
downloadAllZip: "Tout télécharger (ZIP)",
hideSettings: "Masquer les paramètres",
imageArea: "Zone d'aperçu",
disabledByAdmin: "Cet outil a été désactivé par votre administrateur",
browseOtherTools: "Parcourir les autres outils",
privacyNote: "Les fichiers sont traités sur votre serveur et ne quittent jamais votre réseau",
applyAndDownload: "Appliquer et télécharger",
andMore: "et {count} de plus",
importFromFiles: "Importer depuis Fichiers",
saveToFiles: "Enregistrer dans Fichiers",
savedToFiles: "Enregistré dans Fichiers",
adjustSettings: "Ajuster les paramètres",
startOver: "Recommencer avec un nouveau fichier",
newFile: "Nouveau fichier",
previewUnavailable: "L'aperçu sera disponible après le traitement",
generatePreview: "Générer l'aperçu",
previewFailed: "Échec de la génération de l'aperçu",
backToTools: "Retour aux outils",
original: "Original",
processed: "Traité",
saved: "Enregistré",
noChange: "aucun changement",
download: "Télécharger",
settingsSaved: "Vos paramètres sont enregistrés.",
tryAgain: "Réessayer",
tryDifferentFile: "Essayer un autre fichier",
batchPartialSuccess: "{success} sur {total} traités. {failed} en échec.",
dataResultsHint:
"Résultats affichés ci-dessus. Utilisez le bouton copier dans le panneau de résultats.",
downloadAsFile: "Télécharger en fichier",
downloadAll: "Tout télécharger",
downloadFiles: "Télécharger {count} fichiers",
audioDecodeUnsupported: "Ce format audio ne peut pas être prévisualisé dans le navigateur",
},
homePage: {
generatingPreview: "Génération de l'aperçu...",
loadingPreview: "Chargement de l'aperçu...",
changeFile: "Changer de fichier",
quickActions: "Actions rapides",
allTools: "Tous les outils",
searchPlaceholder: "Rechercher parmi {count} outils...",
recent: "Récents",
popular: "Populaires",
browseByCategory: "Parcourir par catégorie",
gettingStarted: "Pour commencer",
noToolsMatch: "Aucun outil ne correspond à « {query} »",
clearSearch: "Effacer la recherche",
requestToolCta: "Demander '{query}'",
requestToolBelowResults: "Introuvable ? Demandez un outil",
all: "Tous",
documents: "PDF",
data: "Fichiers",
pdf: "PDF",
files: "Fichiers",
toolCount: "{count} outils",
heading: "Outils SnapOtter",
},
fullscreenGrid: {
searchPlaceholder: "Rechercher des outils...",
hideDetails: "Masquer les détails",
showDetails: "Afficher les détails",
switchToSidebar: "Passer à la vue barre latérale",
sidebarButton: "Barre latérale",
noToolsFound: "Aucun outil trouvé",
tryDifferent: "Essayez un autre terme de recherche",
},
editor: {
menu: {
file: {
label: "Fichier",
new: "Nouveau",
open: "Ouvrir",
save: "Enregistrer",
exportAs: "Exporter sous...",
quickExportPng: "Export rapide en PNG",
close: "Fermer",
},
edit: {
label: "Édition",
undo: "Annuler",
redo: "Rétablir",
cut: "Couper",
copy: "Copier",
copyMerged: "Copier avec fusion",
paste: "Coller",
pasteInPlace: "Coller sur place",
delete: "Supprimer",
freeTransform: "Transformation libre",
transform: {
label: "Transformation",
scale: "Échelle",
rotate: "Rotation",
skew: "Inclinaison",
flipHorizontal: "Miroir horizontal",
flipVertical: "Miroir vertical",
},
},
image: {
label: "Image",
imageSize: "Taille de l'image...",
canvasSize: "Taille du canevas...",
rotation: {
label: "Rotation de l'image",
cw90: "90 sens horaire",
ccw90: "90 sens antihoraire",
r180: "180",
flipHorizontal: "Miroir horizontal",
flipVertical: "Miroir vertical",
},
trim: "Rogner",
adjustments: {
label: "Réglages",
brightnessContrast: "Luminosité/Contraste",
hueSaturation: "Teinte/Saturation",
colorBalance: "Balance des couleurs",
levels: "Niveaux",
curves: "Courbes",
},
},
layer: {
label: "Calque",
newLayer: "Nouveau calque",
duplicateLayer: "Dupliquer le calque",
deleteLayer: "Supprimer le calque",
arrange: {
label: "Organiser",
bringToFront: "Mettre au premier plan",
bringForward: "Avancer",
sendBackward: "Reculer",
sendToBack: "Mettre en arrière-plan",
},
mergeDown: "Fusionner vers le bas",
flattenImage: "Aplatir l'image",
},
select: {
label: "Sélection",
all: "Tout",
deselect: "Désélectionner",
inverse: "Inverser",
colorRange: "Plage de couleurs...",
},
filter: {
label: "Filtre",
blur: {
label: "Flou",
gaussian: "Flou gaussien",
motion: "Flou de mouvement",
radial: "Flou radial",
surface: "Flou de surface",
},
sharpen: {
label: "Netteté",
sharpen: "Netteté",
unsharpMask: "Masque flou",
},
noise: {
label: "Bruit",
addNoise: "Ajouter du bruit",
reduceNoise: "Réduire le bruit",
},
pixelate: {
label: "Pixelisation",
pixelate: "Pixeliser",
mosaic: "Mosaïque",
},
stylize: {
label: "Styliser",
emboss: "Relief",
solarize: "Solariser",
posterize: "Postériser",
},
grayscale: "Niveaux de gris",
sepia: "Sépia",
invert: "Inverser",
},
view: {
label: "Affichage",
zoomIn: "Zoom avant",
zoomOut: "Zoom arrière",
fitOnScreen: "Ajuster à l'écran",
actualPixels: "Pixels réels",
rulers: "Règles",
grid: "Grille",
guides: "Repères",
snap: "Magnétisme",
panels: "Panneaux",
},
},
menuBar: {
backTitle: "Retour à SnapOtter",
},
welcome: {
ariaLabel: "Zone de dépôt d'image",
heading: "Éditeur d'images",
dropDescription: "Déposez une image ici pour commencer",
openImageButton: "Ouvrir une image",
newDocumentButton: "Nouveau document",
pasteHint: "Ou collez depuis le presse-papiers (Ctrl+V)",
},
mobile: {
heading: "Bureau recommandé",
description:
"L'éditeur d'images fonctionne mieux sur les écrans de bureau. Veuillez passer à un appareil avec un écran plus grand pour profiter pleinement de l'expérience d'édition.",
},
errors: {
serverDecodeFailed: "Échec du décodage serveur",
},
shapes: {
shape: "Forme",
fill: "Remplissage",
stroke: "Contour",
strokeWidth: "Épaisseur",
cornerRadius: "Rayon",
sides: "Côtés",
points: "Pointes",
dashStyle: "Tiret",
solid: "Continu",
dashed: "Tirets",
dotted: "Pointillé",
none: "Aucun",
opacity: "Opacité",
rectangle: "Rectangle",
ellipse: "Ellipse",
line: "Ligne",
arrow: "Flèche",
polygon: "Polygone",
star: "Étoile",
},
},
settings: {
heading: "Paramètres",
nav: {
general: "Général",
systemSettings: "Paramètres système",
security: "Sécurité",
people: "Personnes",
teams: "Équipes",
roles: "Rôles",
auditLog: "Journal d'audit",
usage: "Utilisation",
apiKeys: "Clés API",
aiFeatures: "Fonctionnalités AI",
tools: "Outils",
about: "À propos",
},
general: {
heading: "Général",
description: "Préférences utilisateur et paramètres d'affichage.",
loading: "Chargement...",
logOut: "Se déconnecter",
defaultToolViewLabel: "Vue par défaut des outils",
defaultToolViewDescription: "Comment les outils sont affichés sur la page d'accueil",
sidebarOption: "Barre latérale",
fullscreenGridOption: "Grille plein écran",
appVersionLabel: "Version de l'application",
appVersionDescription: "Version actuelle de SnapOtter",
saveButton: "Enregistrer les paramètres",
saveSuccess: "Paramètres enregistrés.",
saveFailed: "Échec de l'enregistrement des paramètres.",
},
system: {
heading: "Paramètres système",
description: "Configuration côté serveur et limites.",
fileUploadLimitLabel: "Limite d'import de fichier (MB)",
fileUploadLimitDescription: "Taille maximale de fichier par import",
defaultThemeLabel: "Thème par défaut",
defaultThemeDescription: "Thème appliqué pour les nouvelles sessions",
lightOption: "Clair",
darkOption: "Sombre",
systemOption: "Système",
languageLabel: "Langue",
languageDescription: "Langue de l'interface",
loginAttemptLimitLabel: "Limite de tentatives de connexion",
loginAttemptLimitDescription:
"Nombre maximal de tentatives de connexion échouées par minute avant verrouillage",
fileManagementHeading: "Gestion des fichiers",
maxFileAgeLabel: "Âge maximal des fichiers (heures)",
maxFileAgeDescription:
"Durée de conservation des fichiers traités avant nettoyage automatique",
startupCleanupLabel: "Nettoyage au démarrage",
startupCleanupDescription: "Nettoie les anciens fichiers temporaires au démarrage du serveur",
saveButton: "Enregistrer les paramètres",
saveSuccess: "Paramètres enregistrés.",
saveFailed: "Échec de l'enregistrement des paramètres.",
limitsAndResources: "Limites et ressources",
maxFileSize: "Taille de fichier maximale",
maxBatchSize: "Taille de lot maximale",
concurrentJobs: "Tâches simultanées",
workerThreads: "Fils d'exécution",
maxPipelineSteps: "Étapes Pipeline maximales",
processingTimeout: "Délai de traitement",
rateLimitPerMin: "Limite de requêtes (req/min)",
unlimited: "Illimité",
auto: "Automatique",
envOverride: "Défini par variable d'environnement",
maxCanvasPixels: "Pixels de canevas maximaux",
maxSvgSize: "Taille SVG maximale",
maxSplitGrid: "Grille de découpage maximale",
maxPdfPages: "Pages PDF maximales",
sessionDuration: "Durée de la session",
supportBundleButton: "Télécharger le diagnostic",
supportBundleDescription:
"Téléchargez une archive de diagnostic avec la configuration masquée, les journaux et les données de tâches.",
supportBundleFailed: "Échec du téléchargement du diagnostic.",
},
privacy: {
title: "Confidentialité",
description:
"Les statistiques produit anonymes aident à améliorer SnapOtter. Elles sont activées par défaut et configurées pour toute l'instance par un administrateur.",
analyticsLabel: "Statistiques produit anonymes",
analyticsDescription:
"Partagez des données d'usage anonymes (quels outils sont exécutés, durées, codes d'erreur) et des rapports de plantage. Aucune adresse IP, aucune identité de compte. Nous ne collectons jamais vos noms de fichiers, le contenu des fichiers, les résultats d'OCR, les métadonnées d'images ni le texte des documents. Désactivez cette option pour tout arrêter.",
},
security: {
heading: "Sécurité",
description: "Paramètres de mot de passe et d'authentification.",
changePasswordHeading: "Changer le mot de passe",
currentPasswordPlaceholder: "Mot de passe actuel",
newPasswordPlaceholder: "Nouveau mot de passe",
confirmPasswordPlaceholder: "Confirmer le nouveau mot de passe",
passwordsMismatch: "Les mots de passe ne correspondent pas",
passwordTooShort: "Le mot de passe doit contenir au moins 4 caractères",
changeSuccess: "Mot de passe modifié avec succès",
changeFailed: "Échec de la modification du mot de passe",
currentPasswordIncorrect: "Le mot de passe actuel est incorrect",
changePasswordButton: "Changer le mot de passe",
loginAttemptLimitNote:
"Les limites de tentatives de connexion peuvent être configurées dans les Paramètres système.",
adminHeading: "Paramètres de sécurité admin",
adminDescription:
"Paramètres de politique de sécurité entreprise. S'appliquent à tous les utilisateurs.",
sessionIdleTimeout: "Délai d'inactivité de session (minutes)",
sessionIdleTimeoutDesc: "Déconnexion automatique des sessions inactives. 0 = désactivé.",
maxSessionsPerUser: "Sessions max par utilisateur",
maxSessionsPerUserDesc: "Limiter les sessions simultanées par utilisateur. 0 = illimité.",
mfaPolicy: "Politique MFA",
mfaPolicyDesc: "Exiger l'authentification multifacteur pour les utilisateurs.",
mfaPolicyOptional: "Facultatif",
mfaPolicyAdminsOnly: "Obligatoire pour les admins",
mfaPolicyRequired: "Obligatoire pour tous les utilisateurs",
ssoEnforcement: "Application du SSO",
ssoEnforcementDesc:
"Exiger la connexion SSO pour tous les utilisateurs sans accès d'urgence.",
ssoBreakGlassUsername: "Identifiant admin d'urgence",
ssoBreakGlassUsernameDesc:
"Cet admin peut toujours se connecter avec des identifiants locaux lorsque le SSO est activé.",
passwordMinLength: "Longueur minimale du mot de passe",
passwordMinLengthDesc: "Nombre minimal de caractères requis pour les mots de passe.",
passwordRequireUppercase: "Majuscule requise",
passwordRequireUppercaseDesc: "Exiger au moins une lettre majuscule.",
passwordRequireNumber: "Chiffre requis",
passwordRequireNumberDesc: "Exiger au moins un chiffre.",
passwordRequireSpecial: "Caractère spécial requis",
passwordRequireSpecialDesc: "Exiger au moins un caractère spécial.",
passwordPolicyHeading: "Politique de mots de passe",
securitySettingsSaved: "Paramètres de sécurité enregistrés",
securitySettingsFailed: "Échec de l'enregistrement des paramètres de sécurité",
},
people: {
heading: "Personnes",
description: "Gérez les membres de l'espace de travail et leurs permissions",
userCount: "{count} utilisateur",
userCountPlural: "{count} utilisateurs",
searchPlaceholder: "Rechercher des membres...",
addMembersButton: "Ajouter des membres",
newMemberHeading: "Nouveau membre",
usernamePlaceholder: "Nom d'utilisateur",
passwordPlaceholder: "Mot de passe",
roleUserOption: "Utilisateur",
roleEditorOption: "Éditeur",
roleAdminOption: "Admin",
roleUserDescription: "Accès basique aux outils",
roleEditorDescription: "Tous les fichiers et pipelines",
roleAdminDescription: "Accès complet",
noDescription: "Aucune description",
defaultTeamOption: "Par défaut",
createButton: "Créer",
cancelButton: "Annuler",
createSuccess: "Utilisateur créé avec succès",
createFailed: "Échec de la création de l'utilisateur",
userLimitReached: "Limite d'utilisateurs atteinte ({max} maximum)",
deleteConfirm: 'Supprimer l\'utilisateur "{username}" ? Cette action est irréversible.',
deleteSuccess: 'Utilisateur "{username}" supprimé',
deleteFailed: "Échec de la suppression de l'utilisateur",
editHeading: "Modifier {username}",
updateSuccess: "Utilisateur mis à jour",
updateFailed: "Échec de la mise à jour de l'utilisateur",
cannotRemoveOwnAdmin: "Vous ne pouvez pas supprimer votre propre rôle administrateur",
resetPasswordHeading: "Réinitialiser le mot de passe de {username}",
newPasswordLabel: "Nouveau mot de passe (min. 8 caractères)",
resetPasswordButton: "Réinitialiser le mot de passe",
resetPasswordWarning: "Cela invalidera toutes les sessions et clés API de cet utilisateur.",
resetSuccess: "Mot de passe réinitialisé avec succès",
resetFailed: "Échec de la réinitialisation du mot de passe",
tableHeaderUser: "Utilisateur",
tableHeaderRole: "Rôle",
tableHeaderTeam: "Équipe",
noSearchResults: "Aucun membre ne correspond à votre recherche.",
noUsersFound: "Aucun utilisateur trouvé.",
authBadgeLocalOidc: "Local + OIDC",
authBadgeOidc: "OIDC",
editRoleTeamAction: "Modifier le rôle / l'équipe",
resetPasswordAction: "Réinitialiser le mot de passe",
deleteUserAction: "Supprimer l'utilisateur",
saveButton: "Enregistrer",
copyPasswordButton: "Copier le mot de passe",
passwordCopied: "Copié !",
copyPasswordWarning:
"Copiez ce mot de passe maintenant. Vous ne pourrez plus le voir après la création de l'utilisateur.",
},
teams: {
heading: "Équipes",
description: "Organisez les membres en équipes pour une meilleure gestion.",
createButton: "Créer une nouvelle équipe",
newTeamHeading: "Nouvelle équipe",
teamNamePlaceholder: "Nom de l'équipe",
createSubmitButton: "Créer",
cancelButton: "Annuler",
createSuccess: "Équipe créée avec succès",
createFailed: "Échec de la création de l'équipe",
duplicateTeamError: "Une équipe avec ce nom existe déjà",
renameSuccess: "Équipe renommée",
renameFailed: "Échec du renommage de l'équipe",
deleteConfirm: 'Supprimer l\'équipe "{name}" ? Les membres seront désaffectés.',
deleteSuccess: 'Équipe "{name}" supprimée',
deleteFailed: "Échec de la suppression de l'équipe",
cannotDeleteDefault:
"Impossible de supprimer l'équipe par défaut ou une équipe avec des membres",
tableHeaderTeamName: "Nom de l'équipe",
tableHeaderMembers: "Membres",
emptyState: "Aucune équipe trouvée.",
renameSaveButton: "Enregistrer",
renameCancelButton: "Annuler",
renameAction: "Renommer",
deleteAction: "Supprimer",
totalMembers: "Nombre total de membres",
nameRequired: "Le nom de l'équipe est requis",
nameTooLong: "Le nom de l'équipe doit contenir 50 caractères ou moins",
duplicateName: "Une équipe avec ce nom existe déjà",
teamStorageQuota: "Quota de stockage (MB)",
teamStorageQuotaDesc:
"Stockage maximum pour cette équipe en MB. Laisser vide pour aucune limite.",
teamRetentionHours: "Rétention (heures)",
teamRetentionHoursDesc:
"Rétention des fichiers traités pour cette équipe. Laisser vide pour la valeur par défaut.",
quotaSaved: "Paramètres d'équipe enregistrés",
},
roles: {
heading: "Rôles",
description:
"Gérez les rôles et leurs permissions. Les rôles prédéfinis ne peuvent pas être modifiés.",
createButton: "Créer un rôle personnalisé",
newRoleHeading: "Nouveau rôle",
roleNamePlaceholder: "Nom du rôle",
descriptionPlaceholder: "Description (optionnel)",
permissionsLabel: "Permissions",
createSubmitButton: "Créer",
cancelButton: "Annuler",
createSuccess: "Rôle créé avec succès",
createFailed: "Échec de la création du rôle",
duplicateRoleError: "Un rôle avec ce nom existe déjà",
editHeading: "Modifier le rôle : {name}",
editSaveButton: "Enregistrer",
editCancelButton: "Annuler",
updateSuccess: "Rôle mis à jour",
updateFailed: "Échec de la mise à jour du rôle",
deleteConfirm: 'Supprimer le rôle "{name}" ? {count} utilisateur(s) devront être réassignés.',
deleteConfirmSimple: 'Supprimer le rôle "{name}" ?',
deleteSuccess: 'Rôle "{name}" supprimé',
deleteFailed: "Échec de la suppression du rôle",
emptyState: "Aucun rôle trouvé.",
builtInBadge: "Prédéfini",
userCountBadge: "{count} utilisateur(s)",
editRoleTitle: "Modifier le rôle",
deleteRoleTitle: "Supprimer le rôle",
permGroup: {
tools: "Outils",
files: "Fichiers",
apiKeys: "Clés API",
pipelines: "Pipelines",
settings: "Paramètres",
users: "Utilisateurs",
teams: "Équipes",
system: "Système",
},
},
auditLog: {
heading: "Journal d'audit",
allActionsFilter: "Toutes les actions",
emptyState: "Aucune entrée dans le journal d'audit.",
tableHeaderTime: "Heure",
tableHeaderUser: "Utilisateur",
tableHeaderAction: "Action",
tableHeaderTarget: "Cible",
paginationInfo: "Page {page} sur {totalPages} ({total} entrées)",
previousButton: "Précédent",
nextButton: "Suivant",
justNow: "à l'instant",
minutesAgo: "il y a {mins}min",
hoursAgo: "il y a {hrs}h",
daysAgo: "il y a {days}j",
},
usage: {
heading: "Utilisation",
description: "Statistiques d'utilisation locales des tâches et du stockage de fichiers.",
periodLabel: "Période",
days7: "7 jours",
days30: "30 jours",
days90: "90 jours",
jobsPerDayHeading: "Tâches par jour",
topToolsHeading: "Outils les plus utilisés",
perUserHeading: "Volume par utilisateur",
durationsHeading: "Percentiles de durée",
noData: "Aucune donnée pour cette période.",
dayColumn: "Jour",
totalColumn: "Total",
completedColumn: "Terminées",
failedColumn: "Échouées",
toolColumn: "Outil",
runsColumn: "Exécutions",
userColumn: "Utilisateur",
bytesInColumn: "Octets entrants",
poolColumn: "Pool",
p50Column: "p50",
p95Column: "p95",
storageHeading: "Stockage de la bibliothèque",
storageFiles: "{count} fichiers",
unknownUser: "(inconnu)",
storageByTeam: "Stockage par équipe",
teamColumn: "Équipe",
storageColumn: "Stockage",
usersColumn: "Utilisateurs",
},
apiKeys: {
heading: "Clés API",
description: "Gérez les clés API pour l'accès programmatique à SnapOtter.",
keyNamePlaceholder: "Nom de la clé (optionnel)",
generateButton: "Générer une clé API",
removeScopingLabel: "Supprimer la restriction de permissions",
restrictPermissionsLabel: "Restreindre les permissions (optionnel)",
expiresLabel: "Expire :",
clearButton: "Effacer",
copyTitle: "Copier",
keyWarning: "Conservez cette clé en lieu sûr. Elle ne sera plus affichée.",
existingKeysHeading: "Clés existantes",
createdPrefix: "Créée le {date}",
scopedPrefix: "Portée :",
expiresPrefix: "Expire le {date}",
deleteKeyTitle: "Supprimer la clé",
deleteConfirm:
"Supprimer cette clé API ? Les intégrations qui l'utilisent cesseront de fonctionner.",
emptyState: "Aucune clé API pour le moment. Générez-en une pour commencer.",
},
tools: {
heading: "Outils",
description:
"Activez ou désactivez les outils individuellement. Les outils désactivés sont masqués pour tous les utilisateurs.",
restartBanner: "Un redémarrage est nécessaire pour appliquer les modifications.",
searchPlaceholder: "Rechercher des outils...",
noSearchResults: "Aucun outil ne correspond à votre recherche.",
loadFailedError:
"Échec du chargement des paramètres d'outils. L'enregistrement est désactivé pour éviter toute perte de données.",
saveButton: "Enregistrer les paramètres d'outils",
disabledCount: "{count} outil(s) désactivé(s)",
},
experimental: {
label: "Activer les outils expérimentaux",
description: "Affiche les outils encore en développement. Ils peuvent être instables.",
},
fileManagement: {
title: "Gestion des fichiers",
maxAge: "Âge maximal des fichiers (heures)",
maxAgeDescription: "Durée de conservation des fichiers traités avant nettoyage automatique",
startupCleanup: "Nettoyage au démarrage",
startupCleanupDescription: "Nettoie les anciens fichiers temporaires au démarrage du serveur",
},
dataRetention: {
title: "Rétention des données",
fileMaxAgeHours: "Rétention des fichiers traités (heures)",
fileMaxAgeHoursDesc:
"Durée de conservation des fichiers téléversés et traités. Par défaut : 72 heures.",
jobsRetentionDays: "Rétention des enregistrements de tâches (jours)",
jobsRetentionDaysDesc:
"Durée de conservation des métadonnées de tâches. 0 = conserver indéfiniment. Par défaut : 30 jours.",
auditRetentionDays: "Rétention du journal d'audit (jours)",
auditRetentionDaysDesc:
"Durée de conservation des entrées du journal d'audit. 0 = conserver indéfiniment. Par défaut : indéfiniment.",
},
aiFeatures: {
title: "Fonctionnalités AI",
description: "Gérez les paquets de modèles AI pour le traitement avancé de fichiers.",
installAll: "Tout installer",
diskUsage: "Utilisation du disque : {size}",
sizeOnDisk: "{size} sur le disque",
installed: "Installé",
notInstalled: "Non installé",
queued: "En file d'attente",
install: "Installer",
repair: "Réparer",
uninstall: "Désinstaller",
installing: "Installation...",
importBundle: "Importer un bundle",
importDescription: "Téléversez une archive .tar.gz exportée depuis une autre installation.",
importButton: "Importer depuis un fichier",
importing: "Importation...",
importSuccess: "Bundle importé avec succès.",
importError: "Échec de l'importation du bundle : {error}",
},
about: {
heading: "À propos",
appName: "SnapOtter",
appDescription:
"Une suite de traitement de fichiers auto-hébergée, axée sur la confidentialité, avec 200+ outils. Convertissez, compressez, éditez, transcrivez, OCR et automatisez vos flux de travail image, vidéo, audio, document et données sans envoyer de données vers le cloud.",
versionLabel: "Version :",
linksHeading: "Liens",
githubLink: "Dépôt GitHub",
docsLink: "Documentation",
apiRefLink: "Référence API (Swagger)",
licenseLabel: "Licence :",
licenseDescription:
"SnapOtter est un logiciel open source sous licence GNU Affero General Public License v3 (AGPLv3).",
},
},
auth: {
login: "Connexion",
logout: "Se déconnecter",
username: "Nom d'utilisateur",
password: "Mot de passe",
loginButton: "Se connecter",
loggingIn: "Connexion en cours...",
invalidCredentials: "Nom d'utilisateur ou mot de passe invalide",
connectionError: "Erreur de connexion",
signInWith: "Se connecter avec {provider}",
signInWithSso: "Se connecter avec SSO",
or: "ou",
methodLocal: "Local",
methodOidc: "OIDC",
methodBoth: "Local + OIDC",
oidcAuthFailed: "L'authentification a échoué. Veuillez réessayer.",
oidcProviderUnreachable:
"Impossible de joindre le fournisseur d'identité. Veuillez réessayer plus tard.",
oidcSessionExpired: "La session de connexion a expiré. Veuillez réessayer.",
oidcUserNotAuthorized:
"Votre compte n'est pas autorisé à accéder à cette application. Contactez votre administrateur.",
oidcUserLimitReached: "Limite d'utilisateurs atteinte. Contactez votre administrateur.",
oidcGenericError: "Erreur d'authentification. Veuillez réessayer.",
samlAuthFailed: "Échec de l'authentification SAML. Veuillez réessayer.",
samlUserNotAuthorized:
"Votre compte n'est pas autorisé à accéder à cette application. Contactez votre administrateur.",
samlUserLimitReached: "Limite d'utilisateurs atteinte. Contactez votre administrateur.",
ssoEnforcedLocalRestricted: "La connexion locale est réservée aux administrateurs autorisés.",
mfaRequired: "Entrez votre code d'authentification",
mfaRecoveryHint: "Vous pouvez aussi utiliser un code de récupération",
verify: "Vérifier",
verifying: "Vérification...",
mfaInvalidCode: "Code invalide. Veuillez réessayer.",
mfaEnrollmentRequired:
"Votre organisation exige l'authentification multifacteur. Veuillez configurer le MFA dans les paramètres de votre compte.",
methodSaml: "SAML",
passwordManagedByProvider:
"Les modifications de mot de passe sont gérées par votre fournisseur d'identité.",
enterUsername: "Saisissez votre nom d'utilisateur",
enterPassword: "Saisissez votre mot de passe",
heroTitle: "Vos fichiers. Restent les vôtres.",
heroSubtitle: "Tous les outils dont vous avez besoin.",
rotatingPhrases: [
"Aucune inscription. Aucun compte.",
"Aucun envoi vers le cloud. Jamais.",
"Traitement 100% local.",
"Gratuit. Pour toujours.",
"Sans limites. Sans plafonds cachés.",
"Fonctionne entièrement hors ligne.",
"Traitement par lot illimité.",
"200+ outils.",
"15 modèles AI. Votre matériel.",
"Ultra rapide. Propulsé par Sharp.",
"Prêt pour les réseaux isolés.",
"Un seul conteneur Docker.",
"Open source. Toujours.",
"Chaque pixel reste sur votre matériel.",
"Votre serveur. Vos règles.",
"Se déploie en un seul docker pull.",
"L'alternative auto-hébergée.",
"Redimensionnez, compressez, convertissez. Localement.",
"Éditeur d'images gratuit. Sans filigrane.",
"Traitement de fichiers par lot. Illimité.",
"Supprimez les arrière-plans hors ligne.",
"Alternative auto-hébergée à Canva.",
"Aucune clé API nécessaire.",
"Conforme au RGPD par conception.",
"Fonctionne sans internet.",
],
},
changePassword: {
title: "Changez votre mot de passe",
description:
"Vous devez définir un nouveau mot de passe avant de continuer. Votre mot de passe doit contenir au moins 8 caractères avec des majuscules, des minuscules et un chiffre.",
usernameLabel: "Nom d'utilisateur",
currentPasswordLabel: "Mot de passe actuel",
currentPasswordPlaceholder: "Saisissez le mot de passe actuel",
newPasswordLabel: "Nouveau mot de passe",
generateButton: "Générer un mot de passe fort",
newPasswordPlaceholder: "Au moins 8 caractères",
confirmPasswordLabel: "Confirmer le nouveau mot de passe",
confirmPasswordPlaceholder: "Répétez le nouveau mot de passe",
passwordsMismatch: "Les mots de passe ne correspondent pas",
failedError: "Échec du changement de mot de passe",
connectionError: "Erreur de connexion",
changingButton: "Modification en cours...",
changeButton: "Changer le mot de passe",
sidebarTitle: "Presque fini",
sidebarDescription:
"Définissez un mot de passe fort pour sécuriser votre compte, puis vous serez prêt.",
},
automate: {
title: "Automatiser",
invalidPipelineFile: "Ce n'est pas un fichier Pipeline SnapOtter valide",
newerVersion: "Ce Pipeline a été créé avec une version plus récente de SnapOtter",
missingName: "Le fichier Pipeline n'a pas de nom",
noSteps: "Le fichier Pipeline n'a aucune étape",
importFailed: "Échec de l'importation",
couldNotRead: "Impossible de lire le fichier Pipeline",
fileCount: "{count} fichier",
fileCountPlural: "{count} fichiers",
importFromLibrary: "Importer depuis la bibliothèque",
addButton: "+ Ajouter",
libraryButton: "Bibliothèque",
clearButton: "Effacer",
processingFailed: "Échec du traitement pour ce fichier",
processingMultiple: "Traitement de {count} fichiers...",
processingPipeline: "Traitement du Pipeline...",
processButton: "Traiter",
processButtonMultiple: "Traiter ({count})",
processAllButton: "Tout traiter ({count})",
addTool: "Ajouter un outil",
toolPalette: "Palette d'outils",
clickToAdd: "Cliquez pour ajouter au Pipeline",
savedLabel: "Enregistré",
templatesLabel: "Modèles",
importButton: "Importer",
noSavedPipelines: "Aucun Pipeline enregistré",
stepCount: "({count} étape)",
stepCountPlural: "({count} étapes)",
exportPipeline: "Exporter le Pipeline",
deletePipeline: "Supprimer le Pipeline",
moreCount: "+{count} de plus",
pipelineBuilder: "Constructeur de Pipeline",
addToolsPrompt: "Ajoutez des outils depuis la palette pour commencer",
stepsConfigured: "{count} étape configurée",
stepsConfiguredPlural: "{count} étapes configurées",
noFilesLoaded: "Aucun fichier chargé",
downloadZip: "Télécharger le ZIP",
saveButton: "Enregistrer",
pipelineNamePlaceholder: "Nom du Pipeline",
descriptionPlaceholder: "Description",
savingIndicator: "...",
cancelButton: "Annuler",
preview: "Aperçu",
previousImage: "Fichier précédent",
nextImage: "Fichier suivant",
imageCounter: "{current} / {total}",
imageArea: "Zone d'aperçu",
templateSocialMedia: "Prêt pour les réseaux sociaux",
templatePrivacyClean: "Nettoyage de confidentialité",
templateWebOptimization: "Optimisation web",
templateProfilePicture: "Photo de profil",
templateWatermarkBatch: "Lot de filigranes",
createNew: "Créer une nouvelle automatisation",
savedAutomations: "Automatisations enregistrées",
templates: "Modèles",
addStep: "Ajouter une étape",
removeStep: "Supprimer",
moveUp: "Monter",
moveDown: "Descendre",
savePipeline: "Enregistrer le Pipeline",
runPipeline: "Traiter",
pipelineName: "Nom du Pipeline",
pipelineDescription: "Description (optionnel)",
noStepsPrompt: "Ajoutez des étapes pour construire votre automatisation",
noStepsHeading: "Aucune étape pour le moment",
searchToolsPlaceholder: "Rechercher des outils...",
step: "Étape",
modalityWarning: "Incompatibilité de modalité",
modalityWarningTooltip:
"Cette étape attend {expected} mais reçoit {received} ; elle peut échouer lors de l'exécution du pipeline.",
},
nav: {
tools: "Outils",
reader: "Lecteur",
automate: "Automatiser",
editor: "Éditeur",
files: "Fichiers",
help: "Aide",
settings: "Paramètres",
grid: "Grille",
},
files: {
myFiles: "Mes fichiers",
recentTab: "Récents",
uploadTab: "Téléverser des fichiers",
fileDetailsAriaLabel: "Détails du fichier",
fileDetailsHeading: "Détails du fichier",
searchPlaceholder: "Rechercher des fichiers...",
selectedCount: "{count} sélectionnés",
fileCount: "{count} fichiers",
fileCountSingular: "{count} fichier",
noFilesFound: "Aucun fichier trouvé",
selectFilePrompt: "Sélectionnez un fichier pour voir les détails",
openFile: "Ouvrir le fichier",
selectFile: "Sélectionner le fichier",
openInPipeline: "Ouvrir dans le pipeline",
dropFilesHere: "Déposez les fichiers ici",
orClickToSelect: "ou cliquez pour sélectionner des fichiers",
name: "Nom",
format: "Format",
size: "Taille",
dimensions: "Dimensions",
version: "Version",
toolsUsed: "Outils utilisés",
none: "Aucun",
delete: "Supprimer",
pipeline: "Pipeline",
download: "Télécharger",
},
dropzone: {
unsupportedFileType: "Ce type de fichier n'est pas pris en charge par cet outil",
urlFetchFailed: "Impossible de récupérer l'image depuis l'URL",
ariaLabel: "Zone de dépôt de fichiers",
dropPrompt: "Déposez vos images ici",
browseOrPaste: "utilisez le bouton d'import, ou collez depuis le presse-papiers",
uploadButton: "Importer",
defaultFormats: "PNG, JPG, WebP, HEIC, RAW, PSD et plus de 65 formats",
orSeparator: "ou",
urlPlaceholder: "Collez l'URL de l'image...",
urlLoadingIndicator: "...",
addUrlButton: "Ajouter",
importMultipleUrls: "Importer plusieurs URLs...",
filesSelected: "{count} fichiers sélectionnés",
dropToAdd: "Déposer pour ajouter des fichiers",
dropToReplace: "Déposer pour remplacer le fichier",
},
reviewPanel: {
processedResultAlt: "Résultat traité",
sizeLabel: "Taille : {size}",
typeLabel: "Type : {type}",
processedLabel: "Traité : {time}",
undoButton: "Annuler",
downloadButton: "Télécharger",
openInEditor: "Ouvrir dans l'éditeur",
reviewHeading: "Vérification",
continueEditing: "Continuer l'édition",
},
features: {
notEnabledTitle: "Fonctionnalité non activée",
notEnabledDescription:
"Cette fonctionnalité n'est pas activée. Demandez à votre administrateur de l'activer dans les Paramètres.",
requiresDownload: "Cette fonctionnalité nécessite un téléchargement supplémentaire (~{size})",
retryButton: "Réessayer",
queued: "En file d'attente pour l'installation...",
enableButton: "Activer {name}",
repairRequired: "Réparation requise",
repairDescription:
"Certains fichiers de modèle sont manquants ou corrompus. La réparation les retéléchargera.",
repairButton: "Réparer {name}",
lessThanMinute: "Moins d'une minute restante",
oneMinuteLeft: "~1 minute restante",
minutesLeft: "~{mins} minutes restantes",
progressMessages: [
"Presque fini... sans doute...",
"Les bonnes choses prennent du temps...",
"Toujours plus rapide que de regarder sécher la peinture...",
"Votre patience est vraiment admirable...",
"Ça travaille dur dans les coulisses...",
"C'est la partie passionnante, faites-nous confiance...",
"Des opérations importantes en arrière-plan...",
"Si vous lisez ceci, ça fonctionne...",
"Préparation de quelque chose de génial...",
"Ça vaut chaque seconde, promis...",
"Le suspense fait partie de l'expérience...",
"On apprend de nouveaux tours à votre ordinateur...",
"Configuration de vos super-pouvoirs...",
"Vos fichiers vous remercieront plus tard...",
"Chargement... mais avec du style...",
"Le moment idéal pour un café...",
"Rome ne s'est pas faite en un jour non plus...",
"Chut... un génie au travail...",
"Vos projets vont être jaloux de ce qui arrive...",
"On rassemble l'équipe de choc...",
"Déballage de merveilles...",
"On a presque fini de penser à commencer... on plaisante...",
"Retournement de situation : ça fait vraiment quelque chose...",
"Préchauffage des moteurs créatifs...",
"Chargement de l'imagination...",
"Ce n'est pas un écran de veille, promis...",
"Le grand art prend du temps à s'installer...",
"Votre futur vous vous remerciera...",
"Récupération de fichiers très intelligents...",
"Tenez bon, le meilleur reste à venir...",
],
},
help: {
heading: "Aide",
gettingStarted: {
heading: "Pour commencer",
description:
"Sélectionnez un outil dans la barre latérale ou recherchez-en un. Importez un fichier en le faisant glisser sur la page ou en cliquant sur la zone d'import. Ajustez les paramètres et téléchargez votre résultat.",
},
keyboardShortcuts: {
heading: "Raccourcis clavier",
focusSearchBar: "Focus sur la barre de recherche",
goToTools: "Aller aux outils",
toggleTheme: "Changer de thème",
goToResize: "Aller à Redimensionner",
goToCrop: "Aller à Recadrer",
goToCompress: "Aller à Compresser",
goToConvert: "Aller à Convertir",
goToRemoveBackground: "Aller à Supprimer l'arrière-plan",
goToWatermarkText: "Aller au Filigrane texte",
goToStripMetadata: "Aller à Supprimer les métadonnées",
goToImageInfo: "Aller à Info image",
processFile: "Traiter le fichier",
downloadResult: "Télécharger le résultat",
},
resources: {
heading: "Ressources",
githubLink: "Dépôt GitHub",
reportIssueLink: "Signaler un problème",
docsLink: "Documentation",
apiRefLink: "Référence API (Swagger)",
},
versionLabel: "SnapOtter v{version}",
},
errors: {
generic: "Une erreur est survenue",
offline: "Vous êtes hors ligne",
reconnecting: "Reconnexion au serveur...",
connected: "Connecté",
processingFailed: "Échec du traitement pour ce fichier",
timeout: "Délai d'attente dépassé. Le serveur est peut-être surchargé. Veuillez réessayer.",
networkError: "Erreur réseau. Vérifiez votre connexion.",
invalidCredentials: "Nom d'utilisateur ou mot de passe invalide",
connectionError: "Erreur de connexion",
},
sidebar: {
tools: "Outils",
grid: "Grille",
automate: "Automatiser",
editor: "Éditeur",
files: "Fichiers",
help: "Aide",
settings: "Paramètres",
},
toolCard: {
addToFavourites: "Ajouter aux favoris",
},
appLayout: {
mobileNavTools: "Outils",
mobileNavAutomate: "Automatiser",
mobileNavEditor: "Éditeur",
mobileNavFiles: "Fichiers",
mobileNavSettings: "Paramètres",
},
a11y: {
skipToContent: "Aller au contenu principal",
openSidebar: "Ouvrir le panneau latéral",
closeSidebar: "Fermer le panneau latéral",
closeSettings: "Fermer les paramètres",
closeHelp: "Fermer l'aide",
closeDialog: "Fermer la boîte de dialogue",
zoomIn: "Zoom avant",
zoomOut: "Zoom arrière",
fitToView: "Ajuster à la vue",
actualSize: "Taille réelle",
pan: "Déplacer",
previousImage: "Fichier précédent",
nextImage: "Fichier suivant",
imageArea: "Zone d'aperçu",
imageViewer: "Visionneuse de fichiers",
fileDropZone: "Zone de dépôt de fichiers",
imageDropZone: "Zone de dépôt de fichiers",
beforeAfterSlider: "Curseur de comparaison avant/après",
imageControls: "Contrôles d'aperçu",
zoomControls: "Contrôles de zoom",
dragToReorder: "Glisser pour réorganiser",
whiteBackground: "Arrière-plan blanc",
blackBackground: "Arrière-plan noir",
expandPanel: "Développer le panneau",
collapsePanel: "Réduire le panneau",
swapDimensions: "Inverser les dimensions",
applyCrop: "Appliquer le recadrage",
cancelCrop: "Annuler le recadrage",
fontFamily: "Famille de polices",
textColor: "Couleur du texte",
flipHorizontal: "Retourner horizontalement",
flipVertical: "Retourner verticalement",
hexColorValue: "Valeur de couleur HEX",
backgroundColor: "Couleur d'arrière-plan",
foregroundColor: "Couleur de premier plan",
swapColors: "Inverser les couleurs de premier plan et d'arrière-plan",
resetColors: "Réinitialiser au noir et blanc par défaut",
foregroundHex: "Valeur HEX de la couleur de premier plan",
undo: "Annuler",
redo: "Rétablir",
layers: "Calques",
addLayer: "Ajouter un calque",
deleteLayer: "Supprimer le calque",
cancelOperation: "Annuler l'opération",
fill: "Remplissage",
fileDetails: "Détails du fichier",
language: "Langue",
selected: "Sélectionné",
deleteKey: "Supprimer la clé",
editRole: "Modifier le rôle",
deleteRole: "Supprimer le rôle",
notInstalled: "Non installé",
queued: "En file d'attente pour l'installation",
installing: "Installation en cours",
imageNOfTotal: "Image {n} sur {total}",
processingComplete: "Image traitée avec succès",
processingFailed: "Échec du traitement",
settingsDialog: "Paramètres",
helpDialog: "Aide",
navigationMenu: "Navigation",
homeLink: "Accueil SnapOtter",
},
pipelineTemplates: {
"web-optimize": {
name: "Optimiser pour le web",
description:
"Redimensionne, convertit en WebP et compresse une image pour un chargement web rapide.",
},
"email-friendly": {
name: "Adapté aux e-mails",
description: "Réduit une image pour qu'elle soit assez petite pour être jointe à un e-mail.",
},
"privacy-scrub": {
name: "Nettoyage de confidentialité",
description: "Supprime les métadonnées EXIF, GPS et autres, puis compresse.",
},
"social-square": {
name: "Carré pour réseaux sociaux",
description:
"Recadre au format carré 1:1 et compresse pour les publications sur les réseaux sociaux.",
},
"watermark-batch": {
name: "Filigrane par lot",
description: "Appose un filigrane texte sur les images, puis compresse.",
},
"shrink-pdf-email": {
name: "Réduire un PDF pour e-mail",
description: "Aplatit et compresse fortement un PDF pour respecter les limites des e-mails.",
},
"podcast-polish": {
name: "Peaufiner un podcast",
description:
"Supprime les silences, normalise le volume et ajoute des fondus à un enregistrement.",
},
"cut-out-subject": {
name: "Détourer le sujet",
description: "Supprime l'arrière-plan avec l'IA et compresse le détourage transparent.",
},
"restore-old-photo": {
name: "Restaurer une vieille photo",
description: "Répare, colorise et agrandit une photo ancienne ou abîmée avec l'IA.",
},
},
} as const;