@base44/app-plugin-commerce 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +4 -10
  2. package/base44/entities/commerce.ProductReview.jsonc +2 -2
  3. package/base44/functions/commerce/storefront-catalog/entry.ts +7 -3
  4. package/package.json +1 -1
  5. package/scripts/install.js +2 -4
  6. package/skills/commerce/SKILL.md +9 -3
  7. package/skills/commerce/docs/api-storefront.md +3 -3
  8. package/skills/commerce/install/01-install.md +8 -24
  9. package/skills/commerce/install/02-storefront.md +21 -9
  10. package/skills/commerce/references/admin-localization.md +95 -0
  11. package/skills/commerce/references/reviews.md +7 -6
  12. package/src/commerce/admin/README.md +36 -14
  13. package/src/commerce/admin/bot/StoreAdminBot.jsx +12 -11
  14. package/src/commerce/admin/components/AddressForm.jsx +13 -12
  15. package/src/commerce/admin/components/ConfirmDialog.jsx +5 -4
  16. package/src/commerce/admin/components/CountrySelect.jsx +12 -8
  17. package/src/commerce/admin/components/DataTable.jsx +3 -2
  18. package/src/commerce/admin/components/DateRangePicker.jsx +11 -10
  19. package/src/commerce/admin/components/EmptyState.jsx +2 -1
  20. package/src/commerce/admin/components/MediaUploader.jsx +3 -2
  21. package/src/commerce/admin/components/MetaDataEditor.jsx +4 -3
  22. package/src/commerce/admin/components/SearchSelect.jsx +4 -3
  23. package/src/commerce/admin/context/SettingsContext.jsx +12 -25
  24. package/src/commerce/admin/hooks/useMoney.js +3 -2
  25. package/src/commerce/admin/i18n/index.js +54 -0
  26. package/src/commerce/admin/i18n/locales/de.js +896 -0
  27. package/src/commerce/admin/i18n/locales/en.js +900 -0
  28. package/src/commerce/admin/i18n/locales/es.js +896 -0
  29. package/src/commerce/admin/i18n/locales/fr.js +896 -0
  30. package/src/commerce/admin/i18n/locales/ja.js +896 -0
  31. package/src/commerce/admin/i18n/locales/pt.js +896 -0
  32. package/src/commerce/admin/index.jsx +6 -30
  33. package/src/commerce/admin/layout/AccessDenied.jsx +8 -9
  34. package/src/commerce/admin/layout/AuthGuard.jsx +2 -1
  35. package/src/commerce/admin/layout/Sidebar.jsx +29 -18
  36. package/src/commerce/admin/layout/Topbar.jsx +4 -3
  37. package/src/commerce/admin/lib/api.js +3 -2
  38. package/src/commerce/admin/lib/constants.js +44 -43
  39. package/src/commerce/admin/lib/format.js +4 -3
  40. package/src/commerce/admin/lib/paths.js +2 -3
  41. package/src/commerce/admin/pages/Dashboard.jsx +25 -24
  42. package/src/commerce/admin/pages/coupons/CouponEditor.jsx +55 -57
  43. package/src/commerce/admin/pages/coupons/CouponsList.jsx +22 -21
  44. package/src/commerce/admin/pages/customers/CustomerEditor.jsx +31 -30
  45. package/src/commerce/admin/pages/customers/CustomersList.jsx +19 -18
  46. package/src/commerce/admin/pages/orders/OrderEditor.jsx +75 -71
  47. package/src/commerce/admin/pages/orders/OrdersList.jsx +16 -15
  48. package/src/commerce/admin/pages/orders/components/AddProductDialog.jsx +12 -11
  49. package/src/commerce/admin/pages/orders/components/DownloadPermissionsPanel.jsx +14 -13
  50. package/src/commerce/admin/pages/orders/components/LineItemsTable.jsx +12 -11
  51. package/src/commerce/admin/pages/orders/components/OrderNotesPanel.jsx +11 -10
  52. package/src/commerce/admin/pages/orders/components/PaymentPanel.jsx +22 -22
  53. package/src/commerce/admin/pages/orders/components/RefundPanel.jsx +18 -17
  54. package/src/commerce/admin/pages/orders/components/TotalsBox.jsx +18 -17
  55. package/src/commerce/admin/pages/products/Categories.jsx +14 -13
  56. package/src/commerce/admin/pages/products/ProductEditor.jsx +16 -15
  57. package/src/commerce/admin/pages/products/ProductsList.jsx +41 -36
  58. package/src/commerce/admin/pages/products/Reviews.jsx +54 -46
  59. package/src/commerce/admin/pages/products/components/AttributesSection.jsx +45 -39
  60. package/src/commerce/admin/pages/products/components/ProductDataPanel.jsx +8 -7
  61. package/src/commerce/admin/pages/products/components/PublishBox.jsx +10 -9
  62. package/src/commerce/admin/pages/products/components/TaxonomyPanel.jsx +18 -17
  63. package/src/commerce/admin/pages/products/components/tabs/DownloadsTab.jsx +11 -10
  64. package/src/commerce/admin/pages/products/components/tabs/LinkedTab.jsx +9 -10
  65. package/src/commerce/admin/pages/products/components/tabs/ModifiersTab.jsx +3 -9
  66. package/src/commerce/admin/pages/products/components/tabs/PriceInventoryTab.jsx +76 -78
  67. package/src/commerce/admin/pages/reports/Reports.jsx +33 -32
  68. package/src/commerce/admin/pages/settings/EmailsSettings.jsx +36 -39
  69. package/src/commerce/admin/pages/settings/GeneralSettings.jsx +13 -14
  70. package/src/commerce/admin/pages/settings/InventorySettings.jsx +12 -13
  71. package/src/commerce/admin/pages/settings/LocationEditor.jsx +48 -47
  72. package/src/commerce/admin/pages/settings/PaymentsSettings.jsx +32 -33
  73. package/src/commerce/admin/pages/settings/SettingsLayout.jsx +13 -12
  74. package/src/commerce/admin/pages/settings/ShippingTaxSettings.jsx +31 -31
  75. package/src/commerce/admin/pages/settings/useGroupForm.jsx +4 -3
  76. package/src/commerce/admin/pages/status/WebhookEditor.jsx +34 -31
  77. package/src/commerce/admin/pages/status/Webhooks.jsx +11 -10
  78. package/src/commerce/admin/routes.jsx +31 -43
  79. package/src/commerce/storefront/pickers.jsx +19 -5
  80. package/src/commerce/storefront/useCheckout.jsx +28 -3
  81. package/src/commerce/utils/storefront.js +49 -2
@@ -0,0 +1,896 @@
1
+ /**
2
+ * Français (French). Same keys as en.js — a key missing here falls back to the
3
+ * English value. Formal register (vous); `{placeholders}` are kept verbatim.
4
+ */
5
+ export default {
6
+ $locale: "fr",
7
+
8
+ // ── shared vocabulary ───────────────────────────────────────────
9
+ "common.add": "Ajouter",
10
+ "common.amount": "Montant",
11
+ "common.cancel": "Annuler",
12
+ "common.confirm": "Confirmer",
13
+ "common.delete": "Supprimer",
14
+ "common.description": "Description",
15
+ "common.edit": "Modifier",
16
+ "common.email": "E-mail",
17
+ "common.name": "Nom",
18
+ "common.no_results": "Aucun résultat.",
19
+ "common.phone": "Téléphone",
20
+ "common.request_failed": "La requête a échoué",
21
+ "common.save": "Enregistrer",
22
+ "common.search": "Rechercher…",
23
+ "common.selected_count": "{count} sélectionné(s)",
24
+ "common.status": "Statut",
25
+ "common.type": "Type",
26
+ "common.upload_failed": "Échec de l'envoi du fichier",
27
+
28
+ // ── generic table ───────────────────────────────────────────────
29
+ "table.empty_title": "Rien pour le moment",
30
+ "table.page": "Page {page}",
31
+
32
+ // ── confirm dialog ──────────────────────────────────────────────
33
+ "confirm.description": "Cette action est irréversible.",
34
+ "confirm.title": "Êtes-vous sûr ?",
35
+
36
+ // ── date-range presets ──────────────────────────────────────────
37
+ "dates.all_time": "Toute la période",
38
+ "dates.last_7_days": "7 derniers jours",
39
+ "dates.last_month": "Mois dernier",
40
+ "dates.this_month": "Ce mois-ci",
41
+ "dates.this_year": "Cette année",
42
+ "dates.today": "Aujourd'hui",
43
+
44
+ // ── navigation ──────────────────────────────────────────────────
45
+ "nav.all_products": "Tous les produits",
46
+ "nav.marketing_group": "Marketing",
47
+ "nav.products_group": "Produits",
48
+ "nav.store_management": "Gestion de la boutique",
49
+ "nav.storeadmin_bot": "Bot StoreAdmin",
50
+ "nav.view_storefront": "Voir la boutique",
51
+
52
+ // ── route + breadcrumb labels ───────────────────────────────────
53
+ "routes.categories": "Catégories",
54
+ "routes.coupons": "Codes promo",
55
+ "routes.coupons_edit": "Modifier le code promo",
56
+ "routes.coupons_new": "Ajouter un code promo",
57
+ "routes.customer": "Client",
58
+ "routes.customers": "Clients",
59
+ "routes.customers_new": "Ajouter un client",
60
+ "routes.dashboard": "Tableau de bord",
61
+ "routes.order": "Commande",
62
+ "routes.orders": "Commandes",
63
+ "routes.orders_new": "Ajouter une commande",
64
+ "routes.products": "Produits",
65
+ "routes.products_edit": "Modifier le produit",
66
+ "routes.products_new": "Ajouter un produit",
67
+ "routes.reports": "Rapports",
68
+ "routes.reviews": "Avis",
69
+ "routes.settings": "Paramètres",
70
+ "routes.settings_emails": "E-mails",
71
+ "routes.settings_general": "Général",
72
+ "routes.settings_inventory": "Stock",
73
+ "routes.settings_location": "Zone",
74
+ "routes.settings_payments": "Paiements",
75
+ "routes.settings_shipping_tax": "Livraison et taxes",
76
+ "routes.settings_webhooks": "Webhooks",
77
+ "routes.webhook": "Webhook",
78
+ "routes.webhooks_new": "Ajouter un webhook",
79
+
80
+ // ── 404 ─────────────────────────────────────────────────────────
81
+ "notfound.back": "Retour au tableau de bord",
82
+ "notfound.description": "Ceci n'est pas une page d'administration.",
83
+ "notfound.title": "Page introuvable",
84
+
85
+ // ── auth / access screens ───────────────────────────────────────
86
+ "auth.admin_required": "Accès administrateur requis",
87
+ "auth.administrator": "Administrateur",
88
+ "auth.checking_access": "Vérification de vos accès…",
89
+ "auth.must_sign_in": "Vous devez vous connecter pour accéder à l'administration de la boutique.",
90
+ "auth.no_admin_role": "Votre compte n'a pas le rôle administrateur. Demandez à un administrateur de la boutique de vous accorder l'accès.",
91
+ "auth.sign_in": "Se connecter",
92
+ "auth.sign_in_required": "Connexion requise",
93
+ "auth.sign_in_timeout": "Nous n'avons pas pu confirmer votre identité. Connectez-vous pour continuer — si cette page est intégrée dans un panneau d'aperçu, ouvrez-la d'abord dans son propre onglet, car la connexion ne peut pas aboutir dans une iframe.",
94
+ "auth.sign_out": "Se déconnecter",
95
+ "auth.signed_in_as": "Connecté en tant que {email}",
96
+
97
+ // ── address form ────────────────────────────────────────────────
98
+ "address.city": "Ville",
99
+ "address.company": "Société",
100
+ "address.country": "Pays",
101
+ "address.first_name": "Prénom",
102
+ "address.last_name": "Nom",
103
+ "address.line1": "Adresse ligne 1",
104
+ "address.line2": "Adresse ligne 2",
105
+ "address.postcode": "Code postal",
106
+ "address.select_state": "Sélectionnez une région…",
107
+ "address.state": "Région / Département",
108
+
109
+ // ── country picker ──────────────────────────────────────────────
110
+ "country.any": "N'importe quel pays",
111
+ "country.none_found": "Aucun pays trouvé.",
112
+ "country.search": "Rechercher un pays…",
113
+ "country.select": "Sélectionnez un pays…",
114
+
115
+ // ── media uploader ──────────────────────────────────────────────
116
+ "media.add_images": "Ajouter des images",
117
+ "media.set_image": "Définir l'image",
118
+
119
+ // ── meta-data editor ────────────────────────────────────────────
120
+ "meta.add_field": "Ajouter un champ",
121
+ "meta.key": "Clé",
122
+ "meta.value": "Valeur",
123
+
124
+ // ── first-run setup screen ──────────────────────────────────────
125
+ "setup.description": "Ceci ressemble à une nouvelle installation. Initialisez la boutique avec les paramètres par défaut (devise, classes de taxe, moyens de paiement, zone de livraison et configuration des e-mails) pour commencer à utiliser l'administration.",
126
+ "setup.run": "Initialiser les valeurs par défaut",
127
+ "setup.sample_hint": "Ajoute des catégories de démonstration, 10 produits (trois avec des variantes taille/couleur, un téléchargeable) et des codes promo pour explorer l'administration.",
128
+ "setup.sample_label": "Inclure des données d'exemple",
129
+ "setup.schema_error_description": "Les schémas d'entité de cette application ont été modifiés d'une manière qui empêche l'initialisation. Restaurez les schémas du modèle ou corrigez les champs ci-dessous, puis réessayez.",
130
+ "setup.schema_error_title": "Les schémas d'entité sont incompatibles",
131
+ "setup.store_name": "Nom de la boutique",
132
+ "setup.store_name_hint": "Utilisé dans l'objet et comme nom d'expéditeur de chaque e-mail transactionnel. Modifiable ensuite dans Paramètres → E-mails.",
133
+ "setup.store_name_placeholder": "Le nom de votre boutique",
134
+ "setup.success": "Valeurs par défaut initialisées",
135
+ "setup.title": "Configurez votre boutique",
136
+
137
+ // ── status enums ────────────────────────────────────────────────
138
+ "status.order.cancelled": "Annulée",
139
+ "status.order.completed": "Terminée",
140
+ "status.order.failed": "Échouée",
141
+ "status.order.on-hold": "En attente",
142
+ "status.order.pending": "Paiement en attente",
143
+ "status.order.processing": "En cours de traitement",
144
+ "status.order.refunded": "Remboursée",
145
+ "status.product.draft": "Brouillon",
146
+ "status.product.pending": "En attente de relecture",
147
+ "status.product.private": "Privé",
148
+ "status.product.publish": "Publié",
149
+ "status.review.approved": "Approuvé",
150
+ "status.review.hold": "En attente",
151
+ "status.review.spam": "Indésirable",
152
+ "status.review.trash": "Corbeille",
153
+ "status.stock.instock": "En stock",
154
+ "status.stock.onbackorder": "En réapprovisionnement",
155
+ "status.stock.outofstock": "Rupture de stock",
156
+ "status.webhook.active": "Actif",
157
+ "status.webhook.disabled": "Désactivé",
158
+ "status.webhook.paused": "En pause",
159
+
160
+ // ── backorder options ───────────────────────────────────────────
161
+ "backorder.no": "Ne pas autoriser",
162
+ "backorder.notify": "Autoriser, mais prévenir le client",
163
+ "backorder.yes": "Autoriser",
164
+
165
+ // ── tax status ──────────────────────────────────────────────────
166
+ "tax_status.none": "Aucun",
167
+ "tax_status.taxable": "Taxable",
168
+
169
+ // ── coupon types ────────────────────────────────────────────────
170
+ "coupon_type.fixed_cart": "Remise fixe sur le panier",
171
+ "coupon_type.fixed_product": "Remise fixe par produit",
172
+ "coupon_type.percent": "Remise en pourcentage",
173
+
174
+ // ── transactional emails ────────────────────────────────────────
175
+ "email_type.cancelled_order": "Commande annulée",
176
+ "email_type.completed_order": "Commande terminée",
177
+ "email_type.customer_invoice": "Facture client / Détails de la commande",
178
+ "email_type.customer_note": "Note au client",
179
+ "email_type.failed_order": "Commande échouée",
180
+ "email_type.low_stock": "Stock faible",
181
+ "email_type.new_account": "Nouveau compte",
182
+ "email_type.new_order": "Nouvelle commande",
183
+ "email_type.on_hold_order": "Commande en attente",
184
+ "email_type.out_of_stock": "Rupture de stock",
185
+ "email_type.processing_order": "Commande en traitement",
186
+ "email_type.refunded_order": "Commande remboursée",
187
+ "email_type.reset_password": "Réinitialisation du mot de passe",
188
+
189
+ // ── dashboard ───────────────────────────────────────────────────
190
+ "dashboard.all_stocked_description": "Aucun produit n'est en stock faible.",
191
+ "dashboard.all_stocked_title": "Stocks au complet",
192
+ "dashboard.awaiting_processing": "En attente de traitement",
193
+ "dashboard.create_coupon": "Créer un code promo",
194
+ "dashboard.date": "Date",
195
+ "dashboard.latest_orders": "Dernières commandes",
196
+ "dashboard.low_on_stock": "Stock faible",
197
+ "dashboard.low_stock": "Stock faible",
198
+ "dashboard.low_stock_hint": "produits au seuil ou en dessous",
199
+ "dashboard.n_left": "{count} restant(s)",
200
+ "dashboard.net_sales_month": "Ventes nettes ce mois-ci",
201
+ "dashboard.net_sales_today": "Ventes nettes aujourd'hui",
202
+ "dashboard.no_orders_description": "Les commandes apparaîtront ici dès leur arrivée.",
203
+ "dashboard.no_orders_title": "Aucune commande pour l'instant",
204
+ "dashboard.orders_to_fulfill": "commandes à préparer",
205
+ "dashboard.sku": "UGS : {sku}",
206
+ "dashboard.status_count": "{status} : {count}",
207
+ "dashboard.subtitle": "Votre boutique en un coup d'œil.",
208
+ "dashboard.total": "Total",
209
+ "dashboard.view_reports": "Voir les rapports",
210
+
211
+ // ── orders ──────────────────────────────────────────────────────
212
+ "orders.add_fee": "Ajouter des frais",
213
+ "orders.add_note_placeholder": "Ajouter une note…",
214
+ "orders.add_products": "Ajouter des produits",
215
+ "orders.add_shipping": "Ajouter la livraison",
216
+ "orders.add_to_order": "Ajouter à la commande",
217
+ "orders.addr_billing": "facturation",
218
+ "orders.addr_shipping": "livraison",
219
+ "orders.all": "Toutes",
220
+ "orders.already_customer_linked": "{name} est déjà client — lié. Enregistrez la commande pour conserver le lien.",
221
+ "orders.and_separator": " et ",
222
+ "orders.apply": "Appliquer",
223
+ "orders.apply_coupon": "Appliquer le code promo",
224
+ "orders.apply_coupon_dirty_tip": "Enregistre vos modifications en attente, puis applique le code promo",
225
+ "orders.available_to_refund": "Total remboursable :",
226
+ "orders.awaiting_payment": "En attente de paiement",
227
+ "orders.billing": "Facturation",
228
+ "orders.change_status_to": "Changer le statut en…",
229
+ "orders.check_payment": "Vérifier le paiement",
230
+ "orders.choose_variation": "Choisissez une déclinaison…",
231
+ "orders.close_refund": "Fermer le remboursement",
232
+ "orders.copy_failed": "Copie impossible — sélectionnez le lien et copiez-le manuellement",
233
+ "orders.copy_from_billing": "Copier l'adresse de facturation dans la livraison",
234
+ "orders.copy_link": "Copier le lien",
235
+ "orders.cost": "Coût",
236
+ "orders.coupon_applied": "Code promo {code} appliqué",
237
+ "orders.coupon_code": "Code promo",
238
+ "orders.coupon_code_placeholder": "ex. welcome10",
239
+ "orders.coupon_removed": "Code promo {code} retiré",
240
+ "orders.coupons_codes": "Code(s) promo : {codes}",
241
+ "orders.coupons_label": "Codes promo :",
242
+ "orders.create_payment_link": "Créer un lien de paiement",
243
+ "orders.custom_fields": "Champs personnalisés",
244
+ "orders.customer_created": "Client {name} créé. Enregistrez la commande pour conserver le lien.",
245
+ "orders.customer_load_failed": "Impossible de charger cette fiche client",
246
+ "orders.customer_no_saved_address": "Ce client n'a aucune adresse enregistrée",
247
+ "orders.customer_provided_note": "Note laissée par le client",
248
+ "orders.date": "Date",
249
+ "orders.delete_note": "Supprimer la note",
250
+ "orders.delete_order": "Supprimer la commande",
251
+ "orders.delete_order_description": "Seules les commandes en attente, annulées ou échouées peuvent être supprimées. Cette action est irréversible.",
252
+ "orders.delete_order_title": "Supprimer la commande n° {number} ?",
253
+ "orders.deleted": "Commande supprimée",
254
+ "orders.discount": "Remise",
255
+ "orders.download_granted": "Accès au téléchargement accordé",
256
+ "orders.download_permissions": "Autorisations des produits téléchargeables",
257
+ "orders.download_revoked": "Accès au téléchargement révoqué",
258
+ "orders.empty_description": "Les commandes apparaîtront ici au fur et à mesure.",
259
+ "orders.empty_search_hint": "Essayez d'ajuster votre recherche ou la plage de dates.",
260
+ "orders.empty_title": "Aucune commande trouvée",
261
+ "orders.expires": "Expire le",
262
+ "orders.fee": "Frais",
263
+ "orders.fee_name": "Libellé des frais",
264
+ "orders.fees": "Frais",
265
+ "orders.file": "Fichier",
266
+ "orders.filled_from": "{parts} renseigné(e) depuis {name}",
267
+ "orders.from_billing": "Depuis la facturation",
268
+ "orders.general": "Général",
269
+ "orders.grant_access": "Accorder l'accès",
270
+ "orders.guest_order": "Commande invité",
271
+ "orders.guest_order_hint": "Commande invité. Choisissez un client pour renseigner les adresses depuis sa fiche, ou saisissez les informations ci-dessous — l'e-mail de facturation est l'adresse à laquelle partent les e-mails de cette commande.",
272
+ "orders.guest_order_needs_email": "Commande invité — e-mail de facturation requis",
273
+ "orders.guest_search_customers": "Invité — rechercher des clients…",
274
+ "orders.invoice_sent": "Détails de la commande envoyés au client",
275
+ "orders.item": "Article",
276
+ "orders.items": "Articles",
277
+ "orders.items_subtotal": "Sous-total des articles",
278
+ "orders.kept_existing_addresses": "Les adresses déjà présentes sur cette commande ont été conservées — utilisez « Utiliser les adresses du client » pour les remplacer.",
279
+ "orders.link_copied": "Lien copié",
280
+ "orders.link_sets_method": "Envoyer un lien de paiement bascule cette commande en paiement par carte.",
281
+ "orders.link_switches_method": "Envoyer un lien de paiement fait passer cette commande de {method} au paiement par carte.",
282
+ "orders.loading_variations": "Chargement des déclinaisons…",
283
+ "orders.method": "Moyen",
284
+ "orders.method_title": "Libellé du moyen",
285
+ "orders.n_orders": "{count} commande(s)",
286
+ "orders.n_updated": "{count} commande(s) mises à jour",
287
+ "orders.net_payment": "Paiement net",
288
+ "orders.never": "Jamais",
289
+ "orders.new_payment_link": "Nouveau lien de paiement",
290
+ "orders.no_address_set": "Aucune adresse définie.",
291
+ "orders.no_card_payment_tip": "Aucun paiement par carte n'est enregistré sur cette commande pour être remboursé",
292
+ "orders.no_download_permissions": "Aucune autorisation de téléchargement sur cette commande.",
293
+ "orders.no_items": "Aucun article.",
294
+ "orders.no_items_hint": "Utilisez « Ajouter des produits » ci-dessous.",
295
+ "orders.no_notes": "Aucune note pour l'instant.",
296
+ "orders.no_payment_method_hint": "Aucun moyen de paiement n'est défini sur cette commande. Encaissez en dehors de la boutique puis passez-la en « En cours de traitement », ou envoyez un lien de paiement au client.",
297
+ "orders.no_payment_yet": "Aucun paiement reçu pour l'instant",
298
+ "orders.no_saved_address_enter_below": "{name} n'a aucune adresse enregistrée — saisissez les informations ci-dessous.",
299
+ "orders.no_variations": "Ce produit n'a pas encore de déclinaisons.",
300
+ "orders.not_found": "Commande introuvable.",
301
+ "orders.note_added": "Note ajoutée",
302
+ "orders.note_sent": "Note envoyée au client",
303
+ "orders.note_to_customer": "Note au client",
304
+ "orders.open": "Ouvrir",
305
+ "orders.open_customer": "Ouvrir le client",
306
+ "orders.order_actions": "Actions sur la commande",
307
+ "orders.order_notes": "Notes de la commande",
308
+ "orders.order_number": "N° de commande",
309
+ "orders.order_total": "Total de la commande",
310
+ "orders.paid": "Payée",
311
+ "orders.pay_outside_hint": "Cette commande est réglée en dehors de la boutique ({method}) : marquez-la comme payée en la passant en « En cours de traitement » dès réception des fonds.",
312
+ "orders.payment": "Paiement",
313
+ "orders.payment_confirmed": "Paiement confirmé",
314
+ "orders.payment_link_created": "Lien de paiement créé",
315
+ "orders.payment_link_hint": "Envoyez-le au client — il ouvre la page de paiement sécurisée du prestataire. La commande se met à jour d'elle-même après le paiement.",
316
+ "orders.placed_via": "{date} via {via}",
317
+ "orders.preview_failed": "Impossible de chiffrer ces modifications :",
318
+ "orders.preview_failed_generic": "Impossible de chiffrer ces modifications",
319
+ "orders.previous_refunds": "Remboursements précédents",
320
+ "orders.pricing_changes": "Chiffrage de vos modifications…",
321
+ "orders.private_note": "Note privée",
322
+ "orders.product": "Produit",
323
+ "orders.qty": "Qté",
324
+ "orders.quantity": "Quantité",
325
+ "orders.recalculate": "Recalculer",
326
+ "orders.recalculate_dirty_tip": "Enregistre vos modifications en attente, puis recalcule taxes et totaux selon les paramètres actuels",
327
+ "orders.recalculate_tip": "Recalculer les taxes et les totaux selon les paramètres actuels",
328
+ "orders.recalculated": "Totaux recalculés",
329
+ "orders.reference": "Référence",
330
+ "orders.refund": "Remboursement",
331
+ "orders.refund_amount": "Remboursement",
332
+ "orders.refund_over_max": "Le montant dépasse le total remboursable.",
333
+ "orders.refund_reason": "Motif du remboursement (facultatif)",
334
+ "orders.refund_shipping": "Rembourser la livraison",
335
+ "orders.refund_via_provider": "Renvoyer les fonds via le prestataire de paiement",
336
+ "orders.refunded": "Remboursé",
337
+ "orders.refunded_amount": "{amount} remboursé",
338
+ "orders.refunded_by": "par {name}",
339
+ "orders.refunded_via_provider": "{amount} remboursé via le prestataire de paiement",
340
+ "orders.remaining": "Restant",
341
+ "orders.remove_coupon": "Retirer le code promo",
342
+ "orders.replaced_from_customer": "{parts} remplacé(e) depuis la fiche client",
343
+ "orders.restock_items": "Remettre en stock les articles remboursés",
344
+ "orders.revoke": "Révoquer",
345
+ "orders.save_and_recalculate": "Enregistrer et recalculer",
346
+ "orders.save_as_customer": "Enregistrer comme client",
347
+ "orders.save_as_customer_needs_email_tip": "Ajoutez un e-mail de facturation ci-dessous pour enregistrer ces informations comme client",
348
+ "orders.save_as_customer_tip": "Créer un client à partir des informations de facturation ci-dessous et y lier cette commande",
349
+ "orders.save_order": "Enregistrer la commande",
350
+ "orders.saved": "Commande enregistrée",
351
+ "orders.saved_recalculated": "Commande enregistrée et totaux recalculés",
352
+ "orders.search_downloadable": "Rechercher des produits téléchargeables…",
353
+ "orders.search_placeholder": "Rechercher n° de commande, nom, e-mail…",
354
+ "orders.search_products": "Rechercher des produits…",
355
+ "orders.send_details": "Envoyer les détails de la commande au client",
356
+ "orders.sent_to_customer": "· envoyée au client",
357
+ "orders.shipping": "Livraison",
358
+ "orders.sku": "UGS : {sku}",
359
+ "orders.system": "· système",
360
+ "orders.tax": "Taxes",
361
+ "orders.total": "Total",
362
+ "orders.unsaved_totals": "Non enregistré — les totaux ci-dessous incluent vos modifications",
363
+ "orders.use_customer_addresses": "Utiliser les adresses du client",
364
+ "orders.use_customer_addresses_tip": "Remplacer la facturation et la livraison de la commande par les adresses enregistrées du client",
365
+ "orders.used_count": "(utilisé {count})",
366
+ "orders.variation": "Déclinaison",
367
+ "orders.view_edit": "Voir / modifier",
368
+
369
+ // ── products ────────────────────────────────────────────────────
370
+ "products.add_file": "Ajouter un fichier",
371
+ "products.add_gallery_images": "Ajouter des images à la galerie",
372
+ "products.add_new": "Ajouter",
373
+ "products.add_new_category": "Ajouter une catégorie",
374
+ "products.add_new_product": "Ajouter un produit",
375
+ "products.add_new_ribbon": "Ajouter un bandeau",
376
+ "products.add_option_placeholder": "Ajouter une option…",
377
+ "products.add_value": "Ajouter une valeur",
378
+ "products.all_categories": "Toutes les catégories",
379
+ "products.all_stock": "Tous les stocks",
380
+ "products.backorders": "Réapprovisionnements",
381
+ "products.bulk_copied": "Copié sur {count} déclinaison(s).",
382
+ "products.bulk_price_set": "Prix appliqué à {count} déclinaison(s).",
383
+ "products.bulk_stock_set": "Stock appliqué à {count} déclinaison(s).",
384
+ "products.category_create_failed": "Impossible de créer la catégorie",
385
+ "products.category_created": "Catégorie créée",
386
+ "products.category_name_placeholder": "Nom de la catégorie",
387
+ "products.clear": "Effacer",
388
+ "products.code": "Code",
389
+ "products.confirm_delete_bulk": "Supprimer {count} produit(s) ?",
390
+ "products.confirm_delete_description": "Cela supprime définitivement le produit et ses déclinaisons.",
391
+ "products.confirm_delete_one": "Supprimer « {name} » ?",
392
+ "products.confirm_delete_this": "Supprimer ce produit ?",
393
+ "products.confirm_remove_option": "Retirer l'option « {name} » ?",
394
+ "products.confirm_remove_option_all": "Cela supprime les {count} déclinaison(s) avec leurs prix, stocks et UGS.",
395
+ "products.confirm_remove_option_rebuild": "La liste des déclinaisons est reconstruite sans elle — les prix, stocks et UGS des {count} déclinaison(s) actuelles peuvent être perdus.",
396
+ "products.confirm_remove_values": "Retirer {values} ?",
397
+ "products.confirm_remove_values_description": "Cela supprime {count} déclinaison(s). Leurs prix, stocks et UGS seront perdus à l'enregistrement.",
398
+ "products.confirm_remove_values_description_stock": "Cela supprime {count} déclinaison(s) et leurs {stock} unités en stock. Leurs prix, stocks et UGS seront perdus à l'enregistrement.",
399
+ "products.copy_to_selected": "Copier vers la sélection",
400
+ "products.create_named": "Créer « {name} »",
401
+ "products.created": "Produit créé",
402
+ "products.cross_sells": "Ventes croisées",
403
+ "products.cross_sells_hint": "Mis en avant dans le panier à côté de ce produit.",
404
+ "products.cross_sells_placeholder": "Rechercher des produits en vente croisée…",
405
+ "products.date": "Date",
406
+ "products.default": "Par défaut",
407
+ "products.default_value_name": "Valeur {number}",
408
+ "products.delete_count": "Supprimer ({count})",
409
+ "products.delete_product": "Supprimer le produit",
410
+ "products.delete_variants": "Supprimer les déclinaisons",
411
+ "products.deleted": "Produit supprimé",
412
+ "products.deleted_product": "(produit supprimé)",
413
+ "products.description_placeholder": "Description complète du produit (HTML autorisé)",
414
+ "products.dimensions_with_unit": "Dimensions L×l×H ({unit})",
415
+ "products.done": "Terminé",
416
+ "products.download_expiry": "Expiration du téléchargement (jours)",
417
+ "products.download_expiry_hint": "-1 pour aucune expiration.",
418
+ "products.download_limit": "Limite de téléchargements",
419
+ "products.download_limit_hint": "-1 pour des téléchargements illimités.",
420
+ "products.download_name_placeholder": "ex. Manuel d'utilisation",
421
+ "products.downloadable": "Téléchargeable",
422
+ "products.downloadable_files": "Fichiers téléchargeables",
423
+ "products.downloads": "Téléchargements",
424
+ "products.duplicate": "Dupliquer",
425
+ "products.duplicated": "Produit dupliqué",
426
+ "products.empty_create": "Créez votre premier produit pour commencer.",
427
+ "products.empty_search": "Essayez une autre recherche ou un autre filtre.",
428
+ "products.empty_title": "Aucun produit trouvé",
429
+ "products.enable_variant": "Activer {name}",
430
+ "products.enabled": "Activée",
431
+ "products.featured_product": "Produit mis en avant",
432
+ "products.file": "Fichier",
433
+ "products.file_url": "URL du fichier",
434
+ "products.from_price": "à partir de {price}",
435
+ "products.has_variants": "Avec déclinaisons",
436
+ "products.image": "Image",
437
+ "products.linked_products": "Produits liés",
438
+ "products.load_failed": "Impossible de charger le produit",
439
+ "products.low_stock_threshold": "Seuil de stock faible",
440
+ "products.lowest_enabled_variant": "(déclinaison active la moins chère)",
441
+ "products.make_default": "Définir {name} par défaut",
442
+ "products.manage_catalog": "Gérez votre catalogue",
443
+ "products.manage_option_catalog": "Gérer le catalogue d'options (affecte tous les produits)",
444
+ "products.max_one_per_order": "max. 1 par commande",
445
+ "products.modifiers_empty_hint": "Vous voulez que le produit varie selon un critère ? Ajoutez-le comme option dans Prix et stock.",
446
+ "products.modifiers_hint": "Informations descriptives affichées sur la page produit (ex. ingrédients, allergènes, conseils d'entretien).",
447
+ "products.more_fields": "Plus de champs (image, promo, livraison)",
448
+ "products.move_down": "Descendre",
449
+ "products.move_up": "Monter",
450
+ "products.n_deleted": "{count} produit(s) supprimés",
451
+ "products.name_placeholder": "Nom du produit",
452
+ "products.name_required": "Le nom du produit est obligatoire",
453
+ "products.new_option": "Nouvelle option",
454
+ "products.new_option_placeholder": "ex. Matière",
455
+ "products.no_categories": "Aucune catégorie pour l'instant.",
456
+ "products.no_options": "Aucune option pour l'instant.",
457
+ "products.no_parent": "— Aucune —",
458
+ "products.no_title": "(sans titre)",
459
+ "products.no_values": "Aucune valeur pour l'instant.",
460
+ "products.no_variants_description": "Choisissez ci-dessus les valeurs proposées pour ce produit et ses déclinaisons apparaîtront ici automatiquement.",
461
+ "products.no_variants_title": "Aucune déclinaison — les clients ne peuvent pas acheter ce produit",
462
+ "products.not_tracked": "Non suivi — saisissez une quantité pour activer le suivi",
463
+ "products.option_catalog": "Catalogue d'options",
464
+ "products.option_catalog_hint": "Partagé par tous les produits — les modifications sont enregistrées immédiatement. Pour supprimer une option ou une valeur, retirez-la des données de l'entité.",
465
+ "products.options": "Options",
466
+ "products.options_empty": "Aucune option pour l'instant. Ajoutez-en une (Taille, Couleur, Lot…) et choisissez les valeurs proposées pour ce produit.",
467
+ "products.options_hint": "Ce qui distingue les versions de ce produit — chaque combinaison de valeurs devient une déclinaison ci-dessous.",
468
+ "products.order": "Ordre",
469
+ "products.parent": "Parent",
470
+ "products.price": "Prix",
471
+ "products.price_inventory": "Prix et stock",
472
+ "products.product_data": "Données du produit",
473
+ "products.product_gallery": "Galerie du produit",
474
+ "products.product_image": "Image du produit",
475
+ "products.publish": "Publier",
476
+ "products.qty": "Qté",
477
+ "products.quick_edit": "Modification rapide",
478
+ "products.regular_price": "Prix habituel",
479
+ "products.remove_from_product": "Retirer de ce produit",
480
+ "products.remove_option": "Retirer l'option",
481
+ "products.remove_variants": "Retirer les déclinaisons",
482
+ "products.ribbon_create_failed": "Impossible de créer le bandeau",
483
+ "products.ribbon_created": "Bandeau créé",
484
+ "products.ribbons": "Bandeaux",
485
+ "products.sale_end": "Fin de la promo",
486
+ "products.sale_price": "Prix promo",
487
+ "products.sale_start": "Début de la promo",
488
+ "products.saved": "Produit enregistré",
489
+ "products.schedule_sale": "Programmer la promo",
490
+ "products.search_placeholder": "Rechercher des produits…",
491
+ "products.section_files": "Fichiers",
492
+ "products.section_inventory": "Stock",
493
+ "products.section_price": "Prix",
494
+ "products.section_sale": "Promo",
495
+ "products.section_shipping": "Livraison",
496
+ "products.section_type": "Type",
497
+ "products.select_all_variants": "Sélectionner toutes les déclinaisons",
498
+ "products.select_ribbons": "Sélectionner des bandeaux",
499
+ "products.select_variant": "Sélectionner {name}",
500
+ "products.set_price": "Définir le prix",
501
+ "products.set_product_image": "Définir l'image du produit",
502
+ "products.set_stock": "Définir le stock",
503
+ "products.short_description": "Description courte",
504
+ "products.short_description_placeholder": "Résumé court affiché dans les listes",
505
+ "products.single_hint": "Un prix, un stock. Changez si le produit existe en tailles, lots ou couleurs.",
506
+ "products.single_product": "Produit simple",
507
+ "products.sku": "UGS",
508
+ "products.sku_line": "UGS : {sku}",
509
+ "products.sku_placeholder": "Référence unique de stock",
510
+ "products.slug_label": "Slug :",
511
+ "products.sold_individually": "Limiter l'achat à 1 article par commande",
512
+ "products.specifications": "Caractéristiques",
513
+ "products.stock": "Stock",
514
+ "products.stock_dont_track": "Ne pas suivre",
515
+ "products.stock_management": "Gestion du stock",
516
+ "products.stock_quantity": "Quantité en stock",
517
+ "products.stock_same_as_product": "Comme le produit",
518
+ "products.stock_status": "État du stock",
519
+ "products.stock_track_quantity": "Suivre la quantité",
520
+ "products.store_default": "Valeur de la boutique",
521
+ "products.store_price": "Prix en boutique :",
522
+ "products.switch_single_description": "Cela retire {count} déclinaison(s) ainsi que leurs stocks et leurs prix. Le produit conserve un prix et un stock.",
523
+ "products.switch_single_title": "Passer à un produit simple ?",
524
+ "products.tax_group": "Groupe de taxe",
525
+ "products.tax_purchase_rules": "Règles de taxe et d'achat",
526
+ "products.tax_status": "Statut fiscal",
527
+ "products.toggle_featured": "Basculer la mise en avant",
528
+ "products.track_stock_quantity": "Suivre la quantité en stock",
529
+ "products.tracked_quantity": "Quantité suivie",
530
+ "products.updated": "Produit mis à jour",
531
+ "products.upload_file": "Envoyer un fichier",
532
+ "products.upsells": "Montées en gamme",
533
+ "products.upsells_hint": "Recommandé à la place de ce produit, ex. des alternatives supérieures.",
534
+ "products.upsells_placeholder": "Rechercher des produits en montée en gamme…",
535
+ "products.values": "Valeurs",
536
+ "products.values_placeholder": "Valeurs proposées pour ce produit…",
537
+ "products.variant": "Déclinaison",
538
+ "products.variant_count": "{count} déclinaison(s)",
539
+ "products.variants_hint": "Chaque combinaison de valeurs d'options devient une déclinaison avec son propre prix, stock et UGS.",
540
+ "products.virtual": "Virtuel",
541
+ "products.visible": "Visible",
542
+ "products.visible_off": "Masqué — enregistré en brouillon",
543
+ "products.visible_on": "Visible dans la boutique",
544
+ "products.weight_with_unit": "Poids ({unit})",
545
+
546
+ // ── categories ──────────────────────────────────────────────────
547
+ "categories.add": "Ajouter une catégorie",
548
+ "categories.added": "Catégorie ajoutée",
549
+ "categories.confirm_delete_description": "Les produits de cette catégorie ne sont pas supprimés ; ils perdent simplement la catégorie. Cette action est irréversible.",
550
+ "categories.confirm_delete_title": "Supprimer « {name} » ?",
551
+ "categories.deleted": "Catégorie supprimée",
552
+ "categories.description": "Organisez les produits en catégories",
553
+ "categories.empty": "Aucune catégorie pour l'instant — ajoutez la première ci-dessous.",
554
+ "categories.name_placeholder": "Nom de la catégorie",
555
+ "categories.order": "Ordre",
556
+ "categories.saved": "Catégorie enregistrée",
557
+ "categories.slug": "Slug",
558
+ "categories.slug_placeholder": "automatique d'après le nom",
559
+
560
+ // ── reviews ─────────────────────────────────────────────────────
561
+ "reviews.anonymous": "Anonyme",
562
+ "reviews.approve": "Approuver",
563
+ "reviews.author": "Auteur",
564
+ "reviews.auto_approve_label": "Approuver automatiquement les nouveaux avis",
565
+ "reviews.auto_approve_off": "Les nouveaux avis sont retenus pour modération",
566
+ "reviews.auto_approve_on": "Les nouveaux avis sont publiés immédiatement",
567
+ "reviews.confirm_delete_bulk": "Supprimer {count} avis ?",
568
+ "reviews.confirm_delete_description": "Cela supprime définitivement l'avis.",
569
+ "reviews.confirm_delete_one": "Supprimer cet avis ?",
570
+ "reviews.date": "Date",
571
+ "reviews.delete_permanently": "Supprimer définitivement",
572
+ "reviews.deleted": "Avis supprimé",
573
+ "reviews.deleted_plural": "Avis supprimés",
574
+ "reviews.deleted_product": "(produit supprimé)",
575
+ "reviews.edit_review": "Modifier l'avis",
576
+ "reviews.empty_description": "Les avis déposés par les clients apparaîtront ici.",
577
+ "reviews.empty_title": "Aucun avis",
578
+ "reviews.hold": "Mettre en attente",
579
+ "reviews.page_description": "Modérez les avis produits de vos clients",
580
+ "reviews.product": "Produit",
581
+ "reviews.rating": "Note",
582
+ "reviews.rating_only": "Note seule — sans texte",
583
+ "reviews.review": "Avis",
584
+ "reviews.save_failed": "Échec de l'enregistrement",
585
+ "reviews.tab_all": "Tous",
586
+ "reviews.updated": "Avis mis à jour",
587
+ "reviews.updated_plural": "Avis mis à jour",
588
+ "reviews.verified_owner": "✓ Achat vérifié",
589
+
590
+ // ── coupons ─────────────────────────────────────────────────────
591
+ "coupons.allowed_emails": "E-mails autorisés",
592
+ "coupons.allowed_emails_hint": "Seules ces adresses peuvent utiliser le code promo. Laissez vide pour l'ouvrir à tous.",
593
+ "coupons.amount_label": "Montant",
594
+ "coupons.amount_label_percent": "Pourcentage",
595
+ "coupons.amount_required": "Un montant de remise est obligatoire",
596
+ "coupons.any_category": "N'importe quelle catégorie",
597
+ "coupons.any_product": "N'importe quel produit",
598
+ "coupons.apply_all_items": "Appliquer à tous les articles éligibles",
599
+ "coupons.code": "Code",
600
+ "coupons.code_placeholder": "ex. ETE20",
601
+ "coupons.code_required": "Un code promo est obligatoire",
602
+ "coupons.confirm_delete_description": "Les clients ne pourront plus l'utiliser. Cette action est irréversible.",
603
+ "coupons.confirm_delete_many": "Supprimer {count} code(s) promo ?",
604
+ "coupons.confirm_delete_one": "Supprimer ce code promo ?",
605
+ "coupons.coupon_code": "Code promo",
606
+ "coupons.coupon_expiry_date": "Date d'expiration du code promo",
607
+ "coupons.create": "Créer un code promo",
608
+ "coupons.delete_selected": "Supprimer la sélection ({count})",
609
+ "coupons.deleted": "Code promo supprimé",
610
+ "coupons.description_optional": "Description (facultative)",
611
+ "coupons.disabled": "Désactivé",
612
+ "coupons.disabled_hint": "Désactivé — les clients ne peuvent pas appliquer ce code promo, et les paniers qui le contiennent le perdent.",
613
+ "coupons.discount_type": "Type de remise",
614
+ "coupons.email_chips_placeholder": "email@example.com ou *@example.com — appuyez sur Entrée",
615
+ "coupons.empty_description": "Les codes promo vous permettent d'offrir des remises au paiement.",
616
+ "coupons.empty_title": "Aucun code promo",
617
+ "coupons.enabled": "Activé",
618
+ "coupons.exclude_categories": "Exclure des catégories",
619
+ "coupons.exclude_products": "Exclure des produits",
620
+ "coupons.exclude_sale_items": "Exclure les articles en promo",
621
+ "coupons.exclude_sale_items_hint": "Le code promo ne s'appliquera pas aux articles en promotion.",
622
+ "coupons.expiry_date": "Date d'expiration",
623
+ "coupons.free_shipping": "Autoriser la livraison gratuite",
624
+ "coupons.free_shipping_hint": "Donne accès aux modes de livraison gratuits qui exigent un code promo.",
625
+ "coupons.general": "Général",
626
+ "coupons.generate": "Générer",
627
+ "coupons.individual_use": "Utilisation seule",
628
+ "coupons.individual_use_hint": "Ne peut pas être cumulé avec d'autres codes promo.",
629
+ "coupons.limit_usage_items": "Limiter à X articles",
630
+ "coupons.limit_usage_items_hint": "Nombre maximal d'articles auxquels le code promo s'applique (remises par produit).",
631
+ "coupons.maximum_spend": "Montant maximum ({code})",
632
+ "coupons.minimum_spend": "Montant minimum ({code})",
633
+ "coupons.n_deleted": "{count} code(s) promo supprimés",
634
+ "coupons.no_exclusions": "Aucune exclusion",
635
+ "coupons.no_maximum": "Aucun maximum",
636
+ "coupons.no_minimum": "Aucun minimum",
637
+ "coupons.product_categories": "Catégories de produits",
638
+ "coupons.publish": "Publier",
639
+ "coupons.save": "Enregistrer le code promo",
640
+ "coupons.saved": "Code promo enregistré",
641
+ "coupons.search_placeholder": "Rechercher des codes promo…",
642
+ "coupons.subtitle": "Créez et gérez vos codes de remise.",
643
+ "coupons.title_with_code": "Code promo : {code}",
644
+ "coupons.unlimited": "Illimité",
645
+ "coupons.usage_limit_col": "Utilisations / Limite",
646
+ "coupons.usage_limit_per_coupon": "Limite d'utilisation par code promo",
647
+ "coupons.usage_limit_per_coupon_hint": "Combien de fois le code promo peut être utilisé au total.",
648
+ "coupons.usage_limit_per_user": "Limite d'utilisation par client",
649
+ "coupons.usage_limit_per_user_hint": "Combien de fois un même client (selon l'e-mail de facturation) peut l'utiliser.",
650
+ "coupons.usage_limits": "Limites d'utilisation",
651
+ "coupons.usage_restriction": "Restriction d'utilisation",
652
+ "coupons.used_times": "Utilisé : {count}",
653
+
654
+ // ── customers ───────────────────────────────────────────────────
655
+ "customers.account": "Compte",
656
+ "customers.average_order_value": "Panier moyen",
657
+ "customers.billing_address": "Adresse de facturation",
658
+ "customers.confirm_delete_description": "Ses commandes sont conservées et réattribuées à Invité. Cette action est irréversible.",
659
+ "customers.confirm_delete_title": "Supprimer ce client ?",
660
+ "customers.copied_from_billing": "Copié depuis la facturation",
661
+ "customers.copy_from_billing": "Copier depuis la facturation",
662
+ "customers.create": "Créer un client",
663
+ "customers.custom_fields": "Champs personnalisés",
664
+ "customers.deleted": "Client supprimé",
665
+ "customers.email_address_required": "Adresse e-mail *",
666
+ "customers.email_required": "Une adresse e-mail est obligatoire",
667
+ "customers.email_username": "E-mail / Identifiant",
668
+ "customers.empty_description": "Les clients apparaissent ici après leur commande ou lorsque vous les ajoutez manuellement.",
669
+ "customers.empty_title": "Aucun client pour l'instant",
670
+ "customers.guest_badge": "Invité",
671
+ "customers.invite_sent": "Invitation envoyée",
672
+ "customers.location": "Localisation",
673
+ "customers.no_orders_yet": "Aucune commande pour l'instant.",
674
+ "customers.paying_customer": "Client payant ✓",
675
+ "customers.recalculate": "Recalculer",
676
+ "customers.recent_orders": "Commandes récentes",
677
+ "customers.save": "Enregistrer le client",
678
+ "customers.saved": "Client enregistré",
679
+ "customers.search_placeholder": "Rechercher par nom, e-mail ou identifiant…",
680
+ "customers.send_invite": "Envoyer une invitation de compte au nouvel utilisateur",
681
+ "customers.shipping_address": "Adresse de livraison",
682
+ "customers.stats": "Statistiques",
683
+ "customers.stats_recalculated": "Statistiques recalculées",
684
+ "customers.subtitle": "Clients enregistrés et invités du tunnel de commande.",
685
+ "customers.total_spend": "Total dépensé",
686
+ "customers.username": "Identifiant",
687
+
688
+ // ── reports ─────────────────────────────────────────────────────
689
+ "reports.attributes": "Attributs",
690
+ "reports.coupons_by_type": "Codes promo par type",
691
+ "reports.discounted": "Remisé",
692
+ "reports.empty_no_sales": "Aucune vente sur cette période",
693
+ "reports.gross_sales": "Ventes brutes",
694
+ "reports.items_sold": "Articles vendus",
695
+ "reports.net_revenue": "Revenu net",
696
+ "reports.net_sales": "Ventes nettes",
697
+ "reports.no_sales_in_period": "Aucune vente sur cette période.",
698
+ "reports.orders_by_status": "Commandes par statut",
699
+ "reports.product": "Produit",
700
+ "reports.products_by_status": "Produits par statut",
701
+ "reports.quantity": "Quantité",
702
+ "reports.quantity_sold": "Quantité vendue",
703
+ "reports.reviews_by_status": "Avis par statut",
704
+ "reports.ribbons": "Bandeaux",
705
+ "reports.shipping": "Livraison",
706
+ "reports.subtitle": "Performances des ventes et totaux de la boutique.",
707
+ "reports.tab_sales": "Ventes",
708
+ "reports.tab_top_sellers": "Meilleures ventes",
709
+ "reports.tab_totals": "Totaux",
710
+ "reports.top_sellers_by_quantity": "Meilleures ventes par quantité",
711
+
712
+ // ── settings ────────────────────────────────────────────────────
713
+ "settings.description": "Configurez le fonctionnement de votre boutique.",
714
+ "settings.emails.additional_content": "Contenu supplémentaire",
715
+ "settings.emails.additional_content_placeholder": "Texte ajouté sous le corps de l'e-mail.",
716
+ "settings.emails.admin": "Admin",
717
+ "settings.emails.admin_recipients": "Destinataires des notifications d'administration",
718
+ "settings.emails.admin_users_fallback": "les utilisateurs administrateurs de votre application",
719
+ "settings.emails.default_placeholder": "Laissez vide pour la valeur par défaut",
720
+ "settings.emails.done": "Terminé",
721
+ "settings.emails.enabled": "Activé",
722
+ "settings.emails.heading": "Titre de l'e-mail",
723
+ "settings.emails.manage": "Gérer",
724
+ "settings.emails.managed_by_auth": "Géré par Base44 Auth",
725
+ "settings.emails.manual": "Manuel",
726
+ "settings.emails.no_admin_warning": "Aucun utilisateur de l'application n'a le rôle administrateur : laisser ce champ vide fait que ces e-mails ne partent nulle part.",
727
+ "settings.emails.notifications": "Notifications par e-mail",
728
+ "settings.emails.notifications_description": "Activez, désactivez et personnalisez chaque e-mail transactionnel, y compris les alertes de stock faible et de rupture.",
729
+ "settings.emails.placeholders_hint": "Variables disponibles : {order_number}, {customer_name}, {store_name}, {order_total}",
730
+ "settings.emails.recipient": "Destinataire",
731
+ "settings.emails.recipient_override_hint": "Séparés par des virgules. Remplace les destinataires d'administration ci-dessus pour cet e-mail uniquement.",
732
+ "settings.emails.recipient_placeholder": "Laissez vide pour utiliser les destinataires d'administration par défaut",
733
+ "settings.emails.recipients_hint": "Laissez vide pour notifier {users}.",
734
+ "settings.emails.recipients_label": "Destinataire(s)",
735
+ "settings.emails.recipients_placeholder": "admin@example.com, ops@example.com",
736
+ "settings.emails.sender_options": "Options d'expéditeur",
737
+ "settings.emails.sender_options_description": "Comment les e-mails transactionnels sont nommés et qui reçoit les copies d'administration. L'adresse d'envoi est définie par votre configuration e-mail Base44, pas ici.",
738
+ "settings.emails.sent_to_admin": "Envoyés à l'administrateur de la boutique",
739
+ "settings.emails.sent_to_customer": "Envoyés au client",
740
+ "settings.emails.store_name_hint": "Envoyé sous « {name} » dans l'objet et comme nom d'expéditeur de chaque e-mail transactionnel.",
741
+ "settings.emails.subject": "Objet",
742
+ "settings.emails.type_email_title": "E-mail « {type} »",
743
+ "settings.emails.your_store": "Votre boutique",
744
+ "settings.general.checkout": "Paiement",
745
+ "settings.general.checkout_description": "Où les clients arrivent après avoir payé.",
746
+ "settings.general.currency": "Devise",
747
+ "settings.general.currency_description": "Tous les prix de la boutique sont stockés et affichés dans cette devise.",
748
+ "settings.general.dimension_unit": "Unité de dimensions",
749
+ "settings.general.measurements": "Mesures",
750
+ "settings.general.measurements_description": "Unités utilisées pour le poids et les dimensions des produits.",
751
+ "settings.general.payment_return_path": "Chemin de retour après paiement",
752
+ "settings.general.payment_return_path_hint": "La route de la boutique vers laquelle les clients reviennent après avoir payé, sur l'adresse de votre propre boutique. Elle doit correspondre à la page que vous avez créée : un chemin incorrect envoie les clients qui paient vers une erreur 404.",
753
+ "settings.general.weight_unit": "Unité de poids",
754
+ "settings.inventory.description": "Valeurs par défaut de gestion du stock pour les produits qui suivent leur inventaire.",
755
+ "settings.inventory.hide_out_of_stock": "Masquer du catalogue les articles en rupture",
756
+ "settings.inventory.hide_out_of_stock_hint": "Les API de la boutique excluront des listes les produits en rupture de stock.",
757
+ "settings.inventory.hold_stock": "Réserver le stock (minutes)",
758
+ "settings.inventory.hold_stock_hint": "Réserve le stock des commandes impayées pendant ce nombre de minutes. À l'expiration, la commande en attente est annulée et son stock libéré. La libération s'exécute de façon opportuniste — voir references/operations.md dans la skill commerce.",
759
+ "settings.inventory.low_stock_threshold": "Seuil de stock faible",
760
+ "settings.inventory.manage_stock": "Gérer le stock",
761
+ "settings.inventory.manage_stock_hint": "Active la gestion du stock pour toute la boutique.",
762
+ "settings.inventory.out_of_stock_threshold": "Seuil de rupture de stock",
763
+ "settings.inventory.visibility": "Visibilité",
764
+ "settings.location.add_rate": "Ajouter un tarif",
765
+ "settings.location.add_region": "Ajouter une région",
766
+ "settings.location.add_tax_group": "Ajouter un groupe de taxe",
767
+ "settings.location.continent": "Continent",
768
+ "settings.location.cost": "Coût",
769
+ "settings.location.created": "Zone créée",
770
+ "settings.location.default_group_hint": "Groupe par défaut — les produits sans groupe de taxe utilisent celui-ci",
771
+ "settings.location.delivery_option": "Option de livraison",
772
+ "settings.location.edit_location": "Modifier la zone",
773
+ "settings.location.exact_amount": "Montant exact",
774
+ "settings.location.free_over": "Gratuit à partir de",
775
+ "settings.location.free_over_title": "Sous-total des articles (après remises) à partir duquel ce tarif devient gratuit",
776
+ "settings.location.group_name_placeholder": "Nom du groupe",
777
+ "settings.location.header_description": "Gérez où vous vendez, ainsi que la livraison et les taxes qui s'y appliquent.",
778
+ "settings.location.load_failed": "Impossible de charger la zone",
779
+ "settings.location.match_order": "Ordre de correspondance",
780
+ "settings.location.name_placeholder": "ex. France",
781
+ "settings.location.name_required": "Le nom de la zone est obligatoire",
782
+ "settings.location.never": "Jamais",
783
+ "settings.location.no_tax_rates": "Aucun taux de taxe pour les articles {name}.",
784
+ "settings.location.no_tax_rates_default": "Aucun taux de taxe — ces articles ne sont pas taxés ici.",
785
+ "settings.location.no_tax_rates_unnamed": "Aucun taux de taxe pour ces articles.",
786
+ "settings.location.not_taxed": "Non taxé",
787
+ "settings.location.rate_name_placeholder": "ex. Livraison standard",
788
+ "settings.location.rate_percent": "Taux %",
789
+ "settings.location.rate_placeholder": "Nom du taux — ex. TVA, taxe de vente",
790
+ "settings.location.rates_hint": "Tarifs proposés au paiement pour les commandes livrées dans cette zone.",
791
+ "settings.location.regions_hint": "Laissez les régions vides pour faire de cette zone celle qui capte toutes les adresses qu'aucune autre ne couvre.",
792
+ "settings.location.save_failed": "Impossible d'enregistrer la zone",
793
+ "settings.location.saved": "Zone enregistrée",
794
+ "settings.location.select_continent": "Sélectionnez un continent…",
795
+ "settings.location.state": "Région",
796
+ "settings.location.state_placeholder": "PAYS:RÉGION — ex. US:CA",
797
+ "settings.location.tax_example": "Exemple : {base} dans le groupe Products à 18 % génère {tax} de taxe.",
798
+ "settings.location.tax_group": "Groupe de taxe",
799
+ "settings.location.tax_hint": "S'applique aux articles {group}.",
800
+ "settings.location.tax_on_shipping": "Taxe sur la livraison",
801
+ "settings.location.tax_on_shipping_hint": "Appliquée au coût de livraison dans cette zone — indépendamment des groupes de produits ci-dessus.",
802
+ "settings.payments.account_n": "Compte",
803
+ "settings.payments.account_name": "Titulaire du compte",
804
+ "settings.payments.account_number": "Numéro de compte",
805
+ "settings.payments.add_account": "Ajouter un compte",
806
+ "settings.payments.add_method": "Ajouter un moyen de paiement",
807
+ "settings.payments.added": "Moyen de paiement ajouté",
808
+ "settings.payments.bank_details": "Coordonnées bancaires",
809
+ "settings.payments.bank_name": "Nom de la banque",
810
+ "settings.payments.bank_none": "Aucune pour l'instant — cela convient au paiement à la livraison ; ajoutez-en une pour le virement.",
811
+ "settings.payments.bic": "BIC / Swift",
812
+ "settings.payments.checkout_options": "Options de paiement",
813
+ "settings.payments.checkout_options_description": "Les moyens de paiement que les clients peuvent choisir au paiement, dans cet ordre, et le libellé qu'ils voient. Tous les moyens sauf la carte bancaire se règlent en dehors de la boutique : la commande passe en attente avec la description du moyen comme instructions, et vous la faites avancer une fois payée.",
814
+ "settings.payments.delete_confirm": "Supprimer le moyen de paiement « {title} » ?",
815
+ "settings.payments.delete_failed": "Échec de la suppression",
816
+ "settings.payments.deleted": "Moyen de paiement supprimé",
817
+ "settings.payments.description_hint": "Également affiché comme instructions de paiement une fois la commande passée.",
818
+ "settings.payments.iban": "IBAN",
819
+ "settings.payments.reorder_failed": "Échec de la réorganisation",
820
+ "settings.payments.saved": "Moyen de paiement enregistré",
821
+ "settings.payments.sort_code": "Code guichet",
822
+ "settings.payments.title_hint": "Affiché aux clients pendant le paiement.",
823
+ "settings.payments.title_label": "Libellé",
824
+ "settings.payments.title_required": "Donnez un libellé au moyen de paiement",
825
+ "settings.payments.update_failed": "Impossible de mettre à jour la passerelle",
826
+ "settings.save_changes": "Enregistrer les modifications",
827
+ "settings.save_failed": "Échec de l'enregistrement",
828
+ "settings.save_settings_failed": "Impossible d'enregistrer les paramètres",
829
+ "settings.saved": "Paramètres enregistrés",
830
+ "settings.shipping.add_location": "Ajouter une zone",
831
+ "settings.shipping.charge_shipping": "Facturer la livraison",
832
+ "settings.shipping.charge_shipping_hint": "Désactivé signifie que les paniers n'ont jamais d'étape de livraison — pour les boutiques entièrement virtuelles.",
833
+ "settings.shipping.clone": "Dupliquer",
834
+ "settings.shipping.clone_failed": "Impossible de dupliquer la zone",
835
+ "settings.shipping.copy_name": "{name} (copie)",
836
+ "settings.shipping.delete_confirm_description": "Les commandes déjà passées conservent leurs frais ; les paniers livrés dans cette zone perdent leurs options.",
837
+ "settings.shipping.delete_confirm_title": "Supprimer « {name} » ?",
838
+ "settings.shipping.delete_failed": "Impossible de supprimer la zone",
839
+ "settings.shipping.disabled_toast": "Livraison désactivée",
840
+ "settings.shipping.empty_description": "Ajoutez une zone pour définir où vous livrez et quelle taxe s'applique.",
841
+ "settings.shipping.empty_title": "Aucune zone pour l'instant",
842
+ "settings.shipping.enabled_toast": "Livraison activée",
843
+ "settings.shipping.everywhere_else": "Partout ailleurs (par défaut)",
844
+ "settings.shipping.location": "Zone",
845
+ "settings.shipping.location_cloned": "Zone dupliquée",
846
+ "settings.shipping.location_deleted": "Zone supprimée",
847
+ "settings.shipping.locations_intro": "Une zone couvre les régions qu'elle nomme ; la zone sans région capte tous les autres. Chacune a ses propres tarifs de livraison et ses propres taxes.",
848
+ "settings.shipping.no_rates": "aucun — rien n'est livré ici",
849
+ "settings.shipping.no_tax": "aucune taxe",
850
+ "settings.shipping.rate_fallback": "Tarif",
851
+ "settings.shipping.regions": "Régions",
852
+ "settings.shipping.shipping_amount": "Livraison {amount}",
853
+ "settings.shipping.shipping_rates": "Tarifs de livraison",
854
+ "settings.shipping.tax": "Taxe",
855
+
856
+ // ── webhooks ────────────────────────────────────────────────────
857
+ "webhooks.api_version": "Version de l'API",
858
+ "webhooks.create": "Créer le webhook",
859
+ "webhooks.created": "Créé le",
860
+ "webhooks.created_toast": "Webhook créé",
861
+ "webhooks.delete_confirm": "Supprimer le webhook ?",
862
+ "webhooks.delete_failed": "Échec de la suppression",
863
+ "webhooks.deleted": "Webhook supprimé",
864
+ "webhooks.delivery_url": "URL de livraison",
865
+ "webhooks.description": "Prévenez des services externes lorsque des événements surviennent dans la boutique.",
866
+ "webhooks.details": "Détails du webhook",
867
+ "webhooks.edit_title": "Modifier le webhook",
868
+ "webhooks.empty_description": "Créez un webhook pour envoyer en POST les données d'événements vers une URL externe.",
869
+ "webhooks.empty_title": "Aucun webhook",
870
+ "webhooks.failures": "Échecs",
871
+ "webhooks.generate": "Générer",
872
+ "webhooks.load_failed": "Impossible de charger le webhook",
873
+ "webhooks.name_url_required": "Le nom et l'URL de livraison sont obligatoires",
874
+ "webhooks.no_deliveries": "Aucune livraison pour l'instant.",
875
+ "webhooks.recent_deliveries": "Livraisons récentes",
876
+ "webhooks.redeliver": "Renvoyer",
877
+ "webhooks.redelivered": "Renvoyé",
878
+ "webhooks.request": "Requête",
879
+ "webhooks.response": "Réponse",
880
+ "webhooks.save_failed": "Impossible d'enregistrer le webhook",
881
+ "webhooks.saved": "Webhook enregistré",
882
+ "webhooks.secret": "Secret",
883
+ "webhooks.secret_placeholder": "Sert à signer la charge utile (HMAC-SHA256)",
884
+ "webhooks.send_test": "Envoyer un test",
885
+ "webhooks.test_delivered": "Test livré",
886
+ "webhooks.test_delivered_code": "Test livré — HTTP {code}",
887
+ "webhooks.topic": "Sujet",
888
+
889
+ // ── StoreAdmin bot ──────────────────────────────────────────────
890
+ "bot.error_reach": "Impossible de joindre StoreAdmin",
891
+ "bot.input_placeholder": "ex. Affiche les commandes en attente sous forme de tableau",
892
+ "bot.intro": "Posez-moi n'importe quelle question sur votre boutique — je peux consulter les données et faire des modifications pour vous.",
893
+ "bot.new_chat": "Nouvelle conversation",
894
+ "bot.title": "StoreAdmin",
895
+ "bot.working": "En cours…",
896
+ };