From 931c5bd990f3f61fcbfaf54e6d02247bdd7ca6ee Mon Sep 17 00:00:00 2001 From: quentinClaudel Date: Sun, 29 Mar 2026 23:36:56 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20improve=20French=20translations=20?= =?UTF-8?q?=E2=80=94=20thanks=20@quentinClaudel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/Vacay/VacayMonthCard.tsx | 10 +- client/src/i18n/translations/fr.ts | 140 +++++++++--------- 2 files changed, 77 insertions(+), 73 deletions(-) diff --git a/client/src/components/Vacay/VacayMonthCard.tsx b/client/src/components/Vacay/VacayMonthCard.tsx index 9c1e8ad..708acb9 100644 --- a/client/src/components/Vacay/VacayMonthCard.tsx +++ b/client/src/components/Vacay/VacayMonthCard.tsx @@ -6,10 +6,13 @@ import type { HolidaysMap, VacayEntry } from '../../types' const WEEKDAYS_EN = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] const WEEKDAYS_DE = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] const WEEKDAYS_ES = ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'] +const WEEKDAYS_FR = ['Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'] const WEEKDAYS_AR = ['اث', 'ثل', 'أر', 'خم', 'جم', 'سب', 'أح'] + const MONTHS_EN = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] const MONTHS_DE = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] const MONTHS_ES = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'] +const MONTHS_FR = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'] const MONTHS_AR = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'] function hexToRgba(hex: string, alpha: number): string { @@ -37,9 +40,10 @@ export default function VacayMonthCard({ onCellClick, companyMode, blockWeekends, weekendDays = [0, 6] }: VacayMonthCardProps) { const { language } = useTranslation() - const weekdays = language === 'de' ? WEEKDAYS_DE : language === 'es' ? WEEKDAYS_ES : language === 'ar' ? WEEKDAYS_AR : WEEKDAYS_EN - const monthNames = language === 'de' ? MONTHS_DE : language === 'es' ? MONTHS_ES : language === 'ar' ? MONTHS_AR : MONTHS_EN - + + const weekdays = language === 'de' ? WEEKDAYS_DE : language === 'es' ? WEEKDAYS_ES : language === 'fr' ? WEEKDAYS_FR : language === 'ar' ? WEEKDAYS_AR : WEEKDAYS_EN + const monthNames = language === 'de' ? MONTHS_DE : language === 'es' ? MONTHS_ES : language === 'fr' ? MONTHS_FR : language === 'ar' ? MONTHS_AR : MONTHS_EN + const weeks = useMemo(() => { const firstDay = new Date(year, month, 1) const daysInMonth = new Date(year, month + 1, 0).getDate() diff --git a/client/src/i18n/translations/fr.ts b/client/src/i18n/translations/fr.ts index 722e8d8..f610cc0 100644 --- a/client/src/i18n/translations/fr.ts +++ b/client/src/i18n/translations/fr.ts @@ -5,13 +5,13 @@ const fr: Record = { 'common.delete': 'Supprimer', 'common.edit': 'Modifier', 'common.add': 'Ajouter', - 'common.loading': 'Chargement...', + 'common.loading': 'Chargement…', 'common.error': 'Erreur', 'common.back': 'Retour', 'common.all': 'Tout', 'common.close': 'Fermer', 'common.open': 'Ouvrir', - 'common.upload': 'Téléverser', + 'common.upload': 'Importer', 'common.search': 'Rechercher', 'common.confirm': 'Confirmer', 'common.ok': 'OK', @@ -24,10 +24,10 @@ const fr: Record = { 'common.name': 'Nom', 'common.email': 'E-mail', 'common.password': 'Mot de passe', - 'common.saving': 'Enregistrement...', + 'common.saving': 'Enregistrement…', 'common.update': 'Mettre à jour', 'common.change': 'Modifier', - 'common.uploading': 'Téléversement…', + 'common.uploading': 'Import en cours…', 'common.backToPlanning': 'Retour à la planification', 'common.reset': 'Réinitialiser', @@ -44,7 +44,7 @@ const fr: Record = { // Dashboard 'dashboard.title': 'Mes voyages', - 'dashboard.subtitle.loading': 'Chargement des voyages...', + 'dashboard.subtitle.loading': 'Chargement des voyages…', 'dashboard.subtitle.trips': '{count} voyages ({archived} archivés)', 'dashboard.subtitle.empty': 'Commencez votre premier voyage', 'dashboard.subtitle.activeOne': '{count} voyage actif', @@ -54,8 +54,8 @@ const fr: Record = { 'dashboard.gridView': 'Vue en grille', 'dashboard.listView': 'Vue en liste', 'dashboard.currency': 'Devise', - 'dashboard.timezone': 'Fuseaux horaires', - 'dashboard.localTime': 'Local', + 'dashboard.timezone': 'Fuseau horaire', + 'dashboard.localTime': 'Heure locale', 'dashboard.timezoneCustomTitle': 'Fuseau horaire personnalisé', 'dashboard.timezoneCustomLabelPlaceholder': 'Libellé (facultatif)', 'dashboard.timezoneCustomTzPlaceholder': 'ex. America/New_York', @@ -105,7 +105,7 @@ const fr: Record = { 'dashboard.addMembers': 'Compagnons de voyage', 'dashboard.addMember': 'Ajouter un membre', 'dashboard.coverSaved': 'Image de couverture enregistrée', - 'dashboard.coverUploadError': 'Échec du téléversement', + 'dashboard.coverUploadError': 'Échec de l\'import', 'dashboard.coverRemoveError': 'Échec de la suppression', 'dashboard.titleRequired': 'Le titre est obligatoire', 'dashboard.endDateError': 'La date de fin doit être postérieure à la date de début', @@ -115,7 +115,7 @@ const fr: Record = { 'settings.subtitle': 'Configurez vos paramètres personnels', 'settings.map': 'Carte', 'settings.mapTemplate': 'Modèle de carte', - 'settings.mapTemplatePlaceholder.select': 'Sélectionner un modèle...', + 'settings.mapTemplatePlaceholder.select': 'Sélectionner un modèle…', 'settings.mapDefaultHint': 'Laissez vide pour OpenStreetMap (par défaut)', 'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 'settings.mapHint': 'Modèle d\'URL pour les tuiles de carte', @@ -127,7 +127,7 @@ const fr: Record = { 'settings.mapsKeyHint': 'Pour la recherche de lieux. Nécessite l\'API Places (New). Obtenez-la sur console.cloud.google.com', 'settings.weatherKey': 'Clé API OpenWeatherMap', 'settings.weatherKeyHint': 'Pour les données météo. Gratuit sur openweathermap.org/api', - 'settings.keyPlaceholder': 'Saisir la clé...', + 'settings.keyPlaceholder': 'Saisir la clé…', 'settings.configured': 'Configuré', 'settings.saveKeys': 'Enregistrer les clés', 'settings.display': 'Affichage', @@ -186,15 +186,15 @@ const fr: Record = { 'settings.toast.keysSaved': 'Clés API enregistrées', 'settings.toast.displaySaved': 'Paramètres d\'affichage enregistrés', 'settings.toast.profileSaved': 'Profil enregistré', - 'settings.uploadAvatar': 'Téléverser une photo de profil', + 'settings.uploadAvatar': 'Importer une photo de profil', 'settings.removeAvatar': 'Supprimer la photo de profil', 'settings.avatarUploaded': 'Photo de profil mise à jour', 'settings.avatarRemoved': 'Photo de profil supprimée', - 'settings.avatarError': 'Échec du téléversement', + 'settings.avatarError': 'Échec de l\'import', // Login 'login.error': 'Échec de la connexion. Veuillez vérifier vos identifiants.', - 'login.tagline': 'Vos voyages.\nVotre plan.', + 'login.tagline': 'Vos voyages.\nVotre organisation.', 'login.description': 'Planifiez vos voyages en collaboration avec des cartes interactives, des budgets et la synchronisation en temps réel.', 'login.features.maps': 'Cartes interactives', 'login.features.mapsDesc': 'Google Places, itinéraires et regroupement', @@ -209,7 +209,7 @@ const fr: Record = { 'login.features.bookings': 'Réservations', 'login.features.bookingsDesc': 'Vols, hôtels, restaurants et plus', 'login.features.files': 'Documents', - 'login.features.filesDesc': 'Téléversez et gérez vos documents', + 'login.features.filesDesc': 'Importez et gérez vos documents', 'login.features.routes': 'Itinéraires intelligents', 'login.features.routesDesc': 'Optimisation automatique et export Google Maps', 'login.selfHosted': 'Auto-hébergé · Open Source · Vos données restent les vôtres', @@ -260,7 +260,7 @@ const fr: Record = { 'register.minChars': 'Min. 6 caractères', 'register.confirmPassword': 'Confirmer le mot de passe', 'register.repeatPassword': 'Répéter le mot de passe', - 'register.registering': 'Inscription en cours...', + 'register.registering': 'Inscription en cours…', 'register.register': 'S\'inscrire', 'register.hasAccount': 'Vous avez déjà un compte ?', 'register.signIn': 'Se connecter', @@ -343,7 +343,7 @@ const fr: Record = { // File Types 'admin.fileTypes': 'Types de fichiers autorisés', - 'admin.fileTypesHint': 'Configurez les types de fichiers que les utilisateurs peuvent téléverser.', + 'admin.fileTypesHint': 'Configurez les types de fichiers que les utilisateurs peuvent importer.', 'admin.fileTypesFormat': 'Extensions séparées par des virgules (ex. jpg,png,pdf,doc). Utilisez * pour autoriser tous les types.', 'admin.fileTypesSaved': 'Paramètres des types de fichiers enregistrés', @@ -381,11 +381,11 @@ const fr: Record = { 'admin.addons.catalog.budget.description': 'Suivez les dépenses et planifiez votre budget de voyage', 'admin.addons.catalog.documents.name': 'Documents', 'admin.addons.catalog.documents.description': 'Stockez et gérez vos documents de voyage', - 'admin.addons.catalog.vacay.name': 'Vacay', + 'admin.addons.catalog.vacay.name': 'Vacances', 'admin.addons.catalog.vacay.description': 'Planificateur de vacances personnel avec vue calendrier', 'admin.addons.catalog.atlas.name': 'Atlas', 'admin.addons.catalog.atlas.description': 'Carte du monde avec pays visités et statistiques de voyage', - 'admin.addons.catalog.collab.name': 'Collab', + 'admin.addons.catalog.collab.name': 'Collaboration', 'admin.addons.catalog.collab.description': 'Notes en temps réel, sondages et chat pour la planification de voyage', 'admin.addons.subtitleBefore': 'Activez ou désactivez des fonctionnalités pour personnaliser votre expérience ', 'admin.addons.subtitleAfter': '.', @@ -408,7 +408,7 @@ const fr: Record = { 'admin.weather.climateDesc': 'Moyennes des 85 dernières années pour les jours au-delà des prévisions de 16 jours', 'admin.weather.requests': '10 000 requêtes / jour', 'admin.weather.requestsDesc': 'Gratuit, aucune clé API requise', - 'admin.weather.locationHint': 'La météo est basée sur le premier lieu avec des coordonnées de chaque jour. Si aucun lieu n\'est assigné à un jour, un lieu de la liste est utilisé comme référence.', + 'admin.weather.locationHint': 'La météo est basée sur le premier lieu avec des coordonnées de chaque jour. Si aucun lieu n\'est attribué à un jour, un lieu de la liste est utilisé comme référence.', // GitHub 'admin.tabs.github': 'GitHub', @@ -419,8 +419,8 @@ const fr: Record = { 'admin.github.showDetails': 'Afficher les détails', 'admin.github.hideDetails': 'Masquer les détails', 'admin.github.loadMore': 'Charger plus', - 'admin.github.loading': 'Chargement...', - 'admin.github.support': 'Aide à continuer le développement de TREK', + 'admin.github.loading': 'Chargement…', + 'admin.github.support': 'Aidez à poursuivre le développement de TREK', 'admin.github.error': 'Impossible de charger les versions', 'admin.github.by': 'par', @@ -430,7 +430,7 @@ const fr: Record = { 'admin.update.install': 'Installer la mise à jour', 'admin.update.confirmTitle': 'Installer la mise à jour ?', 'admin.update.confirmText': 'TREK sera mis à jour de {current} vers {version}. Le serveur redémarrera automatiquement ensuite.', - 'admin.update.dataInfo': 'Toutes vos données (voyages, utilisateurs, clés API, téléversements, Vacay, Atlas, budgets) seront préservées.', + 'admin.update.dataInfo': 'Toutes vos données (voyages, utilisateurs, clés API, importations, Vacances, Atlas, budgets) seront préservées.', 'admin.update.warning': 'L\'application sera brièvement indisponible pendant le redémarrage.', 'admin.update.confirm': 'Mettre à jour maintenant', 'admin.update.installing': 'Mise à jour…', @@ -443,7 +443,7 @@ const fr: Record = { 'admin.update.reloadHint': 'Veuillez recharger la page dans quelques secondes.', // Vacay addon - 'vacay.subtitle': 'Planifiez et gérez vos jours de congé', + 'vacay.subtitle': 'Planifiez et gérez vos jours de congés', 'vacay.settings': 'Paramètres', 'vacay.year': 'Année', 'vacay.addYear': 'Ajouter une année', @@ -490,11 +490,11 @@ const fr: Record = { 'vacay.shareEmailPlaceholder': 'E-mail de l\'utilisateur TREK', 'vacay.shareSuccess': 'Plan partagé avec succès', 'vacay.shareError': 'Impossible de partager le plan', - 'vacay.dissolve': 'Dissoudre la fusion', + 'vacay.dissolve': 'Séparer les calendriers', 'vacay.dissolveHint': 'Séparer à nouveau les calendriers. Vos entrées seront conservées.', 'vacay.dissolveAction': 'Dissoudre', 'vacay.dissolved': 'Calendrier séparé', - 'vacay.fusedWith': 'Fusionné avec', + 'vacay.fusedWith': 'Partagé avec', 'vacay.you': 'vous', 'vacay.noData': 'Aucune donnée', 'vacay.changeColor': 'Changer la couleur', @@ -580,14 +580,14 @@ const fr: Record = { 'trip.tabs.packingShort': 'Bagages', 'trip.tabs.budget': 'Budget', 'trip.tabs.files': 'Fichiers', - 'trip.loading': 'Chargement du voyage...', + 'trip.loading': 'Chargement du voyage…', 'trip.mobilePlan': 'Plan', 'trip.mobilePlaces': 'Lieux', 'trip.toast.placeUpdated': 'Lieu mis à jour', 'trip.toast.placeAdded': 'Lieu ajouté', 'trip.toast.placeDeleted': 'Lieu supprimé', 'trip.toast.selectDay': 'Veuillez d\'abord sélectionner un jour', - 'trip.toast.assignedToDay': 'Lieu assigné au jour', + 'trip.toast.assignedToDay': 'Lieu attribué au planning', 'trip.toast.reorderError': 'Échec de la réorganisation', 'trip.toast.reservationUpdated': 'Réservation mise à jour', 'trip.toast.reservationAdded': 'Réservation ajoutée', @@ -605,7 +605,7 @@ const fr: Record = { 'dayplan.totalCost': 'Coût total', 'dayplan.days': 'Jours', 'dayplan.dayN': 'Jour {n}', - 'dayplan.calculating': 'Calcul en cours...', + 'dayplan.calculating': 'Calcul en cours…', 'dayplan.route': 'Itinéraire', 'dayplan.optimize': 'Optimiser', 'dayplan.optimized': 'Itinéraire optimisé', @@ -620,11 +620,11 @@ const fr: Record = { 'dayplan.pdfError': 'Échec de l\'export PDF', // Places Sidebar - 'places.addPlace': 'Ajouter un lieu/activité', + 'places.addPlace': 'Ajouter un lieu ou une activité', 'places.assignToDay': 'Ajouter à quel jour ?', 'places.all': 'Tous', 'places.unplanned': 'Non planifiés', - 'places.search': 'Rechercher des lieux...', + 'places.search': 'Rechercher des lieux…', 'places.allCategories': 'Toutes les catégories', 'places.count': '{count} lieux', 'places.countSingular': '1 lieu', @@ -634,7 +634,7 @@ const fr: Record = { 'places.formName': 'Nom', 'places.formNamePlaceholder': 'ex. Tour Eiffel', 'places.formDescription': 'Description', - 'places.formDescriptionPlaceholder': 'Brève description...', + 'places.formDescriptionPlaceholder': 'Brève description…', 'places.formAddress': 'Adresse', 'places.formAddressPlaceholder': 'Rue, ville, pays', 'places.formLat': 'Latitude (ex. 48.8566)', @@ -648,10 +648,10 @@ const fr: Record = { 'places.endTimeBeforeStart': 'L\'heure de fin est antérieure à l\'heure de début', 'places.timeCollision': 'Chevauchement horaire avec :', 'places.formWebsite': 'Site web', - 'places.formNotesPlaceholder': 'Notes personnelles...', + 'places.formNotesPlaceholder': 'Notes personnelles…', 'places.formReservation': 'Réservation', - 'places.reservationNotesPlaceholder': 'Notes de réservation, numéro de confirmation...', - 'places.mapsSearchPlaceholder': 'Rechercher des lieux...', + 'places.reservationNotesPlaceholder': 'Notes de réservation, numéro de confirmation…', + 'places.mapsSearchPlaceholder': 'Rechercher des lieux…', 'places.mapsSearchError': 'La recherche de lieu a échoué.', 'places.osmHint': 'Recherche via OpenStreetMap (pas de photos, horaires ni notes). Ajoutez une clé API Google dans les paramètres pour plus de détails.', 'places.osmActive': 'Recherche via OpenStreetMap (pas de photos, notes ni horaires). Ajoutez une clé API Google dans les paramètres pour des données enrichies.', @@ -696,7 +696,7 @@ const fr: Record = { 'reservations.time': 'Heure', 'reservations.timeAlt': 'Heure (alternative, ex. 19h30)', 'reservations.notes': 'Notes', - 'reservations.notesPlaceholder': 'Notes supplémentaires...', + 'reservations.notesPlaceholder': 'Notes supplémentaires…', 'reservations.meta.airline': 'Compagnie aérienne', 'reservations.meta.flightNumber': 'N° de vol', 'reservations.meta.from': 'De', @@ -726,14 +726,14 @@ const fr: Record = { 'reservations.confirm.delete': 'Voulez-vous vraiment supprimer la réservation « {name} » ?', 'reservations.toast.updated': 'Réservation mise à jour', 'reservations.toast.removed': 'Réservation supprimée', - 'reservations.toast.fileUploaded': 'Fichier téléversé', - 'reservations.toast.uploadError': 'Échec du téléversement', + 'reservations.toast.fileUploaded': 'Fichier importé', + 'reservations.toast.uploadError': 'Échec de l\'import', 'reservations.newTitle': 'Nouvelle réservation', 'reservations.bookingType': 'Type de réservation', 'reservations.titleLabel': 'Titre', - 'reservations.titlePlaceholder': 'ex. Lufthansa LH123, Hôtel Adlon, ...', + 'reservations.titlePlaceholder': 'ex. Lufthansa LH123, Hôtel Adlon, …', 'reservations.locationAddress': 'Lieu / Adresse', - 'reservations.locationPlaceholder': 'Adresse, aéroport, hôtel...', + 'reservations.locationPlaceholder': 'Adresse, aéroport, hôtel…', 'reservations.confirmationCode': 'Code de réservation', 'reservations.confirmationPlaceholder': 'ex. ABC12345', 'reservations.day': 'Jour', @@ -741,22 +741,22 @@ const fr: Record = { 'reservations.place': 'Lieu', 'reservations.noPlace': 'Aucun lieu', 'reservations.pendingSave': 'sera enregistré…', - 'reservations.uploading': 'Téléversement...', + 'reservations.uploading': 'Importation…', 'reservations.attachFile': 'Joindre un fichier', 'reservations.linkExisting': 'Lier un fichier existant', 'reservations.toast.saveError': 'Échec de l\'enregistrement', 'reservations.toast.updateError': 'Échec de la mise à jour', 'reservations.toast.deleteError': 'Échec de la suppression', 'reservations.confirm.remove': 'Supprimer la réservation pour « {name} » ?', - 'reservations.linkAssignment': 'Lier à l\'assignation du jour', - 'reservations.pickAssignment': 'Sélectionnez une assignation de votre plan...', + 'reservations.linkAssignment': 'Lier à l\'affectation du jour', + 'reservations.pickAssignment': 'Sélectionnez une affectation de votre plan…', 'reservations.noAssignment': 'Aucun lien (autonome)', // Budget 'budget.title': 'Budget', 'budget.emptyTitle': 'Aucun budget créé', 'budget.emptyText': 'Créez des catégories et des entrées pour planifier votre budget de voyage', - 'budget.emptyPlaceholder': 'Nom de la catégorie...', + 'budget.emptyPlaceholder': 'Nom de la catégorie…', 'budget.createCategory': 'Créer une catégorie', 'budget.category': 'Catégorie', 'budget.categoryName': 'Nom de la catégorie', @@ -774,24 +774,24 @@ const fr: Record = { 'budget.total': 'Total', 'budget.totalBudget': 'Budget total', 'budget.byCategory': 'Par catégorie', - 'budget.editTooltip': 'Cliquer pour modifier', + 'budget.editTooltip': 'Cliquez pour modifier', 'budget.confirm.deleteCategory': 'Voulez-vous vraiment supprimer la catégorie « {name} » avec {count} entrées ?', 'budget.deleteCategory': 'Supprimer la catégorie', 'budget.perPerson': 'Par personne', 'budget.paid': 'Payé', 'budget.open': 'Ouvert', - 'budget.noMembers': 'Aucun membre assigné', + 'budget.noMembers': 'Aucun membre attribué', // Files 'files.title': 'Fichiers', 'files.count': '{count} fichiers', 'files.countSingular': '1 fichier', - 'files.uploaded': '{count} téléversés', - 'files.uploadError': 'Échec du téléversement', + 'files.uploaded': '{count} importés', + 'files.uploadError': 'Échec de l\'import', 'files.dropzone': 'Déposez les fichiers ici', 'files.dropzoneHint': 'ou cliquez pour parcourir', 'files.allowedTypes': 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 Mo', - 'files.uploading': 'Téléversement...', + 'files.uploading': 'Importation…', 'files.filterAll': 'Tous', 'files.filterPdf': 'PDF', 'files.filterImages': 'Images', @@ -799,7 +799,7 @@ const fr: Record = { 'files.filterCollab': 'Notes Collab', 'files.sourceCollab': 'Depuis les notes Collab', 'files.empty': 'Aucun fichier', - 'files.emptyHint': 'Téléversez des fichiers pour les joindre à votre voyage', + 'files.emptyHint': 'Importez des fichiers pour les joindre à votre voyage', 'files.openTab': 'Ouvrir dans un nouvel onglet', 'files.confirm.delete': 'Voulez-vous vraiment supprimer ce fichier ?', 'files.toast.deleted': 'Fichier supprimé', @@ -818,18 +818,18 @@ const fr: Record = { 'files.assignTitle': 'Assigner le fichier', 'files.assignPlace': 'Lieu', 'files.assignBooking': 'Réservation', - 'files.unassigned': 'Non assigné', + 'files.unassigned': 'Non attribué', 'files.unlink': 'Supprimer le lien', 'files.toast.trashed': 'Déplacé dans la corbeille', 'files.toast.restored': 'Fichier restauré', 'files.toast.trashEmptied': 'Corbeille vidée', - 'files.toast.assigned': 'Fichier assigné', + 'files.toast.assigned': 'Fichier attribué', 'files.toast.assignError': 'Échec de l\'assignation', 'files.toast.restoreError': 'Échec de la restauration', 'files.confirm.permanentDelete': 'Supprimer définitivement ce fichier ? Cette action est irréversible.', 'files.confirm.emptyTrash': 'Supprimer définitivement tous les fichiers de la corbeille ? Cette action est irréversible.', 'files.noteLabel': 'Note', - 'files.notePlaceholder': 'Ajouter une note...', + 'files.notePlaceholder': 'Ajouter une note…', // Packing 'packing.title': 'Liste de bagages', @@ -841,8 +841,8 @@ const fr: Record = { 'packing.suggestionsTitle': 'Ajouter des suggestions', 'packing.allSuggested': 'Toutes les suggestions ajoutées', 'packing.allPacked': 'Tout est emballé !', - 'packing.addPlaceholder': 'Ajouter un nouvel article...', - 'packing.categoryPlaceholder': 'Catégorie...', + 'packing.addPlaceholder': 'Ajouter un nouvel article…', + 'packing.categoryPlaceholder': 'Catégorie…', 'packing.filterAll': 'Tous', 'packing.filterOpen': 'À faire', 'packing.filterDone': 'Fait', @@ -956,10 +956,10 @@ const fr: Record = { // Backup (Admin) 'backup.title': 'Sauvegarde des données', - 'backup.subtitle': 'Base de données et tous les fichiers téléversés', + 'backup.subtitle': 'Base de données et tous les fichiers importés', 'backup.refresh': 'Actualiser', - 'backup.upload': 'Téléverser une sauvegarde', - 'backup.uploading': 'Téléversement…', + 'backup.upload': 'Importer une sauvegarde', + 'backup.uploading': 'Importation…', 'backup.create': 'Créer une sauvegarde', 'backup.creating': 'Création…', 'backup.empty': 'Aucune sauvegarde', @@ -967,14 +967,14 @@ const fr: Record = { 'backup.download': 'Télécharger', 'backup.restore': 'Restaurer', 'backup.confirm.restore': 'Restaurer la sauvegarde « {name} » ?\n\nToutes les données actuelles seront remplacées par la sauvegarde.', - 'backup.confirm.uploadRestore': 'Téléverser et restaurer le fichier de sauvegarde « {name} » ?\n\nToutes les données actuelles seront écrasées.', + 'backup.confirm.uploadRestore': 'Importer et restaurer le fichier de sauvegarde « {name} » ?\n\nToutes les données actuelles seront écrasées.', 'backup.confirm.delete': 'Supprimer la sauvegarde « {name} » ?', 'backup.toast.loadError': 'Impossible de charger les sauvegardes', 'backup.toast.created': 'Sauvegarde créée avec succès', 'backup.toast.createError': 'Impossible de créer la sauvegarde', 'backup.toast.restored': 'Sauvegarde restaurée. La page va se recharger…', 'backup.toast.restoreError': 'Échec de la restauration', - 'backup.toast.uploadError': 'Échec du téléversement', + 'backup.toast.uploadError': 'Échec de l\'import', 'backup.toast.deleted': 'Sauvegarde supprimée', 'backup.toast.deleteError': 'Échec de la suppression', 'backup.toast.downloadError': 'Échec du téléchargement', @@ -1000,15 +1000,15 @@ const fr: Record = { // Photos 'photos.allDays': 'Tous les jours', 'photos.noPhotos': 'Aucune photo', - 'photos.uploadHint': 'Téléversez vos photos de voyage', + 'photos.uploadHint': 'Importez vos photos de voyage', 'photos.clickToSelect': 'ou cliquez pour sélectionner', 'photos.linkPlace': 'Lier au lieu', 'photos.noPlace': 'Aucun lieu', - 'photos.uploadN': '{n} photo(s) téléversées', + 'photos.uploadN': '{n} photo(s) importée(s)', // Backup restore modal 'backup.restoreConfirmTitle': 'Restaurer la sauvegarde ?', - 'backup.restoreWarning': 'Toutes les données actuelles (voyages, lieux, utilisateurs, téléversements) seront définitivement remplacées par la sauvegarde. Cette action est irréversible.', + 'backup.restoreWarning': 'Toutes les données actuelles (voyages, lieux, utilisateurs, importations) seront définitivement remplacées par la sauvegarde. Cette action est irréversible.', 'backup.restoreTip': 'Conseil : créez une sauvegarde de l\'état actuel avant de restaurer.', 'backup.restoreConfirm': 'Oui, restaurer', @@ -1045,8 +1045,8 @@ const fr: Record = { 'planner.placeN': '{n} lieux', 'planner.addNote': 'Ajouter une note', 'planner.noEntries': 'Aucune entrée pour ce jour', - 'planner.addPlace': 'Ajouter un lieu/activité', - 'planner.addPlaceShort': '+ Ajouter un lieu/activité', + 'planner.addPlace': 'Ajouter un lieu ou une activité', + 'planner.addPlaceShort': '+ Ajouter un lieu ou une activité', 'planner.resPending': 'Réservation en attente · ', 'planner.resConfirmed': 'Réservation confirmée · ', 'planner.notePlaceholder': 'Note…', @@ -1076,7 +1076,7 @@ const fr: Record = { 'planner.noDays': 'Aucun jour', 'planner.editTripToAddDays': 'Modifiez le voyage pour ajouter des jours', 'planner.dayCount': '{n} jours', - 'planner.clickToUnlock': 'Cliquer pour déverrouiller', + 'planner.clickToUnlock': 'Cliquez pour déverrouiller', 'planner.keepPosition': 'Maintenir la position lors de l\'optimisation de l\'itinéraire', 'planner.dayDetails': 'Détails du jour', 'planner.dayN': 'Jour {n}', @@ -1139,7 +1139,7 @@ const fr: Record = { 'memories.allLocations': 'Tous les lieux', // Collab Addon - 'collab.tabs.chat': 'Chat', + 'collab.tabs.chat': 'Discussion', 'collab.tabs.notes': 'Notes', 'collab.tabs.polls': 'Sondages', 'collab.whatsNext.title': 'À venir', @@ -1149,7 +1149,7 @@ const fr: Record = { 'collab.whatsNext.until': 'à', 'collab.whatsNext.emptyHint': 'Les activités avec des horaires apparaîtront ici', 'collab.chat.send': 'Envoyer', - 'collab.chat.placeholder': 'Écrire un message...', + 'collab.chat.placeholder': 'Écrire un message…', 'collab.chat.empty': 'Commencez la conversation', 'collab.chat.emptyHint': 'Les messages sont partagés avec tous les membres du voyage', 'collab.chat.emptyDesc': 'Partagez des idées, des plans et des mises à jour avec votre groupe de voyage', @@ -1166,9 +1166,9 @@ const fr: Record = { 'collab.notes.emptyHint': 'Commencez à capturer vos idées et plans', 'collab.notes.all': 'Toutes', 'collab.notes.titlePlaceholder': 'Titre de la note', - 'collab.notes.contentPlaceholder': 'Écrivez quelque chose...', + 'collab.notes.contentPlaceholder': 'Écrivez quelque chose…', 'collab.notes.categoryPlaceholder': 'Catégorie', - 'collab.notes.newCategory': 'Nouvelle catégorie...', + 'collab.notes.newCategory': 'Nouvelle catégorie…', 'collab.notes.category': 'Catégorie', 'collab.notes.noCategory': 'Sans catégorie', 'collab.notes.color': 'Couleur', @@ -1182,7 +1182,7 @@ const fr: Record = { 'collab.notes.categorySettings': 'Gérer les catégories', 'collab.notes.create': 'Créer', 'collab.notes.website': 'Site web', - 'collab.notes.websitePlaceholder': 'https://...', + 'collab.notes.websitePlaceholder': 'https://…', 'collab.notes.attachFiles': 'Joindre des fichiers', 'collab.notes.noCategoriesYet': 'Aucune catégorie', 'collab.notes.emptyDesc': 'Créez une note pour commencer',