247 lines
8.9 KiB
TypeScript
247 lines
8.9 KiB
TypeScript
|
|
/**
|
|||
|
|
* French dictionary.
|
|||
|
|
*
|
|||
|
|
* Typed as `Dictionary` (derived from `en.ts`), so a key added to English but
|
|||
|
|
* forgotten here fails the type-check rather than falling through to English
|
|||
|
|
* at runtime.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import type { Dictionary } from '../index';
|
|||
|
|
|
|||
|
|
const plural = (n: number, one: string, other: string) => `${n} ${n === 1 ? one : other}`;
|
|||
|
|
|
|||
|
|
export const fr: Dictionary = {
|
|||
|
|
dateLocale: 'fr-FR',
|
|||
|
|
|
|||
|
|
nav: {
|
|||
|
|
home: 'Accueil',
|
|||
|
|
about: 'À propos',
|
|||
|
|
map: 'Carte',
|
|||
|
|
journal: 'Journal',
|
|||
|
|
skipToContent: 'Aller au contenu',
|
|||
|
|
openMenu: 'Ouvrir le menu',
|
|||
|
|
closeMenu: 'Fermer le menu',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
common: {
|
|||
|
|
backTo: (label: string) => `Retour à ${label}`,
|
|||
|
|
backToGallery: 'Retour à la galerie',
|
|||
|
|
backToJournal: 'Retour au journal',
|
|||
|
|
email: 'E-mail',
|
|||
|
|
website: 'Site web',
|
|||
|
|
home: 'Accueil',
|
|||
|
|
photos: (n: number) => plural(n, 'photo', 'photos'),
|
|||
|
|
albums: (n: number) => plural(n, 'album', 'albums'),
|
|||
|
|
collections: (n: number) => plural(n, 'collection', 'collections'),
|
|||
|
|
prevAlbum: 'Album précédent',
|
|||
|
|
nextAlbum: 'Album suivant',
|
|||
|
|
prevAlbumAria: (name: string) => `Album précédent : ${name}`,
|
|||
|
|
nextAlbumAria: (name: string) => `Album suivant : ${name}`,
|
|||
|
|
albumNavAria: 'Navigation entre les albums',
|
|||
|
|
prevEntry: 'Article précédent',
|
|||
|
|
nextEntry: 'Article suivant',
|
|||
|
|
prevEntryAria: (title: string) => `Article précédent : ${title}`,
|
|||
|
|
nextEntryAria: (title: string) => `Article suivant : ${title}`,
|
|||
|
|
entryNavAria: 'Navigation entre les articles du journal',
|
|||
|
|
loadingGallery: 'Chargement de la galerie',
|
|||
|
|
loadingPhotos: 'Chargement des photos',
|
|||
|
|
downloadAlbum: 'Télécharger l’album',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
home: {
|
|||
|
|
enter: 'Entrer',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
error: {
|
|||
|
|
notFoundTitle: 'Page introuvable',
|
|||
|
|
notFoundText: 'Cette page n’existe pas, ou l’album n’est plus publié.',
|
|||
|
|
errorTitle: 'Une erreur est survenue',
|
|||
|
|
errorText:
|
|||
|
|
'Cette page n’a pas pu être chargée. C’est généralement temporaire — réessayez dans un instant.',
|
|||
|
|
siteErrorText:
|
|||
|
|
'Ce site n’a pas pu être chargé. C’est généralement temporaire — réessayez dans un instant.',
|
|||
|
|
tryAgain: 'Réessayer',
|
|||
|
|
reference: (digest: string) => `Référence : ${digest}`,
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
download: {
|
|||
|
|
unavailableTitle: 'Téléchargement indisponible',
|
|||
|
|
notAvailable: 'Ce téléchargement n’est pas disponible.',
|
|||
|
|
rateLimited: 'Trop de demandes de téléchargement. Patientez un instant, puis réessayez.',
|
|||
|
|
immichUnavailable:
|
|||
|
|
'La photothèque est momentanément indisponible. Veuillez réessayer dans un instant.',
|
|||
|
|
back: 'Retour à la galerie',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
theme: {
|
|||
|
|
switchToLight: 'Passer en mode clair',
|
|||
|
|
switchToDark: 'Passer en mode sombre',
|
|||
|
|
scrollToTop: 'Revenir en haut',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
password: {
|
|||
|
|
subtitle: 'Cette galerie est protégée par un mot de passe.',
|
|||
|
|
siteSubtitle: 'Ce site est protégé par un mot de passe.',
|
|||
|
|
placeholder: 'Saisissez le mot de passe',
|
|||
|
|
submit: 'Entrer',
|
|||
|
|
verifying: 'Vérification…',
|
|||
|
|
incorrect: 'Mot de passe incorrect. Veuillez réessayer.',
|
|||
|
|
failed: 'Impossible de vérifier le mot de passe. Veuillez réessayer plus tard.',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
about: {
|
|||
|
|
kicker: 'À propos',
|
|||
|
|
title: 'À propos',
|
|||
|
|
metaTitle: (name: string) => `À propos — ${name}`,
|
|||
|
|
portraitAlt: 'Portrait',
|
|||
|
|
gear: 'Matériel',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
map: {
|
|||
|
|
title: 'Carte',
|
|||
|
|
kicker: 'Où',
|
|||
|
|
subtitle: 'Les lieux où les photos ont été prises',
|
|||
|
|
loading: 'Chargement de la carte…',
|
|||
|
|
loadFailed: (status: number) => `Échec du chargement des données de la carte (${status})`,
|
|||
|
|
initFailed: 'Impossible d’initialiser la carte',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
subpage: {
|
|||
|
|
collectionKicker: (index: string) => `${index} — Collection`,
|
|||
|
|
sectionsNav: 'Sections',
|
|||
|
|
coverAria: (albumName: string, count: string) => `${albumName}, ${count}`,
|
|||
|
|
nextSubpage: 'Suivant',
|
|||
|
|
nextSubpageAria: (name: string) => `Suivant : ${name}`,
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
journal: {
|
|||
|
|
title: 'Journal',
|
|||
|
|
kicker: 'Récits & essais',
|
|||
|
|
subtitle: 'Essais photographiques, récits visuels et notes de terrain.',
|
|||
|
|
description: 'Essais photographiques, récits de voyage et coulisses.',
|
|||
|
|
entryDescription: 'Article du journal',
|
|||
|
|
empty: 'Aucun article publié pour le moment.',
|
|||
|
|
readStory: 'Lire le récit →',
|
|||
|
|
minRead: (n: number) => `${n} min de lecture`,
|
|||
|
|
draft: 'Brouillon',
|
|||
|
|
by: (author: string) => `par ${author}`,
|
|||
|
|
notFound: 'Introuvable',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
lightbox: {
|
|||
|
|
viewer: 'Visionneuse d’images',
|
|||
|
|
openPhoto: (n: number) => `Afficher la photo ${n}`,
|
|||
|
|
close: 'Fermer',
|
|||
|
|
closeTitle: 'Fermer (Échap)',
|
|||
|
|
previous: 'Photo précédente',
|
|||
|
|
previousTitle: 'Photo précédente (flèche gauche)',
|
|||
|
|
next: 'Photo suivante',
|
|||
|
|
nextTitle: 'Photo suivante (flèche droite)',
|
|||
|
|
toggleInfo: 'Afficher/masquer les informations',
|
|||
|
|
toggleInfoTitle: 'Afficher/masquer les informations (i)',
|
|||
|
|
hideInfo: 'Masquer les infos',
|
|||
|
|
info: 'Infos',
|
|||
|
|
loading: 'Chargement…',
|
|||
|
|
camera: 'Appareil',
|
|||
|
|
lens: 'Objectif',
|
|||
|
|
focalLength: 'Focale',
|
|||
|
|
aperture: 'Ouverture',
|
|||
|
|
shutter: 'Vitesse',
|
|||
|
|
iso: 'ISO',
|
|||
|
|
location: 'Lieu',
|
|||
|
|
noExif: 'Aucune donnée EXIF disponible',
|
|||
|
|
copyLink: 'Copier le lien de cette photo',
|
|||
|
|
copyLinkTitle: 'Copier le lien de cette photo (c)',
|
|||
|
|
copyLinkShort: 'Lien',
|
|||
|
|
copied: 'Copié',
|
|||
|
|
copyManual: 'Copiez ce lien',
|
|||
|
|
shortcuts: 'Raccourcis clavier',
|
|||
|
|
shortcutNavigate: 'Photo précédente / suivante',
|
|||
|
|
shortcutInfo: 'Informations sur la photo',
|
|||
|
|
shortcutFullscreen: 'Plein écran',
|
|||
|
|
shortcutExitFullscreen: 'Quitter le plein écran',
|
|||
|
|
download: 'Télécharger le fichier original',
|
|||
|
|
downloadTitle: 'Télécharger le fichier original (d)',
|
|||
|
|
downloadShort: 'Original',
|
|||
|
|
shortcutDownload: 'Télécharger l’original',
|
|||
|
|
shortcutSlideshow: 'Diaporama',
|
|||
|
|
shortcutSlideshowRunning: (seconds: number) => `Diaporama — toutes les ${seconds} s`,
|
|||
|
|
slideshowStopped: 'Diaporama arrêté',
|
|||
|
|
slideshowRunning: (seconds: number) =>
|
|||
|
|
`Diaporama en cours, photo suivante toutes les ${seconds} secondes`,
|
|||
|
|
shortcutCopyLink: 'Copier le lien de cette photo',
|
|||
|
|
shortcutList: 'Cette liste',
|
|||
|
|
shortcutClose: 'Fermer la visionneuse',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
proofing: {
|
|||
|
|
addFavorite: 'Ajouter aux favoris',
|
|||
|
|
removeFavorite: 'Retirer des favoris',
|
|||
|
|
addToFavorites: 'Ajouter aux favoris',
|
|||
|
|
removeFromFavorites: 'Retirer des favoris',
|
|||
|
|
saved: 'Enregistré',
|
|||
|
|
favorite: 'Favori',
|
|||
|
|
showAll: 'Tout afficher',
|
|||
|
|
selected: (n: number) => `❤️ ${n} ${n === 1 ? 'sélectionnée' : 'sélectionnées'}`,
|
|||
|
|
shareExport: 'Partager & exporter',
|
|||
|
|
modalTitle: (n: number) => `❤️ Sélection (${n})`,
|
|||
|
|
closeModal: 'Fermer la fenêtre',
|
|||
|
|
intro: (n: number) =>
|
|||
|
|
`Vous avez sélectionné ${plural(n, 'photo', 'photos')}. Choisissez une option d’export ci-dessous pour partager votre sélection :`,
|
|||
|
|
copyLink: 'Copier le lien de partage',
|
|||
|
|
linkCopied: 'Lien copié !',
|
|||
|
|
copyList: 'Copier la liste (#1, #2…)',
|
|||
|
|
listCopied: 'Liste copiée !',
|
|||
|
|
copyManualLink: 'Copiez ce lien',
|
|||
|
|
copyManualList: 'Copiez cette liste',
|
|||
|
|
sendEmail: '✉️ Envoyer un e-mail au photographe',
|
|||
|
|
downloadSelected: 'Télécharger la sélection (.zip)',
|
|||
|
|
clearSelection: 'Vider la sélection',
|
|||
|
|
confirmClear: 'Retirer tous les favoris sélectionnés ?',
|
|||
|
|
listEmpty: (albumName: string) => `${albumName} : aucune photo sélectionnée.`,
|
|||
|
|
listSummary: (albumName: string, count: number, indices: string) =>
|
|||
|
|
`${albumName} — Photos sélectionnées (${count}) : ${indices}`,
|
|||
|
|
mailSubject: (n: number) => `Sélection de photos (${n})`,
|
|||
|
|
mailBody: (list: string, url: string) =>
|
|||
|
|
`Bonjour,\n\nVoici ma sélection de photos :\n\n${list}\n\nLien de partage : ${url}\n\nCordialement,`,
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
legal: {
|
|||
|
|
navLabel: 'Mentions légales',
|
|||
|
|
title: 'Mentions légales',
|
|||
|
|
subtitle: 'Informations conformément au § 5 DDG',
|
|||
|
|
address: 'Adresse',
|
|||
|
|
contact: 'Contact',
|
|||
|
|
email: 'E-mail',
|
|||
|
|
phone: 'Téléphone',
|
|||
|
|
contactForm: 'Formulaire de contact',
|
|||
|
|
taxSection: 'Informations fiscales',
|
|||
|
|
taxId: 'Numéro fiscal',
|
|||
|
|
vatId: 'Numéro de TVA',
|
|||
|
|
extraInfo: 'Informations complémentaires',
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
contact: {
|
|||
|
|
navLabel: 'Contact',
|
|||
|
|
title: 'Contact',
|
|||
|
|
subtitle: 'Écrivez-moi un message',
|
|||
|
|
name: 'Nom',
|
|||
|
|
email: 'E-mail',
|
|||
|
|
message: 'Message',
|
|||
|
|
submit: 'Envoyer le message',
|
|||
|
|
sending: 'Envoi…',
|
|||
|
|
successTitle: 'Merci',
|
|||
|
|
successText: 'Votre message est bien arrivé. Je vous répondrai par e-mail.',
|
|||
|
|
invalid: 'Veuillez remplir tous les champs avec une adresse e-mail valide.',
|
|||
|
|
tooMany: 'Trop de messages en peu de temps. Réessayez dans une minute.',
|
|||
|
|
failed: 'Le message n’a pas pu être envoyé. Réessayez plus tard.',
|
|||
|
|
privacy: (days: number) =>
|
|||
|
|
`Votre message est conservé sur le serveur de ce site, sert uniquement à vous répondre et est supprimé après ${days} ${days === 1 ? 'jour' : 'jours'}.`,
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
privacy: {
|
|||
|
|
navLabel: 'Confidentialité',
|
|||
|
|
title: 'Politique de confidentialité',
|
|||
|
|
},
|
|||
|
|
};
|