Files
opensourcepos/app/Language/fr/Config.php
Ollama 8da4aff262 fix(security): prevent command injection in sendmail path configuration
Add validation for the mailpath POST parameter to prevent command injection
attacks. The path is validated to only allow alphanumeric characters,
underscores, dashes, forward slashes, and dots.

- Required mailpath when protocol is "sendmail"
- Validates format for all non-empty mailpath values
- Blocks common injection vectors: ; | & ` $() spaces newlines
- Added mailpath_invalid translation to all 43 language files
- Simplified validation logic to avoid redundant conditions

Files changed:
- app/Controllers/Config.php: Add regex validation with protocol check
- app/Language/*/Config.php: Add mailpath_invalid error message (43 languages)
- tests/Controllers/ConfigTest.php: Unit tests for validation
2026-04-06 18:37:07 +00:00

333 lines
27 KiB
PHP

<?php
return [
"address" => "Adresse de l'entreprise",
"address_required" => "L'adresse de l'entreprise est un champ obligatoire.",
"all_set" => "Toutes les permissions de fichier sont correctement configurées !",
"allow_duplicate_barcodes" => "Autoriser les codes à barres en double",
"apostrophe" => "apostrophe",
"backup_button" => "Sauvegarde",
"backup_database" => "Sauvegarder la base de données",
"barcode" => "Code à barre",
"barcode_company" => "Nom de l'entreprise",
"barcode_configuration" => "Configuration du code à barre",
"barcode_content" => "Contenu du code à barre",
"barcode_first_row" => "Ligne 1",
"barcode_font" => "Police d'écriture",
"barcode_formats" => "Formats d'entrée",
"barcode_generate_if_empty" => "Générer si vide.",
"barcode_height" => "Hauteur (px)",
"barcode_id" => "Id/Nom d'article",
"barcode_info" => "Configuration des informations du code à barre",
"barcode_layout" => "Disposition du code à barre",
"barcode_name" => "Nom",
"barcode_number" => "Code à barre",
"barcode_number_in_row" => "Numéro dans la ligne",
"barcode_page_cellspacing" => "Afficher l'espacement de cellules de la page.",
"barcode_page_width" => "Afficher la largeur de la page",
"barcode_price" => "Prix",
"barcode_second_row" => "Ligne 2",
"barcode_third_row" => "Ligne 3",
"barcode_tooltip" => "Avertissement : cette fonctionnalité peut entraîner l'importation ou la création de doublons. Ne pas utiliser si vous ne voulez pas de codes à barres en double.",
"barcode_type" => "Type de Code à barre",
"barcode_width" => "Largeur (px)",
"bottom" => "Pied de page",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Décimales",
"cash_decimals_tooltip" => "Si les décimales et les décimales monétaires sont les mêmes, aucun arrondi ne sera effectué.",
"cash_rounding" => "Arrondis de trésorerie",
"category_dropdown" => "Afficher les catégories dans un menu déroulant",
"center" => "Centre",
"change_apperance_tooltip" => "",
"comma" => "virgule",
"company" => "Nome de l'Entreprise",
"company_avatar" => "",
"company_change_image" => "Changer l'image",
"company_logo" => "Logo de l'Entreprise",
"company_remove_image" => "Supprimer l'image",
"company_required" => "Le nom d'entreprise est requis",
"company_select_image" => "Sélectionner l'image",
"company_website_url" => "Le site Web de l'entreprise n'est pas une URL valide (http: //...).",
"country_codes" => "Codes de pays",
"country_codes_tooltip" => "Liste des codes de pays, séparés par des virgules, pour la recherche d'adresses nominatives.",
"currency_code" => "Code de devise",
"currency_decimals" => "Décimales",
"currency_symbol" => "Symbole Monétaire",
"current_employee_only" => "",
"customer_reward" => "Récompense",
"customer_reward_duplicate" => "La récompense doit être unique.",
"customer_reward_enable" => "Activer les récompenses client",
"customer_reward_invalid_chars" => "La récompense ne peut pas contenir '_'",
"customer_reward_required" => "La récompense est un champ obligatoire",
"customer_sales_tax_support" => "Soutien à la taxe de vente au client",
"date_or_time_format" => "Filtre de date et d'heure",
"datetimeformat" => "Format de la date et de l'heure",
"decimal_point" => "Virgule",
"default_barcode_font_size_number" => "La taille de la police du code-barres par défaut doit être un nombre.",
"default_barcode_font_size_required" => "La taille de police du code-barres par défaut est un champ obligatoire.",
"default_barcode_height_number" => "La hauteur du code-barres par défaut doit être un nombre.",
"default_barcode_height_required" => "La hauteur du code-barres par défaut est un champ obligatoire.",
"default_barcode_num_in_row_number" => "Le numéro de code-barres par défaut dans la ligne doit être un nombre.",
"default_barcode_num_in_row_required" => "Le numéro de code-barres par défaut dans la ligne est un champ obligatoire.",
"default_barcode_page_cellspacing_number" => "Page de codes-barres par défaut L'espace-cellule doit être un nombre.",
"default_barcode_page_cellspacing_required" => "Page Barcode par défaut L'espacement des cellules est un champ obligatoire.",
"default_barcode_page_width_number" => "La largeur de page du code à barres par défaut doit être un nombre.",
"default_barcode_page_width_required" => "Largeur de page de code-barres par défaut est un champ obligatoire.",
"default_barcode_width_number" => "La largeur de code à barres par défaut doit être un nombre.",
"default_barcode_width_required" => "La largeur de code à barres par défaut est un champ obligatoire.",
"default_item_columns" => "Colonnes d'article visibles par défaut",
"default_origin_tax_code" => "Code de taxe d'origine par défaut",
"default_receivings_discount" => "Rabais de réception par défaut",
"default_receivings_discount_number" => "Rabais de réception par défaut doit être numérique.",
"default_receivings_discount_required" => "Rabais de réception par défaut est requis.",
"default_sales_discount" => "Remboursement des ventes par défaut %",
"default_sales_discount_number" => "Le rabais de vente par défaut doit être un nombre.",
"default_sales_discount_required" => "La remise sur les ventes par défaut est un champ obligatoire.",
"default_tax_category" => "Catégorie fiscale par défaut",
"default_tax_code" => "Code fiscal par défaut",
"default_tax_jurisdiction" => "Juridiction fiscale par défaut",
"default_tax_name_number" => "Le nom de taxe par défaut doit être une chaîne.",
"default_tax_name_required" => "Le nom de taxe par défaut est un champ obligatoire.",
"default_tax_rate" => "Taux d'Imposition par Défaut",
"default_tax_rate_1" => "Taux d'Imposition 1",
"default_tax_rate_2" => "Taux d'Imposition 2",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "Le taux de taxe par défaut doit être un nombre.",
"default_tax_rate_required" => "Le taux de taxe par défaut est un champ obligatoire.",
"derive_sale_quantity" => "Autoriser la quantité de vente dérivée",
"derive_sale_quantity_tooltip" => "Si coché, un nouveau type d'article sera fourni pour les articles commandés par montant étendu",
"dinner_table" => "Table",
"dinner_table_duplicate" => "La table doit être unique.",
"dinner_table_enable" => "Activer les tables de dîner",
"dinner_table_invalid_chars" => "Le nom de la table ne peut pas contenir '_'.",
"dinner_table_required" => "La table est un champ obligatoire.",
"dot" => "point",
"email" => "Courriel",
"email_configuration" => "Email Configuration",
"email_mailpath" => "Path de Sendmail",
"email_protocol" => "Protocol",
"email_receipt_check_behaviour" => "Case à cocher Reçu de courrier électronique",
"email_receipt_check_behaviour_always" => "Toujours vérifié",
"email_receipt_check_behaviour_last" => "Se souvenir de la dernière sélection",
"email_receipt_check_behaviour_never" => "Toujours décoché",
"email_smtp_crypto" => "SMTP Cryptage",
"email_smtp_host" => "SMTP Serveur",
"email_smtp_pass" => "Mot de passe SMTP",
"email_smtp_port" => "Port SMTP",
"email_smtp_timeout" => "Délai SMTP (s)",
"email_smtp_user" => "Nom d'utilisateur SMTP",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Appliquer la confidentialité",
"enforce_privacy_tooltip" => "Protéger la confidentialité des clients en imposant le brouillage des données en cas de suppression de leurs données",
"fax" => "Fax",
"file_perm" => "Il y a des problèmes avec les permissions de fichier. Veuillez corriger et recharger la page.",
"financial_year" => "Début de l'année fiscale",
"financial_year_apr" => "1er avril",
"financial_year_aug" => "1er août",
"financial_year_dec" => "1er décembre",
"financial_year_feb" => "1er février",
"financial_year_jan" => "1er janvier",
"financial_year_jul" => "1er juillet",
"financial_year_jun" => "1er juin",
"financial_year_mar" => "1er mars",
"financial_year_may" => "1er mai",
"financial_year_nov" => "1er novembre",
"financial_year_oct" => "1er octobre",
"financial_year_sep" => "1er septembre",
"floating_labels" => "Étiquettes flottantes",
"gcaptcha_enable" => "Page de connexion reCAPTCHA",
"gcaptcha_secret_key" => "clé secrète reCAPTCHA",
"gcaptcha_secret_key_required" => "La clé secrète reCAPTCHA est un champ obligatoire",
"gcaptcha_site_key" => "clé de site reCAPTCHA",
"gcaptcha_site_key_required" => "La clé de site reCAPTCHA est un champ obligatoire",
"gcaptcha_tooltip" => "Protégez la page de connexion avec Google reCAPTCHA, cliquez sur l'icône d'une paire de clés API.",
"general" => "General",
"general_configuration" => "General Configuration",
"giftcard_number" => "Numéro de carte-cadeau",
"giftcard_random" => "Générer aléatoire",
"giftcard_series" => "Générer en série",
"image_allowed_file_types" => "Types de fichier autorisés",
"image_max_height_tooltip" => "Hauteur maximale autorisée en pixels pour le téléversement d'images.",
"image_max_size_tooltip" => "Taille de fichier maximale autorisée en kilobytes pour le téléversement d'images.",
"image_max_width_tooltip" => "Largeur maximale autorisée en pixels pour le téléversement d'images.",
"image_restrictions" => "Restrictions sur le téléversement d'images",
"include_hsn" => "Prise en charge des codes HSN",
"info" => "Entreprise",
"info_configuration" => "Çonfiguration de l'Entreprise",
"input_groups" => "Groupes d'entrée",
"integrations" => "Intégrations",
"integrations_configuration" => "Intégration de parties tierces",
"invoice" => "Facture",
"invoice_configuration" => "Paramètres d'impression de facture",
"invoice_default_comments" => "Commentaires par facture par défaut",
"invoice_email_message" => "Modèle de courrier électronique de facture",
"invoice_enable" => "Activer la facturation",
"invoice_printer" => "Imprimante de facture",
"invoice_type" => "Type de facturation",
"is_readable" => "est lisible, mais les permissions sont incorrectes. Définir à 640 ou 660 et rafraîchir.",
"is_writable" => "is écrivable, mais les permissions sont plus hautes que 750.",
"item_markup" => "",
"jsprintsetup_required" => "Attention: Cette fonctionnalité ne sera active que si l'extension FireFox jsPrintSetup est installée. Enregistrer quand même ?",
"language" => "Langue",
"last_used_invoice_number" => "Dernier numéro de facture utilisé",
"last_used_quote_number" => "Dernier numéro de devis utilisé",
"last_used_work_order_number" => "Dernier numéro W / O utilisé",
"left" => "Gauche",
"license" => "Licence",
"license_configuration" => "Déclaration de licence",
"line_sequence" => "Séquence de lignes",
"lines_per_page" => "Lignes par page",
"lines_per_page_number" => "Les lignes par page doivent être un nombre.",
"lines_per_page_required" => "Lignes par page est un champ obligatoire.",
"locale" => "Localisation",
"locale_configuration" => "Configuration de localisation",
"locale_info" => "Informations de configuration de localisation",
"location" => "Inventaire",
"location_configuration" => "Emplacements de stock",
"location_info" => "Informations de configuration de l'emplacement",
"login_form" => "Style du formulaire de connexion",
"logout" => "Voulez-vous faire une sauvegarde avant de vous déconnecter ? Cliquez sur [OK] pour sauvegarder ou sur [Annuler] pour vous déconnecter.",
"mailchimp" => "MailChimp",
"mailchimp_api_key" => "Clé API MailChimp",
"mailchimp_configuration" => "Configuration de MailChimp",
"mailchimp_key_successfully" => "La clé API est valide.",
"mailchimp_key_unsuccessfully" => "La clé de l'API est invalide.",
"mailchimp_lists" => "Liste(s) MailChimp",
"mailchimp_tooltip" => "Cliquez sur l'icône pour une clé API.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Message texte enregistré",
"msg_msg_placeholder" => "Si vous souhaitez utiliser un modèle de SMS, enregistrez votre message ici. Sinon, laisser la boîte en blanc.",
"msg_pwd" => "SMS-API Password",
"msg_pwd_required" => "SMS-API Password est un champ obligatoire",
"msg_src" => "ID de l'expéditeur de SMS-API",
"msg_src_required" => "L'ID de l'expéditeur de SMS-API est un champ obligatoire",
"msg_uid" => "Nom d'utilisateur de l'API SMS",
"msg_uid_required" => "Le nom d'utilisateur de l'API SMS est un champ obligatoire",
"multi_pack_enabled" => "Ensembles multiples par article",
"no_risk" => "Pas de risques de sécurité/vulnérabilité.",
"none" => "none",
"notify_alignment" => "Position contextuelle de notification",
"number_format" => "Number Format",
"number_locale" => "Localisation",
"number_locale_invalid" => "L'environnement local entré est invalide. Vérifiez le lien dans l'info-bulle pour trouver un environnement local valide.",
"number_locale_required" => "Number Locale est un champ obligatoire.",
"number_locale_tooltip" => "Trouvez un lieu approprié grâce à ce lien.",
"os_timezone" => "Fuseau horaire d'OSPOS :",
"ospos_info" => "Informations d'installation d'OSPOS",
"payment_options_order" => "Ordre des options de paiement",
"perm_risk" => "Des permissions incorrectement définies exposent ce logiciel a des risques de sécurité.",
"phone" => "Téléphone",
"phone_required" => "Téléphone de l'entreprise est un champ obligatoire.",
"print_bottom_margin" => "Marge Bas",
"print_bottom_margin_number" => "La marge inférieure doit être un nombre.",
"print_bottom_margin_required" => "La marge inférieure est un champ obligatoire.",
"print_delay_autoreturn" => "Retour automatique a la vente retarde",
"print_delay_autoreturn_number" => "Retour automatique à la vente retarde est un champ obligatoire.",
"print_delay_autoreturn_required" => "Retour automatique à la vente retarde doit être un nombre.",
"print_footer" => "Pied de page imprimante",
"print_header" => "Imprimer l'en-tête du navigateur",
"print_left_margin" => "Marge Gauche",
"print_left_margin_number" => "La marge gauche par défaut doit être un nombre.",
"print_left_margin_required" => "La marge gauche par défaut est un champ obligatoire.",
"print_receipt_check_behaviour" => "Imprimer la case à cocher Reçu",
"print_receipt_check_behaviour_always" => "Toujours vérifié",
"print_receipt_check_behaviour_last" => "Se souvenir de la dernière sélection",
"print_receipt_check_behaviour_never" => "Toujours décoché",
"print_right_margin" => "Marge Droit",
"print_right_margin_number" => "La marge droite par défaut doit être un nombre.",
"print_right_margin_required" => "La marge droite par défaut est un champ obligatoire.",
"print_silently" => "Afficher la boîte de dialogue Imprimer",
"print_top_margin" => "Margin Superieure",
"print_top_margin_number" => "Margin Top doit être un nombre.",
"print_top_margin_required" => "Margin Top est un champ obligatoire.",
"quantity_decimals" => "Nombre de décimales",
"quick_cash_enable" => "",
"quote_default_comments" => "Commentaires de devis par défaut",
"receipt" => "Le reçu",
"receipt_category" => "",
"receipt_configuration" => "Paramètres d'impression du reçu",
"receipt_default" => "Défaut",
"receipt_font_size" => "Taille de font",
"receipt_font_size_number" => "La taille de la font doit être un nombre.",
"receipt_font_size_required" => "Taille de la font est un champ obligatoire.",
"receipt_info" => "Informations de configuration du reçu",
"receipt_printer" => "Imprimante de tickets",
"receipt_short" => "Court",
"receipt_show_company_name" => "Afficher le nom de l'entreprise",
"receipt_show_description" => "Montrer la description",
"receipt_show_serialnumber" => "Afficher le numéro de série",
"receipt_show_tax_ind" => "Afficher les indicateurs de taxe",
"receipt_show_taxes" => "Afficher les taxes",
"receipt_show_total_discount" => "Afficher le rabais total",
"receipt_template" => "Modèle de reçu",
"receiving_calculate_average_price" => "Calc. prix moyen (Réception)",
"recv_invoice_format" => "Format de la facture des factures",
"register_mode_default" => "Mode de registre par défaut",
"report_an_issue" => "Signaler un problème",
"return_policy_required" => "Le Message est un champ requis.",
"reward" => "Récompense",
"reward_configuration" => "Configuration de récompense",
"right" => "Droite",
"sales_invoice_format" => "Format de la facture de vente",
"sales_quote_format" => "Format de devis de vente",
"mailpath_invalid" => "Chemin sendmail invalide. Seuls les lettres, chiffres, tirets, underscores, barres obliques et points sont autorisés.",
"saved_successfully" => "Configuration enregistrer avec succès.",
"saved_unsuccessfully" => "L'enregistrement de configuration a échoué.",
"security_issue" => "Avertissement de faille de sécurité",
"server_notice" => "Veuillez utiliser les informations ci-dessous pour signaler un problème.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Afficher l'icône du bureau",
"statistics" => "Envoyer des statistiques",
"statistics_tooltip" => "Envoyer des statistiques pour le développement et l'amélioration des fonctionnalités.",
"stock_location" => "Emplacement du stock",
"stock_location_duplicate" => "L'emplacement du stock doit être unique.",
"stock_location_invalid_chars" => "L'emplacement de stockage ne peut pas contenir '_'.",
"stock_location_required" => "L'emplacement du stock est un champ obligatoire.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Colonne 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Présentation des suggestions de recherche",
"suggestions_second_column" => "Colonne 2",
"suggestions_third_column" => "Colonne 3",
"system_conf" => "Paramètres & Configuration",
"system_info" => "System Info",
"table" => "Table",
"table_configuration" => "Configuration de la table",
"takings_printer" => "Imprimante de reçu",
"tax" => "Taxe",
"tax_category" => "Catégorie fiscale",
"tax_category_duplicate" => "La catégorie de taxe saisie existe déjà.",
"tax_category_invalid_chars" => "La catégorie de taxe entrée est invalide.",
"tax_category_required" => "La catégorie de taxe est requise.",
"tax_category_used" => "La catégorie de taxe ne peut pas être supprimée car elle est utilisée.",
"tax_configuration" => "Configuration de l'impôt",
"tax_decimals" => "Décimales fiscales",
"tax_id" => "Id de taxe",
"tax_included" => "Taxe inclu",
"theme" => "Thème",
"theme_preview" => "Aperçu du thème :",
"thousands_separator" => "Séparateur de milliers",
"timezone" => "Fuseau Horaire",
"timezone_error" => "Le fuseau horaire d'OSPOS est différent de votre fuseau horaire local.",
"top" => "Haut",
"use_destination_based_tax" => "Utiliser la taxe basée sur la destination",
"user_timezone" => "Fuseau horaire local :",
"website" => "Site Internet",
"wholesale_markup" => "",
"work_order_enable" => "Support de commande de travail",
"work_order_format" => "Format de bon de travail",
];