feat: localize errors, translate profile, refine jobs UI

This commit is contained in:
jeremy bayse
2026-05-08 12:20:30 +02:00
parent fd4a39a703
commit 7c01803f46
29 changed files with 3633 additions and 104 deletions

119
lang/fr/actions.php Normal file
View File

@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
return [
'accept' => 'Accepter',
'action' => 'Action',
'actions' => 'Actions',
'add' => 'Ajouter',
'admin' => 'Administrateur',
'agree' => 'Approuver',
'archive' => 'Archiver',
'assign' => 'Attribuer',
'associate' => 'Associer',
'attach' => 'Attacher',
'browse' => 'Parcourir',
'cancel' => 'Annuler',
'choose' => 'Choisir',
'choose_file' => 'Choisir le fichier',
'choose_image' => 'Choisir une image',
'click_to_copy' => 'Cliquer pour copier',
'close' => 'Fermer',
'collapse' => 'Réduire',
'collapse_all' => 'Réduire tout',
'comment' => 'Commentaire',
'confirm' => 'Confirmer',
'connect' => 'Connecter',
'create' => 'Créer',
'delete' => 'Supprimer',
'detach' => 'Détacher',
'details' => 'Détails',
'disable' => 'Désactiver',
'discard' => 'Jeter',
'done' => 'Fait',
'down' => 'Descendre',
'duplicate' => 'Dupliquer',
'edit' => 'Editer',
'enable' => 'Activer',
'expand' => 'Développer',
'expand_all' => 'Développer tout',
'explanation' => 'Explication',
'export' => 'Exporter',
'file' => 'Déposer',
'files' => 'Fichiers',
'go_home' => 'Aller à l\'accueil',
'hide' => 'Cacher',
'home' => 'Accueil',
'image' => 'Image',
'impersonate' => 'Imiter',
'impersonation' => 'Imitation',
'import' => 'Importer',
'introduction' => 'Introduction',
'like' => 'Aimer',
'load' => 'Charger',
'localize' => 'Localiser',
'log_in' => 'Se connecter',
'log_out' => 'Se déconnecter',
'named' => [
'add' => 'Ajouter :name',
'choose' => 'Choisir :name',
'create' => 'Créer :name',
'delete' => 'Supprimer :name',
'duplicate' => 'Dupliquer :name',
'edit' => 'Editer :name',
'export' => 'Exporter :name',
'hide' => 'Cacher :name',
'import' => 'Importer :name',
'new' => 'Nouveau :name',
'restore' => 'Restaurer :name',
'save' => 'Sauvegarder :name',
'search' => 'Chercher :name',
'show' => 'Afficher :name',
'update' => 'Mettre à jour :name',
'view' => 'Voir :name',
],
'new' => 'Nouveau',
'no' => 'Non',
'open' => 'Ouvrir',
'open_website' => 'Ouvrir sur le site',
'preview' => 'Aperçu',
'price' => 'Prix',
'record' => 'Enregistrer',
'restore' => 'Restaurer',
'save' => 'Sauvegarder',
'save_and_close' => 'Sauvegarder et fermer',
'save_and_return' => 'Sauvegarder et retourner',
'search' => 'Chercher',
'select' => 'Sélectionner',
'select_all' => 'Tout sélectionner',
'send' => 'Envoyer',
'settings' => 'Paramètres',
'show' => 'Montrer',
'show_all' => 'Afficher tout',
'sign_in' => 'Se connecter',
'solve' => 'Résoudre',
'start' => 'Commencer',
'stop' => 'Arrêter',
'submit' => 'Soumettre',
'subscribe' => 'S\'abonner',
'switch' => 'Changer',
'switch_to_role' => 'Passer au rôle',
'tag' => 'Mot clé',
'tags' => 'Mots clés',
'target_link' => [
'blank' => 'Ouvrir dans une nouvelle fenêtre',
'parent' => 'Ouvrir dans la fenêtre parente',
'self' => 'Ouvrir dans la fenêtre actuelle',
'top' => 'Ouvrir dans le cadre le plus haut',
],
'translate' => 'Traduire',
'translate_it' => 'Traduis le',
'unpack' => 'Déballer',
'unsubscribe' => 'Se désabonner',
'up' => 'Monter',
'update' => 'Mettre à jour',
'user' => 'Utilisateur',
'view' => 'Voir',
'yes' => 'Oui',
];

9
lang/fr/auth.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
return [
'failed' => 'Ces identifiants ne correspondent pas à nos enregistrements.',
'password' => 'Le mot de passe est incorrect',
'throttle' => 'Tentatives de connexion trop nombreuses. Veuillez essayer de nouveau dans :seconds secondes.',
];

84
lang/fr/http-statuses.php Normal file
View File

@@ -0,0 +1,84 @@
<?php
declare(strict_types=1);
return [
'0' => 'Erreur inconnue',
'100' => 'Continuer',
'101' => 'Protocoles de commutation',
'102' => 'En traitement',
'200' => 'OK',
'201' => 'Créé',
'202' => 'Accepté',
'203' => 'Informations non certifiées',
'204' => 'Pas de contenu',
'205' => 'Réinitialiser le contenu',
'206' => 'Contenu partiel',
'207' => 'Statut multiple',
'208' => 'Déjà rapporté',
'226' => 'IM utilisé',
'300' => 'Choix multiples',
'301' => 'Déplacé de façon permanente',
'302' => 'A trouvé',
'303' => 'Voir autre',
'304' => 'Non modifié',
'305' => 'Utiliser un proxy',
'307' => 'Redirection temporaire',
'308' => 'Redirection permanente',
'400' => 'Requête invalide',
'401' => 'Non authentifié',
'402' => 'Paiement requis',
'403' => 'Interdit',
'404' => 'Page non trouvée',
'405' => 'Méthode non autorisée',
'406' => 'Non acceptable',
'407' => 'Authentification proxy requise',
'408' => 'Requête expirée',
'409' => 'Conflit',
'410' => 'Disparu',
'411' => 'Longueur requise',
'412' => 'La précondition a échoué',
'413' => 'Charge utile trop grande',
'414' => 'URI trop long',
'415' => 'Type de média non supporté',
'416' => 'Plage non satisfaisante',
'417' => 'Comportement attendu insatisfaisant',
'418' => 'Je suis une théière',
'419' => 'La session a expiré',
'421' => 'Demande mal dirigée',
'422' => 'Contenu non traitable',
'423' => 'Verrouillé',
'424' => 'Dépendance échouée',
'425' => 'Trop tôt',
'426' => 'Mise à niveau requise',
'428' => 'Condition préalable requise',
'429' => 'Trop de demandes',
'431' => 'Champs d\'en-tête de requête trop grands',
'444' => 'Connexion fermée sans réponse',
'449' => 'Réessayer avec',
'451' => 'Indisponible pour des raisons légales',
'499' => 'Demande fermée par le client',
'500' => 'Erreur interne du serveur',
'501' => 'Non implémenté',
'502' => 'Mauvaise passerelle',
'503' => 'Service non disponible',
'504' => 'Temps d\'attente de la passerelle dépassé',
'505' => 'Version HTTP non prise en charge',
'506' => 'La variante négocie également',
'507' => 'Espace insuffisant',
'508' => 'Boucle détectée',
'509' => 'Limite de bande passante dépassée',
'510' => 'Non prolongé',
'511' => 'Authentification réseau requise',
'520' => 'Erreur inconnue',
'521' => 'Le serveur Web est en panne',
'522' => 'La connexion a expiré',
'523' => 'L\'origine est inaccessible',
'524' => 'Un dépassement de délai s\'est produit',
'525' => 'Échec de la prise de contact SSL',
'526' => 'Certificat SSL invalide',
'527' => 'Erreur de Railgun',
'598' => 'Temps d\'attente de la lecture réseau dépassé',
'599' => 'Temps d\'attente de la connexion réseau dépassé',
'unknownError' => 'Erreur inconnue',
];

8
lang/fr/pagination.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
declare(strict_types=1);
return [
'next' => 'Suivant &raquo;',
'previous' => '&laquo; Précédent',
];

11
lang/fr/passwords.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
return [
'reset' => 'Votre mot de passe a été réinitialisé !',
'sent' => 'Nous vous avons envoyé par email le lien de réinitialisation du mot de passe !',
'throttled' => 'Veuillez patienter avant de réessayer.',
'token' => 'Ce jeton de réinitialisation du mot de passe n\'est pas valide.',
'user' => 'Aucun utilisateur n\'a été trouvé avec cette adresse email.',
];

288
lang/fr/validation.php Normal file
View File

@@ -0,0 +1,288 @@
<?php
declare(strict_types=1);
return [
'accepted' => 'Le champ :attribute doit être accepté.',
'accepted_if' => 'Le champ :attribute doit être accepté quand :other a la valeur :value.',
'active_url' => 'Le champ :attribute n\'est pas une URL valide.',
'after' => 'Le champ :attribute doit être une date postérieure au :date.',
'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale au :date.',
'alpha' => 'Le champ :attribute doit contenir uniquement des lettres.',
'alpha_dash' => 'Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets.',
'alpha_num' => 'Le champ :attribute doit contenir uniquement des chiffres et des lettres.',
'any_of' => 'Le champ :attribute est invalide.',
'array' => 'Le champ :attribute doit être un tableau.',
'ascii' => 'Le champ :attribute ne doit contenir que des caractères alphanumériques et des symboles codés sur un octet.',
'before' => 'Le champ :attribute doit être une date antérieure au :date.',
'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale au :date.',
'between' => [
'array' => 'Le tableau :attribute doit contenir entre :min et :max éléments.',
'file' => 'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.',
'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.',
'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.',
],
'boolean' => 'Le champ :attribute doit être vrai ou faux.',
'can' => 'Le champ :attribute contient une valeur non autorisée.',
'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.',
'contains' => 'Le champ :attribute manque une valeur requise.',
'current_password' => 'Le mot de passe est incorrect.',
'date' => 'Le champ :attribute n\'est pas une date valide.',
'date_equals' => 'Le champ :attribute doit être une date égale à :date.',
'date_format' => 'Le champ :attribute ne correspond pas au format :format.',
'decimal' => 'Le champ :attribute doit comporter :decimal décimales.',
'declined' => 'Le champ :attribute doit être décliné.',
'declined_if' => 'Le champ :attribute doit être décliné quand :other a la valeur :value.',
'different' => 'Les champs :attribute et :other doivent être différents.',
'digits' => 'Le champ :attribute doit contenir :digits chiffres.',
'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.',
'dimensions' => 'La taille de l\'image :attribute n\'est pas conforme.',
'distinct' => 'Le champ :attribute a une valeur en double.',
'doesnt_contain' => 'Le champ :attribute ne doit contenir aucun des éléments suivants : :values.',
'doesnt_end_with' => 'Le champ :attribute ne doit pas finir avec une des valeurs suivantes : :values.',
'doesnt_start_with' => 'Le champ :attribute ne doit pas commencer avec une des valeurs suivantes : :values.',
'email' => 'Le champ :attribute doit être une adresse e-mail valide.',
'encoding' => 'The :attribute field must be encoded in :encoding.',
'ends_with' => 'Le champ :attribute doit se terminer par une des valeurs suivantes : :values',
'enum' => 'Le champ :attribute sélectionné est invalide.',
'exists' => 'Le champ :attribute sélectionné est invalide.',
'extensions' => 'Le champ :attribute doit avoir l\'une des extensions suivantes : :values.',
'file' => 'Le champ :attribute doit être un fichier.',
'filled' => 'Le champ :attribute doit avoir une valeur.',
'gt' => [
'array' => 'Le tableau :attribute doit contenir plus de :value éléments.',
'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être supérieure à :value.',
'string' => 'Le texte :attribute doit contenir plus de :value caractères.',
],
'gte' => [
'array' => 'Le tableau :attribute doit contenir au moins :value éléments.',
'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.',
'string' => 'Le texte :attribute doit contenir au moins :value caractères.',
],
'hex_color' => 'Le champ :attribute doit être une couleur hexadécimale valide.',
'image' => 'Le champ :attribute doit être une image.',
'in' => 'Le champ :attribute est invalide.',
'in_array' => 'Le champ :attribute n\'existe pas dans :other.',
'in_array_keys' => 'Le champ :attribute doit contenir au moins l\'une des clés suivantes : :values.',
'integer' => 'Le champ :attribute doit être un entier.',
'ip' => 'Le champ :attribute doit être une adresse IP valide.',
'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.',
'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.',
'json' => 'Le champ :attribute doit être un document JSON valide.',
'list' => 'Le champ :attribute doit être une liste.',
'lowercase' => 'Le champ :attribute doit être en minuscules.',
'lt' => [
'array' => 'Le tableau :attribute doit contenir moins de :value éléments.',
'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être inférieure à :value.',
'string' => 'Le texte :attribute doit contenir moins de :value caractères.',
],
'lte' => [
'array' => 'Le tableau :attribute doit contenir au plus :value éléments.',
'file' => 'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.',
'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.',
'string' => 'Le texte :attribute doit contenir au plus :value caractères.',
],
'mac_address' => 'Le champ :attribute doit être une adresse MAC valide.',
'max' => [
'array' => 'Le tableau :attribute ne peut pas contenir plus que :max éléments.',
'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.',
'numeric' => 'La valeur de :attribute ne peut pas être supérieure à :max.',
'string' => 'Le texte de :attribute ne peut pas contenir plus de :max caractères.',
],
'max_digits' => 'Le champ :attribute ne doit pas avoir plus de :max chiffres.',
'mimes' => 'Le champ :attribute doit être un fichier de type : :values.',
'mimetypes' => 'Le champ :attribute doit être un fichier de type : :values.',
'min' => [
'array' => 'Le tableau :attribute doit contenir au moins :min éléments.',
'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :min kilo-octets.',
'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.',
'string' => 'Le texte de :attribute doit contenir au moins :min caractères.',
],
'min_digits' => 'Le champ :attribute doit avoir au moins :min chiffres.',
'missing' => 'Le champ :attribute doit être manquant.',
'missing_if' => 'Le champ :attribute doit être manquant quand :other a la valeur :value.',
'missing_unless' => 'Le champ :attribute doit être manquant sauf si :other a la valeur :value.',
'missing_with' => 'Le champ :attribute doit être manquant quand :values est présent.',
'missing_with_all' => 'Le champ :attribute doit être manquant quand :values sont présents.',
'multiple_of' => 'La valeur de :attribute doit être un multiple de :value',
'not_in' => 'Le champ :attribute sélectionné n\'est pas valide.',
'not_regex' => 'Le format du champ :attribute n\'est pas valide.',
'numeric' => 'Le champ :attribute doit contenir un nombre.',
'password' => [
'letters' => 'Le champ :attribute doit contenir au moins une lettre.',
'mixed' => 'Le champ :attribute doit contenir au moins une majuscule et une minuscule.',
'numbers' => 'Le champ :attribute doit contenir au moins un chiffre.',
'symbols' => 'Le champ :attribute doit contenir au moins un symbole.',
'uncompromised' => 'La valeur du champ :attribute est apparue dans une fuite de données. Veuillez choisir une valeur différente.',
],
'present' => 'Le champ :attribute doit être présent.',
'present_if' => 'Le champ :attribute doit être présent lorsque :other est :value.',
'present_unless' => 'Le champ :attribute doit être présent sauf si :other vaut :value.',
'present_with' => 'Le champ :attribute doit être présent lorsque :values est présent.',
'present_with_all' => 'Le champ :attribute doit être présent lorsque :values sont présents.',
'prohibited' => 'Le champ :attribute est interdit.',
'prohibited_if' => 'Le champ :attribute est interdit quand :other a la valeur :value.',
'prohibited_if_accepted' => 'Le champ :attribute est interdit quand :other a été accepté.',
'prohibited_if_declined' => 'Le champ :attribute est interdit quand :other a été refusé.',
'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other est l\'une des valeurs :values.',
'prohibits' => 'Le champ :attribute interdit :other d\'être présent.',
'regex' => 'Le format du champ :attribute est invalide.',
'required' => 'Le champ :attribute est obligatoire.',
'required_array_keys' => 'Le champ :attribute doit contenir des entrées pour : :values.',
'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.',
'required_if_accepted' => 'Le champ :attribute est obligatoire quand le champ :other a été accepté.',
'required_if_declined' => 'Le champ :attribute est obligatoire quand le champ :other a été refusé.',
'required_unless' => 'Le champ :attribute est obligatoire sauf si :other est :values.',
'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.',
'required_with_all' => 'Le champ :attribute est obligatoire quand :values sont présents.',
'required_without' => 'Le champ :attribute est obligatoire quand :values n\'est pas présent.',
'required_without_all' => 'Le champ :attribute est requis quand aucun de :values n\'est présent.',
'same' => 'Les champs :attribute et :other doivent être identiques.',
'size' => [
'array' => 'Le tableau :attribute doit contenir :size éléments.',
'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.',
'numeric' => 'La valeur de :attribute doit être :size.',
'string' => 'Le texte de :attribute doit contenir :size caractères.',
],
'starts_with' => 'Le champ :attribute doit commencer avec une des valeurs suivantes : :values',
'string' => 'Le champ :attribute doit être une chaîne de caractères.',
'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.',
'ulid' => 'Le champ :attribute doit être un ULID valide.',
'unique' => 'La valeur du champ :attribute est déjà utilisée.',
'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.',
'uppercase' => 'Le champ :attribute doit être en majuscules.',
'url' => 'Le format de l\'URL de :attribute n\'est pas valide.',
'uuid' => 'Le champ :attribute doit être un UUID valide',
'attributes' => [
'address' => 'adresse',
'affiliate_url' => 'URL d\'affiliation',
'age' => 'âge',
'amount' => 'montant',
'announcement' => 'annonce',
'area' => 'zone',
'audience_prize' => 'prix du public',
'audience_winner' => 'gagnant du public',
'available' => 'disponible',
'birthday' => 'anniversaire',
'body' => 'corps',
'city' => 'ville',
'color' => 'color',
'company' => 'entreprise',
'compilation' => 'compilation',
'concept' => 'concept',
'conditions' => 'conditions',
'content' => 'contenu',
'contest' => 'contest',
'country' => 'pays',
'cover' => 'couverture',
'created_at' => 'date de création',
'creator' => 'créateur',
'currency' => 'devise',
'current_password' => 'mot de passe actuel',
'customer' => 'client',
'date' => 'date',
'date_of_birth' => 'date de naissance',
'dates' => 'rendez-vous',
'day' => 'jour',
'deleted_at' => 'date de suppression',
'description' => 'description',
'display_type' => 'type d\'affichage',
'district' => 'quartier',
'duration' => 'durée',
'email' => 'adresse e-mail',
'excerpt' => 'extrait',
'filter' => 'filtre',
'finished_at' => 'date de fin',
'first_name' => 'prénom',
'gender' => 'genre',
'grand_prize' => 'grand prix',
'group' => 'groupe',
'hour' => 'heure',
'image' => 'image',
'image_desktop' => 'image de bureau',
'image_main' => 'image principale',
'image_mobile' => 'image mobile',
'images' => 'images',
'is_audience_winner' => 'est le gagnant du public',
'is_hidden' => 'est caché',
'is_subscribed' => 'est abonné',
'is_visible' => 'est visible',
'is_winner' => 'est gagnant',
'items' => 'articles',
'key' => 'clé',
'last_name' => 'nom de famille',
'lesson' => 'leçon',
'line_address_1' => 'ligne d\'adresse 1',
'line_address_2' => 'ligne d\'adresse 2',
'login' => 'identifiant',
'message' => 'message',
'middle_name' => 'deuxième prénom',
'minute' => 'minute',
'mobile' => 'portable',
'month' => 'mois',
'name' => 'nom',
'national_code' => 'code national',
'number' => 'numéro',
'password' => 'mot de passe',
'password_confirmation' => 'confirmation du mot de passe',
'phone' => 'téléphone',
'photo' => 'photo',
'portfolio' => 'portefeuille',
'postal_code' => 'code postal',
'preview' => 'aperçu',
'price' => 'prix',
'product_id' => 'identifiant du produit',
'product_uid' => 'UID du produit',
'product_uuid' => 'UUID du produit',
'promo_code' => 'code promo',
'province' => 'région',
'quantity' => 'quantité',
'reason' => 'raison',
'recaptcha_response_field' => 'champ de réponse reCAPTCHA',
'referee' => 'arbitre',
'referees' => 'arbitres',
'region' => 'region',
'reject_reason' => 'motif de rejet',
'remember' => 'se souvenir',
'restored_at' => 'date de restauration',
'result_text_under_image' => 'texte de résultat sous l\'image',
'role' => 'rôle',
'rule' => 'règle',
'rules' => 'règles',
'second' => 'seconde',
'sex' => 'sexe',
'shipment' => 'expédition',
'short_text' => 'texte court',
'size' => 'taille',
'skills' => 'compétences',
'slug' => 'slug',
'specialization' => 'spécialisation',
'started_at' => 'date de début',
'state' => 'état',
'status' => 'statut',
'street' => 'rue',
'student' => 'étudiant',
'subject' => 'sujet',
'tag' => 'mot clé',
'tags' => 'mots clés',
'teacher' => 'professeur',
'terms' => 'conditions',
'test_description' => 'description du test',
'test_locale' => 'localisation du test',
'test_name' => 'nom du test',
'text' => 'texte',
'time' => 'heure',
'title' => 'titre',
'type' => 'type',
'updated_at' => 'date de mise à jour',
'user' => 'utilisateur',
'username' => 'nom d\'utilisateur',
'value' => 'valeur',
'winner' => 'gagnant',
'work' => 'travail',
'year' => 'année',
],
];