/* Uleez — traduction du back-office. Exporte window.I18N.
 *
 * POURQUOI CE FICHIER.
 *
 * Le back-office était intégralement en français en dur, alors que `User.preferredLanguage`
 * existe en base depuis toujours et que le serveur s'en sert désormais pour les e-mails. Un
 * loueur qui règle son compte en anglais recevait donc des e-mails en anglais… et se
 * connectait à une interface en français.
 *
 * PAS DE BUILD ici : le projet est transpilé à la volée par Babel standalone (voir
 * index.html). On reste dans ce modèle — un IIFE qui pose son API sur `window`, comme
 * icons.jsx, data.jsx et ui.jsx. Ce fichier est chargé AVANT ui.jsx, car les primitives
 * d'interface s'en servent.
 *
 * REPLI EN CASCADE : langue demandée → français → la clé elle-même. Une chaîne non traduite
 * s'affiche en français plutôt que de disparaître, et une clé inexistante apparaît telle
 * quelle — bien plus facile à repérer qu'un libellé vide.
 */
(function () {
  const STORAGE_KEY = 'uleez-lang';
  const SUPPORTED = ['fr', 'en', 'ar'];
  const DEFAULT = 'fr';

  // Le nom d'une langue s'écrit DANS cette langue : un sélecteur qui afficherait « Arabe »
  // en français est illisible pour la personne venue justement basculer en arabe.
  const LANGUAGE_NAMES = { fr: 'Français', en: 'English', ar: 'العربية' };

  const DICT = {
    fr: {
      // — Navigation / shell —
      'nav.dashboard': 'Tableau de bord',
      'nav.bookings': 'Réservations',
      'nav.calendar': 'Calendrier',
      'nav.vehicles': 'Véhicules',
      'nav.fleet': 'Ma flotte',
      'nav.payments': 'Paiements',
      'nav.subscription': 'Abonnement',
      'nav.profile': 'Mon profil',
      'nav.settings': 'Paramètres',
      'nav.logout': 'Déconnexion',
      'nav.support': 'Support',

      // — Commun —
      'common.save': 'Enregistrer',
      'common.cancel': 'Annuler',
      'common.close': 'Fermer',
      'common.search': 'Rechercher',
      'common.loading': 'Chargement…',
      'common.error': 'Erreur',
      'common.retry': 'Réessayer',
      'common.all': 'Tous',
      'common.none': 'Aucun',
      'common.yes': 'Oui',
      'common.no': 'Non',
      'common.language': 'Langue',
      'common.languageSaved': 'Langue mise à jour',
      'common.languageHint':
        'Cette langue s’applique au back-office ET aux e-mails que nous vous envoyons.',

      // — Profil loueur —
      'profile.title': 'Mon profil',
      'profile.myAgency': 'Mon agence',
      'profile.agency': 'Agence',
      'profile.individual': 'Particulier',
      'profile.verified': 'Compte vérifié',
      'profile.pendingVerification': 'Vérification en attente',
      'profile.vehicles': 'Véhicules',
      'profile.rating': 'Note',
      'profile.reviews': 'Avis',
      'profile.changeLogo': 'Changer le logo',
      'profile.tabAgency': 'Agence',
      'profile.tabContact': 'Contact',
      'profile.tabBanking': 'Coordonnées bancaires',
      'profile.tabSecurity': 'Sécurité',
      'profile.tabPreferences': 'Préférences',
      'profile.saved': 'Profil enregistré',
      'profile.logoUpdated': 'Logo mis à jour',
      'profile.uploadFailed': 'Échec de l’upload',
      'profile.passwordUpdated': 'Mot de passe mis à jour',
      'profile.otherSessionsClosed': 'Vos autres sessions ont été déconnectées.',
      'profile.bothPasswords': 'Renseignez les deux mots de passe',
      'profile.passwordMismatch': 'Les mots de passe ne correspondent pas',

      // — Avis clients (nouvelle section) —
      'reviews.title': 'Ce que les clients disent sur vos véhicules',
      'reviews.subtitle':
        'Les avis laissés après chaque location, tous véhicules confondus.',
      'reviews.empty': 'Aucun avis pour le moment',
      'reviews.emptyDesc':
        'Les avis apparaîtront ici dès que vos premiers clients auront terminé leur location.',
      'reviews.allVehicles': 'Tous les véhicules',
      'reviews.average': 'Note moyenne',
      'reviews.count': '{n} avis',
      'reviews.loadFailed': 'Les avis n’ont pas pu être chargés.',
      'reviews.anonymous': 'Client',
      'reviews.noComment': 'Note laissée sans commentaire.',
      // — Statuts — rendus par StatusBadge dans tout l'espace loueur —
      'status.booking.pending': 'En attente',
      'status.booking.confirmed': 'Confirmée',
      'status.booking.in_progress': 'En cours',
      'status.booking.completed': 'Terminée',
      'status.booking.cancelled': 'Annulée',
      'status.booking.rejected': 'Rejetée',
      'status.booking.deletion_requested': 'Suppression demandée',
      'status.booking.deleted': 'Supprimée',
      'status.payment.paid': 'Payé',
      'status.payment.partial': 'Partiel',
      'status.payment.unpaid': 'Impayé',
      'status.payment.none': 'Rien à régler',
      'status.payment.refunded': 'Remboursé',
      'status.vehicle.published': 'En ligne',
      'status.vehicle.unpublished': 'Non publié',
      'status.vehicle.under_review': 'En révision',
      'status.vehicle.rejected': 'Refusé',
      'status.vehicle.archived': 'Archivé',
      'status.lessor.approved': 'Approuvé',
      'status.lessor.pending': 'En attente',
      'status.lessor.rejected': 'Refusé',
      'status.lessor.suspended': 'Suspendu',
      'status.document.pending': 'En attente',
      'status.document.approved': 'Validé',
      'status.document.rejected': 'Refusé',
      'status.kyc.not_submitted': 'Non soumis',
      'status.kyc.pending': 'À vérifier',
      'status.kyc.verified': 'Vérifié',
      'status.kyc.rejected': 'Refusé',
      'status.kyc.expired': 'Expiré',
      // — Titres et sous-titres des pages (en-tête) —
      'page.dashboard.title': 'Tableau de bord',
      'page.dashboard.sub': 'Vue d\'ensemble de votre activité',
      'page.bookings.title': 'Réservations',
      'page.bookings.sub': 'Gérez vos demandes et locations',
      'page.bookingDetail.title': 'Détail de la réservation',
      'page.bookingDetail.sub': 'Informations et messagerie',
      'page.calendar.title': 'Planning',
      'page.calendar.sub': 'Disponibilité de vos véhicules',
      'page.vehicles.title': 'Ma flotte',
      'page.vehicles.sub': 'Vos véhicules en location',
      'page.vehicleNew.title': 'Nouveau véhicule',
      'page.vehicleNew.sub': 'Ajouter une annonce',
      'page.vehicleEdit.title': 'Modifier le véhicule',
      'page.vehicleEdit.sub': 'Mettre à jour l\'annonce',
      'page.payments.title': 'Paiements',
      'page.payments.sub': 'Revenus et transactions',
      'page.subscription.title': 'Mon abonnement',
      'page.subscription.sub': 'Contrat, factures et règlements',
      'page.profile.title': 'Mon profil',
      'page.profile.sub': 'Informations de votre agence',
      'page.setup.title': 'Finaliser mon compte',
      'page.setup.sub': 'Documents et activation du compte loueur',
      // — Graphiques, chat et navigation temporelle —
      'chart.noData': 'Pas de données',
      'chat.sharedLocation': 'Position partagée',
      'chat.openInMaps': 'Ouvrir dans Google Maps',
      'chat.encrypted': 'Message chiffré — indisponible sur cet appareil',
      'det.phoneUnverified': 'Numéro non vérifié',
      'det.phoneUnverifiedHint': 'Ce numéro n\u2019a pas été confirmé par SMS. À titre d\u2019information : la réservation n\u2019est pas bloquée.',
      'chat.quoteYou': 'Vous',
      'chat.quoteClient': 'Client',
      'chat.quotePhoto': 'Photo',
      'chat.quoteAlbum': 'Album photo',
      'chat.quoteVoice': 'Message vocal',
      'chat.quoteFile': 'Pièce jointe',
      'chat.quoteLocation': 'Position partagée',
      'chat.quoteEncrypted': 'Message chiffré',
      'period.previousMonth': 'Mois précédent',
      'period.nextMonth': 'Mois suivant',
      'period.current': 'En cours',
      // — Coquille : en-tête, barre latérale, cloche de notifications —
      'shell.toggleTheme': 'Changer de thème',
      'shell.logout': 'Déconnexion',
      'shell.search': 'Rechercher…',
      'shell.lessorSpace': 'Espace Loueur',
      'shell.roleLessor': 'Loueur',
      'shell.myProfile': 'Mon profil',
      'shell.mySubscription': 'Mon abonnement',
      'shell.settings': 'Paramètres',
      'notif.title': 'Notifications',
      'notif.markAllRead': 'Tout marquer lu',
      'notif.empty': 'Aucune notification',
      'notif.justNow': 'à l\'instant',
      'notif.minutesAgo': 'il y a {n} min',
      'notif.hoursAgo': 'il y a {n} h',
      'notif.daysAgo': 'il y a {n} j',
      // — Thème, médias du chat, visionneuse —
      'shell.themeToLight': 'Passer en mode clair',
      'shell.themeToDark': 'Passer en mode sombre',
      'shell.user': 'Utilisateur',
      'shell.terms': 'Conditions',
      'shell.privacy': 'Confidentialité',
      'shell.collapseMenu': 'Réduire le menu',
      'notif.loading': 'Chargement…',
      'voice.unavailable': 'Lecteur indisponible',
      'voice.playFailed': 'Lecture impossible — cliquez pour réessayer',
      'voice.pause': 'Pause',
      'voice.play': 'Écouter',
      'media.download': 'Télécharger',
      'media.loading': 'Chargement…',
      'media.previousPhoto': 'Photo précédente',
      'media.nextPhoto': 'Photo suivante',
      'media.close': 'Fermer (Échap)',
      // — Messages d'erreur réseau (remontés en toasts) —
      'api.offline': 'Connexion au serveur impossible. Réessayez.',
      'api.sessionExpired': 'Session expirée. Veuillez vous reconnecter.',
      'api.httpError': 'Erreur {code}',
      'api.badCredentials': 'Identifiants incorrects. Vérifiez votre numéro et mot de passe.',
      'api.resetSendFailed': 'Impossible d\'envoyer le lien. Réessayez dans quelques minutes.',
      'api.resetLinkBad': 'Lien de réinitialisation invalide ou expiré',
      'api.fileTypeDenied': 'Type de fichier non autorisé (image, PDF ou audio)',
      'api.attachmentDenied': 'Pièce jointe refusée : contenu non reconnu',
      'api.albumPhotosOnly': 'Un album ne peut contenir que des photos',
      // — Écran Abonnement & facturation —
      'bill.plan.monthly': 'Mensuel',
      'bill.plan.quarterly': 'Trimestriel',
      'bill.plan.yearly': 'Annuel',
      'bill.per.monthly': 'par mois',
      'bill.per.quarterly': 'par trimestre',
      'bill.per.yearly': 'par an',
      'bill.sub.trial': 'Période de bienvenue',
      'bill.sub.active': 'Actif',
      'bill.sub.past_due': 'Échu',
      'bill.sub.suspended': 'Suspendu',
      'bill.sub.cancelled': 'Résilié',
      'bill.sub.expired': 'Expiré',
      'bill.inv.draft': 'Brouillon',
      'bill.inv.issued': 'Émise',
      'bill.inv.sent': 'Envoyée',
      'bill.inv.partially_paid': 'Partielle',
      'bill.inv.paid': 'Réglée',
      'bill.inv.overdue': 'En retard',
      'bill.inv.void': 'Annulée',
      'bill.kind.commission': 'Commission & frais',
      'bill.kind.subscription': 'Abonnement',
      'bill.downloadFailed': 'Téléchargement impossible',
      'bill.loadFailed': 'Impossible de charger votre facturation',
      'bill.overdueTitle': 'Votre abonnement est échu.',
      'bill.overdueBody': 'Sans règlement d\'ici le {date}, vos véhicules seront retirés de la recherche et vous ne recevrez plus de réservations. Vous disposez de {days} jours à compter de l\'échéance. Réglez auprès de l\'agence Uleez pour rétablir immédiatement votre visibilité.',
      'bill.outstandingTitle': '{amount} restent à régler.',
      'bill.outstandingBody': 'Retrouvez le détail dans vos factures ci-dessous.',
      'bill.contractTitle': 'Mon abonnement',
      'bill.contractSub': 'Ce qui rend votre agence visible sur Uleez',
      'bill.noSubTitle': 'Aucun abonnement en cours',
      'bill.noSubDesc': 'Votre agence n\'a pas de contrat actif. Contactez l\'équipe Uleez pour en ouvrir un et rendre votre flotte visible.',
      'bill.formula': 'Formule',
      'bill.nextDue': 'Prochaine échéance',
      'bill.inDays': 'dans {n} jour(s)',
      'bill.overdueDays': 'échu depuis {n} jour(s)',
      'bill.autoRenew': ' · renouvellement automatique',
      'bill.noRenew': ' · sans renouvellement',
      'bill.situation': 'Situation',
      'bill.compliant': 'En règle',
      'bill.toSettle': 'À régulariser',
      'bill.pendingAmount': '{amount} en attente',
      'bill.nothingDue': 'Rien à régler',
      'bill.trialUntil': 'Période de bienvenue en cours jusqu\'au {date}.',
      'bill.trialOngoing': 'Période de bienvenue en cours.',
      'bill.trialNote': 'Aucun abonnement ne vous est facturé tant qu\'elle dure.',
      'bill.roiTitle': 'Ce que Uleez vous a rapporté',
      'bill.roiSub': 'Sur les 12 derniers mois',
      'bill.roiEarned': 'Locations encaissées',
      'bill.roiBookings': '{n} location(s)',
      'bill.roiBilled': 'Abonnement facturé',
      'bill.roiPaid': 'dont {amount} réglés',
      'bill.roiRatio': 'Retour sur abonnement',
      'bill.roiPerDA': 'encaissés pour 1 DA d\'abonnement',
      'bill.roiNote': 'Montant des locations hors frais de service et hors caution, à la date d\'encaissement. La commission n\'est pas comptée ici : proportionnelle à votre chiffre d\'affaires, elle est déjà déduite de ce que vous percevez.',
      'bill.invoicesTitle': 'Mes factures',
      'bill.invoicesSub': 'Abonnements, commissions et frais de service',
      'bill.allKinds': 'Toutes natures',
      'bill.noInvoices': 'Aucune facture',
      'bill.noInvoicesDesc': 'Vos factures apparaîtront ici dès qu\'elles seront émises.',
      'bill.colRef': 'Référence',
      'bill.colKind': 'Nature',
      'bill.colPeriod': 'Période',
      'bill.colDue': 'Échéance',
      'bill.colAmount': 'Montant',
      'bill.colRemaining': 'Restant',
      'bill.colStatus': 'Statut',
      'bill.daysLate': '{n} j de retard',
      'bill.howToPayTitle': 'Comment régler',
      'bill.howToPaySub': 'Modalités de paiement',
      'bill.howToPayBody1': 'Les règlements se font auprès de l\'agence Uleez : espèces, virement ou chèque. Il n\'y a pas de paiement en ligne à ce stade — aucune donnée bancaire ne vous est demandée depuis cet écran.',
      'bill.howToPayBody2': 'Une fois votre règlement enregistré par notre équipe, votre situation et votre visibilité sont mises à jour immédiatement. Si vous avez déjà réglé et que le montant apparaît encore ici, contactez l\'assistance : la saisie n\'a peut-être pas encore été faite.',
      'bill.contactSupport': 'Contacter l\'assistance Uleez',
      'bill.mailSubject': 'Demande d\'assistance — {agency}',
      'bill.mailSubjectFallback': 'mon agence',
      'bill.mailGreeting': 'Bonjour,',
      'bill.mailReasonPlaceholder': '[Décrivez ici la raison de votre message]',
      'bill.mailInfoHeader': 'Mes informations',
      'bill.mailAgencyLabel': 'Agence :',
      'bill.mailPhoneLabel': 'Téléphone :',
      'bill.mailEmailLabel': 'Email :',
      'common.refresh': 'Actualiser',
      'common.download': 'Télécharger',
      // — Tableau de bord et réservations (lessor1) —
      'dash.statusOverview': 'Aperçu des états',
      'dash.confirmedTitle': 'Réservations confirmées',
      'dash.vsLastMonth': 'Ce mois vs mois dernier',
      'dash.publishedVehicles': 'Véhicules publiés',
      'dash.seeFleet': 'Voir ma flotte',
      'dash.monthRevenue': 'Revenu du mois (DA)',
      'dash.seeAll': 'Tout voir',
      'dash.loadError': 'Erreur de chargement',
      'dash.allUpToDate': 'Tout est à jour ✓',
      'dash.noPending': 'Aucune demande en attente.',
      'dash.noUpcoming': 'Aucune location à venir',
      'dash.freeSchedule': 'Votre planning est libre pour le moment.',
      'dash.addVehicle': 'Ajouter un véhicule',
      'dash.growFleet': 'Agrandir votre flotte',
      'dash.seeSchedule': 'Voir le planning',
      'dash.upcomingRentals': 'Locations à venir',
      'dash.loadFailed': 'Impossible de charger',
      'dash.complete': 'Compléter',
      'dash.waitingMinutes': 'En attente {n} min',
      'dash.tomorrow': 'Demain',
      'dash.today': 'Aujourd\'hui',
      'book.rejectRequest': 'Rejeter la demande',
      'book.rejectBooking': 'Rejeter la réservation',
      'book.confirmReject': 'Confirmer le refus',
      'book.rejectReason': 'Motif du refus',
      'book.rejectReasonHint': 'Expliquez la raison du refus (visible par le demandeur)…',
      'book.reasonRequired': 'Le motif est obligatoire.',
      'book.confirmed': 'Réservation confirmée',
      'book.rejectedToast': 'Demande rejetée',
      'book.deleted': 'Réservation supprimée',
      'book.rejectedBooking': 'Réservation rejetée',
      'book.cancelled': 'Réservation annulée',
      'book.completed': 'Location terminée',
      'book.notFulfilled': 'Non réalisée',
      'book.notFulfilledToast': 'Location déclarée non réalisée',
      'book.detail': 'Détail',
      'book.searchPlaceholder': 'Référence, locataire…',
      'book.tabUpcoming': 'À venir',
      'book.tabConfirmed': 'Confirmées',
      'book.tabCompleted': 'Terminées',
      'book.tabCancelled': 'Annulées',
      'book.exportExcel': 'Télécharger Excel',
      'book.exportPdf': 'Télécharger PDF',
      'book.exportFailed': 'Échec de l\'export',
      'book.loadFailed': 'Impossible de charger les réservations',
      'book.none': 'Aucune réservation',
      'book.noneDesc': 'Changez de filtre pour voir d\'autres réservations.',
      'book.colBooking': 'Réservation',
      'book.colVehicle': 'Véhicule',
      'book.colPeriod': 'Période',
      'book.colDuration': 'Durée',
      'book.colCollected': 'Encaissé',
      'book.colBookedOn': 'Date de réservation',
      'book.colServiceFee': 'Frais de service',
      'book.bookedOn': 'Réservée le {date}',
      'book.settledOnHint': 'Date à laquelle la location a été comptabilisée comme encaissée',
      'book.serviceFeeHint': 'Frais de service payés par le client — à reverser à Uleez',
      'book.presumedHint': 'Encaissement présumé par le système après 48 h, non confirmé par vous',
      'book.presumed': 'Présumé',
      'pay.recorded': 'Paiement enregistré',
      'pay.recordTitle': 'Enregistrer un paiement',
      'pay.amountToCollect': 'Montant à encaisser (DA)',
      'pay.method': 'Méthode',
      'pay.cashOnPickup': 'Espèces (à la remise)',
      'pay.reference': 'Référence',
      'nf.title': 'Cette location n\'a pas eu lieu',
      'nf.reasonHint': 'Ex. : le client ne s\'est pas présenté à la remise des clés.',
      'nf.reasonKept': 'Ce motif est conservé et visible par le support.',
      'common.export': 'Exporter',
      'dash.pendingRequests': 'Demandes en attente',
      'dash.urgentCount': '{n} urgentes',
      'dash.toProcess': '{n} à traiter',
      'dash.nextRentals': 'Prochaines locations',
      'dash.lessor': 'Loueur',
      'book.reject': 'Rejeter',
      'book.confirm': 'Confirmer',
      'book.cancel': 'Annuler',
      'book.finish': 'Terminer',
      'book.delete': 'Supprimer',
      'book.payment': 'Paiement',
      'book.columns': 'Colonnes',
      'book.compactView': 'Affichage compact',
      'book.tabPending': 'En attente',
      'book.tabInProgress': 'En cours',
      'book.colRenter': 'Locataire',
      'book.colNet': 'Net',
      'book.colStatus': 'Statut',
      'book.colActions': 'Actions',
      'pay.confirmCollection': 'Confirmer l\'encaissement',
      'nf.reasonRequired': 'Motif (obligatoire)',
      'dash.inDays': 'Dans {n} jour(s)',
      'dash.upcomingTitle': 'Prochaines locations',
      'dash.finishSetupTitle': 'Finalisez la création de votre compte',
      'dash.finishSetupBody': 'Complétez votre dossier (documents justificatifs) pour demander l\'activation de votre compte.',
      'book.tabAll': 'Toutes',
      'book.settledOn': 'Encaissée le {date}',
      'book.ofWhichFees': 'dont {amount} de frais',
      'book.days': '{n} j',
      'pay.totalNote': 'Montant total de la réservation, frais de service inclus. Confirmez uniquement après avoir reçu la somme.',
      'nf.confirmCancel': 'Confirmer l\'annulation',
      'nf.explainOn': 'Cette réservation a été comptabilisée automatiquement comme encaissée le {date}. La déclarer non réalisée annule l\'encaissement de {amount}, retire la location de vos revenus et passe la réservation en « Annulée ».',
      'nf.explain': 'Cette réservation a été comptabilisée automatiquement comme encaissée. La déclarer non réalisée annule l\'encaissement de {amount}, retire la location de vos revenus et passe la réservation en « Annulée ».',
      'nf.charsLeft': 'Encore {n} caractère(s) — ce motif est conservé et visible par le support.',
      // — Assistance, revenus, profil et fiche véhicule (lessor3) —
      'asst.justNow': 'À l\'instant',
      'asst.reactFailed': 'Réaction impossible',
      'asst.attachment': '📎 Pièce jointe',
      'asst.cancelReply': 'Annuler la réponse',
      'asst.attachHint': 'Joindre une image ou un PDF',
      'asst.messagePlaceholder': 'Votre message…',
      'rev.wholePeriod': 'Toute la période',
      'rev.realCumul': 'cumul réel',
      'rev.projectedCumul': 'cumul projeté',
      'rev.lowHistory': 'peu de recul',
      'rev.realCumulTitle': 'Cumul réel',
      'rev.realized': 'Revenus réalisés',
      'rev.evolution': 'Évolution des revenus',
      'rev.clickToChange': 'Cliquez une barre pour changer de période',
      'rev.clickToIsolate': 'Cliquez une barre pour isoler une période',
      'rev.noData': 'Aucune donnée',
      'rev.noRevenue': 'Pas encore de revenus sur cette période.',
      'rev.byDay': 'Par jour',
      'rev.byWeek': 'Par semaine',
      'rev.byMonth': 'Par mois',
      'rev.year': 'Année',
      'rev.previous': 'Précédent',
      'rev.backToToday': 'Revenir à aujourd\'hui',
      'rev.loadFailed': 'Impossible de charger les données',
      'rev.collected': 'Encaissé auprès des clients (DA)',
      'rev.collectedSub': 'Argent effectivement reçu',
      'rev.serviceFees': 'Frais de service (DA)',
      'rev.serviceFeesSub': 'Payés par le client · à reverser',
      'rev.toRemit': 'À reverser à Uleez (DA)',
      'rev.netForYou': 'Net pour vous (DA)',
      'rev.netForYouSub': 'Ce qui vous reste au final',
      'rev.breakdown': 'Répartition',
      'rev.byVehicle': 'Par véhicule',
      'rev.forecast': 'Prévision',
      'rev.forecastSub': 'Projection sur la période',
      'rev.alreadyBooked': 'Déjà réservé (confirmé, non payé)',
      'rev.asIs': 'Compté tel quel, pas estimé',
      'rev.dailyAverage': 'Moyenne journalière retenue',
      'rev.lowHistoryNote': ' Trop peu de recul : à considérer comme un ordre de grandeur.',
      'rev.weekdayProfile': ' Le profil par jour de la semaine est pris en compte.',
      'rev.yourRevenue': 'Votre revenu',
      'rev.yourRevenueSub': 'Ce que la location vous rapporte',
      'rev.billedRentals': 'Locations facturées',
      'rev.billedRentalsSub': 'Hors frais de service et caution',
      'rev.commissionSub': 'Prélevée sur la location uniquement',
      'rev.netToReceive': 'Net à percevoir',
      'rev.collectedFrom': 'Encaissé des clients',
      'rev.throughYourHands': 'Ce qui passe par vos mains',
      'rev.serviceFeeShort': 'Frais de service',
      'rev.serviceFeeCollected': 'Payés par le client, collectés pour Uleez',
      'rev.discountsFunded': 'Remises financées par Uleez',
      'rev.discountsNote': 'Le client paie moins, vous ne perdez rien',
      'rev.totalCollected': 'Total encaissé',
      'rev.toRemitShort': 'À reverser à Uleez',
      'rev.balanceDetail': 'Le détail du solde',
      'rev.feesCollected': 'Frais de service collectés',
      'rev.feesCollectedNote': 'Vous les avez encaissés pour Uleez',
      'rev.discountsDeducted': 'Déduites de ce que vous devez',
      'rev.uleezRefunds': 'Uleez vous reverse',
      'rev.historyTitle': 'Historique des encaissements',
      'rev.noCollection': 'Aucun encaissement sur cette période',
      'rev.historyNote': 'Les encaissements apparaissent ici à la date où vous recevez l\'argent, pas à la date de réservation.',
      'rev.colCollectedOn': 'Encaissé le',
      'rev.colRentalPeriod': 'Période de location',
      'rev.presumedHint': 'Encaissement présumé automatiquement 48 h après la fin de la location, non confirmé par vous',
      'prof.rc': 'Registre de commerce (RC)',
      'prof.descHint': 'Visible par les locataires sur vos annonces',
      'prof.phone': 'Téléphone',
      'prof.contactNote': 'Ces informations sont utilisées pour vous contacter au sujet des réservations.',
      'prof.accountHolder': 'Titulaire du compte',
      'prof.bankNote': 'Vos versements sont effectués chaque semaine sur ce compte, après déduction de la commission.',
      'prof.currentPassword': 'Mot de passe actuel',
      'prof.newPassword': 'Nouveau mot de passe',
      'prof.twoFactorNote': 'Activez la double authentification pour sécuriser votre compte.',
      'veh.unlimited': 'Illimité',
      'veh.deleteFailed': 'Impossible de supprimer',
      'veh.updated': 'Véhicule modifié',
      'veh.draftSaved': 'Brouillon enregistré',
      'veh.submitted': 'Véhicule soumis à validation Uleez',
      'veh.add': 'Ajouter un véhicule',
      'veh.photos': 'Photos du véhicule',
      'veh.photosHint': 'Jusqu\'à 8 photos · la première sera la couverture',
      'rev.cumul': 'cumul',
      'rev.confHigh': 'fiable',
      'rev.confMedium': 'indicative',
      'rev.projectionPerDay': 'Projection · {amount}/j ({conf})',
      'rev.alreadyBookedAmount': '{amount} déjà réservés',
      'rev.chartBar': 'Barre',
      'rev.chartLine': 'Cumul',
      'rev.chartPie': 'Camembert',
      'rev.periodMonth': 'Mois',
      'rev.periodQuarter': 'Trimestre',
      'rev.periodLast12': '12 derniers mois',
      'rev.next': 'Suivant',
      'rev.commissionFormula': 'Commission {pct}% + frais − remises',
      'rev.trend': 'Tendance',
      'rev.basedOn': 'Basée sur {days} jour(s) d\'historique et {bookings} location(s).',
      'rev.commissionUleez': 'Commission Uleez ({pct}%)',
      'rev.netShare': 'Net : {pct}%',
      'rev.depositNote': 'La caution n\'apparaît jamais ici : elle est restituée au client.',
      'rev.commission': 'Commission',
      'rev.commissionOf': '{pct}% des locations facturées',
      'rev.checkLine': 'Vérification : {collected} encaissés − {net} pour vous = {due}.',
      'rev.transactions': 'Transactions',
      'rev.awaitingConfirm': '{n} location(s) terminée(s) attendent la confirmation de leur encaissement.',
      'rev.colCollection': 'Encaissement',
      'rev.colRental': 'Location',
      'rev.bookedOn': 'réservée le {date}',
      'prof.phoneInvalid': 'Numéro invalide pour {country}',
      'prof.website': 'Site web (optionnel)',
      'prof.bank': 'Banque',
      'prof.iban': 'RIB / Compte bancaire',
      'prof.confirmPassword': 'Confirmer',
      'prof.address': 'Adresse',
      'prof.description': 'Description',
      'prof.wilaya': 'Wilaya',
      'prof.type': 'Type',
      'prof.email': 'Email',
      'veh.editTitle': 'Modifier · {vehicle}',
      'veh.generalInfo': 'Informations générales',
      'veh.brand': 'Marque',
      'veh.model': 'Modèle',
      'veh.year': 'Année',
      'veh.plate': 'Immatriculation',
      'veh.category': 'Catégorie',
      'veh.fuel': 'Carburant',
      'veh.gearbox': 'Boîte',
      'veh.seats': 'Places',
      'veh.luggage': 'Bagages',
      'veh.color': 'Couleur du véhicule',
      'veh.description': 'Description',
      'veh.pricingTitle': 'Tarification & disponibilité',
      'veh.pricePerDay': 'Prix par jour (DA)',
      'veh.pricePerWeek': 'Prix par semaine (DA)',
      'veh.pricePerMonth': 'Prix par mois (DA)',
      'veh.deposit': 'Caution (DA)',
      'veh.restrictions': 'Règles du véhicule',
      'veh.restr.no_smoking': 'Non-fumeur',
      'veh.restr.pets_allowed': 'Animaux acceptés',
      'veh.restr.no_pets': 'Animaux non acceptés',
      'veh.restr.mileage_limited': 'Kilométrage limité',
      'veh.restr.no_offroad': 'Hors-piste interdit',
      'veh.restr.min_age_25': 'Conducteur de 25 ans minimum',
      'veh.mileagePolicy': 'Politique de kilométrage',
      'veh.availWilaya': 'Wilaya de disponibilité',
      'veh.pickupAddress': 'Adresse de prise en charge',
      'veh.latitude': 'Latitude',
      'veh.longitude': 'Longitude',
      'veh.requiredDocs': 'Documents requis du locataire',
      'veh.requiredDocsSub': 'Sélectionnez les documents que le locataire devra fournir',
      'veh.descPlaceholder': 'Décrivez votre véhicule, ses équipements, son état…',
      'veh.colorPlaceholder': 'ex: Blanc, Noir, Gris métallisé…',
      'veh.addressPlaceholder': 'Rue, quartier…',
      'prof.agencyName': 'Nom de l\'agence',
      // — Détail de réservation, planning, flotte et activation (lessor2) —
      'det.previewUnavailable': 'Aperçu indisponible',
      'det.statusUpdated': 'Statut mis à jour',
      'det.extAccepted': 'Prolongation acceptée',
      'det.extRefused': 'Prolongation refusée',
      'det.tooEarly': 'Trop tôt',
      'det.tooEarlyBody': 'Disponible à partir du premier jour de la location{when}.',
      'det.cannotFinish': 'Une location ne peut pas être terminée avant sa date de début.',
      'det.requestSent': 'Demande envoyée',
      'det.deletionPending': 'La suppression sera validée par un administrateur.',
      'det.paymentReceived': 'Paiement reçu',
      'det.deletionAwaiting': 'Suppression en attente de validation admin',
      'det.confirmBooking': 'Confirmer la réservation',
      'det.availableAfterStart': 'Disponible une fois la location commencée',
      'det.markCompleted': 'Marquer comme terminée',
      'det.downloadContract': 'Télécharger le contrat',
      'det.notFound': 'Réservation introuvable',
      'det.backToBookings': 'Retour aux réservations',
      'det.deletedNote': 'Cette réservation a été supprimée (jamais commencée ni payée). Elle est conservée pour l\'historique.',
      'det.deletionRequested': 'Suppression demandée — en attente de validation par un administrateur.',
      'det.extensionRequest': 'Demande de prolongation',
      'det.extraDays': 'Jours en plus',
      'det.cost': 'Coût',
      'det.acceptExtension': 'Accepter la prolongation',
      'det.rentalDetails': 'Détails de la location',
      'det.customerNote': 'Note du client',
      'det.seeListing': 'Voir la fiche',
      'det.inspection': 'État des lieux',
      'det.inspectionLate': 'Déposé en retard',
      'det.checkIn': 'Départ (check-in)',
      'det.sendMessage': 'Envoyer un message',
      'det.serviceFee': 'Frais de service',
      'det.paidByCustomer': '(payés par le client)',
      'det.totalPaidByCustomer': 'Total réglé par le client',
      'det.depositNote': '(restituée, hors commission)',
      'det.yourBreakdown': 'Votre décompte',
      'det.totalReceived': 'Total perçu par le loueur',
      'det.uleezRefunds': 'Uleez vous reverse',
      'det.toRemit': 'À reverser à Uleez',
      'det.feesCollected': 'Frais de service collectés du client',
      'det.totalToReceive': 'Total à recevoir',
      'det.totalToRemit': 'Total à reverser',
      'det.renterDocs': 'Documents du locataire',
      'det.noDocs': 'Aucun document',
      'det.noDocsDesc': 'Le locataire n\'a pas encore envoyé de document.',
      'det.downloadFailed': 'Téléchargement impossible',
      'det.encryptedPdf': 'Document PDF chiffré',
      'det.clickToDownload': 'Cliquer pour télécharger',
      'det.noMessageDesc': 'Envoyez un message au locataire.',
      'det.requestDeletion': 'Demander la suppression',
      'cal.blocked': 'Bloqué',
      'cal.blockedDates': 'Dates bloquées',
      'cal.unavailable': 'Le véhicule est indisponible sur la période.',
      'cal.allVehicles': 'Tous les véhicules',
      'cal.blockDates': 'Bloquer des dates',
      'cal.confirmedOngoing': 'Confirmée / en cours',
      'cal.clickDay': 'Cliquez sur un jour pour voir le détail',
      'cal.fleetOverview': 'Vue d\'ensemble de la flotte',
      'cal.noVehicle': 'Aucun véhicule',
      'cal.noEvent': 'Aucun évènement',
      'cal.freeDay': 'Journée libre',
      'cal.freeDayDesc': 'Aucune réservation ni blocage ce jour.',
      'cal.blockRemoved': 'Blocage supprimé',
      'cal.blockDesc': 'Rendez un véhicule indisponible (maintenance, usage personnel…)',
      'cal.confirmBlock': 'Confirmer le blocage',
      'cal.startDate': 'Date de début',
      'cal.endDate': 'Date de fin',
      'cal.reasonPlaceholder': 'Maintenance, révision…',
      'fleet.unpublished': 'Véhicule dépublié',
      'fleet.published': 'Véhicule publié',
      'fleet.loadFailed': 'Impossible de charger la flotte',
      'fleet.accountPending': 'Compte en cours de validation',
      'fleet.accountPendingBody': 'Votre compte doit être activé par notre équipe avant de pouvoir gérer votre flotte. Complétez votre dossier pour accélérer le processus.',
      'fleet.completeFile': 'Compléter mon dossier',
      'fleet.allStatuses': 'Tous les statuts',
      'fleet.noVehicleDesc': 'Ajoutez votre premier véhicule pour commencer à recevoir des réservations.',
      'fleet.unpublish': 'Dépublier',
      'fleet.publish': 'Publier',
      'fleet.seeBookings': 'Voir les réservations',
      'fleet.managePhotos': 'Gérer les photos',
      'fleet.unarchive': 'Désarchiver',
      'fleet.archived': 'Véhicule archivé',
      'fleet.unarchived': 'Véhicule désarchivé',
      'fleet.archiveConfirmTitle': 'Archiver ce véhicule ?',
      'fleet.archiveConfirmDesc': 'Il disparaîtra de votre flotte active et de la recherche. Vous pourrez le désarchiver à tout moment depuis le filtre « Archivés ».',
      'setup.cin': 'Carte d\'identité (CIN)',
      'setup.cinDesc': 'Document d\'identité du responsable',
      'setup.rib': 'RIB / Relevé bancaire',
      'setup.ribDesc': 'Pour le versement de vos revenus',
      'setup.rc': 'Registre de commerce (RC)',
      'setup.rcDesc': 'Pour les agences',
      'setup.docSent': 'Document envoyé',
      'setup.reviewIn48h': 'Notre équipe examine votre dossier sous 24-48h.',
      'setup.title': 'Compléter mon dossier',
      'setup.subtitle': 'Ces documents sont nécessaires pour activer votre compte.',
      'setup.done': 'Terminé',
      'setup.verified': '✓ Vérifié',
      'setup.rejected': '✗ Rejeté — veuillez re-déposer',
      'setup.awaitingCheck': 'En attente de vérification',
      'setup.upload': 'Téléverser',
      'setup.requestSentLong': 'Demande envoyée. Notre équipe examinera votre dossier dans un délai de 24 à 48h. Vous recevrez un e-mail de confirmation.',
      'setup.needCin': 'Déposez la CIN pour continuer',
      'setup.accountActive': 'Votre compte est actif. Vous pouvez gérer votre flotte.',
      'setup.manageFleet': 'Gérer ma flotte',
      'det.tabBooking': 'Réservation',
      'det.tabRenter': 'Locataire',
      'det.tabPayment': 'Paiement',
      'det.tabDocuments': 'Documents',
      'det.impossible': 'Impossible',
      'det.availableFrom': 'Disponible à partir du {date}',
      'det.payNotYet': 'Le paiement ne peut être encaissé qu\'à partir du premier jour de la location{when}.',
      'det.refuse': 'Refuser',
      'det.newReturn': 'Nouveau retour',
      'det.pickup': 'Prise en charge',
      'det.return': 'Retour',
      'det.location': 'Localisation',
      'det.conversation': 'Conversation',
      'det.rental': 'Location',
      'det.deposit': 'Caution',
      'det.commission': 'Commission',
      'det.perDay': 'DA / jour',
      'det.reasonOptional': 'Raison (optionnel)',
      'det.welcome': 'Bienvenue',
      'cal.today': 'Aujourd\'hui',
      'cal.myFleet': 'Ma flotte',
      'cal.payments': 'Paiements',
      'cal.online': 'En ligne',
      'cal.edit': 'Modifier',
      'det.checkOut': 'Retour (check-out)',
      'det.rentalDays': 'Location ({n} j)',
      'det.discount': 'Remise',
      'det.vehicle': 'Véhicule',
      'det.discountFunded': 'Remise{code} financée par Uleez',
      'det.balanceCheck': '{total} encaissés {sign} {due} = {net} nets pour vous.',
      'cal.eventCount': '{n} évènement(s)',
      'cal.blockedDays': 'Jours bloqués/réservés en {month}',
      'fleet.count': '{n} véhicules · {online} en ligne',
      'setup.profileCreatedAgency': 'Profil agence créé',
      'setup.profileCreatedLessor': 'Profil loueur créé',
      'setup.replace': 'Remplacer',
      'setup.requestActivation': 'Demander l\'activation',
      'setup.cinRequired': 'La CIN est obligatoire pour soumettre votre dossier.',
      'det.noMessage': 'Aucun message',
      'det.docPending': 'En attente : le locataire doit renvoyer ce document.',
      'rev.pageTitle': 'Paiements & revenus',
      'rev.pageSub': 'Ce que vous gagnez, ce que vous encaissez et ce que vous reversez à Uleez',
      'rev.pendingCount': '{n} paiement(s) en attente · {amount}',
      'veh.uploadError': 'Erreur upload : {file}',
      'veh.reorderError': "L'ordre des photos n'a pas pu être enregistré",
      'veh.backToFleet': 'Retour à la flotte',
      'veh.airportDelivery': 'Livraison à l\'aéroport disponible',
      'veh.manualApproval': 'Validation manuelle des réservations',
      'veh.manualApprovalNote': 'Si coché, chaque demande de réservation devra être approuvée par vous avant confirmation. Sinon, les réservations sont confirmées automatiquement.',
      'veh.saveDraft': 'Enregistrer en brouillon',
      'veh.publish': 'Publier le véhicule',
      'book.selectedCount': '{n} sélectionné(s)',
      'book.bookingCount': '{n} réservation(s)',
      'det.payFromDay1': 'Encaissement possible à partir du 1ᵉʳ jour de la location ({date}).',
      // — Connexion, mot de passe oublié et inscription loueur —
      'pwd.minLength': '8 caractères minimum',
      'pwd.upper': '1 majuscule',
      'pwd.digit': '1 chiffre',
      'pwd.special': '1 caractère spécial',
      'login.heroTitle': 'Gérez votre flotte, connectez vos clients.',
      'login.vehicles': 'Véhicules',
      'login.phone': 'Numéro de téléphone',
      'login.password': 'Mot de passe',
      'login.rememberMe': 'Se souvenir de moi',
      'login.forgot': 'Mot de passe oublié ?',
      'login.needPassword': 'Veuillez saisir votre mot de passe.',
      'login.notLessor': 'Accès refusé. Ce portail est réservé aux loueurs et administrateurs.',
      'login.genericError': 'Une erreur est survenue. Réessayez.',
      'rec.title': 'Votre code de récupération',
      'rec.body1': 'Vos conversations sont chiffrées : nos serveurs ne peuvent pas les lire. ',
      'rec.body2': 'Ce code est le seul moyen de retrouver vos messages si vous oubliez votre mot de passe.',
      'rec.body3': ' Il ne sera plus jamais affiché.',
      'rec.copied': 'Copié',
      'rec.copy': 'Copier le code',
      'rec.confirm': 'J\'ai noté ce code et je le conserve en lieu sûr.',
      'fp.title': 'Mot de passe oublié',
      'fp.subtitle': 'Saisissez l\'adresse email de votre compte : nous vous enverrons un lien pour définir un nouveau mot de passe.',
      'fp.emailPlaceholder': 'vous@exemple.dz',
      'fp.sendLink': 'Envoyer le lien',
      'fp.checkInbox': 'Vérifiez votre boîte mail',
      'fp.sentTo': 'Si un compte Uleez est associé à ',
      'fp.sentBody': ', vous allez recevoir un lien de réinitialisation. Il est valable 30 minutes et ne peut servir qu\'une seule fois.',
      'fp.checkSpam': 'Pensez à regarder dans vos courriers indésirables.',
      'fp.backToLogin': 'Retour à la connexion',
      'rp.title': 'Nouveau mot de passe',
      'rp.confirm': 'Confirmer le mot de passe',
      'rp.mismatch': 'Les mots de passe ne correspondent pas',
      'rp.mismatchDot': 'Les deux mots de passe ne correspondent pas.',
      'rp.criteria': 'Le mot de passe ne respecte pas les critères ci-dessous.',
      'rp.submit': 'Définir le mot de passe',
      'rp.updated': 'Mot de passe mis à jour',
      'rp.updatedBody': 'Vous pouvez maintenant vous connecter avec votre nouveau mot de passe. ',
      'rp.sessionsClosed': 'Par sécurité, toutes les sessions déjà ouvertes sur d\'autres appareils ont été déconnectées.',
      'rp.expired': 'Lien expiré',
      'rp.expiredBody': 'Ce lien de réinitialisation n\'est plus valable : il a expiré ou a déjà été utilisé. ',
      'rp.askNew': 'Demandez-en un nouveau depuis l\'écran de connexion.',
      'ob.createAccount': 'Créez votre compte',
      'ob.firstName': 'Prénom *',
      'ob.lastName': 'Nom *',
      'ob.phone': 'Numéro de téléphone *',
      'ob.password': 'Mot de passe *',
      'ob.confirmPassword': 'Confirmer le mot de passe *',
      'ob.passwordRule': 'Min. 8 caractères, 1 majuscule, 1 chiffre, 1 caractère spécial',
      'ob.creating': 'Création du compte…',
      'ob.signupError': 'Une erreur est survenue. Vérifiez que cet email/téléphone n\'est pas déjà utilisé.',
      'ob.genericError': 'Une erreur est survenue.',
      'ob.rcRequired': 'Requis pour une agence',
      'ob.yourAgency': 'Votre agence',
      'ob.yourProfile': 'Votre profil',
      'ob.youAre': 'Vous êtes *',
      'ob.independent': 'Particulier / loueur indépendant',
      'ob.agency': 'Agence / Société de location',
      'ob.agencyName': 'Nom de l\'agence / société *',
      'ob.contactPhone': 'Téléphone de contact',
      'ob.contactEmail': 'Email de contact',
      'ob.rcNumber': 'N° Registre de commerce (RC)',
      'ob.descPlaceholder': 'Agence spécialisée dans la location de véhicules…',
      'ob.descPlaceholderIndep': 'Décrivez votre activité de loueur…',
      'ob.completeLater': 'Vous pourrez compléter votre dossier (documents justificatifs) après connexion, depuis votre tableau de bord.',
      'ob.goToDashboard': 'Accéder au tableau de bord →',
      'ob.accountCreated': 'Compte créé !',
      'ob.isReady': ' est prêt.',
      'ob.completeFile': 'Complétez votre dossier (CIN, RIB…) depuis le tableau de bord pour activer votre compte.',
      'ob.reviewDelay': 'Notre équipe examine les dossiers dans un délai de 24 à 48h.',
      'ob.onceActive': 'Une fois activé, vous pourrez publier vos véhicules et recevoir des réservations.',
      'ob.goToSpace': 'Accéder à mon espace',
      'login.heroSub': 'Le back-office des agences et loueurs de voitures en Algérie. Réservations, planning, paiements — au même endroit.',
      'login.wilayas': 'Wilayas',
      'login.satisfaction': 'Satisfaction',
      'rp.chooseStrong': 'Choisissez un mot de passe solide pour votre compte Uleez.',
      'rp.recoveryLabel': 'Code de récupération (facultatif)',
      'rp.recoveryHint': 'Vos conversations sont chiffrées. Saisissez votre code de récupération pour les retrouver. Sans lui, le compte est réinitialisé et la messagerie repart avec une nouvelle clé — mais vos anciens messages seront définitivement perdus, et un nouveau code vous sera remis.',
      'rp.recoveryWrong': 'Ce code ne correspond pas. Vérifiez-le, ou laissez le champ vide pour réinitialiser sans restaurer vos messages.',
      'rp.recoverySkipped': 'Mot de passe réinitialisé et messagerie réactivée avec une nouvelle clé. Vos anciens messages chiffrés ne sont plus récupérables.',
      'rp.newCodeTitle': 'Votre nouveau code de récupération',
      'rp.newCodeBody': 'Notez-le et conservez-le en lieu sûr : c\'est le seul moyen de retrouver vos messages si vous oubliez votre mot de passe. Il ne sera plus jamais affiché.',
      'rp.copyCode': 'Copier le code',
      'rp.copied': 'Copié',
      'chat.removeReaction': 'Retirer ma réaction',
      'chat.react': 'Réagir',
      'chat.reply': 'Répondre',
      'phone.countryCode': 'Indicatif du pays',
      // — Signalements de bug remontés depuis l'app mobile —
      'bug.title': 'Signalements',
      'bug.sub': 'Problèmes remontés depuis l\'application mobile',
      'bug.tab.new': 'Nouveaux',
      'bug.tab.triaged': 'En analyse',
      'bug.tab.resolved': 'Résolus',
      'bug.tab.all': 'Tous',
      'bug.kind.crash': 'Fermeture / blocage',
      'bug.kind.display': 'Affichage',
      'bug.kind.feature': 'Fonction cassée',
      'bug.kind.payment': 'Paiement',
      'bug.kind.other': 'Autre',
      'bug.status.new': 'Nouveau',
      'bug.status.triaged': 'En analyse',
      'bug.status.resolved': 'Résolu',
      'bug.empty': 'Aucun signalement dans cette vue.',
      'bug.error': 'Chargement impossible.',
      'bug.retry': 'Réessayer',
      'bug.reporter': 'Auteur',
      'bug.context': 'Contexte technique',
      'bug.appVersion': 'Version de l\'app',
      'bug.platform': 'Plateforme',
      'bug.device': 'Système',
      'bug.route': 'Écran d\'origine',
      'bug.description': 'Description',
      'bug.noDescription': 'Aucune description écrite.',
      'bug.screenshots': 'Captures d\'écran',
      'bug.voice': 'Note vocale',
      'bug.note': 'Note interne',
      'bug.notePlaceholder': 'Ce qui a été trouvé, ce qui reste à faire…',
      'bug.markTriaged': 'Marquer en analyse',
      'bug.markResolved': 'Marquer résolu',
      'bug.reopen': 'Rouvrir',
      'bug.saved': 'Signalement mis à jour',
      'bug.saveFailed': 'Échec de la mise à jour',
      'bug.count': 'signalement(s)',
      'bug.openDetail': 'Ouvrir',
      // — Promotions sur véhicule (espace loueur) —
      "promo.nav": "Promotions",
      "promo.title": "Promotions",
      "promo.sub": "Prix réduit à durée limitée sur vos véhicules",
      "promo.new": "Nouvelle promotion",
      "promo.vehicle": "Véhicule",
      "promo.pickVehicle": "Choisir un véhicule",
      "promo.normalPrice": "Prix normal",
      "promo.promoPrice": "Prix en promotion (DA/jour)",
      "promo.discount": "Remise",
      "promo.from": "Début",
      "promo.to": "Fin",
      "promo.create": "Soumettre à validation",
      "promo.creating": "Envoi…",
      "promo.pendingNote": "Votre promotion sera visible des clients une fois validée par Uleez.",
      "promo.created": "Promotion envoyée pour validation",
      "promo.createFailed": "Création impossible",
      "promo.empty": "Aucune promotion pour le moment.",
      "promo.status.pending": "En attente de validation",
      "promo.status.approved": "En ligne",
      "promo.status.rejected": "Refusée",
      "promo.rejectedBecause": "Motif",
      "promo.remove": "Retirer",
      "promo.removed": "Promotion retirée",
      "promo.removeConfirm": "Retirer cette promotion ?",
      "promo.minDiscount": "La remise doit être d’au moins 5 %.",
      "promo.endsAfterStart": "La fin doit être après le début.",
      "promo.perDay": "DA/jour",
      // Pourquoi une promotion est — ou n'est pas — visible des clients. Le loueur posait la
      // question au support faute de pouvoir la lire sur son propre écran.
      "promo.visible": "Visible dans l’app",
      "promo.notVisible": "Pas encore visible",
      "promo.vis.notApproved": "en attente de validation",
      "promo.vis.archived": "retirée",
      "promo.vis.notStarted": "commence le {date}",
      "promo.vis.ended": "période terminée",
      "promo.vis.vehicleHidden": "véhicule non publié",
      "promo.vis.lessorSuspended": "compte suspendu",
      "promo.vis.fullyBooked": "période entièrement louée",
      "promo.vis.vehicleMissing": "véhicule introuvable",
      "promo.availChecking": "Vérification des disponibilités…",
      "promo.availFree": "Libre sur toute la période ({total} j).",
      "promo.availPartial": "{booked} j déjà loués sur {total} : la promotion reste utile sur les {free} j libres.",
      "promo.availFull": "Déjà loué sur TOUTE la période : la promotion ne serait jamais visible.",
      "promo.availBookedOn": "Déjà loué :",
      "promo.stats.bookings": "{count} réservation(s) sur la période",
      "promo.stats.none": "Aucune réservation sur la période",
    },

    en: {
      'nav.dashboard': 'Dashboard',
      'nav.bookings': 'Bookings',
      'nav.calendar': 'Calendar',
      'nav.vehicles': 'Vehicles',
      'nav.fleet': 'My fleet',
      'nav.payments': 'Payments',
      'nav.subscription': 'Subscription',
      'nav.profile': 'My profile',
      'nav.settings': 'Settings',
      'nav.logout': 'Log out',
      'nav.support': 'Support',

      'common.save': 'Save',
      'common.cancel': 'Cancel',
      'common.close': 'Close',
      'common.search': 'Search',
      'common.loading': 'Loading…',
      'common.error': 'Error',
      'common.retry': 'Try again',
      'common.all': 'All',
      'common.none': 'None',
      'common.yes': 'Yes',
      'common.no': 'No',
      'common.language': 'Language',
      'common.languageSaved': 'Language updated',
      'common.languageHint':
        'This language applies to the back-office AND to the emails we send you.',

      'profile.title': 'My profile',
      'profile.myAgency': 'My agency',
      'profile.agency': 'Agency',
      'profile.individual': 'Individual',
      'profile.verified': 'Verified account',
      'profile.pendingVerification': 'Verification pending',
      'profile.vehicles': 'Vehicles',
      'profile.rating': 'Rating',
      'profile.reviews': 'Reviews',
      'profile.changeLogo': 'Change logo',
      'profile.tabAgency': 'Agency',
      'profile.tabContact': 'Contact',
      'profile.tabBanking': 'Bank details',
      'profile.tabSecurity': 'Security',
      'profile.tabPreferences': 'Preferences',
      'profile.saved': 'Profile saved',
      'profile.logoUpdated': 'Logo updated',
      'profile.uploadFailed': 'Upload failed',
      'profile.passwordUpdated': 'Password updated',
      'profile.otherSessionsClosed': 'Your other sessions have been logged out.',
      'profile.bothPasswords': 'Fill in both passwords',
      'profile.passwordMismatch': 'Passwords do not match',

      'reviews.title': 'What customers say about your vehicles',
      'reviews.subtitle': 'Reviews left after each rental, across your whole fleet.',
      'reviews.empty': 'No reviews yet',
      'reviews.emptyDesc':
        'Reviews will show up here as soon as your first customers finish their rental.',
      'reviews.allVehicles': 'All vehicles',
      'reviews.average': 'Average rating',
      'reviews.count': '{n} reviews',
      'reviews.loadFailed': 'Reviews could not be loaded.',
      'reviews.anonymous': 'Customer',
      'reviews.noComment': 'Rating left without a comment.',
      'status.booking.pending': 'Pending',
      'status.booking.confirmed': 'Confirmed',
      'status.booking.in_progress': 'In progress',
      'status.booking.completed': 'Completed',
      'status.booking.cancelled': 'Cancelled',
      'status.booking.rejected': 'Rejected',
      'status.booking.deletion_requested': 'Deletion requested',
      'status.booking.deleted': 'Deleted',
      'status.payment.paid': 'Paid',
      'status.payment.partial': 'Partial',
      'status.payment.unpaid': 'Unpaid',
      'status.payment.none': 'Nothing to pay',
      'status.payment.refunded': 'Refunded',
      'status.vehicle.published': 'Online',
      'status.vehicle.unpublished': 'Unpublished',
      'status.vehicle.under_review': 'Under review',
      'status.vehicle.rejected': 'Rejected',
      'status.vehicle.archived': 'Archived',
      'status.lessor.approved': 'Approved',
      'status.lessor.pending': 'Pending',
      'status.lessor.rejected': 'Rejected',
      'status.lessor.suspended': 'Suspended',
      'status.document.pending': 'Pending',
      'status.document.approved': 'Approved',
      'status.document.rejected': 'Rejected',
      'status.kyc.not_submitted': 'Not submitted',
      'status.kyc.pending': 'To verify',
      'status.kyc.verified': 'Verified',
      'status.kyc.rejected': 'Rejected',
      'status.kyc.expired': 'Expired',
      'page.dashboard.title': 'Dashboard',
      'page.dashboard.sub': 'An overview of your activity',
      'page.bookings.title': 'Bookings',
      'page.bookings.sub': 'Manage your requests and rentals',
      'page.bookingDetail.title': 'Booking details',
      'page.bookingDetail.sub': 'Details and messaging',
      'page.calendar.title': 'Schedule',
      'page.calendar.sub': 'Your vehicles\' availability',
      'page.vehicles.title': 'My fleet',
      'page.vehicles.sub': 'Your vehicles for rent',
      'page.vehicleNew.title': 'New vehicle',
      'page.vehicleNew.sub': 'Add a listing',
      'page.vehicleEdit.title': 'Edit vehicle',
      'page.vehicleEdit.sub': 'Update the listing',
      'page.payments.title': 'Payments',
      'page.payments.sub': 'Revenue and transactions',
      'page.subscription.title': 'My subscription',
      'page.subscription.sub': 'Contract, invoices and payments',
      'page.profile.title': 'My profile',
      'page.profile.sub': 'Your agency\'s details',
      'page.setup.title': 'Complete my account',
      'page.setup.sub': 'Documents and lessor account activation',
      'chart.noData': 'No data',
      'chat.sharedLocation': 'Shared location',
      'chat.openInMaps': 'Open in Google Maps',
      'chat.encrypted': 'Encrypted message — unavailable on this device',
      'det.phoneUnverified': 'Phone number not verified',
      'det.phoneUnverifiedHint': 'This number has not been confirmed by SMS. For your information only: the booking is not blocked.',
      'chat.quoteYou': 'You',
      'chat.quoteClient': 'Customer',
      'chat.quotePhoto': 'Photo',
      'chat.quoteAlbum': 'Photo album',
      'chat.quoteVoice': 'Voice message',
      'chat.quoteFile': 'Attachment',
      'chat.quoteLocation': 'Shared location',
      'chat.quoteEncrypted': 'Encrypted message',
      'period.previousMonth': 'Previous month',
      'period.nextMonth': 'Next month',
      'period.current': 'Current',
      'shell.toggleTheme': 'Toggle theme',
      'shell.logout': 'Sign out',
      'shell.search': 'Search…',
      'shell.lessorSpace': 'Lessor space',
      'shell.roleLessor': 'Lessor',
      'shell.myProfile': 'My profile',
      'shell.mySubscription': 'My subscription',
      'shell.settings': 'Settings',
      'notif.title': 'Notifications',
      'notif.markAllRead': 'Mark all as read',
      'notif.empty': 'No notifications',
      'notif.justNow': 'just now',
      'notif.minutesAgo': '{n} min ago',
      'notif.hoursAgo': '{n} h ago',
      'notif.daysAgo': '{n} d ago',
      'shell.themeToLight': 'Switch to light mode',
      'shell.themeToDark': 'Switch to dark mode',
      'shell.user': 'User',
      'shell.terms': 'Terms',
      'shell.privacy': 'Privacy',
      'shell.collapseMenu': 'Collapse menu',
      'notif.loading': 'Loading…',
      'voice.unavailable': 'Player unavailable',
      'voice.playFailed': 'Playback failed — click to retry',
      'voice.pause': 'Pause',
      'voice.play': 'Play',
      'media.download': 'Download',
      'media.loading': 'Loading…',
      'media.previousPhoto': 'Previous photo',
      'media.nextPhoto': 'Next photo',
      'media.close': 'Close (Esc)',
      'api.offline': 'Cannot reach the server. Please try again.',
      'api.sessionExpired': 'Session expired. Please sign in again.',
      'api.httpError': 'Error {code}',
      'api.badCredentials': 'Incorrect credentials. Check your number and password.',
      'api.resetSendFailed': 'Could not send the link. Try again in a few minutes.',
      'api.resetLinkBad': 'Invalid or expired reset link',
      'api.fileTypeDenied': 'File type not allowed (image, PDF or audio)',
      'api.attachmentDenied': 'Attachment refused: unrecognised content',
      'api.albumPhotosOnly': 'An album can only contain photos',
      'bill.plan.monthly': 'Monthly',
      'bill.plan.quarterly': 'Quarterly',
      'bill.plan.yearly': 'Yearly',
      'bill.per.monthly': 'per month',
      'bill.per.quarterly': 'per quarter',
      'bill.per.yearly': 'per year',
      'bill.sub.trial': 'Welcome period',
      'bill.sub.active': 'Active',
      'bill.sub.past_due': 'Past due',
      'bill.sub.suspended': 'Suspended',
      'bill.sub.cancelled': 'Cancelled',
      'bill.sub.expired': 'Expired',
      'bill.inv.draft': 'Draft',
      'bill.inv.issued': 'Issued',
      'bill.inv.sent': 'Sent',
      'bill.inv.partially_paid': 'Partial',
      'bill.inv.paid': 'Paid',
      'bill.inv.overdue': 'Overdue',
      'bill.inv.void': 'Void',
      'bill.kind.commission': 'Commission & fees',
      'bill.kind.subscription': 'Subscription',
      'bill.downloadFailed': 'Download failed',
      'bill.loadFailed': 'Could not load your billing',
      'bill.overdueTitle': 'Your subscription is past due.',
      'bill.overdueBody': 'Without payment by {date}, your vehicles will be removed from search and you will stop receiving bookings. You have {days} days from the due date. Pay at the Uleez office to restore your visibility immediately.',
      'bill.outstandingTitle': '{amount} still outstanding.',
      'bill.outstandingBody': 'See the details in your invoices below.',
      'bill.contractTitle': 'My subscription',
      'bill.contractSub': 'What makes your agency visible on Uleez',
      'bill.noSubTitle': 'No active subscription',
      'bill.noSubDesc': 'Your agency has no active contract. Contact the Uleez team to open one and make your fleet visible.',
      'bill.formula': 'Plan',
      'bill.nextDue': 'Next due date',
      'bill.inDays': 'in {n} day(s)',
      'bill.overdueDays': '{n} day(s) overdue',
      'bill.autoRenew': ' · auto-renewing',
      'bill.noRenew': ' · no renewal',
      'bill.situation': 'Status',
      'bill.compliant': 'Up to date',
      'bill.toSettle': 'To settle',
      'bill.pendingAmount': '{amount} pending',
      'bill.nothingDue': 'Nothing due',
      'bill.trialUntil': 'Welcome period running until {date}.',
      'bill.trialOngoing': 'Welcome period running.',
      'bill.trialNote': 'No subscription is billed while it lasts.',
      'bill.roiTitle': 'What Uleez has earned you',
      'bill.roiSub': 'Over the last 12 months',
      'bill.roiEarned': 'Rentals collected',
      'bill.roiBookings': '{n} rental(s)',
      'bill.roiBilled': 'Subscription billed',
      'bill.roiPaid': 'including {amount} paid',
      'bill.roiRatio': 'Return on subscription',
      'bill.roiPerDA': 'collected per 1 DA of subscription',
      'bill.roiNote': 'Rental amounts excluding service fees and deposits, at the collection date. Commission is not counted here: proportional to your revenue, it is already deducted from what you receive.',
      'bill.invoicesTitle': 'My invoices',
      'bill.invoicesSub': 'Subscriptions, commissions and service fees',
      'bill.allKinds': 'All kinds',
      'bill.noInvoices': 'No invoices',
      'bill.noInvoicesDesc': 'Your invoices will appear here as soon as they are issued.',
      'bill.colRef': 'Reference',
      'bill.colKind': 'Kind',
      'bill.colPeriod': 'Period',
      'bill.colDue': 'Due date',
      'bill.colAmount': 'Amount',
      'bill.colRemaining': 'Remaining',
      'bill.colStatus': 'Status',
      'bill.daysLate': '{n} d late',
      'bill.howToPayTitle': 'How to pay',
      'bill.howToPaySub': 'Payment methods',
      'bill.howToPayBody1': 'Payments are made at the Uleez office: cash, bank transfer or cheque. There is no online payment at this stage — no banking details are requested from this screen.',
      'bill.howToPayBody2': 'Once our team records your payment, your status and visibility are updated immediately. If you have already paid and the amount still shows here, contact support: it may not have been entered yet.',
      'bill.contactSupport': 'Contact Uleez support',
      'bill.mailSubject': 'Support request — {agency}',
      'bill.mailSubjectFallback': 'my agency',
      'bill.mailGreeting': 'Hello,',
      'bill.mailReasonPlaceholder': '[Describe the reason for your message here]',
      'bill.mailInfoHeader': 'My details',
      'bill.mailAgencyLabel': 'Agency:',
      'bill.mailPhoneLabel': 'Phone:',
      'bill.mailEmailLabel': 'Email:',
      'common.refresh': 'Refresh',
      'common.download': 'Download',
      'dash.statusOverview': 'Status overview',
      'dash.confirmedTitle': 'Confirmed bookings',
      'dash.vsLastMonth': 'This month vs last month',
      'dash.publishedVehicles': 'Published vehicles',
      'dash.seeFleet': 'View my fleet',
      'dash.monthRevenue': 'This month\'s revenue (DA)',
      'dash.seeAll': 'See all',
      'dash.loadError': 'Loading error',
      'dash.allUpToDate': 'All up to date ✓',
      'dash.noPending': 'No pending requests.',
      'dash.noUpcoming': 'No upcoming rentals',
      'dash.freeSchedule': 'Your schedule is clear for now.',
      'dash.addVehicle': 'Add a vehicle',
      'dash.growFleet': 'Grow your fleet',
      'dash.seeSchedule': 'View schedule',
      'dash.upcomingRentals': 'Upcoming rentals',
      'dash.loadFailed': 'Could not load',
      'dash.complete': 'Complete',
      'dash.waitingMinutes': 'Waiting {n} min',
      'dash.tomorrow': 'Tomorrow',
      'dash.today': 'Today',
      'book.rejectRequest': 'Reject request',
      'book.rejectBooking': 'Reject booking',
      'book.confirmReject': 'Confirm rejection',
      'book.rejectReason': 'Reason for rejection',
      'book.rejectReasonHint': 'Explain why you are rejecting (visible to the requester)…',
      'book.reasonRequired': 'A reason is required.',
      'book.confirmed': 'Booking confirmed',
      'book.rejectedToast': 'Request rejected',
      'book.deleted': 'Booking deleted',
      'book.rejectedBooking': 'Booking rejected',
      'book.cancelled': 'Booking cancelled',
      'book.completed': 'Rental completed',
      'book.notFulfilled': 'Not fulfilled',
      'book.notFulfilledToast': 'Rental marked as not fulfilled',
      'book.detail': 'Details',
      'book.searchPlaceholder': 'Reference, renter…',
      'book.tabUpcoming': 'Upcoming',
      'book.tabConfirmed': 'Confirmed',
      'book.tabCompleted': 'Completed',
      'book.tabCancelled': 'Cancelled',
      'book.exportExcel': 'Download Excel',
      'book.exportPdf': 'Download PDF',
      'book.exportFailed': 'Export failed',
      'book.loadFailed': 'Could not load bookings',
      'book.none': 'No bookings',
      'book.noneDesc': 'Change the filter to see other bookings.',
      'book.colBooking': 'Booking',
      'book.colVehicle': 'Vehicle',
      'book.colPeriod': 'Period',
      'book.colDuration': 'Duration',
      'book.colCollected': 'Collected',
      'book.colBookedOn': 'Booking date',
      'book.colServiceFee': 'Service fee',
      'book.bookedOn': 'Booked on {date}',
      'book.settledOnHint': 'Date the rental was recorded as collected',
      'book.serviceFeeHint': 'Service fee paid by the customer — to be remitted to Uleez',
      'book.presumedHint': 'Collection presumed by the system after 48 h, not confirmed by you',
      'book.presumed': 'Presumed',
      'pay.recorded': 'Payment recorded',
      'pay.recordTitle': 'Record a payment',
      'pay.amountToCollect': 'Amount to collect (DA)',
      'pay.method': 'Method',
      'pay.cashOnPickup': 'Cash (on pick-up)',
      'pay.reference': 'Reference',
      'nf.title': 'This rental did not take place',
      'nf.reasonHint': 'E.g. the customer did not show up for the key handover.',
      'nf.reasonKept': 'This reason is kept and visible to support.',
      'common.export': 'Export',
      'dash.pendingRequests': 'Pending requests',
      'dash.urgentCount': '{n} urgent',
      'dash.toProcess': '{n} to process',
      'dash.nextRentals': 'Next rentals',
      'dash.lessor': 'Lessor',
      'book.reject': 'Reject',
      'book.confirm': 'Confirm',
      'book.cancel': 'Cancel',
      'book.finish': 'Finish',
      'book.delete': 'Delete',
      'book.payment': 'Payment',
      'book.columns': 'Columns',
      'book.compactView': 'Compact view',
      'book.tabPending': 'Pending',
      'book.tabInProgress': 'In progress',
      'book.colRenter': 'Renter',
      'book.colNet': 'Net',
      'book.colStatus': 'Status',
      'book.colActions': 'Actions',
      'pay.confirmCollection': 'Confirm collection',
      'nf.reasonRequired': 'Reason (required)',
      'dash.inDays': 'In {n} day(s)',
      'dash.upcomingTitle': 'Next rentals',
      'dash.finishSetupTitle': 'Finish setting up your account',
      'dash.finishSetupBody': 'Complete your file (supporting documents) to request activation of your account.',
      'book.tabAll': 'All',
      'book.settledOn': 'Collected on {date}',
      'book.ofWhichFees': 'including {amount} in fees',
      'book.days': '{n} d',
      'pay.totalNote': 'Total booking amount, service fee included. Confirm only once you have received the money.',
      'nf.confirmCancel': 'Confirm cancellation',
      'nf.explainOn': 'This booking was automatically recorded as collected on {date}. Declaring it not fulfilled cancels the {amount} collection, removes the rental from your revenue and moves the booking to “Cancelled”.',
      'nf.explain': 'This booking was automatically recorded as collected. Declaring it not fulfilled cancels the {amount} collection, removes the rental from your revenue and moves the booking to “Cancelled”.',
      'nf.charsLeft': '{n} more character(s) — this reason is kept and visible to support.',
      'asst.justNow': 'Just now',
      'asst.reactFailed': 'Could not react',
      'asst.attachment': '📎 Attachment',
      'asst.cancelReply': 'Cancel reply',
      'asst.attachHint': 'Attach an image or a PDF',
      'asst.messagePlaceholder': 'Your message…',
      'rev.wholePeriod': 'Whole period',
      'rev.realCumul': 'actual cumulative',
      'rev.projectedCumul': 'projected cumulative',
      'rev.lowHistory': 'little history',
      'rev.realCumulTitle': 'Actual cumulative',
      'rev.realized': 'Realised revenue',
      'rev.evolution': 'Revenue over time',
      'rev.clickToChange': 'Click a bar to change period',
      'rev.clickToIsolate': 'Click a bar to isolate a period',
      'rev.noData': 'No data',
      'rev.noRevenue': 'No revenue for this period yet.',
      'rev.byDay': 'By day',
      'rev.byWeek': 'By week',
      'rev.byMonth': 'By month',
      'rev.year': 'Year',
      'rev.previous': 'Previous',
      'rev.backToToday': 'Back to today',
      'rev.loadFailed': 'Could not load the data',
      'rev.collected': 'Collected from customers (DA)',
      'rev.collectedSub': 'Money actually received',
      'rev.serviceFees': 'Service fees (DA)',
      'rev.serviceFeesSub': 'Paid by the customer · to remit',
      'rev.toRemit': 'To remit to Uleez (DA)',
      'rev.netForYou': 'Net for you (DA)',
      'rev.netForYouSub': 'What you keep in the end',
      'rev.breakdown': 'Breakdown',
      'rev.byVehicle': 'By vehicle',
      'rev.forecast': 'Forecast',
      'rev.forecastSub': 'Projection over the period',
      'rev.alreadyBooked': 'Already booked (confirmed, unpaid)',
      'rev.asIs': 'Counted as is, not estimated',
      'rev.dailyAverage': 'Daily average used',
      'rev.lowHistoryNote': ' Too little history: treat as an order of magnitude.',
      'rev.weekdayProfile': ' The day-of-week profile is taken into account.',
      'rev.yourRevenue': 'Your revenue',
      'rev.yourRevenueSub': 'What the rental earns you',
      'rev.billedRentals': 'Rentals billed',
      'rev.billedRentalsSub': 'Excluding service fees and deposit',
      'rev.commissionSub': 'Charged on the rental only',
      'rev.netToReceive': 'Net to receive',
      'rev.collectedFrom': 'Collected from customers',
      'rev.throughYourHands': 'What passes through your hands',
      'rev.serviceFeeShort': 'Service fees',
      'rev.serviceFeeCollected': 'Paid by the customer, collected for Uleez',
      'rev.discountsFunded': 'Discounts funded by Uleez',
      'rev.discountsNote': 'The customer pays less, you lose nothing',
      'rev.totalCollected': 'Total collected',
      'rev.toRemitShort': 'To remit to Uleez',
      'rev.balanceDetail': 'Balance breakdown',
      'rev.feesCollected': 'Service fees collected',
      'rev.feesCollectedNote': 'You collected them for Uleez',
      'rev.discountsDeducted': 'Deducted from what you owe',
      'rev.uleezRefunds': 'Uleez refunds you',
      'rev.historyTitle': 'Collection history',
      'rev.noCollection': 'No collection in this period',
      'rev.historyNote': 'Collections appear here on the date you receive the money, not the booking date.',
      'rev.colCollectedOn': 'Collected on',
      'rev.colRentalPeriod': 'Rental period',
      'rev.presumedHint': 'Collection presumed automatically 48 h after the rental ends, not confirmed by you',
      'prof.rc': 'Trade register (RC)',
      'prof.descHint': 'Visible to renters on your listings',
      'prof.phone': 'Phone',
      'prof.contactNote': 'This information is used to contact you about bookings.',
      'prof.accountHolder': 'Account holder',
      'prof.bankNote': 'Your payouts are made weekly to this account, after commission is deducted.',
      'prof.currentPassword': 'Current password',
      'prof.newPassword': 'New password',
      'prof.twoFactorNote': 'Enable two-factor authentication to secure your account.',
      'veh.unlimited': 'Unlimited',
      'veh.deleteFailed': 'Could not delete',
      'veh.updated': 'Vehicle updated',
      'veh.draftSaved': 'Draft saved',
      'veh.submitted': 'Vehicle submitted for Uleez approval',
      'veh.add': 'Add a vehicle',
      'veh.photos': 'Vehicle photos',
      'veh.photosHint': 'Up to 8 photos · the first is the cover',
      'rev.cumul': 'cumulative',
      'rev.confHigh': 'reliable',
      'rev.confMedium': 'indicative',
      'rev.projectionPerDay': 'Projection · {amount}/day ({conf})',
      'rev.alreadyBookedAmount': '{amount} already booked',
      'rev.chartBar': 'Bar',
      'rev.chartLine': 'Cumulative',
      'rev.chartPie': 'Pie',
      'rev.periodMonth': 'Month',
      'rev.periodQuarter': 'Quarter',
      'rev.periodLast12': 'Last 12 months',
      'rev.next': 'Next',
      'rev.commissionFormula': 'Commission {pct}% + fees − discounts',
      'rev.trend': 'Trend',
      'rev.basedOn': 'Based on {days} day(s) of history and {bookings} rental(s).',
      'rev.commissionUleez': 'Uleez commission ({pct}%)',
      'rev.netShare': 'Net: {pct}%',
      'rev.depositNote': 'The deposit never appears here: it is returned to the customer.',
      'rev.commission': 'Commission',
      'rev.commissionOf': '{pct}% of billed rentals',
      'rev.checkLine': 'Check: {collected} collected − {net} for you = {due}.',
      'rev.transactions': 'Transactions',
      'rev.awaitingConfirm': '{n} completed rental(s) awaiting collection confirmation.',
      'rev.colCollection': 'Collection',
      'rev.colRental': 'Rental',
      'rev.bookedOn': 'booked on {date}',
      'prof.phoneInvalid': 'Invalid number for {country}',
      'prof.website': 'Website (optional)',
      'prof.bank': 'Bank',
      'prof.iban': 'Bank account',
      'prof.confirmPassword': 'Confirm',
      'prof.address': 'Address',
      'prof.description': 'Description',
      'prof.wilaya': 'Wilaya',
      'prof.type': 'Type',
      'prof.email': 'Email',
      'veh.editTitle': 'Edit · {vehicle}',
      'veh.generalInfo': 'General information',
      'veh.brand': 'Make',
      'veh.model': 'Model',
      'veh.year': 'Year',
      'veh.plate': 'Registration',
      'veh.category': 'Category',
      'veh.fuel': 'Fuel',
      'veh.gearbox': 'Gearbox',
      'veh.seats': 'Seats',
      'veh.luggage': 'Luggage',
      'veh.color': 'Vehicle colour',
      'veh.description': 'Description',
      'veh.pricingTitle': 'Pricing & availability',
      'veh.pricePerDay': 'Price per day (DA)',
      'veh.pricePerWeek': 'Price per week (DA)',
      'veh.pricePerMonth': 'Price per month (DA)',
      'veh.deposit': 'Deposit (DA)',
      'veh.restrictions': 'Vehicle rules',
      'veh.restr.no_smoking': 'No smoking',
      'veh.restr.pets_allowed': 'Pets allowed',
      'veh.restr.no_pets': 'No pets',
      'veh.restr.mileage_limited': 'Mileage limited',
      'veh.restr.no_offroad': 'No off-road driving',
      'veh.restr.min_age_25': 'Driver aged 25 or over',
      'veh.mileagePolicy': 'Mileage policy',
      'veh.availWilaya': 'Availability wilaya',
      'veh.pickupAddress': 'Pick-up address',
      'veh.latitude': 'Latitude',
      'veh.longitude': 'Longitude',
      'veh.requiredDocs': 'Documents required from the renter',
      'veh.requiredDocsSub': 'Select the documents the renter must provide',
      'veh.descPlaceholder': 'Describe your vehicle, its equipment, its condition…',
      'veh.colorPlaceholder': 'e.g. White, Black, Metallic grey…',
      'veh.addressPlaceholder': 'Street, neighbourhood…',
      'prof.agencyName': 'Agency name',
      'det.previewUnavailable': 'Preview unavailable',
      'det.statusUpdated': 'Status updated',
      'det.extAccepted': 'Extension accepted',
      'det.extRefused': 'Extension refused',
      'det.tooEarly': 'Too early',
      'det.tooEarlyBody': 'Available from the first day of the rental{when}.',
      'det.cannotFinish': 'A rental cannot be completed before its start date.',
      'det.requestSent': 'Request sent',
      'det.deletionPending': 'Deletion will be approved by an administrator.',
      'det.paymentReceived': 'Payment received',
      'det.deletionAwaiting': 'Deletion awaiting admin approval',
      'det.confirmBooking': 'Confirm booking',
      'det.availableAfterStart': 'Available once the rental has started',
      'det.markCompleted': 'Mark as completed',
      'det.downloadContract': 'Download contract',
      'det.notFound': 'Booking not found',
      'det.backToBookings': 'Back to bookings',
      'det.deletedNote': 'This booking was deleted (never started or paid). It is kept for the record.',
      'det.deletionRequested': 'Deletion requested — awaiting approval by an administrator.',
      'det.extensionRequest': 'Extension request',
      'det.extraDays': 'Extra days',
      'det.cost': 'Cost',
      'det.acceptExtension': 'Accept extension',
      'det.rentalDetails': 'Rental details',
      'det.customerNote': 'Customer note',
      'det.seeListing': 'View listing',
      'det.inspection': 'Condition report',
      'det.inspectionLate': 'Filed late',
      'det.checkIn': 'Pick-up (check-in)',
      'det.sendMessage': 'Send a message',
      'det.serviceFee': 'Service fee',
      'det.paidByCustomer': '(paid by the customer)',
      'det.totalPaidByCustomer': 'Total paid by the customer',
      'det.depositNote': '(refunded, excluding commission)',
      'det.yourBreakdown': 'Your breakdown',
      'det.totalReceived': 'Total received by the lessor',
      'det.uleezRefunds': 'Uleez refunds you',
      'det.toRemit': 'To remit to Uleez',
      'det.feesCollected': 'Service fees collected from the customer',
      'det.totalToReceive': 'Total to receive',
      'det.totalToRemit': 'Total to remit',
      'det.renterDocs': 'Renter documents',
      'det.noDocs': 'No documents',
      'det.noDocsDesc': 'The renter has not sent any document yet.',
      'det.downloadFailed': 'Download failed',
      'det.encryptedPdf': 'Encrypted PDF document',
      'det.clickToDownload': 'Click to download',
      'det.noMessageDesc': 'Send a message to the renter.',
      'det.requestDeletion': 'Request deletion',
      'cal.blocked': 'Blocked',
      'cal.blockedDates': 'Blocked dates',
      'cal.unavailable': 'The vehicle is unavailable for the period.',
      'cal.allVehicles': 'All vehicles',
      'cal.blockDates': 'Block dates',
      'cal.confirmedOngoing': 'Confirmed / ongoing',
      'cal.clickDay': 'Click a day to see the details',
      'cal.fleetOverview': 'Fleet overview',
      'cal.noVehicle': 'No vehicles',
      'cal.noEvent': 'No events',
      'cal.freeDay': 'Free day',
      'cal.freeDayDesc': 'No booking or block on this day.',
      'cal.blockRemoved': 'Block removed',
      'cal.blockDesc': 'Make a vehicle unavailable (maintenance, personal use…)',
      'cal.confirmBlock': 'Confirm block',
      'cal.startDate': 'Start date',
      'cal.endDate': 'End date',
      'cal.reasonPlaceholder': 'Maintenance, servicing…',
      'fleet.unpublished': 'Vehicle unpublished',
      'fleet.published': 'Vehicle published',
      'fleet.loadFailed': 'Could not load the fleet',
      'fleet.accountPending': 'Account under review',
      'fleet.accountPendingBody': 'Your account must be activated by our team before you can manage your fleet. Complete your file to speed things up.',
      'fleet.completeFile': 'Complete my file',
      'fleet.allStatuses': 'All statuses',
      'fleet.noVehicleDesc': 'Add your first vehicle to start receiving bookings.',
      'fleet.unpublish': 'Unpublish',
      'fleet.publish': 'Publish',
      'fleet.seeBookings': 'View bookings',
      'fleet.managePhotos': 'Manage photos',
      'fleet.unarchive': 'Unarchive',
      'fleet.archived': 'Vehicle archived',
      'fleet.unarchived': 'Vehicle unarchived',
      'fleet.archiveConfirmTitle': 'Archive this vehicle?',
      'fleet.archiveConfirmDesc': 'It will disappear from your active fleet and from search. You can unarchive it at any time from the "Archived" filter.',
      'setup.cin': 'ID card',
      'setup.cinDesc': 'ID document of the manager',
      'setup.rib': 'Bank details',
      'setup.ribDesc': 'For paying out your revenue',
      'setup.rc': 'Trade register (RC)',
      'setup.rcDesc': 'For agencies',
      'setup.docSent': 'Document sent',
      'setup.reviewIn48h': 'Our team reviews your file within 24–48 h.',
      'setup.title': 'Complete my file',
      'setup.subtitle': 'These documents are required to activate your account.',
      'setup.done': 'Done',
      'setup.verified': '✓ Verified',
      'setup.rejected': '✗ Rejected — please re-upload',
      'setup.awaitingCheck': 'Awaiting verification',
      'setup.upload': 'Upload',
      'setup.requestSentLong': 'Request sent. Our team will review your file within 24 to 48 h. You will receive a confirmation email.',
      'setup.needCin': 'Upload the ID card to continue',
      'setup.accountActive': 'Your account is active. You can manage your fleet.',
      'setup.manageFleet': 'Manage my fleet',
      'det.tabBooking': 'Booking',
      'det.tabRenter': 'Renter',
      'det.tabPayment': 'Payment',
      'det.tabDocuments': 'Documents',
      'det.impossible': 'Not possible',
      'det.availableFrom': 'Available from {date}',
      'det.payNotYet': 'Payment can only be collected from the first day of the rental{when}.',
      'det.refuse': 'Refuse',
      'det.newReturn': 'New return',
      'det.pickup': 'Pick-up',
      'det.return': 'Return',
      'det.location': 'Location',
      'det.conversation': 'Conversation',
      'det.rental': 'Rental',
      'det.deposit': 'Deposit',
      'det.commission': 'Commission',
      'det.perDay': 'DA / day',
      'det.reasonOptional': 'Reason (optional)',
      'det.welcome': 'Welcome',
      'cal.today': 'Today',
      'cal.myFleet': 'My fleet',
      'cal.payments': 'Payments',
      'cal.online': 'Online',
      'cal.edit': 'Edit',
      'det.checkOut': 'Return (check-out)',
      'det.rentalDays': 'Rental ({n} d)',
      'det.discount': 'Discount',
      'det.vehicle': 'Vehicle',
      'det.discountFunded': 'Discount{code} funded by Uleez',
      'det.balanceCheck': '{total} collected {sign} {due} = {net} net for you.',
      'cal.eventCount': '{n} event(s)',
      'cal.blockedDays': 'Blocked/booked days in {month}',
      'fleet.count': '{n} vehicles · {online} online',
      'setup.profileCreatedAgency': 'Agency profile created',
      'setup.profileCreatedLessor': 'Lessor profile created',
      'setup.replace': 'Replace',
      'setup.requestActivation': 'Request activation',
      'setup.cinRequired': 'The ID card is required to submit your file.',
      'det.noMessage': 'No messages',
      'det.docPending': 'Pending: the renter must resend this document.',
      'rev.pageTitle': 'Payments & revenue',
      'rev.pageSub': 'What you earn, what you collect and what you remit to Uleez',
      'rev.pendingCount': '{n} pending payment(s) · {amount}',
      'veh.uploadError': 'Upload error: {file}',
      'veh.reorderError': 'Photo order could not be saved',
      'veh.backToFleet': 'Back to the fleet',
      'veh.airportDelivery': 'Airport delivery available',
      'veh.manualApproval': 'Manual booking approval',
      'veh.manualApprovalNote': 'If checked, every booking request must be approved by you before confirmation. Otherwise bookings are confirmed automatically.',
      'veh.saveDraft': 'Save as draft',
      'veh.publish': 'Publish vehicle',
      'book.selectedCount': '{n} selected',
      'book.bookingCount': '{n} booking(s)',
      'det.payFromDay1': 'Collection possible from the first day of the rental ({date}).',
      'pwd.minLength': '8 characters minimum',
      'pwd.upper': '1 uppercase letter',
      'pwd.digit': '1 digit',
      'pwd.special': '1 special character',
      'login.heroTitle': 'Manage your fleet, connect your customers.',
      'login.vehicles': 'Vehicles',
      'login.phone': 'Phone number',
      'login.password': 'Password',
      'login.rememberMe': 'Remember me',
      'login.forgot': 'Forgot your password?',
      'login.needPassword': 'Please enter your password.',
      'login.notLessor': 'Access denied. This portal is reserved for lessors and administrators.',
      'login.genericError': 'Something went wrong. Please try again.',
      'rec.title': 'Your recovery code',
      'rec.body1': 'Your conversations are encrypted: our servers cannot read them. ',
      'rec.body2': 'This code is the only way to recover your messages if you forget your password.',
      'rec.body3': ' It will never be shown again.',
      'rec.copied': 'Copied',
      'rec.copy': 'Copy the code',
      'rec.confirm': 'I have written this code down and keep it in a safe place.',
      'fp.title': 'Forgot password',
      'fp.subtitle': 'Enter your account email: we will send you a link to set a new password.',
      'fp.emailPlaceholder': 'you@example.com',
      'fp.sendLink': 'Send the link',
      'fp.checkInbox': 'Check your inbox',
      'fp.sentTo': 'If a Uleez account exists for ',
      'fp.sentBody': ', you will receive a reset link. It is valid for 30 minutes and can be used only once.',
      'fp.checkSpam': 'Remember to check your spam folder.',
      'fp.backToLogin': 'Back to sign-in',
      'rp.title': 'New password',
      'rp.confirm': 'Confirm password',
      'rp.mismatch': 'Passwords do not match',
      'rp.mismatchDot': 'The two passwords do not match.',
      'rp.criteria': 'The password does not meet the criteria below.',
      'rp.submit': 'Set the password',
      'rp.updated': 'Password updated',
      'rp.updatedBody': 'You can now sign in with your new password. ',
      'rp.sessionsClosed': 'For security, all sessions already open on other devices have been signed out.',
      'rp.expired': 'Link expired',
      'rp.expiredBody': 'This reset link is no longer valid: it has expired or has already been used. ',
      'rp.askNew': 'Request a new one from the sign-in screen.',
      'ob.createAccount': 'Create your account',
      'ob.firstName': 'First name *',
      'ob.lastName': 'Last name *',
      'ob.phone': 'Phone number *',
      'ob.password': 'Password *',
      'ob.confirmPassword': 'Confirm password *',
      'ob.passwordRule': 'Min. 8 characters, 1 uppercase, 1 digit, 1 special character',
      'ob.creating': 'Creating the account…',
      'ob.signupError': 'Something went wrong. Check that this email/phone is not already in use.',
      'ob.genericError': 'Something went wrong.',
      'ob.rcRequired': 'Required for an agency',
      'ob.yourAgency': 'Your agency',
      'ob.yourProfile': 'Your profile',
      'ob.youAre': 'You are *',
      'ob.independent': 'Individual / independent lessor',
      'ob.agency': 'Agency / rental company',
      'ob.agencyName': 'Agency / company name *',
      'ob.contactPhone': 'Contact phone',
      'ob.contactEmail': 'Contact email',
      'ob.rcNumber': 'Trade register number (RC)',
      'ob.descPlaceholder': 'Agency specialising in vehicle rental…',
      'ob.descPlaceholderIndep': 'Describe your rental activity…',
      'ob.completeLater': 'You can complete your file (supporting documents) after signing in, from your dashboard.',
      'ob.goToDashboard': 'Go to the dashboard →',
      'ob.accountCreated': 'Account created!',
      'ob.isReady': ' is ready.',
      'ob.completeFile': 'Complete your file (ID, bank details…) from the dashboard to activate your account.',
      'ob.reviewDelay': 'Our team reviews files within 24 to 48 h.',
      'ob.onceActive': 'Once activated, you can publish your vehicles and receive bookings.',
      'ob.goToSpace': 'Go to my space',
      'login.heroSub': 'The back-office for car rental agencies and lessors in Algeria. Bookings, schedule, payments — all in one place.',
      'login.wilayas': 'Wilayas',
      'login.satisfaction': 'Satisfaction',
      'rp.chooseStrong': 'Choose a strong password for your Uleez account.',
      'rp.recoveryLabel': 'Recovery code (optional)',
      'rp.recoveryHint': 'Your conversations are encrypted. Enter your recovery code to get them back. Without it, the account is reset and messaging restarts with a new key — but your past messages are lost for good, and a new code will be given to you.',
      'rp.recoveryWrong': 'That code does not match. Check it, or leave the field empty to reset without restoring your messages.',
      'rp.recoverySkipped': 'Password reset and messaging re-enabled with a new key. Your past encrypted messages can no longer be recovered.',
      'rp.newCodeTitle': 'Your new recovery code',
      'rp.newCodeBody': 'Write it down and keep it safe: it is the only way to get your messages back if you forget your password. It will never be shown again.',
      'rp.copyCode': 'Copy the code',
      'rp.copied': 'Copied',
      'chat.removeReaction': 'Remove my reaction',
      'chat.react': 'React',
      'chat.reply': 'Reply',
      'phone.countryCode': 'Country code',
      // — Signalements de bug remontés depuis l'app mobile —
      'bug.title': 'Reports',
      'bug.sub': 'Problems reported from the mobile app',
      'bug.tab.new': 'New',
      'bug.tab.triaged': 'Being looked at',
      'bug.tab.resolved': 'Resolved',
      'bug.tab.all': 'All',
      'bug.kind.crash': 'Crash / freeze',
      'bug.kind.display': 'Display',
      'bug.kind.feature': 'Broken feature',
      'bug.kind.payment': 'Payment',
      'bug.kind.other': 'Other',
      'bug.status.new': 'New',
      'bug.status.triaged': 'Being looked at',
      'bug.status.resolved': 'Resolved',
      'bug.empty': 'No reports in this view.',
      'bug.error': 'Could not load.',
      'bug.retry': 'Retry',
      'bug.reporter': 'Reported by',
      'bug.context': 'Technical context',
      'bug.appVersion': 'App version',
      'bug.platform': 'Platform',
      'bug.device': 'System',
      'bug.route': 'Origin screen',
      'bug.description': 'Description',
      'bug.noDescription': 'No written description.',
      'bug.screenshots': 'Screenshots',
      'bug.voice': 'Voice note',
      'bug.note': 'Internal note',
      'bug.notePlaceholder': 'What was found, what is left to do…',
      'bug.markTriaged': 'Mark as being looked at',
      'bug.markResolved': 'Mark resolved',
      'bug.reopen': 'Reopen',
      'bug.saved': 'Report updated',
      'bug.saveFailed': 'Update failed',
      'bug.count': 'report(s)',
      'bug.openDetail': 'Open',
      // — Promotions sur véhicule (espace loueur) —
      "promo.nav": "Promotions",
      "promo.title": "Promotions",
      "promo.sub": "Time-limited price cuts on your vehicles",
      "promo.new": "New promotion",
      "promo.vehicle": "Vehicle",
      "promo.pickVehicle": "Choose a vehicle",
      "promo.normalPrice": "Normal price",
      "promo.promoPrice": "Promotion price (DA/day)",
      "promo.discount": "Discount",
      "promo.from": "Start",
      "promo.to": "End",
      "promo.create": "Submit for review",
      "promo.creating": "Sending…",
      "promo.pendingNote": "Your promotion becomes visible to customers once Uleez approves it.",
      "promo.created": "Promotion submitted for review",
      "promo.createFailed": "Could not create",
      "promo.empty": "No promotions yet.",
      "promo.status.pending": "Awaiting approval",
      "promo.status.approved": "Live",
      "promo.status.rejected": "Rejected",
      "promo.rejectedBecause": "Reason",
      "promo.remove": "Remove",
      "promo.removed": "Promotion removed",
      "promo.removeConfirm": "Remove this promotion?",
      "promo.minDiscount": "The discount must be at least 5%.",
      "promo.endsAfterStart": "The end must be after the start.",
      "promo.perDay": "DA/day",
      "promo.visible": "Visible in the app",
      "promo.notVisible": "Not visible yet",
      "promo.vis.notApproved": "awaiting approval",
      "promo.vis.archived": "removed",
      "promo.vis.notStarted": "starts on {date}",
      "promo.vis.ended": "period over",
      "promo.vis.vehicleHidden": "vehicle not published",
      "promo.vis.lessorSuspended": "account suspended",
      "promo.vis.fullyBooked": "period fully booked",
      "promo.vis.vehicleMissing": "vehicle not found",
      "promo.availChecking": "Checking availability…",
      "promo.availFree": "Free for the whole period ({total} d).",
      "promo.availPartial": "{booked} d already booked out of {total}: the promotion still helps on the {free} free d.",
      "promo.availFull": "Already booked for the WHOLE period: the promotion would never be visible.",
      "promo.availBookedOn": "Already booked:",
      "promo.stats.bookings": "{count} booking(s) during the period",
      "promo.stats.none": "No booking during the period",
    },

    ar: {
      'nav.dashboard': 'لوحة القيادة',
      'nav.bookings': 'الحجوزات',
      'nav.calendar': 'الرزنامة',
      'nav.vehicles': 'السيارات',
      'nav.fleet': 'أسطولي',
      'nav.payments': 'المدفوعات',
      'nav.subscription': 'الاشتراك',
      'nav.profile': 'ملفي',
      'nav.settings': 'الإعدادات',
      'nav.logout': 'تسجيل الخروج',
      'nav.support': 'الدعم',

      'common.save': 'حفظ',
      'common.cancel': 'إلغاء',
      'common.close': 'إغلاق',
      'common.search': 'بحث',
      'common.loading': 'جارٍ التحميل…',
      'common.error': 'خطأ',
      'common.retry': 'إعادة المحاولة',
      'common.all': 'الكل',
      'common.none': 'لا شيء',
      'common.yes': 'نعم',
      'common.no': 'لا',
      'common.language': 'اللغة',
      'common.languageSaved': 'تم تحديث اللغة',
      'common.languageHint': 'تنطبق هذه اللغة على لوحة التحكّم وعلى الرسائل التي نبعثها لك.',

      'profile.title': 'ملفي',
      'profile.myAgency': 'وكالتي',
      'profile.agency': 'وكالة',
      'profile.individual': 'خاص',
      'profile.verified': 'حساب موثّق',
      'profile.pendingVerification': 'التوثيق قيد الانتظار',
      'profile.vehicles': 'السيارات',
      'profile.rating': 'التقييم',
      'profile.reviews': 'الآراء',
      'profile.changeLogo': 'تغيير الشعار',
      'profile.tabAgency': 'الوكالة',
      'profile.tabContact': 'الاتصال',
      'profile.tabBanking': 'المعلومات البنكية',
      'profile.tabSecurity': 'الأمان',
      'profile.tabPreferences': 'التفضيلات',
      'profile.saved': 'تم حفظ الملف',
      'profile.logoUpdated': 'تم تحديث الشعار',
      'profile.uploadFailed': 'فشل الرفع',
      'profile.passwordUpdated': 'تم تحديث كلمة المرور',
      'profile.otherSessionsClosed': 'تم إنهاء جلساتك الأخرى.',
      'profile.bothPasswords': 'أدخل كلمتَي المرور',
      'profile.passwordMismatch': 'كلمتا المرور غير متطابقتين',

      'reviews.title': 'ما يقوله الزبائن عن سياراتك',
      'reviews.subtitle': 'الآراء المتروكة بعد كل كراء، لكامل أسطولك.',
      'reviews.empty': 'لا توجد آراء بعد',
      'reviews.emptyDesc': 'ستظهر الآراء هنا بمجرّد أن ينهي أوّل زبائنك كراءهم.',
      'reviews.allVehicles': 'كل السيارات',
      'reviews.average': 'المعدّل',
      'reviews.count': '{n} رأي',
      'reviews.loadFailed': 'تعذّر تحميل الآراء.',
      'reviews.anonymous': 'زبون',
      'reviews.noComment': 'تقييم دون تعليق.',
      'status.booking.pending': 'في الانتظار',
      'status.booking.confirmed': 'مؤكَّد',
      'status.booking.in_progress': 'جارٍ',
      'status.booking.completed': 'منتهٍ',
      'status.booking.cancelled': 'ملغاة',
      'status.booking.rejected': 'مرفوضة',
      'status.booking.deletion_requested': 'طُلب الحذف',
      'status.booking.deleted': 'محذوفة',
      'status.payment.paid': 'مدفوع',
      'status.payment.partial': 'جزئي',
      'status.payment.unpaid': 'غير مدفوع',
      'status.payment.none': 'لا شيء للدفع',
      'status.payment.refunded': 'مُسترجَع',
      'status.vehicle.published': 'منشورة',
      'status.vehicle.unpublished': 'غير منشورة',
      'status.vehicle.under_review': 'قيد المراجعة',
      'status.vehicle.rejected': 'مرفوضة',
      'status.vehicle.archived': 'مؤرشفة',
      'status.lessor.approved': 'مقبول',
      'status.lessor.pending': 'في الانتظار',
      'status.lessor.rejected': 'مرفوض',
      'status.lessor.suspended': 'موقوف',
      'status.document.pending': 'في الانتظار',
      'status.document.approved': 'مُصادَق عليه',
      'status.document.rejected': 'مرفوض',
      'status.kyc.not_submitted': 'لم تُقدَّم',
      'status.kyc.pending': 'بانتظار التحقّق',
      'status.kyc.verified': 'موثَّق',
      'status.kyc.rejected': 'مرفوض',
      'status.kyc.expired': 'منتهي الصلاحية',
      'page.dashboard.title': 'لوحة القيادة',
      'page.dashboard.sub': 'نظرة عامة على نشاطك',
      'page.bookings.title': 'الحجوزات',
      'page.bookings.sub': 'أدِر طلباتك وعمليات الكراء',
      'page.bookingDetail.title': 'تفاصيل الحجز',
      'page.bookingDetail.sub': 'المعلومات والمراسلة',
      'page.calendar.title': 'الرزنامة',
      'page.calendar.sub': 'توفّر مركباتك',
      'page.vehicles.title': 'أسطولي',
      'page.vehicles.sub': 'مركباتك المعروضة للكراء',
      'page.vehicleNew.title': 'مركبة جديدة',
      'page.vehicleNew.sub': 'إضافة إعلان',
      'page.vehicleEdit.title': 'تعديل المركبة',
      'page.vehicleEdit.sub': 'تحديث الإعلان',
      'page.payments.title': 'المدفوعات',
      'page.payments.sub': 'المداخيل والمعاملات',
      'page.subscription.title': 'اشتراكي',
      'page.subscription.sub': 'العقد والفواتير والتسديدات',
      'page.profile.title': 'ملفّي',
      'page.profile.sub': 'معلومات وكالتك',
      'page.setup.title': 'استكمال حسابي',
      'page.setup.sub': 'الوثائق وتفعيل حساب المؤجّر',
      'chart.noData': 'لا توجد بيانات',
      'chat.sharedLocation': 'موقع مُشارَك',
      'chat.openInMaps': 'افتح في خرائط Google',
      'chat.encrypted': 'رسالة مشفّرة — غير متاحة على هذا الجهاز',
      'det.phoneUnverified': 'الرقم غير مؤكَّد',
      'det.phoneUnverifiedHint': 'لم يتم تأكيد هذا الرقم عبر الرسائل النصية. للعلم فقط: الحجز غير محظور.',
      'chat.quoteYou': 'أنت',
      'chat.quoteClient': 'العميل',
      'chat.quotePhoto': 'صورة',
      'chat.quoteAlbum': 'ألبوم صور',
      'chat.quoteVoice': 'رسالة صوتية',
      'chat.quoteFile': 'مرفق',
      'chat.quoteLocation': 'موقع مُشارك',
      'chat.quoteEncrypted': 'رسالة مشفّرة',
      'period.previousMonth': 'الشهر السابق',
      'period.nextMonth': 'الشهر التالي',
      'period.current': 'الحالي',
      'shell.toggleTheme': 'تغيير المظهر',
      'shell.logout': 'تسجيل الخروج',
      'shell.search': 'بحث…',
      'shell.lessorSpace': 'فضاء المؤجّر',
      'shell.roleLessor': 'مؤجّر',
      'shell.myProfile': 'ملفي الشخصي',
      'shell.mySubscription': 'اشتراكي',
      'shell.settings': 'الإعدادات',
      'notif.title': 'الإشعارات',
      'notif.markAllRead': 'تعليم الكل كمقروء',
      'notif.empty': 'لا توجد إشعارات',
      'notif.justNow': 'الآن',
      'notif.minutesAgo': 'منذ {n} دقيقة',
      'notif.hoursAgo': 'منذ {n} ساعة',
      'notif.daysAgo': 'منذ {n} يوم',
      'shell.themeToLight': 'التبديل إلى الوضع الفاتح',
      'shell.themeToDark': 'التبديل إلى الوضع الداكن',
      'shell.user': 'مستخدم',
      'shell.terms': 'الشروط',
      'shell.privacy': 'الخصوصية',
      'shell.collapseMenu': 'طيّ القائمة',
      'notif.loading': 'جارٍ التحميل…',
      'voice.unavailable': 'المشغّل غير متاح',
      'voice.playFailed': 'تعذّر التشغيل — انقر لإعادة المحاولة',
      'voice.pause': 'إيقاف مؤقّت',
      'voice.play': 'استماع',
      'media.download': 'تنزيل',
      'media.loading': 'جارٍ التحميل…',
      'media.previousPhoto': 'الصورة السابقة',
      'media.nextPhoto': 'الصورة التالية',
      'media.close': 'إغلاق (Esc)',
      'api.offline': 'تعذّر الاتصال بالخادم. أعد المحاولة.',
      'api.sessionExpired': 'انتهت الجلسة. يُرجى إعادة الاتصال.',
      'api.httpError': 'خطأ {code}',
      'api.badCredentials': 'بيانات الدخول غير صحيحة. تحقّق من رقمك وكلمة المرور.',
      'api.resetSendFailed': 'تعذّر إرسال الرابط. أعد المحاولة بعد دقائق.',
      'api.resetLinkBad': 'رابط إعادة التعيين غير صالح أو منتهٍ',
      'api.fileTypeDenied': 'نوع الملف غير مسموح (صورة أو PDF أو صوت)',
      'api.attachmentDenied': 'رُفض المرفق: محتوى غير معروف',
      'api.albumPhotosOnly': 'لا يمكن أن يحتوي الألبوم إلا على صور',
      'bill.plan.monthly': 'شهري',
      'bill.plan.quarterly': 'فصلي',
      'bill.plan.yearly': 'سنوي',
      'bill.per.monthly': 'شهريًا',
      'bill.per.quarterly': 'كلّ ثلاثة أشهر',
      'bill.per.yearly': 'سنويًا',
      'bill.sub.trial': 'فترة ترحيبية',
      'bill.sub.active': 'نشط',
      'bill.sub.past_due': 'متأخّر',
      'bill.sub.suspended': 'موقوف',
      'bill.sub.cancelled': 'مفسوخ',
      'bill.sub.expired': 'منتهٍ',
      'bill.inv.draft': 'مسوّدة',
      'bill.inv.issued': 'صادرة',
      'bill.inv.sent': 'مُرسَلة',
      'bill.inv.partially_paid': 'جزئية',
      'bill.inv.paid': 'مسدَّدة',
      'bill.inv.overdue': 'متأخّرة',
      'bill.inv.void': 'ملغاة',
      'bill.kind.commission': 'العمولة والرسوم',
      'bill.kind.subscription': 'الاشتراك',
      'bill.downloadFailed': 'تعذّر التنزيل',
      'bill.loadFailed': 'تعذّر تحميل فوترتك',
      'bill.overdueTitle': 'حلّ أجل اشتراكك.',
      'bill.overdueBody': 'من دون تسديد قبل {date}، ستُسحب مركباتك من البحث ولن تصلك حجوزات. أمامك {days} يومًا ابتداءً من تاريخ الاستحقاق. سدّد لدى وكالة Uleez لاستعادة ظهورك فورًا.',
      'bill.outstandingTitle': '{amount} ما زالت مستحقّة.',
      'bill.outstandingBody': 'تجد التفاصيل في فواتيرك أدناه.',
      'bill.contractTitle': 'اشتراكي',
      'bill.contractSub': 'ما يجعل وكالتك ظاهرة على Uleez',
      'bill.noSubTitle': 'لا يوجد اشتراك ساري',
      'bill.noSubDesc': 'لا يوجد عقد ساري لوكالتك. اتصل بفريق Uleez لفتح عقد وإظهار أسطولك.',
      'bill.formula': 'الصيغة',
      'bill.nextDue': 'الاستحقاق القادم',
      'bill.inDays': 'بعد {n} يوم',
      'bill.overdueDays': 'متأخّر منذ {n} يوم',
      'bill.autoRenew': ' · تجديد تلقائي',
      'bill.noRenew': ' · دون تجديد',
      'bill.situation': 'الوضعية',
      'bill.compliant': 'في وضعية سليمة',
      'bill.toSettle': 'بحاجة إلى تسوية',
      'bill.pendingAmount': '{amount} في الانتظار',
      'bill.nothingDue': 'لا شيء مستحقّ',
      'bill.trialUntil': 'الفترة الترحيبية سارية حتى {date}.',
      'bill.trialOngoing': 'الفترة الترحيبية سارية.',
      'bill.trialNote': 'لا يُفوتر عليك أي اشتراك ما دامت سارية.',
      'bill.roiTitle': 'ما جلبه لك Uleez',
      'bill.roiSub': 'خلال آخر 12 شهرًا',
      'bill.roiEarned': 'عمليات الكراء المحصّلة',
      'bill.roiBookings': '{n} عملية كراء',
      'bill.roiBilled': 'الاشتراك المفوتَر',
      'bill.roiPaid': 'منها {amount} مسدَّدة',
      'bill.roiRatio': 'العائد على الاشتراك',
      'bill.roiPerDA': 'محصّلة مقابل 1 دج من الاشتراك',
      'bill.roiNote': 'مبالغ الكراء دون رسوم الخدمة ودون الضمان، بتاريخ التحصيل. العمولة غير محتسَبة هنا: فهي نسبية من رقم أعمالك ومخصومة أصلًا ممّا تقبضه.',
      'bill.invoicesTitle': 'فواتيري',
      'bill.invoicesSub': 'الاشتراكات والعمولات ورسوم الخدمة',
      'bill.allKinds': 'كلّ الأنواع',
      'bill.noInvoices': 'لا توجد فواتير',
      'bill.noInvoicesDesc': 'ستظهر فواتيرك هنا فور إصدارها.',
      'bill.colRef': 'المرجع',
      'bill.colKind': 'النوع',
      'bill.colPeriod': 'الفترة',
      'bill.colDue': 'الاستحقاق',
      'bill.colAmount': 'المبلغ',
      'bill.colRemaining': 'المتبقّي',
      'bill.colStatus': 'الحالة',
      'bill.daysLate': 'تأخّر {n} يوم',
      'bill.howToPayTitle': 'كيفية التسديد',
      'bill.howToPaySub': 'طرق الدفع',
      'bill.howToPayBody1': 'تتمّ التسديدات لدى وكالة Uleez: نقدًا أو بتحويل أو بشيك. لا يوجد دفع عبر الإنترنت في هذه المرحلة — ولا تُطلب منك أي معطيات بنكية من هذه الشاشة.',
      'bill.howToPayBody2': 'بمجرّد تسجيل فريقنا لتسديدك، تُحدَّث وضعيتك وظهورك فورًا. إذا كنت قد سدّدت وما زال المبلغ ظاهرًا هنا، فراسل الدعم: قد لا يكون قد سُجّل بعد.',
      'bill.contactSupport': 'الاتصال بدعم Uleez',
      'bill.mailSubject': 'طلب مساعدة — {agency}',
      'bill.mailSubjectFallback': 'وكالتي',
      'bill.mailGreeting': 'مرحبًا،',
      'bill.mailReasonPlaceholder': '[اشرح هنا سبب رسالتك]',
      'bill.mailInfoHeader': 'معلوماتي',
      'bill.mailAgencyLabel': 'الوكالة:',
      'bill.mailPhoneLabel': 'الهاتف:',
      'bill.mailEmailLabel': 'البريد الإلكتروني:',
      'common.refresh': 'تحديث',
      'common.download': 'تنزيل',
      'dash.statusOverview': 'نظرة على الحالات',
      'dash.confirmedTitle': 'الحجوزات المؤكَّدة',
      'dash.vsLastMonth': 'هذا الشهر مقابل الشهر الماضي',
      'dash.publishedVehicles': 'المركبات المنشورة',
      'dash.seeFleet': 'عرض أسطولي',
      'dash.monthRevenue': 'مداخيل الشهر (دج)',
      'dash.seeAll': 'عرض الكل',
      'dash.loadError': 'خطأ في التحميل',
      'dash.allUpToDate': 'كلّ شيء محدَّث ✓',
      'dash.noPending': 'لا توجد طلبات في الانتظار.',
      'dash.noUpcoming': 'لا توجد عمليات كراء قادمة',
      'dash.freeSchedule': 'رزنامتك خالية حاليًا.',
      'dash.addVehicle': 'إضافة مركبة',
      'dash.growFleet': 'توسيع أسطولك',
      'dash.seeSchedule': 'عرض الرزنامة',
      'dash.upcomingRentals': 'عمليات الكراء القادمة',
      'dash.loadFailed': 'تعذّر التحميل',
      'dash.complete': 'استكمال',
      'dash.waitingMinutes': 'في الانتظار {n} دقيقة',
      'dash.tomorrow': 'غدًا',
      'dash.today': 'اليوم',
      'book.rejectRequest': 'رفض الطلب',
      'book.rejectBooking': 'رفض الحجز',
      'book.confirmReject': 'تأكيد الرفض',
      'book.rejectReason': 'سبب الرفض',
      'book.rejectReasonHint': 'اشرح سبب الرفض (مرئي لمقدّم الطلب)…',
      'book.reasonRequired': 'السبب إلزامي.',
      'book.confirmed': 'تمّ تأكيد الحجز',
      'book.rejectedToast': 'تمّ رفض الطلب',
      'book.deleted': 'تمّ حذف الحجز',
      'book.rejectedBooking': 'تمّ رفض الحجز',
      'book.cancelled': 'تمّ إلغاء الحجز',
      'book.completed': 'انتهت عملية الكراء',
      'book.notFulfilled': 'لم تتمّ',
      'book.notFulfilledToast': 'أُعلن أنّ الكراء لم يتمّ',
      'book.detail': 'التفاصيل',
      'book.searchPlaceholder': 'المرجع، المستأجر…',
      'book.tabUpcoming': 'قادمة',
      'book.tabConfirmed': 'مؤكَّدة',
      'book.tabCompleted': 'منتهية',
      'book.tabCancelled': 'ملغاة',
      'book.exportExcel': 'تنزيل Excel',
      'book.exportPdf': 'تنزيل PDF',
      'book.exportFailed': 'فشل التصدير',
      'book.loadFailed': 'تعذّر تحميل الحجوزات',
      'book.none': 'لا توجد حجوزات',
      'book.noneDesc': 'غيّر المرشّح لعرض حجوزات أخرى.',
      'book.colBooking': 'الحجز',
      'book.colVehicle': 'المركبة',
      'book.colPeriod': 'الفترة',
      'book.colDuration': 'المدّة',
      'book.colCollected': 'المحصّل',
      'book.colBookedOn': 'تاريخ الحجز',
      'book.colServiceFee': 'رسوم الخدمة',
      'book.bookedOn': 'حُجزت في {date}',
      'book.settledOnHint': 'تاريخ احتساب الكراء كمحصَّل',
      'book.serviceFeeHint': 'رسوم خدمة دفعها العميل — تُحوَّل إلى Uleez',
      'book.presumedHint': 'تحصيل مفترَض من النظام بعد 48 ساعة، لم تؤكّده أنت',
      'book.presumed': 'مفترَض',
      'pay.recorded': 'تمّ تسجيل الدفع',
      'pay.recordTitle': 'تسجيل دفعة',
      'pay.amountToCollect': 'المبلغ المطلوب تحصيله (دج)',
      'pay.method': 'الطريقة',
      'pay.cashOnPickup': 'نقدًا (عند التسليم)',
      'pay.reference': 'المرجع',
      'nf.title': 'لم تتمّ عملية الكراء هذه',
      'nf.reasonHint': 'مثال: لم يحضر العميل لتسلّم المفاتيح.',
      'nf.reasonKept': 'يُحفظ هذا السبب ويكون مرئيًا للدعم.',
      'common.export': 'تصدير',
      'dash.pendingRequests': 'طلبات في الانتظار',
      'dash.urgentCount': '{n} عاجلة',
      'dash.toProcess': '{n} للمعالجة',
      'dash.nextRentals': 'عمليات الكراء القادمة',
      'dash.lessor': 'مؤجّر',
      'book.reject': 'رفض',
      'book.confirm': 'تأكيد',
      'book.cancel': 'إلغاء',
      'book.finish': 'إنهاء',
      'book.delete': 'حذف',
      'book.payment': 'الدفع',
      'book.columns': 'الأعمدة',
      'book.compactView': 'عرض مضغوط',
      'book.tabPending': 'في الانتظار',
      'book.tabInProgress': 'جارية',
      'book.colRenter': 'المستأجر',
      'book.colNet': 'الصافي',
      'book.colStatus': 'الحالة',
      'book.colActions': 'الإجراءات',
      'pay.confirmCollection': 'تأكيد التحصيل',
      'nf.reasonRequired': 'السبب (إلزامي)',
      'dash.inDays': 'بعد {n} يوم',
      'dash.upcomingTitle': 'عمليات الكراء القادمة',
      'dash.finishSetupTitle': 'أكمل إنشاء حسابك',
      'dash.finishSetupBody': 'أكمل ملفّك (الوثائق الثبوتية) لطلب تفعيل حسابك.',
      'book.tabAll': 'الكل',
      'book.settledOn': 'حُصّلت في {date}',
      'book.ofWhichFees': 'منها {amount} رسوم',
      'book.days': '{n} ي',
      'pay.totalNote': 'المبلغ الإجمالي للحجز، شاملًا رسوم الخدمة. أكّد فقط بعد استلام المبلغ.',
      'nf.confirmCancel': 'تأكيد الإلغاء',
      'nf.explainOn': 'احتُسب هذا الحجز تلقائيًا كمحصَّل في {date}. إعلانه غير منجز يُلغي تحصيل {amount}، ويزيل الكراء من مداخيلك، ويحوّل الحجز إلى «ملغى».',
      'nf.explain': 'احتُسب هذا الحجز تلقائيًا كمحصَّل. إعلانه غير منجز يُلغي تحصيل {amount}، ويزيل الكراء من مداخيلك، ويحوّل الحجز إلى «ملغى».',
      'nf.charsLeft': 'يتبقّى {n} حرفًا — يُحفظ هذا السبب ويكون مرئيًا للدعم.',
      'asst.justNow': 'الآن',
      'asst.reactFailed': 'تعذّرت الإضافة',
      'asst.attachment': '📎 مرفق',
      'asst.cancelReply': 'إلغاء الردّ',
      'asst.attachHint': 'أرفق صورة أو ملف PDF',
      'asst.messagePlaceholder': 'رسالتك…',
      'rev.wholePeriod': 'كامل الفترة',
      'rev.realCumul': 'التراكم الفعلي',
      'rev.projectedCumul': 'التراكم المتوقّع',
      'rev.lowHistory': 'سجلّ قصير',
      'rev.realCumulTitle': 'التراكم الفعلي',
      'rev.realized': 'المداخيل المحقّقة',
      'rev.evolution': 'تطوّر المداخيل',
      'rev.clickToChange': 'انقر عمودًا لتغيير الفترة',
      'rev.clickToIsolate': 'انقر عمودًا لعزل فترة',
      'rev.noData': 'لا توجد بيانات',
      'rev.noRevenue': 'لا توجد مداخيل في هذه الفترة بعد.',
      'rev.byDay': 'يوميًا',
      'rev.byWeek': 'أسبوعيًا',
      'rev.byMonth': 'شهريًا',
      'rev.year': 'السنة',
      'rev.previous': 'السابق',
      'rev.backToToday': 'العودة إلى اليوم',
      'rev.loadFailed': 'تعذّر تحميل البيانات',
      'rev.collected': 'المحصّل من العملاء (دج)',
      'rev.collectedSub': 'الأموال المستلمة فعليًا',
      'rev.serviceFees': 'رسوم الخدمة (دج)',
      'rev.serviceFeesSub': 'يدفعها العميل · تُحوَّل',
      'rev.toRemit': 'للتحويل إلى Uleez (دج)',
      'rev.netForYou': 'الصافي لك (دج)',
      'rev.netForYouSub': 'ما يتبقّى لك في النهاية',
      'rev.breakdown': 'التوزيع',
      'rev.byVehicle': 'حسب المركبة',
      'rev.forecast': 'التوقّع',
      'rev.forecastSub': 'إسقاط على الفترة',
      'rev.alreadyBooked': 'محجوز مسبقًا (مؤكَّد، غير مدفوع)',
      'rev.asIs': 'محتسَب كما هو، غير مقدَّر',
      'rev.dailyAverage': 'المتوسط اليومي المعتمد',
      'rev.lowHistoryNote': ' السجلّ قصير جدًا: اعتبره ترتيبًا للحجم فقط.',
      'rev.weekdayProfile': ' يُؤخذ نمط أيام الأسبوع في الحسبان.',
      'rev.yourRevenue': 'مداخيلك',
      'rev.yourRevenueSub': 'ما يجلبه لك الكراء',
      'rev.billedRentals': 'عمليات الكراء المفوترة',
      'rev.billedRentalsSub': 'دون رسوم الخدمة والضمان',
      'rev.commissionSub': 'تُقتطع من الكراء فقط',
      'rev.netToReceive': 'الصافي المستحقّ',
      'rev.collectedFrom': 'المحصّل من العملاء',
      'rev.throughYourHands': 'ما يمرّ عبر يديك',
      'rev.serviceFeeShort': 'رسوم الخدمة',
      'rev.serviceFeeCollected': 'يدفعها العميل، تُجمع لصالح Uleez',
      'rev.discountsFunded': 'تخفيضات يموّلها Uleez',
      'rev.discountsNote': 'يدفع العميل أقلّ ولا تخسر شيئًا',
      'rev.totalCollected': 'إجمالي المحصّل',
      'rev.toRemitShort': 'للتحويل إلى Uleez',
      'rev.balanceDetail': 'تفصيل الرصيد',
      'rev.feesCollected': 'رسوم الخدمة المحصّلة',
      'rev.feesCollectedNote': 'حصّلتها لصالح Uleez',
      'rev.discountsDeducted': 'مخصومة ممّا عليك',
      'rev.uleezRefunds': 'يعيد لك Uleez',
      'rev.historyTitle': 'سجلّ التحصيلات',
      'rev.noCollection': 'لا يوجد تحصيل في هذه الفترة',
      'rev.historyNote': 'تظهر التحصيلات هنا بتاريخ استلامك للمال، لا بتاريخ الحجز.',
      'rev.colCollectedOn': 'حُصّل في',
      'rev.colRentalPeriod': 'فترة الكراء',
      'rev.presumedHint': 'تحصيل مفترَض تلقائيًا بعد 48 ساعة من نهاية الكراء، لم تؤكّده أنت',
      'prof.rc': 'السجلّ التجاري',
      'prof.descHint': 'مرئي للمستأجرين على إعلاناتك',
      'prof.phone': 'الهاتف',
      'prof.contactNote': 'تُستعمل هذه المعلومات للاتصال بك بخصوص الحجوزات.',
      'prof.accountHolder': 'صاحب الحساب',
      'prof.bankNote': 'تُحوَّل مستحقّاتك أسبوعيًا إلى هذا الحساب بعد خصم العمولة.',
      'prof.currentPassword': 'كلمة المرور الحالية',
      'prof.newPassword': 'كلمة المرور الجديدة',
      'prof.twoFactorNote': 'فعّل المصادقة الثنائية لتأمين حسابك.',
      'veh.unlimited': 'غير محدود',
      'veh.deleteFailed': 'تعذّر الحذف',
      'veh.updated': 'تمّ تعديل المركبة',
      'veh.draftSaved': 'حُفظت المسوّدة',
      'veh.submitted': 'أُرسلت المركبة للمصادقة من Uleez',
      'veh.add': 'إضافة مركبة',
      'veh.photos': 'صور المركبة',
      'veh.photosHint': 'حتى 8 صور · الأولى هي الغلاف',
      'rev.cumul': 'تراكمي',
      'rev.confHigh': 'موثوق',
      'rev.confMedium': 'إرشادي',
      'rev.projectionPerDay': 'إسقاط · {amount}/يوم ({conf})',
      'rev.alreadyBookedAmount': '{amount} محجوزة مسبقًا',
      'rev.chartBar': 'أعمدة',
      'rev.chartLine': 'تراكمي',
      'rev.chartPie': 'دائري',
      'rev.periodMonth': 'شهر',
      'rev.periodQuarter': 'فصل',
      'rev.periodLast12': 'آخر 12 شهرًا',
      'rev.next': 'التالي',
      'rev.commissionFormula': 'عمولة {pct}% + رسوم − تخفيضات',
      'rev.trend': 'الاتجاه',
      'rev.basedOn': 'بناءً على {days} يومًا من السجلّ و{bookings} عملية كراء.',
      'rev.commissionUleez': 'عمولة Uleez ({pct}%)',
      'rev.netShare': 'الصافي: {pct}%',
      'rev.depositNote': 'لا يظهر الضمان هنا أبدًا: فهو يُعاد إلى العميل.',
      'rev.commission': 'العمولة',
      'rev.commissionOf': '{pct}% من عمليات الكراء المفوترة',
      'rev.checkLine': 'التحقّق: {collected} محصّلة − {net} لك = {due}.',
      'rev.transactions': 'المعاملات',
      'rev.awaitingConfirm': '{n} عملية كراء منتهية تنتظر تأكيد التحصيل.',
      'rev.colCollection': 'التحصيل',
      'rev.colRental': 'الكراء',
      'rev.bookedOn': 'حُجزت في {date}',
      'prof.phoneInvalid': 'رقم غير صالح لـ {country}',
      'prof.website': 'الموقع الإلكتروني (اختياري)',
      'prof.bank': 'البنك',
      'prof.iban': 'الحساب البنكي',
      'prof.confirmPassword': 'تأكيد',
      'prof.address': 'العنوان',
      'prof.description': 'الوصف',
      'prof.wilaya': 'الولاية',
      'prof.type': 'النوع',
      'prof.email': 'البريد الإلكتروني',
      'veh.editTitle': 'تعديل · {vehicle}',
      'veh.generalInfo': 'معلومات عامة',
      'veh.brand': 'العلامة',
      'veh.model': 'الطراز',
      'veh.year': 'السنة',
      'veh.plate': 'الترقيم',
      'veh.category': 'الفئة',
      'veh.fuel': 'الوقود',
      'veh.gearbox': 'علبة السرعات',
      'veh.seats': 'المقاعد',
      'veh.luggage': 'الأمتعة',
      'veh.color': 'لون المركبة',
      'veh.description': 'الوصف',
      'veh.pricingTitle': 'التسعير والتوفّر',
      'veh.pricePerDay': 'السعر لليوم (دج)',
      'veh.pricePerWeek': 'السعر للأسبوع (دج)',
      'veh.pricePerMonth': 'السعر للشهر (دج)',
      'veh.deposit': 'الضمان (دج)',
      'veh.restrictions': 'قواعد المركبة',
      'veh.restr.no_smoking': 'ممنوع التدخين',
      'veh.restr.pets_allowed': 'الحيوانات الأليفة مقبولة',
      'veh.restr.no_pets': 'الحيوانات الأليفة غير مقبولة',
      'veh.restr.mileage_limited': 'المسافة محدودة',
      'veh.restr.no_offroad': 'ممنوع القيادة خارج الطرق',
      'veh.restr.min_age_25': 'سائق بعمر 25 سنة فأكثر',
      'veh.mileagePolicy': 'سياسة الكيلومترات',
      'veh.availWilaya': 'ولاية التوفّر',
      'veh.pickupAddress': 'عنوان الاستلام',
      'veh.latitude': 'خط العرض',
      'veh.longitude': 'خط الطول',
      'veh.requiredDocs': 'الوثائق المطلوبة من المستأجر',
      'veh.requiredDocsSub': 'اختر الوثائق التي يجب أن يقدّمها المستأجر',
      'veh.descPlaceholder': 'صف مركبتك وتجهيزاتها وحالتها…',
      'veh.colorPlaceholder': 'مثال: أبيض، أسود، رمادي معدني…',
      'veh.addressPlaceholder': 'الشارع، الحيّ…',
      'prof.agencyName': 'اسم الوكالة',
      'det.previewUnavailable': 'المعاينة غير متاحة',
      'det.statusUpdated': 'تمّ تحديث الحالة',
      'det.extAccepted': 'قُبل التمديد',
      'det.extRefused': 'رُفض التمديد',
      'det.tooEarly': 'مبكّر جدًا',
      'det.tooEarlyBody': 'متاح ابتداءً من أول يوم من الكراء{when}.',
      'det.cannotFinish': 'لا يمكن إنهاء الكراء قبل تاريخ بدايته.',
      'det.requestSent': 'أُرسل الطلب',
      'det.deletionPending': 'سيصادق مسؤول على الحذف.',
      'det.paymentReceived': 'تمّ استلام الدفع',
      'det.deletionAwaiting': 'الحذف بانتظار مصادقة المسؤول',
      'det.confirmBooking': 'تأكيد الحجز',
      'det.availableAfterStart': 'متاح بعد بدء الكراء',
      'det.markCompleted': 'وسمها كمنتهية',
      'det.downloadContract': 'تنزيل العقد',
      'det.notFound': 'الحجز غير موجود',
      'det.backToBookings': 'العودة إلى الحجوزات',
      'det.deletedNote': 'حُذف هذا الحجز (لم يبدأ ولم يُدفع). يُحتفظ به للسجلّ.',
      'det.deletionRequested': 'طُلب الحذف — بانتظار مصادقة مسؤول.',
      'det.extensionRequest': 'طلب تمديد',
      'det.extraDays': 'أيام إضافية',
      'det.cost': 'التكلفة',
      'det.acceptExtension': 'قبول التمديد',
      'det.rentalDetails': 'تفاصيل الكراء',
      'det.customerNote': 'ملاحظة العميل',
      'det.seeListing': 'عرض الإعلان',
      'det.inspection': 'محضر الحالة',
      'det.inspectionLate': 'أُودع متأخرًا',
      'det.checkIn': 'الاستلام',
      'det.sendMessage': 'إرسال رسالة',
      'det.serviceFee': 'رسوم الخدمة',
      'det.paidByCustomer': '(يدفعها العميل)',
      'det.totalPaidByCustomer': 'الإجمالي الذي دفعه العميل',
      'det.depositNote': '(تُعاد، دون عمولة)',
      'det.yourBreakdown': 'حسابك',
      'det.totalReceived': 'الإجمالي الذي قبضه المؤجّر',
      'det.uleezRefunds': 'يعيد لك Uleez',
      'det.toRemit': 'للتحويل إلى Uleez',
      'det.feesCollected': 'رسوم الخدمة المحصّلة من العميل',
      'det.totalToReceive': 'الإجمالي المستحقّ لك',
      'det.totalToRemit': 'الإجمالي الواجب تحويله',
      'det.renterDocs': 'وثائق المستأجر',
      'det.noDocs': 'لا توجد وثائق',
      'det.noDocsDesc': 'لم يرسل المستأجر أي وثيقة بعد.',
      'det.downloadFailed': 'تعذّر التنزيل',
      'det.encryptedPdf': 'وثيقة PDF مشفّرة',
      'det.clickToDownload': 'انقر للتنزيل',
      'det.noMessageDesc': 'أرسل رسالة إلى المستأجر.',
      'det.requestDeletion': 'طلب الحذف',
      'cal.blocked': 'محجوب',
      'cal.blockedDates': 'تواريخ محجوبة',
      'cal.unavailable': 'المركبة غير متاحة خلال الفترة.',
      'cal.allVehicles': 'كلّ المركبات',
      'cal.blockDates': 'حجب تواريخ',
      'cal.confirmedOngoing': 'مؤكَّدة / جارية',
      'cal.clickDay': 'انقر يومًا لعرض التفاصيل',
      'cal.fleetOverview': 'نظرة عامة على الأسطول',
      'cal.noVehicle': 'لا توجد مركبات',
      'cal.noEvent': 'لا توجد أحداث',
      'cal.freeDay': 'يوم خالٍ',
      'cal.freeDayDesc': 'لا حجز ولا حجب في هذا اليوم.',
      'cal.blockRemoved': 'أُزيل الحجب',
      'cal.blockDesc': 'اجعل مركبة غير متاحة (صيانة، استعمال شخصي…)',
      'cal.confirmBlock': 'تأكيد الحجب',
      'cal.startDate': 'تاريخ البداية',
      'cal.endDate': 'تاريخ النهاية',
      'cal.reasonPlaceholder': 'صيانة، مراجعة…',
      'fleet.unpublished': 'أُلغي نشر المركبة',
      'fleet.published': 'نُشرت المركبة',
      'fleet.loadFailed': 'تعذّر تحميل الأسطول',
      'fleet.accountPending': 'الحساب قيد المصادقة',
      'fleet.accountPendingBody': 'يجب أن يفعّل فريقنا حسابك قبل أن تتمكّن من إدارة أسطولك. أكمل ملفّك لتسريع العملية.',
      'fleet.completeFile': 'استكمال ملفّي',
      'fleet.allStatuses': 'كلّ الحالات',
      'fleet.noVehicleDesc': 'أضف مركبتك الأولى لتبدأ باستقبال الحجوزات.',
      'fleet.unpublish': 'إلغاء النشر',
      'fleet.publish': 'نشر',
      'fleet.seeBookings': 'عرض الحجوزات',
      'fleet.managePhotos': 'إدارة الصور',
      'fleet.unarchive': 'إلغاء الأرشفة',
      'fleet.archived': 'تمت أرشفة المركبة',
      'fleet.unarchived': 'تم إلغاء أرشفة المركبة',
      'fleet.archiveConfirmTitle': 'أرشفة هذه المركبة؟',
      'fleet.archiveConfirmDesc': 'ستختفي من أسطولك النشط ومن نتائج البحث. يمكنك إلغاء أرشفتها في أي وقت من فلتر «مؤرشفة».',
      'setup.cin': 'بطاقة التعريف',
      'setup.cinDesc': 'وثيقة هوية المسؤول',
      'setup.rib': 'الحساب البنكي',
      'setup.ribDesc': 'لتحويل مداخيلك',
      'setup.rc': 'السجلّ التجاري',
      'setup.rcDesc': 'للوكالات',
      'setup.docSent': 'أُرسلت الوثيقة',
      'setup.reviewIn48h': 'يراجع فريقنا ملفّك خلال 24-48 ساعة.',
      'setup.title': 'استكمال ملفّي',
      'setup.subtitle': 'هذه الوثائق ضرورية لتفعيل حسابك.',
      'setup.done': 'تمّ',
      'setup.verified': '✓ موثَّق',
      'setup.rejected': '✗ مرفوض — يُرجى إعادة الإيداع',
      'setup.awaitingCheck': 'بانتظار التحقّق',
      'setup.upload': 'رفع',
      'setup.requestSentLong': 'أُرسل الطلب. سيراجع فريقنا ملفّك خلال 24 إلى 48 ساعة. ستتلقّى رسالة تأكيد.',
      'setup.needCin': 'أودع بطاقة التعريف للمتابعة',
      'setup.accountActive': 'حسابك نشط. يمكنك إدارة أسطولك.',
      'setup.manageFleet': 'إدارة أسطولي',
      'det.tabBooking': 'الحجز',
      'det.tabRenter': 'المستأجر',
      'det.tabPayment': 'الدفع',
      'det.tabDocuments': 'الوثائق',
      'det.impossible': 'غير ممكن',
      'det.availableFrom': 'متاح ابتداءً من {date}',
      'det.payNotYet': 'لا يمكن تحصيل الدفع إلا ابتداءً من أول يوم من الكراء{when}.',
      'det.refuse': 'رفض',
      'det.newReturn': 'الإرجاع الجديد',
      'det.pickup': 'الاستلام',
      'det.return': 'الإرجاع',
      'det.location': 'الموقع',
      'det.conversation': 'المحادثة',
      'det.rental': 'الكراء',
      'det.deposit': 'الضمان',
      'det.commission': 'العمولة',
      'det.perDay': 'دج / يوم',
      'det.reasonOptional': 'السبب (اختياري)',
      'det.welcome': 'مرحبًا',
      'cal.today': 'اليوم',
      'cal.myFleet': 'أسطولي',
      'cal.payments': 'المدفوعات',
      'cal.online': 'منشورة',
      'cal.edit': 'تعديل',
      'det.checkOut': 'الإرجاع',
      'det.rentalDays': 'الكراء ({n} ي)',
      'det.discount': 'تخفيض',
      'det.vehicle': 'المركبة',
      'det.discountFunded': 'تخفيض{code} يموّله Uleez',
      'det.balanceCheck': '{total} محصّلة {sign} {due} = {net} صافية لك.',
      'cal.eventCount': '{n} حدث',
      'cal.blockedDays': 'الأيام المحجوبة/المحجوزة في {month}',
      'fleet.count': '{n} مركبة · {online} منشورة',
      'setup.profileCreatedAgency': 'أُنشئ ملف الوكالة',
      'setup.profileCreatedLessor': 'أُنشئ ملف المؤجّر',
      'setup.replace': 'استبدال',
      'setup.requestActivation': 'طلب التفعيل',
      'setup.cinRequired': 'بطاقة التعريف إلزامية لتقديم ملفّك.',
      'det.noMessage': 'لا توجد رسائل',
      'det.docPending': 'في الانتظار: على المستأجر إعادة إرسال هذه الوثيقة.',
      'rev.pageTitle': 'المدفوعات والمداخيل',
      'rev.pageSub': 'ما تكسبه وما تحصّله وما تحوّله إلى Uleez',
      'rev.pendingCount': '{n} دفعة في الانتظار · {amount}',
      'veh.uploadError': 'خطأ في الرفع: {file}',
      'veh.reorderError': 'تعذّر حفظ ترتيب الصور',
      'veh.backToFleet': 'العودة إلى الأسطول',
      'veh.airportDelivery': 'التوصيل إلى المطار متاح',
      'veh.manualApproval': 'المصادقة اليدوية على الحجوزات',
      'veh.manualApprovalNote': 'إذا حُدّد، يجب أن توافق على كلّ طلب حجز قبل تأكيده. وإلا تُؤكَّد الحجوزات تلقائيًا.',
      'veh.saveDraft': 'الحفظ كمسوّدة',
      'veh.publish': 'نشر المركبة',
      'book.selectedCount': '{n} محدَّد',
      'book.bookingCount': '{n} حجز',
      'det.payFromDay1': 'التحصيل ممكن ابتداءً من أول يوم من الكراء ({date}).',
      'pwd.minLength': '8 أحرف على الأقل',
      'pwd.upper': 'حرف كبير واحد',
      'pwd.digit': 'رقم واحد',
      'pwd.special': 'رمز خاص واحد',
      'login.heroTitle': 'أدِر أسطولك، وتواصل مع عملائك.',
      'login.vehicles': 'المركبات',
      'login.phone': 'رقم الهاتف',
      'login.password': 'كلمة المرور',
      'login.rememberMe': 'تذكّرني',
      'login.forgot': 'نسيت كلمة المرور؟',
      'login.needPassword': 'يُرجى إدخال كلمة المرور.',
      'login.notLessor': 'الوصول مرفوض. هذه البوابة مخصّصة للمؤجّرين والمسؤولين.',
      'login.genericError': 'حدث خطأ. أعد المحاولة.',
      'rec.title': 'رمز الاسترجاع الخاص بك',
      'rec.body1': 'محادثاتك مشفّرة: لا تستطيع خوادمنا قراءتها. ',
      'rec.body2': 'هذا الرمز هو السبيل الوحيد لاستعادة رسائلك إذا نسيت كلمة المرور.',
      'rec.body3': ' ولن يُعرض مرّة أخرى أبدًا.',
      'rec.copied': 'تمّ النسخ',
      'rec.copy': 'نسخ الرمز',
      'rec.confirm': 'دوّنتُ هذا الرمز وأحتفظ به في مكان آمن.',
      'fp.title': 'نسيت كلمة المرور',
      'fp.subtitle': 'أدخل بريد حسابك: سنرسل لك رابطًا لتعيين كلمة مرور جديدة.',
      'fp.emailPlaceholder': 'you@example.dz',
      'fp.sendLink': 'إرسال الرابط',
      'fp.checkInbox': 'تحقّق من بريدك',
      'fp.sentTo': 'إن كان هناك حساب Uleez مرتبط بـ ',
      'fp.sentBody': '، فستتلقّى رابط إعادة تعيين. صالح لمدة 30 دقيقة ويُستعمل مرّة واحدة فقط.',
      'fp.checkSpam': 'تذكّر التحقّق من مجلّد الرسائل غير المرغوب فيها.',
      'fp.backToLogin': 'العودة إلى تسجيل الدخول',
      'rp.title': 'كلمة مرور جديدة',
      'rp.confirm': 'تأكيد كلمة المرور',
      'rp.mismatch': 'كلمتا المرور غير متطابقتين',
      'rp.mismatchDot': 'كلمتا المرور غير متطابقتين.',
      'rp.criteria': 'كلمة المرور لا تستوفي المعايير أدناه.',
      'rp.submit': 'تعيين كلمة المرور',
      'rp.updated': 'تمّ تحديث كلمة المرور',
      'rp.updatedBody': 'يمكنك الآن تسجيل الدخول بكلمة المرور الجديدة. ',
      'rp.sessionsClosed': 'لأسباب أمنية، أُنهيت كلّ الجلسات المفتوحة على الأجهزة الأخرى.',
      'rp.expired': 'انتهت صلاحية الرابط',
      'rp.expiredBody': 'لم يعد رابط إعادة التعيين صالحًا: انتهت صلاحيته أو استُعمل من قبل. ',
      'rp.askNew': 'اطلب رابطًا جديدًا من شاشة تسجيل الدخول.',
      'ob.createAccount': 'أنشئ حسابك',
      'ob.firstName': 'الاسم *',
      'ob.lastName': 'اللقب *',
      'ob.phone': 'رقم الهاتف *',
      'ob.password': 'كلمة المرور *',
      'ob.confirmPassword': 'تأكيد كلمة المرور *',
      'ob.passwordRule': '8 أحرف على الأقل، حرف كبير، رقم، رمز خاص',
      'ob.creating': 'جارٍ إنشاء الحساب…',
      'ob.signupError': 'حدث خطأ. تحقّق من أنّ هذا البريد/الرقم غير مستعمل سلفًا.',
      'ob.genericError': 'حدث خطأ.',
      'ob.rcRequired': 'إلزامي للوكالة',
      'ob.yourAgency': 'وكالتك',
      'ob.yourProfile': 'ملفّك',
      'ob.youAre': 'أنت *',
      'ob.independent': 'خاص / مؤجّر مستقلّ',
      'ob.agency': 'وكالة / شركة كراء',
      'ob.agencyName': 'اسم الوكالة / الشركة *',
      'ob.contactPhone': 'هاتف الاتصال',
      'ob.contactEmail': 'بريد الاتصال',
      'ob.rcNumber': 'رقم السجلّ التجاري',
      'ob.descPlaceholder': 'وكالة متخصّصة في كراء المركبات…',
      'ob.descPlaceholderIndep': 'صف نشاطك ككراء…',
      'ob.completeLater': 'يمكنك استكمال ملفّك (الوثائق الثبوتية) بعد تسجيل الدخول، من لوحة القيادة.',
      'ob.goToDashboard': 'الانتقال إلى لوحة القيادة →',
      'ob.accountCreated': 'أُنشئ الحساب!',
      'ob.isReady': ' جاهز.',
      'ob.completeFile': 'أكمل ملفّك (بطاقة التعريف، الحساب البنكي…) من لوحة القيادة لتفعيل حسابك.',
      'ob.reviewDelay': 'يراجع فريقنا الملفّات خلال 24 إلى 48 ساعة.',
      'ob.onceActive': 'بعد التفعيل، يمكنك نشر مركباتك واستقبال الحجوزات.',
      'ob.goToSpace': 'الانتقال إلى فضائي',
      'login.heroSub': 'المكتب الخلفي لوكالات ومؤجّري السيارات في الجزائر. الحجوزات والرزنامة والمدفوعات — في مكان واحد.',
      'login.wilayas': 'الولايات',
      'login.satisfaction': 'الرضا',
      'rp.chooseStrong': 'اختر كلمة مرور قوية لحسابك في Uleez.',
      'rp.recoveryLabel': 'رمز الاستعادة (اختياري)',
      'rp.recoveryHint': 'محادثاتك مشفّرة. أدخِل رمز الاستعادة لاستردادها. بدونه، يُعاد تعيين الحساب وتعود المراسلة بمفتاح جديد — لكن رسائلك القديمة تُفقد نهائيًا، وسيُمنح لك رمز جديد.',
      'rp.recoveryWrong': 'هذا الرمز غير مطابق. تحقّق منه، أو اترك الحقل فارغًا لإعادة التعيين دون استعادة رسائلك.',
      'rp.recoverySkipped': 'تم إعادة تعيين كلمة المرور وتفعيل المراسلة بمفتاح جديد. لم تعد رسائلك المشفّرة القديمة قابلة للاستعادة.',
      'rp.newCodeTitle': 'رمز الاستعادة الجديد',
      'rp.newCodeBody': 'دوّنه واحتفظ به في مكان آمن: إنه الطريقة الوحيدة لاستعادة رسائلك إذا نسيت كلمة المرور. لن يُعرض مرة أخرى.',
      'rp.copyCode': 'نسخ الرمز',
      'rp.copied': 'تم النسخ',
      'chat.removeReaction': 'إزالة تفاعلي',
      'chat.react': 'تفاعل',
      'chat.reply': 'ردّ',
      'phone.countryCode': 'رمز الدولة',
      // — Signalements de bug remontés depuis l'app mobile —
      'bug.title': 'البلاغات',
      'bug.sub': 'مشاكل مُبلَّغ عنها من تطبيق الهاتف',
      'bug.tab.new': 'جديدة',
      'bug.tab.triaged': 'قيد الفحص',
      'bug.tab.resolved': 'تم حلها',
      'bug.tab.all': 'الكل',
      'bug.kind.crash': 'إغلاق / تجمّد',
      'bug.kind.display': 'العرض',
      'bug.kind.feature': 'ميزة معطّلة',
      'bug.kind.payment': 'الدفع',
      'bug.kind.other': 'أخرى',
      'bug.status.new': 'جديد',
      'bug.status.triaged': 'قيد الفحص',
      'bug.status.resolved': 'تم حله',
      'bug.empty': 'لا توجد بلاغات في هذا العرض.',
      'bug.error': 'تعذّر التحميل.',
      'bug.retry': 'إعادة المحاولة',
      'bug.reporter': 'المُبلِّغ',
      'bug.context': 'السياق التقني',
      'bug.appVersion': 'إصدار التطبيق',
      'bug.platform': 'النظام الأساسي',
      'bug.device': 'النظام',
      'bug.route': 'الشاشة المصدر',
      'bug.description': 'الوصف',
      'bug.noDescription': 'لا يوجد وصف مكتوب.',
      'bug.screenshots': 'لقطات الشاشة',
      'bug.voice': 'ملاحظة صوتية',
      'bug.note': 'ملاحظة داخلية',
      'bug.notePlaceholder': 'ما تم العثور عليه، وما بقي…',
      'bug.markTriaged': 'تعيين قيد الفحص',
      'bug.markResolved': 'تعيين كمحلول',
      'bug.reopen': 'إعادة الفتح',
      'bug.saved': 'تم تحديث البلاغ',
      'bug.saveFailed': 'فشل التحديث',
      'bug.count': 'بلاغ/بلاغات',
      'bug.openDetail': 'فتح',
      // — Promotions sur véhicule (espace loueur) —
      "promo.nav": "العروض",
      "promo.title": "العروض",
      "promo.sub": "تخفيضات مؤقتة على سياراتك",
      "promo.new": "عرض جديد",
      "promo.vehicle": "السيارة",
      "promo.pickVehicle": "اختر سيارة",
      "promo.normalPrice": "السعر العادي",
      "promo.promoPrice": "سعر العرض (دج/يوم)",
      "promo.discount": "التخفيض",
      "promo.from": "البداية",
      "promo.to": "النهاية",
      "promo.create": "إرسال للمراجعة",
      "promo.creating": "جارٍ الإرسال…",
      "promo.pendingNote": "يصبح عرضك مرئيًا للعملاء بعد موافقة Uleez.",
      "promo.created": "تم إرسال العرض للمراجعة",
      "promo.createFailed": "تعذّر الإنشاء",
      "promo.empty": "لا توجد عروض بعد.",
      "promo.status.pending": "في انتظار الموافقة",
      "promo.status.approved": "منشور",
      "promo.status.rejected": "مرفوض",
      "promo.rejectedBecause": "السبب",
      "promo.remove": "إزالة",
      "promo.removed": "تمت إزالة العرض",
      "promo.removeConfirm": "إزالة هذا العرض؟",
      "promo.minDiscount": "يجب ألا يقل التخفيض عن 5٪.",
      "promo.endsAfterStart": "يجب أن تكون النهاية بعد البداية.",
      "promo.perDay": "دج/يوم",
      "promo.visible": "ظاهرة في التطبيق",
      "promo.notVisible": "غير ظاهرة بعد",
      "promo.vis.notApproved": "في انتظار الموافقة",
      "promo.vis.archived": "مُزالة",
      "promo.vis.notStarted": "تبدأ في {date}",
      "promo.vis.ended": "انتهت الفترة",
      "promo.vis.vehicleHidden": "المركبة غير منشورة",
      "promo.vis.lessorSuspended": "الحساب موقوف",
      "promo.vis.fullyBooked": "الفترة محجوزة بالكامل",
      "promo.vis.vehicleMissing": "المركبة غير موجودة",
      "promo.availChecking": "جارٍ التحقق من التوفّر…",
      "promo.availFree": "متاحة خلال كل الفترة ({total} يوم).",
      "promo.availPartial": "{booked} يوم محجوزة من {total}: العرض يبقى مفيدًا في {free} يوم المتاحة.",
      "promo.availFull": "محجوزة خلال كل الفترة: لن يظهر العرض أبدًا.",
      "promo.availBookedOn": "محجوزة:",
      "promo.stats.bookings": "{count} حجز خلال الفترة",
      "promo.stats.none": "لا حجز خلال الفترة",
    },
  };

  function normalize(raw) {
    const code = String(raw || '').trim().toLowerCase().split(/[_-]/)[0];
    return SUPPORTED.indexOf(code) >= 0 ? code : DEFAULT;
  }

  let current = DEFAULT;
  try {
    const stored = localStorage.getItem(STORAGE_KEY);
    if (stored) current = normalize(stored);
  } catch (e) {
    /* localStorage indisponible (navigation privée stricte) : on reste en français. */
  }

  // Abonnés React : chaque composant qui affiche du texte se re-rend au changement de langue.
  const listeners = new Set();

  /**
   * `dir`/`lang` sur <html> plutôt que sur un conteneur : c'est ce qui fait basculer les
   * marges logiques du CSS et l'alignement du texte pour TOUTE la page, y compris les
   * portails (menus, feuilles, toasts) qui sont montés hors de l'arbre React.
   */
  function applyDocumentDirection(lang) {
    try {
      const el = document.documentElement;
      el.setAttribute('lang', lang);
      el.setAttribute('dir', lang === 'ar' ? 'rtl' : 'ltr');
    } catch (e) { /* pas de DOM (test) : sans effet */ }
  }

  applyDocumentDirection(current);

  function t(key, params) {
    const table = DICT[current] || DICT[DEFAULT];
    let s = table[key];
    if (s === undefined) s = DICT[DEFAULT][key];
    if (s === undefined) return key;
    if (!params) return s;
    // Un paramètre absent laisse son marqueur visible : « {n} avis » saute aux yeux en
    // revue, là où un blanc produit une phrase mutilée qui passe inaperçue.
    return s.replace(/\{(\w+)\}/g, (whole, name) =>
      params[name] === undefined || params[name] === null ? whole : String(params[name]));
  }

  /**
   * Change la langue de l'interface.
   *
   * `persistRemote` écrit AUSSI `preferredLanguage` côté serveur — ce n'est pas cosmétique :
   * c'est ce champ que le backend lit pour choisir la langue des e-mails (factures, relances,
   * renouvellement d'abonnement). Sans lui, l'interface basculerait en anglais et les e-mails
   * continueraient d'arriver en français.
   */
  function setLang(raw, opts) {
    const lang = normalize(raw);
    if (lang === current && !(opts && opts.force)) return lang;
    current = lang;
    try { localStorage.setItem(STORAGE_KEY, lang); } catch (e) { /* ignore */ }
    applyDocumentDirection(lang);
    listeners.forEach((fn) => { try { fn(lang); } catch (e) { /* un abonné cassé n'en bloque pas d'autres */ } });
    if (!opts || opts.persistRemote !== false) {
      // `API.auth.updateAccount` → PATCH /users/me. Best-effort : la langue est DÉJÀ appliquée
      // localement, un échec réseau ne doit pas annuler le changement à l'écran.
      const api = window.API;
      if (api && api.auth && typeof api.auth.updateAccount === 'function') {
        Promise.resolve(api.auth.updateAccount({ preferredLanguage: lang })).catch(() => {});
      }
    }
    return lang;
  }

  /** Aligne l'interface sur la langue du COMPTE, sans réécrire au serveur ce qu'il vient de dire. */
  function adoptFromUser(user) {
    if (!user) return;
    const lang = normalize(user.preferredLanguage || user.preferred_language);
    if (lang !== current) setLang(lang, { persistRemote: false });
  }

  /** Hook React : rend le composant réactif au changement de langue. */
  function useT() {
    const [, force] = React.useState(0);
    React.useEffect(() => {
      const fn = () => force((n) => n + 1);
      listeners.add(fn);
      return () => listeners.delete(fn);
    }, []);
    return t;
  }

  window.I18N = {
    t,
    useT,
    setLang,
    adoptFromUser,
    normalize,
    get lang() { return current; },
    get isRtl() { return current === 'ar'; },
    SUPPORTED,
    LANGUAGE_NAMES,
  };
})();
