diff --git a/src/app/Http/Controllers/ContentController.php b/src/app/Http/Controllers/ContentController.php
--- a/src/app/Http/Controllers/ContentController.php
+++ b/src/app/Http/Controllers/ContentController.php
@@ -86,7 +86,7 @@
return preg_split('/\s*,\s*/', strtolower(trim($locales)));
}
- return ['en', 'de'];
+ return ['en', 'de', 'fr'];
}
/**
diff --git a/src/resources/js/app.js b/src/resources/js/app.js
--- a/src/resources/js/app.js
+++ b/src/resources/js/app.js
@@ -270,7 +270,7 @@
index = '\u00B9'
}
- return this.price(cost) + '/month' + index
+ return this.price(cost) + '/' + this.$t('wallet.month') + index
},
clickRecord(event) {
if (!/^(a|button|svg|path)$/i.test(event.target.nodeName)) {
diff --git a/src/resources/lang/en/ui.php b/src/resources/lang/en/ui.php
--- a/src/resources/lang/en/ui.php
+++ b/src/resources/lang/en/ui.php
@@ -401,6 +401,7 @@
. " We will then convert this to {pc}, and on the next page you will be provided with the bank-details to transfer the amount in {pc}.",
'fill-up' => "Fill up by",
'history' => "History",
+ 'month' => "month",
'noperm' => "Only account owners can access a wallet.",
'payment-amount-hint' => "Choose the amount by which you want to top up your wallet.",
'payment-method' => "Method of payment: {method}",
diff --git a/src/resources/lang/fr/app.php b/src/resources/lang/fr/app.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/app.php
@@ -0,0 +1,81 @@
+ "L'auto-paiement a été supprimé.",
+ 'mandate-update-success' => "L'auto-paiement a été mis-à-jour.",
+
+ 'planbutton' => "Choisir :plan",
+ 'siteuser' => "Utilisateur du :site",
+ 'domain-setconfig-success' => "Les paramètres du domaine sont mis à jour avec succès.",
+ 'user-setconfig-success' => "Les paramètres d'utilisateur sont mis à jour avec succès.",
+
+ 'process-async' => "Le processus d'installation a été poussé. Veuillez patienter.",
+ 'process-user-new' => "Enregistrement d'un utilisateur...",
+ 'process-user-ldap-ready' => "Création d'un utilisateur...",
+ 'process-user-imap-ready' => "Création d'une boîte aux lettres...",
+ 'process-distlist-new' => "Enregistrement d'une liste de distribution...",
+ 'process-distlist-ldap-ready' => "Création d'une liste de distribution...",
+ 'process-domain-new' => "Enregistrement d'un domaine personnalisé...",
+ 'process-domain-ldap-ready' => "Création d'un domaine personnalisé...",
+ 'process-domain-verified' => "Vérification d'un domaine personnalisé...",
+ 'process-domain-confirmed' => "vérification de la propriété d'un domaine personnalisé...",
+ 'process-success' => "Le processus d'installation s'est terminé avec succès.",
+ 'process-error-user-ldap-ready' => "Échec de créar un utilisateur.",
+ 'process-error-user-imap-ready' => "Échec de la vérification de l'existence d'une boîte aux lettres.",
+ 'process-error-domain-ldap-ready' => "Échec de créer un domaine.",
+ 'process-error-domain-verified' => "Échec de vérifier un domaine.",
+ 'process-error-domain-confirmed' => "Échec de la vérification de la propriété d'un domaine.",
+ 'process-distlist-new' => "Enregistrement d'une liste de distribution...",
+ 'process-distlist-ldap-ready' => "Création d'une liste de distribution...",
+ 'process-error-distlist-ldap-ready' => "Échec de créer une liste de distrubion.",
+
+ 'distlist-update-success' => "Liste de distribution mis-à-jour avec succès.",
+ 'distlist-create-success' => "Liste de distribution créer avec succès.",
+ 'distlist-delete-success' => "Liste de distribution suppriméee avec succès.",
+ 'distlist-suspend-success' => "Liste de distribution à été suspendue avec succès.",
+ 'distlist-unsuspend-success' => "Liste de distribution à été débloquée avec succès.",
+
+ 'domain-verify-success' => "Domaine vérifié avec succès.",
+ 'domain-verify-error' => "Vérification de propriété de domaine à échoué.",
+ 'domain-suspend-success' => "Domaine suspendue avec succès.",
+ 'domain-unsuspend-success' => "Domaine debloqué avec succès.",
+
+ 'user-update-success' => "Mis-à-jour des données de l'utilsateur effectué avec succès.",
+ 'user-create-success' => "Utilisateur a été crée avec succès.",
+ 'user-delete-success' => "Utilisateur a été supprimé avec succès.",
+ 'user-suspend-success' => "Utilisateur a été suspendu avec succès.",
+ 'user-unsuspend-success' => "Utilisateur a été debloqué avec succès.",
+ 'user-reset-2fa-success' => "Réinstallation de l'authentification à 2-Facteur avec succès.",
+
+ 'search-foundxdomains' => "Les domaines :x ont été trouvés.",
+ 'search-foundxgroups' => "Les listes de distribution :x ont été trouvées.",
+ 'search-foundxusers' => "Les comptes d'utilisateurs :x ont été trouvés.",
+
+ 'signup-invitations-created' => "L'invitation à été crée.|:count nombre d'invitations ont été crée.",
+ 'signup-invitations-csv-empty' => "Aucune adresses email valides ont été trouvées dans le fichier téléchargé.",
+ 'signup-invitations-csv-invalid-email' => "Une adresse email invalide a été trouvée (:email) on line :line.",
+ 'signup-invitation-delete-success' => "Invitation supprimée avec succès.",
+ 'signup-invitation-resend-success' => "Invitation ajoutée à la file d'attente d'envoi avec succès.",
+
+ 'support-request-success' => "Demande de soutien soumise avec succès.",
+ 'support-request-error' => "La soumission de demande de soutien a échoué.",
+
+ 'wallet-award-success' => "Le bonus a été ajouté au portefeuille avec succès.",
+ 'wallet-penalty-success' => "La pénalité a été ajoutée au portefeuille avec succès.",
+ 'wallet-update-success' => "Portefeuille d'utilisateur a été mis-à-jour avec succès.",
+
+ 'wallet-notice-date' => "Avec vos abonnements actuels, le solde de votre compte durera jusqu'à environ :date (:days).",
+ 'wallet-notice-nocredit' => "Votre crédit a été epuisé, veuillez recharger immédiatement votre solde.",
+ 'wallet-notice-today' => "Votre reste crédit sera épuisé aujourd'hui, veuillez recharger immédiatement.",
+ 'wallet-notice-trial' => "Vous êtes dans votre période d'essai gratuite.",
+ 'wallet-notice-trial-end' => "Vous approchez de la fin de votre période d'essai gratuite, veuillez recharger pour continuer.",
+];
diff --git a/src/resources/lang/fr/auth.php b/src/resources/lang/fr/auth.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/auth.php
@@ -0,0 +1,20 @@
+ "Nom d'utilisateur et mot de passe invalide.",
+ 'throttle' => "Trop de tentatives de connexion. Veuillez ré-essayer dans :seconds secondes.",
+ 'logoutsuccess' => "Déconnecté avec succès.",
+
+];
\ No newline at end of file
diff --git a/src/resources/lang/fr/documents.php b/src/resources/lang/fr/documents.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/documents.php
@@ -0,0 +1,40 @@
+ "ID de Compte",
+ 'amount' => "Montant",
+ 'customer-no' => "No° de Client.",
+ 'date' => "Date",
+ 'description' => "Description",
+ 'period' => "Période",
+ 'total' => "Total",
+
+ 'month1' => "Janvier",
+ 'month2' => "Février",
+ 'month3' => "Mars",
+ 'month4' => "Avril",
+ 'month5' => "Mai",
+ 'month6' => "Juin",
+ 'month7' => "Juillet",
+ 'month8' => "Août",
+ 'month9' => "Septembre",
+ 'month10' => "Octobre",
+ 'month11' => "Novembre",
+ 'month12' => "Décembre",
+
+ 'receipt-filename' => ":site Receipt for :id",
+ 'receipt-title' => "Reçu pour :month :year",
+ 'receipt-item-desc' => ":site Services",
+ 'receipt-refund' => "Remboursement",
+ 'receipt-chargeback' => "Refacturation",
+
+ 'subtotal' => "Sous-Total",
+ 'vat' => "VAT (:rate%)",
+];
diff --git a/src/resources/lang/fr/mail.php b/src/resources/lang/fr/mail.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/mail.php
@@ -0,0 +1,90 @@
+ "Salut :name,",
+ 'footer1' => "Meilleures salutations,",
+ 'footer2' => "Votre :site Équipe",
+
+ 'more-info-html' => "Cliquez ici pour plus d'information.",
+ 'more-info-text' => "Cliquez :href pour plus d'information.",
+
+ 'negativebalance-subject' => ":site Paiement Requis",
+ 'negativebalance-body' => "C'est une notification pour vous informer que votre :site le solde du compte est en négatif et nécessite votre attention."
+ . " Veillez à mettre en place un auto-paiement pour éviter de tel avertissement comme celui-ci dans le future.",
+ 'negativebalance-body-ext' => "Régler votre compte pour le maintenir en fontion:",
+
+ 'negativebalancereminder-subject' => ":site Rappel de Paiement",
+ 'negativebalancereminder-body' => "Vous n'avez peut-être pas rendu compte que vous êtes en retard avec votre paiement pour :site compte."
+ . " Veillez à mettre en place un auto-paiement pour éviter de tel avertissement comme celui-ci dans le future.",
+ 'negativebalancereminder-body-ext' => "Régler votre compte pour le maintenir en fontion:",
+ 'negativebalancereminder-body-warning' => "Soyez conscient que votre compte sera suspendu si le"
+ . " solde de votre compte n'est réglé avant le :date.",
+
+ 'negativebalancesuspended-subject' => ":site Compte Suspendu",
+ 'negativebalancesuspended-body' => "Votre :site compte a été suspendu à la suite d'un solde négatif pendant trop longtemps."
+ . " Veillez nvisager de mettre en place un auto-paiement pour éviter de tel avertissement comme celui-ci dans le future.",
+ 'negativebalancesuspended-body-ext' => "Régler votre compte pour le maintenir en fontion:",
+ 'negativebalancesuspended-body-warning' => "Veuillez vous assurer que votre compte et toutes ses données seront supprimés"
+ . " si le solde de votre compte n'est pas réglé avant le :date.",
+
+ 'negativebalancebeforedelete-subject' => ":site Dernier Avertissement",
+ 'negativebalancebeforedelete-body' => "Ceci-ci est le dernier rappel pour régler votre :site solde de compte."
+ . " votre compte et toutes ses données seront supprimés si le solde de votre compte nest pas régler avant le :date.",
+ 'negativebalancebeforedelete-body-ext' => "Régler votre compte immédiatement:",
+
+ 'passwordreset-subject' => ":site Réinitialisation du mot de passe",
+ 'passwordreset-body1' => "Quelqu'un a récemment demandé de changer votre :site mot de passe.",
+ 'passwordreset-body2' => "Si vous êtes dans ce cas, veuillez utiliser ce code de vérification pour terminer le processus:",
+ 'passwordreset-body3' => "Vous pourrez également cliquer sur le lien ci-dessous:",
+ 'passwordreset-body4' => "si vous n'avez pas fait une telle demande, vous pouvez soit ignorer ce message, soit prendre contact avec nous au sujet de cet incident.",
+
+ 'paymentmandatedisabled-subject' => ":site Problème d'auto-paiement",
+ 'paymentmandatedisabled-body' => "Votre :site solde du compte est négatif"
+ . " et le montant configuré pour le rechargement automatique du solde ne suffit pas"
+ . " le coût des abonnements consommés.",
+ 'paymentmandatedisabled-body-ext' => "En vous facturant plusieurs fois le même monant dans un court laps de temps"
+ . " peut entraîner des problêmes avec le fournisseur du service de paiement."
+ . " Pour éviter tout problème, nous avons suspendu l'auto-paiement pour votre compte."
+ . " Pour resourdre le problème,veuillez vous connecter aux paramètres de votre compte et modifier le montant d'auto-paiement.",
+
+ 'paymentfailure-subject' => ":site Paiement Echoué",
+ 'paymentfailure-body' => "Un problème est survenu avec l'auto-paiement pour votre :site account.\n"
+ . "Nous avons tenté de vous facturer via votre méthode de paiement choisie, mais le chargement n'a pas été effectué.",
+ 'paymentfailure-body-ext' => "Pour éviter tout problème supplémentaire, nous avons suspendu l'auto-paiement sur votre compte."
+ . " Pour resourdre le problème,veuillez vous connecter aux paramètres de votre compte au",
+ 'paymentfailure-body-rest' => "Vous y trouverez la possibilité de payer manuellement votre compte et"
+ . " de modifier vos paramètres d'auto-paiement.",
+
+ 'paymentsuccess-subject' => ":site Paiement Effectué",
+ 'paymentsuccess-body' => "L'auto-paiement pour votre :site le compte s'est exécuté sans problème. "
+ . "Vous pouvez contrôler le solde de votre nouveau compte et obtenir plus de détails ici:",
+
+ 'support' => "Cas particulier? Il y a un probléme avec une charge?\n"
+ . ":site Le support reste à votre disposition.",
+
+ 'signupcode-subject' => ":site Enregistrement",
+ 'signupcode-body1' => "Voici votre code de vérification pour le :site registration process:",
+ 'signupcode-body2' => "Vous pouvez également continuer avec le processus d'enregistrement en cliquant sur le lien ci-dessous:",
+
+ 'signupinvitation-subject' => ":site Invitation",
+ 'signupinvitation-header' => "Salut,",
+ 'signupinvitation-body1' => "Vous êtes invité à joindre :site. Cliquez sur le lien ci-dessous pour vous inscrire.",
+ 'signupinvitation-body2' => "",
+
+ 'suspendeddebtor-subject' => ":site Compte Suspendu",
+ 'suspendeddebtor-body' => "Vous êtes en retard avec le paiement de votre :site compte"
+ . " pour plus de :days jours. Votre compte est suspendu.",
+ 'suspendeddebtor-middle' => "Réglez immédiatement pour réactiver votre compte.",
+ 'suspendeddebtor-cancel' => "Vous ne souhaitez plus être notre client?"
+ . " Voici la démarche à suivre pour annuler votre compte:",
+
+];
diff --git a/src/resources/lang/fr/meet.php b/src/resources/lang/fr/meet.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/meet.php
@@ -0,0 +1,30 @@
+ 'La connexion n´existe pas.',
+ 'connection-dismiss-error' => 'Échec du rejet de la connexion.',
+ 'room-not-found' => 'La salle n´existe pas.',
+ 'room-setconfig-success' => 'La configuration de la salle a été actualisée avec succès.',
+ 'room-unsupported-option-error' => 'Option de configuration de la salle invalide.',
+ 'session-not-found' => 'La session n\'existe pas.',
+ 'session-create-error' => 'Échec de la création de la session.',
+ 'session-join-error' => 'Échec de se joindre à la session.',
+ 'session-close-error' => 'Échec de fermer la session.',
+ 'session-close-success' => 'La session a été terminée avec succès.',
+ 'session-password-error' => 'Échec de se joindre à la session. Mot de pas invalide.',
+ 'session-request-accept-error' => 'Echec d\'accepter la demande d\'adhésion',
+ 'session-request-deny-error' => 'Echec de refuser la demande d\'adhésion.',
+ 'session-room-locked-error' => 'Échec de se joindre à la session. Salle verrouillée.',
+];
diff --git a/src/resources/lang/fr/transactions.php b/src/resources/lang/fr/transactions.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/transactions.php
@@ -0,0 +1,26 @@
+ ':user_email a créé :sku_title pour :object',
+ 'entitlement-billed' => ':sku_title for :object est facturé à :amount',
+ 'entitlement-deleted' => ':user_email supprimé :sku_title pour :object',
+
+ 'entitlement-created-short' => 'Ajoutée :sku_title pour :object',
+ 'entitlement-billed-short' => 'Facturé :sku_title pour :object',
+ 'entitlement-deleted-short' => 'Supprimé :sku_title pour :object',
+
+ 'wallet-award' => 'bonus de :amount attribué à :wallet; :description',
+ 'wallet-chargeback' => ':amount été refacturé par :wallet',
+ 'wallet-credit' => ':amount a été ajouté au solde de :wallet',
+ 'wallet-debit' => ':amount a été déduit du solde de :wallet',
+ 'wallet-penalty' => 'Le solde de :wallet été réduit de :amount; :description',
+ 'wallet-refund' => ':amount a été remboursé sur le solde de :wallet',
+ 'wallet-refund' => ':amount a été remboursé par :wallet',
+
+ 'wallet-award-short' => 'Prime: :description',
+ 'wallet-chargeback-short' => 'Rétrofacturation',
+ 'wallet-credit-short' => 'Paiement',
+ 'wallet-debit-short' => 'Déduction',
+ 'wallet-penalty-short' => 'Charger: :description',
+ 'wallet-refund-short' => 'Remboursement: :description',
+];
diff --git a/src/resources/lang/fr/ui.php b/src/resources/lang/fr/ui.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/ui.php
@@ -0,0 +1,421 @@
+ [
+ 'faq' => "FAQ",
+ ],
+
+ 'btn' => [
+ 'add' => "Ajouter",
+ 'accept' => "Accepter",
+ 'back' => "Back",
+ 'cancel' => "Annuler",
+ 'close' => "Fermer",
+ 'continue' => "Continuer",
+ 'delete' => "Supprimer",
+ 'deny' => "Refuser",
+ 'download' => "Télécharger",
+ 'edit' => "Modifier",
+ 'file' => "Choisir le ficher...",
+ 'moreinfo' => "Plus d'information",
+ 'refresh' => "Actualiser",
+ 'reset' => "Réinitialiser",
+ 'resend' => "Envoyer à nouveau",
+ 'save' => "Sauvegarder",
+ 'search' => "Chercher",
+ 'signup' => "S'inscrire",
+ 'submit' => "Soumettre",
+ 'suspend' => "Suspendre",
+ 'unsuspend' => "Débloquer",
+ 'verify' => "Vérifier",
+ ],
+
+ 'dashboard' => [
+ 'beta' => "bêta",
+ 'distlists' => "Listes de distribution",
+ 'chat' => "Chat Vidéo",
+ 'domains' => "Domaines",
+ 'invitations' => "Invitations",
+ 'profile' => "Votre profil",
+ 'users' => "D'utilisateurs",
+ 'wallet' => "Portefeuille",
+ 'webmail' => "Webmail",
+ 'stats' => "Statistiques",
+ ],
+
+ 'distlist' => [
+ 'list-title' => "Liste de distribution | Listes de Distribution",
+ 'create' => "Créer une liste",
+ 'delete' => "Suprimmer une list",
+ 'email' => "Courriel",
+ 'list-empty' => "il n'y a pas de listes de distribution dans ce compte.",
+ 'new' => "Nouvelle liste de distribution",
+ 'recipients' => "Destinataires",
+ ],
+
+ 'domain' => [
+ 'dns-verify' => "Exemple de vérification du DNS d'un domaine:",
+ 'dns-config' => "Exemple de configuration du DNS d'un domaine:",
+ 'namespace' => "Espace de noms",
+ 'verify' => "Vérification du domaine",
+ 'verify-intro' => "Afin de confirmer que vous êtes bien le titulaire du domaine, nous devons exécuter un processus de vérification avant de l'activer définitivement pour la livraison d'e-mails.",
+ 'verify-dns' => "Le domaine doit avoir l'une des entrées suivantes dans le DNS:",
+ 'verify-dns-txt' => "Entrée TXT avec valeur:",
+ 'verify-dns-cname' => "ou entrée CNAME:",
+ 'verify-outro' => "Lorsque cela est fait, appuyez sur le bouton ci-dessous pour lancer la vérification.",
+ 'verify-sample' => "Voici un fichier de zone simple pour votre domaine:",
+ 'config' => "Configuration du domaine",
+ 'config-intro' => "Afin de permettre à {app} de recevoir le trafic de messagerie pour votre domaine, vous devez ajuster les paramètres DNS, plus précisément les entrées MX, en conséquence.",
+ 'config-sample' => "Modifiez le fichier de zone de votre domaine et remplacez les entrées MX existantes par les valeurs suivantes:",
+ 'config-hint' => "Si vous ne savez pas comment définir les entrées DNS pour votre domaine, veuillez contacter le service d'enregistrement auprès duquel vous avez enregistré le domaine ou votre fournisseur d'hébergement Web.",
+ 'spf-whitelist' => "SPF Whitelist",
+ 'spf-whitelist-text' => "Le Sender Policy Framework permet à un domaine expéditeur de dévoiler, par le biais de DNS,"
+ . " quels systèmes sont autorisés à envoyer des e-mails avec une adresse d'expéditeur d'enveloppe dans le domaine en question.",
+ 'spf-whitelist-ex' => "Vous pouvez ici spécifier une liste de serveurs autorisés, par exemple: .ess.barracuda.com.",
+ ],
+
+ 'error' => [
+ '400' => "Mauvaide demande",
+ '401' => "Non autorisé",
+ '403' => "Accès refusé",
+ '404' => "Pas trouvé",
+ '405' => "Méthode non autorisée",
+ '500' => "Erreur de serveur interne",
+ 'unknown' => "Erreur inconnu",
+ 'server' => "Erreur de serveur",
+ ],
+
+ 'form' => [
+ 'amount' => "Montant",
+ 'code' => "Le code de confirmation",
+ 'config' => "Configuration",
+ 'date' => "Date",
+ 'description' => "Description",
+ 'details' => "Détails",
+ 'domain' => "Domaine",
+ 'email' => "Adresse e-mail",
+ 'firstname' => "Prénom",
+ 'lastname' => "Nom de famille",
+ 'none' => "aucun",
+ 'or' => "ou",
+ 'password' => "Mot de passe",
+ 'password-confirm' => "Confirmer le mot de passe",
+ 'phone' => "Téléphone",
+ 'status' => "État",
+ 'surname' => "Nom de famille",
+ 'user' => "Utilisateur",
+ 'primary-email' => "Email principal",
+ 'id' => "ID",
+ 'created' => "Créé",
+ 'deleted' => "Supprimé",
+ 'disabled' => "Désactivé",
+ 'enabled' => "Activé",
+ 'general' => "Général",
+ 'settings' => "Paramètres",
+ ],
+
+ 'invitation' => [
+ 'create' => "Créez des invitation(s)",
+ 'create-title' => "Invitation à une inscription",
+ 'create-email' => "Saisissez l'adresse électronique de la personne que vous souhaitez inviter.",
+ 'create-csv' => "Pour envoyer plusieurs invitations à la fois, fournissez un fichier CSV (séparé par des virgules) ou un fichier en texte brut, contenant une adresse e-mail par ligne.",
+ 'empty-list' => "Il y a aucune invitation dans la mémoire de données.",
+ 'title' => "Invitation d'inscription",
+ 'search' => "Adresse E-mail ou domaine",
+ 'send' => "Envoyer invitation(s)",
+ 'status-completed' => "Utilisateur s'est inscrit",
+ 'status-failed' => "L'envoi a échoué",
+ 'status-sent' => "Envoyé",
+ 'status-new' => "Pas encore envoyé",
+ ],
+
+ 'lang' => [
+ 'en' => "Anglais",
+ 'de' => "Allemand",
+ 'fr' => "Français",
+ 'it' => "Italien",
+ ],
+
+ 'login' => [
+ '2fa' => "Code du 2ème facteur",
+ '2fa_desc' => "Le code du 2ème facteur est facultatif pour les utilisateurs qui n'ont pas configuré l'authentification à deux facteurs.",
+ 'forgot_password' => "Mot de passe oublié?",
+ 'header' => "Veuillez vous connecter",
+ 'sign_in' => "Se connecter",
+ 'webmail' => "Webmail"
+ ],
+
+ 'meet' => [
+ 'title' => "Voix et vidéo-conférence",
+ 'welcome' => "Bienvenue dans notre programme bêta pour les conférences vocales et vidéo.",
+ 'url' => "Vous disposez d'une salle avec l'URL ci-dessous. Cette salle ouvre uniquement quand vous y êtes vous-même. Utilisez cette URL pour inviter des personnes à vous rejoindre.",
+ 'notice' => "Il s'agit d'un travail en évolution et d'autres fonctions seront ajoutées au fil du temps. Les fonctions actuelles sont les suivantes:",
+ 'sharing' => "Partage d'écran",
+ 'sharing-text' => "Partagez votre écran pour des présentations ou des exposés.",
+ 'security' => "sécurité de chambre",
+ 'security-text' => "Renforcez la sécurité de la salle en définissant un mot de passe que les participants devront connaître."
+ . " avant de pouvoir entrer, ou verrouiller la porte afin que les participants doivent frapper, et un modérateur peut accepter ou refuser ces demandes.",
+ 'qa' => "Lever la main (Q&A)",
+ 'qa-text' => "Les membres du public silencieux peuvent lever la main pour animer une séance de questions-réponses avec les membres du panel.",
+ 'moderation' => "Délégation des Modérateurs",
+ 'moderation-text' => "Déléguer l'autorité du modérateur pour la séance, afin qu'un orateur ne soit pas inutilement"
+ . " interrompu par l'arrivée des participants et d'autres tâches du modérateur.",
+ 'eject' => "Éjecter les participants",
+ 'eject-text' => "Éjectez les participants de la session afin de les obliger à se reconnecter ou de remédier aux violations des règles."
+ . " Cliquez sur l'icône de l'utilisateur pour un renvoi effectif.",
+ 'silent' => "Membres du Public en Silence",
+ 'silent-text' => "Pour une séance de type webinaire, configurez la salle pour obliger tous les nouveaux participants à être des spectateurs silencieux.",
+ 'interpreters' => "Canaux d'Audio Spécifiques de Langues",
+ 'interpreters-text' => "Désignez un participant pour interpréter l'audio original dans une langue cible, pour les sessions avec des participants multilingues."
+ . " L'interprète doit être capable de relayer l'audio original et de le remplacer.",
+ 'beta-notice' => "Rappelez-vous qu'il s'agit d'une version bêta et pourrait entraîner des problèmes."
+ . " Au cas où vous rencontreriez des problèmes, n'hésitez pas à nous en faire part en contactant le support.",
+
+ // Room options dialog
+ 'options' => "Options de salle",
+ 'password' => "Mot de passe",
+ 'password-none' => "aucun",
+ 'password-clear' => "Effacer mot de passe",
+ 'password-set' => "Définir le mot de passe",
+ 'password-text' => "Vous pouvez ajouter un mot de passe à votre session. Les participants devront fournir le mot de passe avant d'être autorisés à rejoindre la session.",
+ 'lock' => "Salle verrouillée",
+ 'lock-text' => "Lorsque la salle est verrouillée, les participants doivent être approuvés par un modérateur avant de pouvoir rejoindre la réunion.",
+ 'nomedia' => "Réservé aux abonnés",
+ 'nomedia-text' => "Force tous les participants à se joindre en tant qu'abonnés (avec caméra et microphone désactivés)"
+ . "Les modérateurs pourront les promouvoir en tant qu'éditeurs tout au long de la session.",
+
+ // Room menu
+ 'partcnt' => "Nombres de participants",
+ 'menu-audio-mute' => "Désactiver le son",
+ 'menu-audio-unmute' => "Activer le son",
+ 'menu-video-mute' => "Désactiver la vidéo",
+ 'menu-video-unmute' => "Activer la vidéo",
+ 'menu-screen' => "Partager l'écran",
+ 'menu-hand-lower' => "Baisser la main",
+ 'menu-hand-raise' => "Lever la main",
+ 'menu-channel' => "Canal de langue interprétée",
+ 'menu-chat' => "Le Chat",
+ 'menu-fullscreen' => "Plein écran",
+ 'menu-fullscreen-exit' => "Sortir en plein écran",
+ 'menu-leave' => "Quitter la session",
+
+ // Room setup screen
+ 'setup-title' => "Préparez votre session",
+ 'mic' => "Microphone",
+ 'cam' => "Caméra",
+ 'nick' => "Surnom",
+ 'nick-placeholder' => "Votre nom",
+ 'join' => "JOINDRE",
+ 'joinnow' => "JOINDRE MAINTENANT",
+ 'imaowner' => "Je suis le propriétaire",
+
+ // Room
+ 'qa' => "Q & A",
+ 'leave-title' => "Salle fermée",
+ 'leave-body' => "La session a été fermée par le propriétaire de la salle.",
+ 'media-title' => "Configuration des médias",
+ 'join-request' => "Demande de rejoindre",
+ 'join-requested' => "{user} demandé à rejoindre.",
+
+ // Status messages
+ 'status-init' => "Vérification de la salle...",
+ 'status-323' => "La salle est fermée. Veuillez attendre le démarrage de la session par le propriétaire.",
+ 'status-324' => "La salle est fermée. Elle sera ouverte aux autres participants après votre adhésion.",
+ 'status-325' => "La salle est prête. Veuillez entrer un mot de passe valide.",
+ 'status-326' => "La salle est fermée. Veuillez entrer votre nom et réessayer.",
+ 'status-327' => "En attendant la permission de joindre la salle.",
+ 'status-404' => "La salle n'existe pas.",
+ 'status-429' => "Trop de demande. Veuillez, patienter.",
+ 'status-500' => "La connexion à la salle a échoué. Erreur de serveur.",
+
+ // Other menus
+ 'media-setup' => "configuration des médias",
+ 'perm' => "Permissions",
+ 'perm-av' => "Publication d'audio et vidéo",
+ 'perm-mod' => "Modération",
+ 'lang-int' => "Interprète de langue",
+ 'menu-options' => "Options",
+ ],
+
+ 'menu' => [
+ 'cockpit' => "Cockpit",
+ 'login' => "Connecter",
+ 'logout' => "Deconnecter",
+ 'signup' => "S'inscrire",
+ 'toggle' => "Basculer la navigation",
+ ],
+
+ 'msg' => [
+ 'initializing' => "Initialisation...",
+ 'loading' => "Chargement...",
+ 'loading-failed' => "Échec du chargement des données.",
+ 'notfound' => "Resource introuvable.",
+ 'info' => "Information",
+ 'error' => "Erreur",
+ 'warning' => "Avertissement",
+ 'success' => "Succès",
+ ],
+
+ 'nav' => [
+ 'more' => "Charger plus",
+ 'step' => "Étape {i}/{n}",
+ ],
+
+ 'password' => [
+ 'reset' => "Réinitialiser le mot de passe",
+ 'reset-step1' => "Entrez votre adresse e-mail pour réinitialiser votre mot de passe.",
+ 'reset-step1-hint' => "Veuillez vérifier votre dossier de spam ou débloquer {email}.",
+ 'reset-step2' => "Nous avons envoyé un code de confirmation à votre adresse e-mail externe."
+ . " Entrez le code que nous vous avons envoyé, ou cliquez sur le lien dans le message.",
+ ],
+
+ 'signup' => [
+ 'email' => "Adresse e-mail actuelle",
+ 'login' => "connecter",
+ 'title' => "S'inscrire",
+ 'step1' => "Inscrivez-vous pour commencer votre mois gratuit.",
+ 'step2' => "Nous avons envoyé un code de confirmation à votre adresse e-mail. Entrez le code que nous vous avons envoyé, ou cliquez sur le lien dans le message.",
+ 'step3' => "Créez votre identité Kolab (vous pourrez choisir des adresses supplémentaires plus tard).",
+ 'voucher' => "Coupon Code",
+ ],
+
+ 'status' => [
+ 'prepare-account' => "Votre compte est en cours de préparation.",
+ 'prepare-domain' => "Le domain est en cours de préparation.",
+ 'prepare-distlist' => "La liste de distribution est en cours de préparation.",
+ 'prepare-user' => "Le compte d'utilisateur est en cours de préparation.",
+ 'prepare-hint' => "Certaines fonctionnalités peuvent être manquantes ou en lecture seule pour le moment.",
+ 'prepare-refresh' => "Le processus ne se termine jamais? Appuyez sur le bouton \"Refresh\", s'il vous plaît.",
+ 'ready-account' => "Votre compte est presque prêt.",
+ 'ready-domain' => "Le domaine est presque prêt.",
+ 'ready-distlist' => "La liste de distribution est presque prête.",
+ 'ready-user' => "Le compte d'utilisateur est presque prêt.",
+ 'verify' => "Veuillez vérifier votre domaine pour terminer le processus de configuration.",
+ 'verify-domain' => "Vérifier domaine",
+ 'deleted' => "Supprimé",
+ 'suspended' => "Suspendu",
+ 'notready' => "Pas Prêt",
+ 'active' => "Actif",
+ ],
+
+ 'support' => [
+ 'title' => "Contacter Support",
+ 'id' => "Numéro de client ou adresse é-mail que vous avez chez nous.",
+ 'id-pl' => "e.g. 12345678 ou john@kolab.org",
+ 'id-hint' => "Laissez vide si vous n'êtes pas encore client",
+ 'name' => "Nom",
+ 'name-pl' => "comment nous devons vous adresser dans notre réponse",
+ 'email' => "adresse e-mail qui fonctionne",
+ 'email-pl' => "assurez-vous que nous pouvons vous atteindre à cette adresse",
+ 'summary' => "Résumé du problème",
+ 'summary-pl' => "une phrase qui résume votre situation",
+ 'expl' => "Analyse du problème",
+ ],
+
+ 'user' => [
+ '2fa-hint1' => "Cela éliminera le droit à l'authentification à 2-Facteurs ainsi que les éléments configurés par l'utilisateur.",
+ '2fa-hint2' => "Veuillez vous assurer que l'identité de l'utilisateur est correctement confirmée.",
+ 'address' => "Adresse",
+ 'aliases' => "Alias",
+ 'aliases-email' => "Alias E-mail",
+ 'aliases-none' => "Cet utilisateur n'aucune alias e-mail.",
+ 'add-bonus' => "Ajouter un bonus",
+ 'add-bonus-title' => "Ajouter un bonus au portefeuille",
+ 'add-penalty' => "Ajouter une pénalité",
+ 'add-penalty-title' => "Ajouter une pénalité au portefeuille",
+ 'auto-payment' => "Auto-paiement",
+ 'auto-payment-text' => "Recharger par {amount} quand le montant est inférieur à {balance} utilisant {method}",
+ 'country' => "Pays",
+ 'create' => "Créer un utilisateur",
+ 'custno' => "No. de Client.",
+ 'delete' => "Supprimer Utilisateur",
+ 'delete-email' => "Supprimer {email}",
+ 'delete-text' => "Voulez-vous vraiment supprimer cet utilisateur de façon permanente?"
+ . " Cela supprimera toutes les données du compte et retirera la permission d'accéder au compte d'e-email."
+ . " Veuillez noter que cette action ne peut pas être révoquée.",
+ 'discount' => "Rabais",
+ 'discount-hint' => "rabais appliqué",
+ 'discount-title' => "Rabais de compte",
+ 'distlists' => "Listes de Distribution",
+ 'distlists-none' => "Il y a aucune liste de distribution dans ce compte.",
+ 'domains' => "Domaines",
+ 'domains-none' => "Il y a pas de domaines dans ce compte.",
+ 'ext-email' => "E-mail externe",
+ 'finances' => "Finances",
+ 'greylisting' => "Greylisting",
+ 'greylisting-text' => "La greylisting est une méthode de défense des utilisateurs contre le spam."
+ . " Tout e-mail entrant provenant d'un expéditeur non reconnu est temporairement rejeté."
+ . " Le serveur d'origine doit réessayer après un délai cette fois-ci, le mail sera accepté."
+ . " Les spammeurs ne réessayent généralement pas de remettre le mail.",
+ 'list-title' => "Comptes d'utilisateur",
+ 'managed-by' => "Géré par",
+ 'new' => "Nouveau compte d'utilisateur",
+ 'org' => "Organisation",
+ 'package' => "Paquet",
+ 'price' => "Prix",
+ 'profile-title' => "Votre profile",
+ 'profile-delete' => "Supprimer compte",
+ 'profile-delete-title' => "Supprimer ce compte?",
+ 'profile-delete-text1' => "Cela supprimera le compte ainsi que tous les domaines, utilisateurs et alias associés à ce compte.",
+ 'profile-delete-warning' => "Cette opération est irrévocable",
+ 'profile-delete-text2' => "Comme vous ne pourrez plus rien récupérer après ce point, assurez-vous d'avoir migré toutes les données avant de poursuivre.",
+ 'profile-delete-support' => "Étant donné que nous nous attachons à toujours nous améliorer, nous aimerions vous demander 2 minutes de votre temps. "
+ . "Le meilleur moyen de nous améliorer est le feedback des utilisateurs, et nous voudrions vous demander"
+ . "quelques mots sur les raisons pour lesquelles vous avez quitté notre service. Veuillez envoyer vos commentaires au {email}.",
+ 'profile-delete-contact' => "Par ailleurs, n'hésitez pas à contacter le support de {app} pour toute question ou souci que vous pourriez avoir dans ce contexte.",
+ 'reset-2fa' => "Réinitialiser l'authentification à 2-Facteurs.",
+ 'reset-2fa-title' => "Réinitialisation de l'Authentification à 2-Facteurs",
+ 'title' => "Compte d'utilisateur",
+ 'search-pl' => "ID utilisateur,e-mail ou domamine",
+ 'skureq' => "{sku} demande {list}.",
+ 'subscription' => "Subscription",
+ 'subscriptions' => "Subscriptions",
+ 'subscriptions-none' => "Cet utilisateur n'a pas de subscriptions.",
+ 'users' => "Utilisateurs",
+ 'users-none' => "Il n'y a aucun utilisateur dans ce compte.",
+ ],
+
+ 'wallet' => [
+ 'add-credit' => "Ajouter un crédit",
+ 'auto-payment-cancel' => "Annuler l'auto-paiement",
+ 'auto-payment-change' => "Changer l'auto-paiement",
+ 'auto-payment-failed' => "La configuration des paiements automatiques a échoué. Redémarrer le processus pour activer les top-ups automatiques.",
+ 'auto-payment-hint' => "Cela fonctionne de la manière suivante: Chaque fois que votre compte est épuisé, nous débiterons votre méthode de paiement préférée d'un montant que vous aurez défini."
+ . " Vous pouvez annuler ou modifier l'option de paiement automatique à tout moment.",
+ 'auto-payment-setup' => "configurer l'auto-paiement",
+ 'auto-payment-disabled' => "L'auto-paiement configuré a été désactivé. Rechargez votre porte-monnaie ou augmentez le montant d'auto-paiement.",
+ 'auto-payment-info' => "L'auto-paiement est set pour recharger votre compte par {amount} lorsque le solde de votre compte devient inférieur à {balance}.",
+ 'auto-payment-inprogress' => "La configuration d'auto-paiement est toujours en cours.",
+ 'auto-payment-next' => "Ensuite, vous serez redirigé vers la page de paiement, où vous pourrez fournir les coordonnées de votre carte de crédit.",
+ 'auto-payment-disabled-next' => "L'auto-paiement est désactivé. Dès que vous aurez soumis de nouveaux paramètres, nous l'activerons et essaierons de recharger votre portefeuille.",
+ 'auto-payment-update' => "Mise à jour de l'auto-paiement.",
+ 'banktransfer-hint' => "Veuillez noter qu'un virement bancaire peut nécessiter plusieurs jours avant d'être effectué.",
+ 'currency-conv' => "Le principe est le suivant: Vous spécifiez le montant dont vous voulez recharger votre portefeuille en {wc}."
+ . " Nous convertirons ensuite ce montant en {pc}, et sur la page suivante, vous obtiendrez les coordonnées bancaires pour transférer le montant en {pc}.",
+ 'fill-up' => "Recharger par",
+ 'history' => "Histoire",
+ 'month' => "mois",
+ 'noperm' => "Seuls les propriétaires de compte peuvent accéder à un portefeuille.",
+ 'payment-amount-hint' => "Choisissez le montant dont vous voulez recharger votre portefeuille.",
+ 'payment-method' => "Mode de paiement: {method}",
+ 'payment-warning' => "Vous serez facturé pour {price}.",
+ 'pending-payments' => "Paiements en attente",
+ 'pending-payments-warning' => "Vous avez des paiements qui sont encore en cours. Voir l'onglet \"Paiements en attente\" ci-dessous.",
+ 'pending-payments-none' => "Il y a aucun paiement en attente pour ce compte.",
+ 'receipts' => "Reçus",
+ 'receipts-hint' => "Vous pouvez télécharger ici les reçus (au format PDF) pour les paiements de la période spécifiée. Sélectionnez la période et appuyez sur le bouton Télécharger.",
+ 'receipts-none' => "Il y a aucun reçu pour les paiements de ce compte. Veuillez noter que vous pouvez télécharger les reçus après la fin du mois.",
+ 'title' => "Solde du compte",
+ 'top-up' => "Rechargez votre portefeuille",
+ 'transactions' => "Transactions",
+ 'transactions-none' => "Il y a aucun transaction pour ce compte.",
+ 'when-below' => "lorsque le solde du compte est inférieur à",
+ ],
+];
diff --git a/src/resources/lang/fr/validation.php b/src/resources/lang/fr/validation.php
new file mode 100644
--- /dev/null
+++ b/src/resources/lang/fr/validation.php
@@ -0,0 +1,187 @@
+ 'Le champ :attribute doit être accepté.',
+ '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.',
+ 'array' => 'Le champ :attribute doit être un tableau.',
+ 'attached' => ':attribute est déjà attaché(e).',
+ '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.',
+ 'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.',
+ '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.',
+ '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.',
+ 'email' => 'Le champ :attribute doit être une adresse email valide.',
+ 'ends_with' => 'Le champ :attribute doit se terminer par une des valeurs suivantes : :values',
+ 'exists' => 'Le champ :attribute sélectionné est invalide.',
+ '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.',
+ ],
+ 'image' => 'Le champ :attribute doit être une image.',
+ 'in' => 'Le champ :attribute est invalide.',
+ 'in_array' => 'Le champ :attribute n\'existe pas dans :other.',
+ '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.',
+ '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.',
+ ],
+ 'max' => [
+ 'array' => 'Le tableau :attribute ne peut contenir plus de :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 être supérieure à :max.',
+ 'string' => 'Le texte de :attribute ne peut contenir plus de :max caractères.',
+ ],
+ '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 à :min kilo-octets.',
+ 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.',
+ 'string' => 'Le texte :attribute doit contenir au moins :min caractères.',
+ ],
+ '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' => 'Le mot de passe est incorrect',
+ 'present' => 'Le champ :attribute doit être présent.',
+ 'prohibited' => 'Le champ :attribute est interdit.',
+ 'prohibited_if' => 'Le champ :attribute est interdit quand :other a la valeur :value.',
+ 'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other est l\'une des valeurs :values.',
+ 'regex' => 'Le format du champ :attribute est invalide.',
+ 'relatable' => ':attribute n\'est sans doute pas associé(e) avec cette donnée.',
+ 'required' => 'Le champ :attribute est obligatoire.',
+ 'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.',
+ '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.',
+ 'unique' => 'La valeur du champ :attribute est déjà utilisée.',
+ 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.',
+ 'url' => 'Le format de l\'URL de :attribute n\'est pas valide.',
+ 'uuid' => 'Le champ :attribute doit être un UUID valide',
+ 'custom' => [
+ 'attribute-name' => [
+ 'rule-name' => 'custom-message',
+ ],
+ ],
+ 'attributes' => [
+ 'address' => 'adresse',
+ 'age' => 'âge',
+ 'available' => 'disponible',
+ 'city' => 'ville',
+ 'content' => 'contenu',
+ 'country' => 'pays',
+ 'current_password' => 'mot de passe actuel',
+ 'date' => 'date',
+ 'day' => 'jour',
+ 'description' => 'description',
+ 'email' => 'adresse email',
+ 'excerpt' => 'extrait',
+ 'first_name' => 'prénom',
+ 'gender' => 'genre',
+ 'hour' => 'heure',
+ 'last_name' => 'nom',
+ 'minute' => 'minute',
+ 'mobile' => 'portable',
+ 'month' => 'mois',
+ 'name' => 'nom',
+ 'password' => 'mot de passe',
+ 'password_confirmation' => 'confirmation du mot de passe',
+ 'phone' => 'téléphone',
+ 'second' => 'seconde',
+ 'sex' => 'sexe',
+ 'size' => 'taille',
+ 'time' => 'heure',
+ 'title' => 'titre',
+ 'username' => 'nom d\'utilisateur',
+ 'year' => 'année',
+ ],
+ '2fareq' => "Le code du second facteur est requis.",
+ '2fainvalid' => "Le code du deuxième facteur n'est pas valideSecond factor code is invalid.",
+ 'emailinvalid' => "L'adresse e-mail spécifiée est invalide.",
+ 'domaininvalid' => "Le domaine spécifié n'est pas valide.",
+ 'domainnotavailable' => "Le domaine spécifié n'est pas disponible.",
+ 'logininvalid' => "Le login spécifié est invalide.",
+ 'loginexists' => "Le login spécifié n'est pas disponible.",
+ 'domainexists' => "Le domaine spécifié n'est pas disponible.",
+ 'noemailorphone' => "Le texte spécifié n'est pas un e-mail valide ni un numéro de téléphone.",
+ 'packageinvalid' => "Le paquet sélectionné est invalide.",
+ 'packagerequired' => "Le paquet est requis.",
+ 'usernotexists' => "Impossible de trouver l'utilisateur.",
+ 'voucherinvalid' => "Le code du coupon est invalide ou a expiré.",
+ 'noextemail' => "Cet utilisateur ne possède pas d'adresse e-mail externe.",
+ 'entryinvalid' => "L'attribut :attribute est invalide.",
+ 'entryexists' => "L'attribut :attribute n'est pas disponible.",
+ 'minamount' => "Le montant minimum pour un paiement unitaire est :amount.",
+ 'minamountdebt' => "Le montant indiqué ne couvre pas le solde du compte.",
+ 'notalocaluser' => "L'adresse e-mail indiquée n'existe pas.",
+ 'memberislist' => "Le destinataire ne peut pas être le même que l'adresse de la liste.",
+ 'listmembersrequired' => "Au moins un destinataire est requis.",
+ 'spf-entry-invalid' => "Le format de l'entrée est invalide. Un nom de domaine débutant par un point est attendu.",
+ 'invalid-config-parameter' => "Le paramètre de configuration demandé est inconnu.",
+
+];
diff --git a/src/resources/themes/default/lang/fr/faq.php b/src/resources/themes/default/lang/fr/faq.php
new file mode 100644
--- /dev/null
+++ b/src/resources/themes/default/lang/fr/faq.php
@@ -0,0 +1,9 @@
+ "Est-il possible de convertir un compte individuel en compte de groupe?",
+ 'storage' => "Combien d'espace de stockage est fourni avec mon compte?",
+ 'tos' => "quelles sont vos conditions de service?",
+
+];
diff --git a/src/resources/themes/default/lang/fr/menu.php b/src/resources/themes/default/lang/fr/menu.php
new file mode 100644
--- /dev/null
+++ b/src/resources/themes/default/lang/fr/menu.php
@@ -0,0 +1,10 @@
+ "Blog",
+ 'explore' => "Explorer",
+ 'support' => "Support",
+ 'tos' => "Conditions de Service",
+
+];
diff --git a/src/resources/themes/default/lang/fr/support.php b/src/resources/themes/default/lang/fr/support.php
new file mode 100644
--- /dev/null
+++ b/src/resources/themes/default/lang/fr/support.php
@@ -0,0 +1,13 @@
+ "Contacter Support",
+ 'text1' => "Notre équipe de support technique est là pour vous aider si vous rencontrez des difficultés."
+ . " Vous ne devriez pas avoir à parler à des machines ou à naviguer dans des menus vocaux,"
+ . " mais plutôt à des êtres humains qui vous répondent personnellement.",
+ 'text2' => "Cette aide est déjà intégrée dans votre souscription, il n'y a donc aucun coût supplémentaire pour vous."
+ . " Si vous rencontrez des problèmes avec votre compte :site, ou si vous avez des questions"
+ . " sur notre produit avant de vous inscrire, veuillez nous contacter.",
+
+];
diff --git a/src/tests/Browser/LogonTest.php b/src/tests/Browser/LogonTest.php
--- a/src/tests/Browser/LogonTest.php
+++ b/src/tests/Browser/LogonTest.php
@@ -56,9 +56,10 @@
})
// Switch English -> German
->whenAvailable('nav .dropdown-menu', function (Browser $browser) {
- $browser->assertElementsCount('a', 2)
+ $browser->assertElementsCount('a', 3)
->assertSeeIn('a:nth-child(1)', 'EN - English')
->assertSeeIn('a:nth-child(2)', 'DE - German')
+ ->assertSeeIn('a:nth-child(3)', 'FR - French')
->click('a:nth-child(2)');
})
->waitUntilMissing('nav .dropdown-menu')
@@ -79,7 +80,8 @@
})
// Switch German -> English
->whenAvailable('nav .dropdown-menu', function (Browser $browser) {
- $browser->click('a:nth-child(1)');
+ $browser->assertSeeIn('a:nth-child(1)', 'Englisch')
+ ->click('a:nth-child(1)');
})
->waitUntilMissing('nav .dropdown-menu')
->within(new Menu(), function ($browser) {