Picasa Revival v{{ appInfo.version }}
{{ searchError }}
🎨 Ambiance de couleur
⚡ Activité des Workers
{{ activeWorkerCount }} actif(s)
⚠️
{{ totalFailedCount }} échec(s) de traitement
{{ worker.icon }} {{ worker.name }}
{{ worker.progress }} %
📄 {{ worker.currentFile }}
{{ worker.status }}
{{ workerActivityError }}
{{ currentUser?.username }}
{{ currentUser?.isAdmin ? t('role.admin') : t('role.user') }} · {{ currentUser?.language?.toUpperCase() }}
{{ editorFilmstripSourceLabel }}
{{ editorMediaTypeLabel }}
📋
Sélection active
📅 {{ selectionStats.earliestDate.slice(0, 10) }} → {{ (selectionStats.latestDate || '').slice(0, 10) }} • 🖼️ {{ selectionCount }} photo(s) sélectionnée(s) • {{ (selectionStats.totalBytes / (1024 * 1024)).toLocaleString('fr-FR', { maximumFractionDigits: 1 }) }} Mo
Cliquez sur une photo pour ouvrir le mode édition. Utilisez les boutons ci-dessous pour lancer un diaporama, afficher la carte ou exporter.
Chargement des fichiers sélectionnés…
{{ selectionViewError }}
Aucune photo sélectionnée.

📁 Albums & Collections

Vos souvenirs organisés en albums automatiques et personnalisés. ({{ visibleAlbumsGrid.length }} affichés sur {{ filteredAndSortedAlbums.length }}) ({{ filteredAndSortedAlbums.length }} album{{ filteredAndSortedAlbums.length > 1 ? 's' : '' }} trouvé{{ filteredAndSortedAlbums.length > 1 ? 's' : '' }})

{{ albumsError }}
Chargement des albums…
Aucun album. Créez votre premier album ou ajoutez-y la sélection courante.
Aucun album favori. Cliquez sur l’étoile d’un album pour l’ajouter à vos favoris.
🔍 Filtre actif : {{ appliedAlbumsSearchQuery }} ({{ filteredAndSortedAlbums.length }} album{{ filteredAndSortedAlbums.length > 1 ? 's' : '' }})
Les albums précédents sont rechargés en remontant
{{ album.photoCount }} fichiers
{{ album.title }}
{{ album.date }} Auto
Faites défiler pour charger la suite des albums… Fin de la liste ({{ filteredAndSortedAlbums.length }} albums au total)
Cet album est vide. Sélectionnez des fichiers dans la Timeline puis utilisez « À l’album ».
Les fichiers précédents sont rechargés en remontant
Chargement de fichiers… Faites défiler pour charger la suite de l’album Fin de l’album ({{ selectedAlbumDetail.photoCount }} photos au total)
▲
▼

{{ currentPeopleNavigation === 'unknown' ? '❓' : '⊘' }} {{ currentPeopleNavigation === 'unknown' ? 'Personnes non reconnues' : 'Visages ignorés' }}

{{ currentPeopleNavigation === 'unknown' ? 'Identifiez les visages détectés en saisissant leur nom.' : 'Visages exclus de la reconnaissance automatique.' }}

{{ peopleCounts[currentPeopleNavigation] || 0 }} visages
{{ reviewFaceSortOrder === 'asc' ? 'Les visages plus anciens sont rechargés en remontant' : 'Les visages plus récents sont rechargés en remontant' }}
Chargement des visages… {{ reviewFaceSortOrder === 'asc' ? 'Faites défiler pour charger la suite' : 'Faites défiler pour charger les visages plus anciens' }} Fin de la liste Aucun visage dans cette catégorie

👥 Groupes de visages similaires

Regroupement automatique des visages non reconnus qui se ressemblent. Nommez ou ignorez des groupes entiers en 1 clic.

Similarité : Min : Netteté : Ordre :
{{ faceClusters.length }} groupes ({{ totalClusteredFaces }} visages)
🎯 Périmètre actif : {{ activeClusterScopeLabel }}
|
🔄

Analyse des similarités et calcul des groupes de visages…

👥

Aucun groupe de visages similaires

Aucun groupe d'au moins {{ clusterMinSize }} visages non reconnus se ressemblant n'a été trouvé avec ce seuil. Vous pouvez réduire l'exigence de similarité (« Large ») ou consulter l'onglet « Non reconnu ».

👥 Groupe #{{ cluster.clusterId }} {{ getActiveFacesInCluster(cluster).length }} visage(s) ({{ cluster.excludedFaceIds.size }} exclu)

👥 Personnes identifiées

Gérez vos albums de personnes reconnues.

{{ searchQuery.trim() ? t('people.countFiltered', { filtered: filteredAndSortedKnownPeople.length, total: knownPeople.length }) : t('people.countTotal', { count: knownPeople.length }) }}
🔍
{{ t('people.noResults', { query: searchQuery.trim() }) }}
Fiche : {{ selectedPersonDetail.name }}
{{ (selectedPersonDetail.name || '?')[0].toUpperCase() }}
{{ personAge }} ♂ Homme ♀ Femme ⚧ Autre * {{ selectedPersonDetail.birthDate }} † {{ selectedPersonDetail.deathDate }}
Photos similaires
Détecter automatiquement d’autres visages correspondants
Seuil de similarité : {{ similarityThreshold }} %
Les suggestions précédentes sont rechargées en remontant
Chargement des suggestions… Fin des suggestions similaires ⭐ Aucun visage de référence défini. Cliquez sur ⭐ sur vos meilleures photos, ou désactivez l'interrupteur. Aucune suggestion à ce seuil

Photos confirmées ({{ selectedPersonDetail.photoCount }})

Les photos plus récentes sont rechargées en remontant
Chargement des photos confirmées… Faites défiler pour charger les photos plus anciennes Fin des photos confirmées Aucune photo confirmée
👥

Relations & Liens ({{ selectedPersonRelationships.length }})

Chargement des liens…
Aucun lien renseigné pour le moment (famille, amis, collègues). Cliquez sur « Ajouter un lien » pour préparer l’arbre généalogique.
{{ (rel.relatedPersonName || rel.related_person_name || '?')[0].toUpperCase() }}
{{ rel.relatedPersonName || rel.related_person_name }}
{{ getRelationshipLabel(rel) }} ({{ rel.category === 'family' ? 'Famille' : rel.category === 'friend' ? 'Ami' : rel.category === 'colleague' ? 'Pro' : 'Lien' }})
📅

Dates marquantes & Événements ({{ selectedPersonEvents.length }})

Chargement des événements…
Aucun événement ou anniversaire renseigné (naissance, mariage, voyage, fête...). Cliquez sur « Ajouter un événement ».
{{ getEventIcon(ev.eventType || ev.event_type) }}
{{ ev.title }} {{ getEventLabel(ev.eventType || ev.event_type) }} Participant(e)
🗓️ {{ ev.eventDate || ev.event_date }}

{{ ev.description }}

📁 {{ album.title }} 👤 {{ part.name }}

👤 État civil & Informations d’identité

📖 Biographie & Notes (Wiki personnel)

Rédigez l’histoire, les souvenirs et anecdotes de {{ selectedPersonDetail.name }} (support Markdown).

Syntaxe Markdown : # Titre, ## Sous-titre, - Liste, **Gras**, *Italique*, > Citation

Aucune biographie rédigée pour le moment.

{{ placesList.length }} lieu(x) affiché(s) sur {{ placesTotal }}
Cliquez ou déplacez le repère, puis enregistrez Chargement des photos… {{ mapMediaCount }} photo(s) dans la zone
{{ mapMediaError }}
Zone limitée aux 500 premières photos — zoomez pour détailler.

📍 Gestion des lieux

Périmètre & géolocalisation

{{ activePlaceEditing.id ? '✏️ Modifier le lieu' : '📍 Nouveau repère' }}
{{ placeAddressError }}
© OpenStreetMap contributors
● Modifications non enregistrées — vérifiez le nom et la position puis cliquez sur Enregistrer.
Latitude
{{ activePlaceEditing.lat.toFixed(5) }}
Longitude
{{ activePlaceEditing.lng.toFixed(5) }}
Périmètre / Rayon :
10–100 m : pas de 1 m · 100–500 m : pas de 10 m · maximum 5 km
🔍
{{ placesError }}
📍 {{ place.name }}
Rayon : {{ formatPlaceRadius(place.radius) }} — {{ place.photoCount }} photo(s) dans le périmètre
Chargement des lieux…
🗑️

Corbeille

{{ trashTotalCount }} fichier(s) · {{ formattedTotalBytes }}

Fichiers supprimés récupérables. Vous pouvez restaurer des éléments ou vider définitivement la corbeille.

🔍
{{ trashError }}
Chargement des éléments de la corbeille…
🗑️

La corbeille est vide

Les photos et vidéos que vous supprimez depuis la Timeline ou les Albums apparaissent ici et peuvent être restaurées à tout moment.

✓
{{ formatBytes(item.fileSize) }}
{{ item.filename }}
📁 {{ item.originalRelativePath }}
Supprimé : {{ formatTrashDate(item.trashedAt) }}
📁 {{ album }}
Nouveau {{ manualFaceKind === 'human' ? 'visage' : 'sujet' }} ({{ faceDrawPixelDims }})
Zoom à {{ Math.round(zoomA * 100) }} %
Chargement de la trace GPX…
{{ gpxTrackError }}
{{ gpxTrackPointCount.toLocaleString() }} points dans la trace
{{ activePhotoA.name }}
Ouvrir {{ activePhotoA?.name }}
Photo A {{ activeEditPane === 'A' ? '(Active)' : '' }}
Nouveau visage ({{ faceDrawPixelDims }})
Photo B {{ activeEditPane === 'B' ? '(Active)' : '' }}
Nouveau visage ({{ faceDrawPixelDims }})
✨ Avec modifications
📷 Original (Sans retouche)
✏️ Encadrez le {{ manualFaceKind === 'human' ? 'visage' : 'sujet' }} sur {{ activePhotoA?.mediaKind === 'video' ? 'la vidéo' : 'l’image' }}
Rendu en cours…
{{ serverPreviewError }}