@salifbiaye/create-boutique 0.5.0 → 0.7.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.
- package/cli/dist/code.js +110 -0
- package/cli/dist/commands.js +241 -17
- package/cli/dist/create.js +108 -15
- package/cli/dist/generate.js +108 -39
- package/cli/dist/guide.js +12 -4
- package/cli/dist/index.js +38 -7
- package/cli/dist/payments.js +150 -0
- package/cli/dist/project.js +42 -3
- package/docs/fiche-client.en.html +2 -2
- package/docs/fiche-client.html +2 -2
- package/docs/guide-complet.fr.html +681 -256
- package/docs/guide-images/categories.jpg +0 -0
- package/docs/guide-images/clients.jpg +0 -0
- package/docs/guide-images/collections.jpg +0 -0
- package/docs/guide-images/commande-detail.jpg +0 -0
- package/docs/guide-images/commande-expedier.jpg +0 -0
- package/docs/guide-images/commande-menu.jpg +0 -0
- package/docs/guide-images/commande-paiement.jpg +0 -0
- package/docs/guide-images/commandes-liste.jpg +0 -0
- package/docs/guide-images/connexion.jpg +0 -0
- package/docs/guide-images/groupes-clients.jpg +0 -0
- package/docs/guide-images/inventaire.jpg +0 -0
- package/docs/guide-images/listes-prix.jpg +0 -0
- package/docs/guide-images/menu.jpg +0 -0
- package/docs/guide-images/mes-boutiques-fermer.jpg +0 -0
- package/docs/guide-images/mes-boutiques-panneau.jpg +0 -0
- package/docs/guide-images/mes-boutiques.jpg +0 -0
- package/docs/guide-images/parametres-boutique.jpg +0 -0
- package/docs/guide-images/parametres-canaux.jpg +0 -0
- package/docs/guide-images/parametres-emplacements.jpg +0 -0
- package/docs/guide-images/parametres-profil.jpg +0 -0
- package/docs/guide-images/parametres-regions.jpg +0 -0
- package/docs/guide-images/parametres-utilisateurs.jpg +0 -0
- package/docs/guide-images/produit-creer-details.jpg +0 -0
- package/docs/guide-images/produit-detail.jpg +0 -0
- package/docs/guide-images/produit-variantes-menu.jpg +0 -0
- package/docs/guide-images/produit-variantes.jpg +0 -0
- package/docs/guide-images/produits-liste.jpg +0 -0
- package/docs/guide-images/promotion-details.jpg +0 -0
- package/docs/guide-images/promotion-type.jpg +0 -0
- package/docs/guide-images/promotions-liste.jpg +0 -0
- package/docs/guide-images/site-boutique.jpg +0 -0
- package/docs/guide-images/site-fermee.png +0 -0
- package/docs/guide-images/vue-ensemble.jpg +0 -0
- package/package.json +3 -2
- package/templates/backend/medusa-config.ts +31 -25
- package/templates/backend/package-lock.json +21 -0
- package/templates/backend/package.json +2 -0
- package/templates/backend/src/admin/i18n/json/en.json +63 -5
- package/templates/backend/src/admin/i18n/json/fr.json +63 -5
- package/templates/backend/src/admin/routes/boutique-campaigns/campaign-drawer.tsx +29 -17
- package/templates/backend/src/admin/routes/boutique-campaigns/page.tsx +84 -6
- package/templates/backend/src/admin/routes/reviews/page.tsx +259 -0
- package/templates/backend/src/api/admin/active-boutique/route.ts +25 -0
- package/templates/backend/src/api/admin/boutique-campaigns/[salesChannelId]/route.ts +7 -1
- package/templates/backend/src/api/admin/boutique-campaigns/route.ts +9 -1
- package/templates/backend/src/api/admin/boutique-online/[salesChannelId]/route.ts +22 -0
- package/templates/backend/src/api/admin/reviews/[id]/route.ts +15 -0
- package/templates/backend/src/api/admin/reviews/route.ts +47 -0
- package/templates/backend/src/api/middlewares.ts +9 -0
- package/templates/backend/src/api/store/campaign/route.ts +5 -1
- package/templates/backend/src/api/store/reviews/latest/route.ts +39 -0
- package/templates/backend/src/api/store/reviews/order/route.ts +36 -0
- package/templates/backend/src/api/store/reviews/route.ts +43 -0
- package/templates/backend/src/api/store/reviews/summary/route.ts +28 -0
- package/templates/backend/src/emails/en.json +3 -1
- package/templates/backend/src/emails/fr.json +3 -1
- package/templates/backend/src/lib/active.ts +41 -0
- package/templates/backend/src/lib/email-config.ts +14 -0
- package/templates/backend/src/lib/emails.ts +9 -0
- package/templates/backend/src/lib/notify.ts +14 -8
- package/templates/backend/src/lib/payment-config.ts +66 -0
- package/templates/backend/src/lib/project.ts +38 -1
- package/templates/backend/src/lib/redirect-payment.ts +264 -0
- package/templates/backend/src/lib/review-token.ts +40 -0
- package/templates/backend/src/lib/reviews.ts +25 -0
- package/templates/backend/src/modules/naboopay/index.ts +6 -0
- package/templates/backend/src/modules/naboopay/service.ts +92 -0
- package/templates/backend/src/modules/paydunya/index.ts +6 -0
- package/templates/backend/src/modules/paydunya/service.ts +89 -0
- package/templates/backend/src/modules/paytech/index.ts +6 -0
- package/templates/backend/src/modules/paytech/service.ts +114 -0
- package/templates/backend/src/modules/product-review/index.ts +8 -0
- package/templates/backend/src/modules/product-review/migrations/Migration20261001090000.ts +18 -0
- package/templates/backend/src/modules/product-review/models/review.ts +25 -0
- package/templates/backend/src/modules/product-review/service.ts +6 -0
- package/templates/backend/src/modules/product-review/validators.ts +27 -0
- package/templates/backend/src/modules/smtp/index.ts +6 -0
- package/templates/backend/src/modules/smtp/service.ts +73 -0
- package/templates/backend/src/scripts/rewrite-file-urls.ts +56 -0
- package/templates/backend/src/scripts/seed.ts +60 -36
- package/templates/backend/src/subscribers/fulfillment-emails.ts +1 -1
- package/templates/backend/src/workflows/reviews.ts +21 -0
- package/templates/backend/src/workflows/steps/create-review.ts +52 -0
- package/templates/backend/src/workflows/steps/update-review.ts +36 -0
- package/templates/storefront/PERSONNALISER.md +134 -0
- package/templates/storefront/locales/en.json +198 -11
- package/templates/storefront/locales/fr.json +198 -11
- package/templates/storefront/public/custom/LISEZMOI.txt +2 -0
- package/templates/storefront/src/app/(checkout)/layout.tsx +1 -1
- package/templates/storefront/src/app/(main)/layout.tsx +8 -1
- package/templates/storefront/src/app/(main)/legal/[page]/page.tsx +42 -7
- package/templates/storefront/src/app/(main)/page.tsx +149 -4
- package/templates/storefront/src/app/(main)/products/[handle]/page.tsx +4 -1
- package/templates/storefront/src/app/(main)/review/page.tsx +60 -0
- package/templates/storefront/src/app/(main)/store/page.tsx +3 -1
- package/templates/storefront/src/app/(main)/template.tsx +17 -2
- package/templates/storefront/src/app/layout.tsx +13 -1
- package/templates/storefront/src/lib/boutique/campaign.ts +5 -1
- package/templates/storefront/src/lib/boutique/config.ts +71 -23
- package/templates/storefront/src/lib/boutique/page-name.ts +25 -0
- package/templates/storefront/src/lib/boutique/schema.ts +7 -2
- package/templates/storefront/src/lib/config.ts +37 -8
- package/templates/storefront/src/lib/constants.tsx +17 -0
- package/templates/storefront/src/lib/data/cart.ts +4 -1
- package/templates/storefront/src/lib/data/cookies.ts +14 -2
- package/templates/storefront/src/lib/data/review-actions.ts +28 -0
- package/templates/storefront/src/lib/data/reviews.ts +64 -0
- package/templates/storefront/src/modules/checkout/components/payment/index.tsx +26 -4
- package/templates/storefront/src/modules/checkout/components/payment-button/index.tsx +85 -2
- package/templates/storefront/src/modules/checkout/components/shipping-address/index.tsx +6 -1
- package/templates/storefront/src/modules/products/templates/index.tsx +5 -0
- package/templates/storefront/src/modules/store/components/shop-search.tsx +85 -0
- package/templates/storefront/src/modules/store/templates/index.tsx +16 -8
- package/templates/storefront/src/modules/store/templates/paginated-products.tsx +15 -3
- package/templates/storefront/src/modules/ub/album.tsx +2 -0
- package/templates/storefront/src/modules/ub/arena.tsx +182 -0
- package/templates/storefront/src/modules/ub/campaign-blocks.tsx +3 -2
- package/templates/storefront/src/modules/ub/campaign-ended.tsx +27 -13
- package/templates/storefront/src/modules/ub/cinema.tsx +2 -0
- package/templates/storefront/src/modules/ub/cookie-banner.tsx +62 -0
- package/templates/storefront/src/modules/ub/gala.tsx +2 -0
- package/templates/storefront/src/modules/ub/grimoire.tsx +35 -8
- package/templates/storefront/src/modules/ub/harvest.tsx +2 -1
- package/templates/storefront/src/modules/ub/hero-image.tsx +14 -0
- package/templates/storefront/src/modules/ub/home-kit.ts +45 -0
- package/templates/storefront/src/modules/ub/lantern.tsx +244 -0
- package/templates/storefront/src/modules/ub/locker.tsx +180 -0
- package/templates/storefront/src/modules/ub/mosaic.tsx +189 -0
- package/templates/storefront/src/modules/ub/nav.tsx +8 -5
- package/templates/storefront/src/modules/ub/review-form.tsx +62 -0
- package/templates/storefront/src/modules/ub/reviews.tsx +131 -0
- package/templates/storefront/src/modules/ub/riviera.tsx +175 -0
- package/templates/storefront/src/modules/ub/souk.tsx +214 -0
- package/templates/storefront/src/modules/ub/sunset-checklist.tsx +95 -0
- package/templates/storefront/src/modules/ub/sunset.tsx +164 -0
- package/templates/storefront/src/modules/ub/tech.tsx +2 -2
- package/templates/storefront/src/modules/ub/training.tsx +196 -0
- package/templates/storefront/src/proxy.ts +4 -1
- package/templates/storefront/src/styles/custom.css +26 -0
- package/templates/storefront/src/styles/ub/album.css +1 -1
- package/templates/storefront/src/styles/ub/arena.css +120 -0
- package/templates/storefront/src/styles/ub/cinema.css +1 -1
- package/templates/storefront/src/styles/ub/gala.css +1 -1
- package/templates/storefront/src/styles/ub/grimoire.css +23 -7
- package/templates/storefront/src/styles/ub/harvest.css +7 -6
- package/templates/storefront/src/styles/ub/lantern.css +157 -0
- package/templates/storefront/src/styles/ub/locker.css +115 -0
- package/templates/storefront/src/styles/ub/media.css +10 -0
- package/templates/storefront/src/styles/ub/mosaic.css +118 -0
- package/templates/storefront/src/styles/ub/motion.css +0 -2
- package/templates/storefront/src/styles/ub/overrides.css +10 -0
- package/templates/storefront/src/styles/ub/pages.css +176 -0
- package/templates/storefront/src/styles/ub/reviews.css +85 -0
- package/templates/storefront/src/styles/ub/riviera.css +103 -0
- package/templates/storefront/src/styles/ub/souk.css +144 -0
- package/templates/storefront/src/styles/ub/sunset.css +123 -0
- package/templates/storefront/src/styles/ub/tech.css +5 -8
- package/templates/storefront/src/styles/ub/training.css +120 -0
- package/templates/storefront/themes/jeux/campaign.en.json +31 -0
- package/templates/storefront/themes/jeux/campaign.fr.json +31 -0
- package/templates/storefront/themes/jeux/theme.json +11 -0
- package/templates/storefront/themes/jeux-2/campaign.en.json +31 -0
- package/templates/storefront/themes/jeux-2/campaign.fr.json +31 -0
- package/templates/storefront/themes/jeux-2/theme.json +11 -0
- package/templates/storefront/themes/mubarak/campaign.en.json +31 -0
- package/templates/storefront/themes/mubarak/campaign.fr.json +31 -0
- package/templates/storefront/themes/mubarak/theme.json +11 -0
- package/templates/storefront/themes/mubarak-2/campaign.en.json +31 -0
- package/templates/storefront/themes/mubarak-2/campaign.fr.json +31 -0
- package/templates/storefront/themes/mubarak-2/theme.json +11 -0
- package/templates/storefront/themes/sport/campaign.en.json +31 -0
- package/templates/storefront/themes/sport/campaign.fr.json +31 -0
- package/templates/storefront/themes/sport/theme.json +11 -0
- package/templates/storefront/themes/sport-2/campaign.en.json +31 -0
- package/templates/storefront/themes/sport-2/campaign.fr.json +31 -0
- package/templates/storefront/themes/sport-2/theme.json +11 -0
- package/templates/storefront/themes/summer/campaign.en.json +31 -0
- package/templates/storefront/themes/summer/campaign.fr.json +31 -0
- package/templates/storefront/themes/summer/theme.json +11 -0
- package/templates/storefront/themes/summer-2/campaign.en.json +31 -0
- package/templates/storefront/themes/summer-2/campaign.fr.json +31 -0
- package/templates/storefront/themes/summer-2/theme.json +11 -0
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"hero.trust.shipping": "Free Shipping",
|
|
14
14
|
"hero.trust.shippingSub": "On eligible orders",
|
|
15
15
|
"hero.trust.secure": "Secure Payment",
|
|
16
|
-
"hero.trust.secureSub": "Encrypted
|
|
16
|
+
"hero.trust.secureSub": "Encrypted payment",
|
|
17
17
|
"hero.trust.returns": "Easy Returns",
|
|
18
18
|
"hero.trust.returnsSub": "Hassle free",
|
|
19
19
|
"countdown.label": "Offer ends in",
|
|
@@ -52,12 +52,12 @@
|
|
|
52
52
|
"pdp.trust.warranty": "2-Year Warranty",
|
|
53
53
|
"pdp.faq": "Frequently asked questions",
|
|
54
54
|
"pdp.faq.q1": "Which payment methods do you accept?",
|
|
55
|
-
"pdp.faq.a1": "
|
|
55
|
+
"pdp.faq.a1": "Card, Wave, Orange Money and the other methods shown at checkout, processed by our secure payment partners.",
|
|
56
56
|
"pdp.faq.q2": "How long does delivery take?",
|
|
57
57
|
"pdp.faq.a2": "Shipping options and delivery times are shown at checkout.",
|
|
58
58
|
"pdp.faq.q3": "Can I return my order?",
|
|
59
59
|
"pdp.faq.a3": "Yes, you have 30 days to return an item in its original condition.",
|
|
60
|
-
"footer.tagline": "
|
|
60
|
+
"footer.tagline": "Carefully chosen products, shipped with care. 100% secure payment.",
|
|
61
61
|
"footer.shop": "Shop",
|
|
62
62
|
"footer.help": "Help",
|
|
63
63
|
"footer.company": "Company",
|
|
@@ -72,14 +72,10 @@
|
|
|
72
72
|
"legal.contact": "Contact",
|
|
73
73
|
"legal.shipping.body": "Orders are prepared within 1–2 business days. Shipping options, costs and estimated delivery times are shown at checkout before you pay.",
|
|
74
74
|
"legal.returns.body": "You can return any item within 30 days of delivery, unused and in its original packaging. Contact us to start a return; refunds are issued to the original payment method.",
|
|
75
|
-
"legal.privacy.body": "{storeName} only collects the data needed
|
|
75
|
+
"legal.privacy.body": "{storeName} only collects the data needed for your order (name, address, e-mail, phone). Payments are processed by secure payment partners (card, Wave, Orange Money…): we never see or store your payment details. Cookies: only those needed for the site to work (cart, sign-in); no advertising or tracking cookies. Contact us to access or delete your data.",
|
|
76
76
|
"legal.terms.body": "Prices include the discounts shown at the time of order. The amount charged is the one displayed at checkout. {storeName} may cancel an order in case of an obvious pricing error; you would then be fully refunded.",
|
|
77
77
|
"legal.contact.body": "Questions about an order? Write to us and we will answer as soon as possible.",
|
|
78
78
|
"legal.contact.email": "Email: {email}",
|
|
79
|
-
"ended.title": "This sale has ended",
|
|
80
|
-
"ended.text": "Thank you for shopping with {storeName}. Our next sale is already waiting for you.",
|
|
81
|
-
"ended.cta": "See the next sale",
|
|
82
|
-
"ended.soon": "Our next sale is coming soon.",
|
|
83
79
|
"upcoming.title": "Coming soon",
|
|
84
80
|
"upcoming.text": "This sale starts on {date}.",
|
|
85
81
|
"notFound.title": "Page not found",
|
|
@@ -89,7 +85,7 @@
|
|
|
89
85
|
"track.text": "Sign in to your account to follow your orders, or check the confirmation email we sent you.",
|
|
90
86
|
"track.cta": "Go to my account",
|
|
91
87
|
"checkout.back": "Back to cart",
|
|
92
|
-
"checkout.secure": "Payments are encrypted and processed by
|
|
88
|
+
"checkout.secure": "Payments are encrypted and processed by our secure payment partners.",
|
|
93
89
|
"form.select": "Select…",
|
|
94
90
|
"form.firstName": "First name",
|
|
95
91
|
"form.lastName": "Last name",
|
|
@@ -292,7 +288,7 @@
|
|
|
292
288
|
"contact.faq.q2": "How do I return an item?",
|
|
293
289
|
"contact.faq.a2": "Email us within 30 days with your order number and we'll send return instructions. Refunds are issued as soon as we receive it.",
|
|
294
290
|
"contact.faq.q3": "Is payment secure?",
|
|
295
|
-
"contact.faq.a3": "Yes. Payments are processed by
|
|
291
|
+
"contact.faq.a3": "Yes. Payments are processed by secure payment partners (card, Wave, Orange Money…): {storeName} never sees or stores your payment details.",
|
|
296
292
|
"contact.faq.q4": "Can I change or cancel my order?",
|
|
297
293
|
"contact.faq.a4": "Yes, as long as it hasn't shipped: contact us as soon as possible with your order number.",
|
|
298
294
|
"section.fold": "Top deals right now",
|
|
@@ -331,5 +327,196 @@
|
|
|
331
327
|
"grimoire.draw": "Draw a card",
|
|
332
328
|
"grimoire.drawSub": "Three cards, three bewitched deals. Hover a card to turn it over.",
|
|
333
329
|
"grimoire.reveal": "Turn over",
|
|
334
|
-
"grimoire.shelf": "The apothecary shelf"
|
|
330
|
+
"grimoire.shelf": "The apothecary shelf",
|
|
331
|
+
"closed.title": "This store is closed for now",
|
|
332
|
+
"closed.text": "Thank you for visiting {storeName}. The store will reopen soon.",
|
|
333
|
+
"closed.cta": "Visit our other store",
|
|
334
|
+
"closed.track": "Track my order",
|
|
335
|
+
"riviera.looksKicker": "The lookbook",
|
|
336
|
+
"riviera.look": "Look No.{n}",
|
|
337
|
+
"riviera.coloursKicker": "By colour",
|
|
338
|
+
"riviera.colours": "The colours of summer",
|
|
339
|
+
"riviera.all": "The whole collection",
|
|
340
|
+
"riviera.step1": "Choose",
|
|
341
|
+
"riviera.step1Sub": "One piece, one colour, your size.",
|
|
342
|
+
"riviera.step2": "Receive",
|
|
343
|
+
"riviera.step2Sub": "Carefully packed, tracked to your door.",
|
|
344
|
+
"riviera.step3": "Enjoy",
|
|
345
|
+
"riviera.step3Sub": "Free returns within 30 days.",
|
|
346
|
+
"sunset.postcardsKicker": "Postcards",
|
|
347
|
+
"sunset.checklistKicker": "Before you go",
|
|
348
|
+
"sunset.checklist": "The beach checklist",
|
|
349
|
+
"sunset.checklistSub": "Tick what you're missing, we add it up for you.",
|
|
350
|
+
"sunset.total": "Total",
|
|
351
|
+
"sunset.addAll": "Add all to cart",
|
|
352
|
+
"sunset.added": "Added to cart",
|
|
353
|
+
"sunset.choose": "choose size",
|
|
354
|
+
"sunset.empty": "Tick at least one item",
|
|
355
|
+
"locker.home": "Home",
|
|
356
|
+
"locker.away": "Away",
|
|
357
|
+
"locker.clock": "Full time in",
|
|
358
|
+
"locker.lineupKicker": "The line-up",
|
|
359
|
+
"locker.lineupSub": "Eleven starters in a {formation}. Tap a player to see the product.",
|
|
360
|
+
"locker.all": "The whole locker room",
|
|
361
|
+
"locker.half": "Half-time",
|
|
362
|
+
"training.programKicker": "7 days, 7 goals",
|
|
363
|
+
"training.program": "This week's programme",
|
|
364
|
+
"training.day1": "Mon",
|
|
365
|
+
"training.day2": "Tue",
|
|
366
|
+
"training.day3": "Wed",
|
|
367
|
+
"training.day4": "Thu",
|
|
368
|
+
"training.day5": "Fri",
|
|
369
|
+
"training.day6": "Sat",
|
|
370
|
+
"training.day7": "Sun",
|
|
371
|
+
"training.focus1": "Strength",
|
|
372
|
+
"training.focus2": "Cardio",
|
|
373
|
+
"training.focus3": "Mobility",
|
|
374
|
+
"training.focus4": "Upper body",
|
|
375
|
+
"training.focus5": "Lower body",
|
|
376
|
+
"training.focus6": "Outdoors",
|
|
377
|
+
"training.focus7": "Recovery",
|
|
378
|
+
"training.pack": "The starter pack",
|
|
379
|
+
"training.total": "All 3 together",
|
|
380
|
+
"training.saving": "You save {amount}",
|
|
381
|
+
"training.promise1": "30-day returns",
|
|
382
|
+
"training.promise1Sub": "Tried it, not convinced: refunded",
|
|
383
|
+
"training.promise4": "Tested gear",
|
|
384
|
+
"training.promise4Sub": "Chosen to last",
|
|
385
|
+
"arena.chrono": "Event ends in",
|
|
386
|
+
"arena.podiumKicker": "The biggest discounts",
|
|
387
|
+
"arena.podium": "The podium",
|
|
388
|
+
"arena.place1": "Gold",
|
|
389
|
+
"arena.place2": "Silver",
|
|
390
|
+
"arena.place3": "Bronze",
|
|
391
|
+
"arena.all": "All events",
|
|
392
|
+
"mosaic.left": "Time left",
|
|
393
|
+
"mosaic.offers": "deals in play",
|
|
394
|
+
"mosaic.medalsKicker": "The standings",
|
|
395
|
+
"mosaic.rank": "Rank",
|
|
396
|
+
"mosaic.product": "Product",
|
|
397
|
+
"mosaic.saving": "Saving",
|
|
398
|
+
"mosaic.price": "Price",
|
|
399
|
+
"mosaic.relay": "The relay",
|
|
400
|
+
"mosaic.leg": "Leg {n}",
|
|
401
|
+
"lantern.until": "Until the offer ends",
|
|
402
|
+
"lantern.selectionKicker": "Under the lantern",
|
|
403
|
+
"lantern.giftsKicker": "For everyone",
|
|
404
|
+
"lantern.gifts": "Gift ideas by budget",
|
|
405
|
+
"lantern.tier1": "Little thoughts",
|
|
406
|
+
"lantern.tier2": "Lovely gifts",
|
|
407
|
+
"lantern.tier3": "Grand gestures",
|
|
408
|
+
"lantern.upTo": "Up to {amount}",
|
|
409
|
+
"lantern.from": "From {amount}",
|
|
410
|
+
"lantern.between": "{min} to {max}",
|
|
411
|
+
"souk.perk1": "Free gift wrapping",
|
|
412
|
+
"souk.perk2": "Delivered before the celebration",
|
|
413
|
+
"souk.stallsKicker": "Along the stalls",
|
|
414
|
+
"souk.sign": "With our warmest wishes",
|
|
415
|
+
"souk.all": "The whole souk",
|
|
416
|
+
"shop.results": "Results for “{q}”",
|
|
417
|
+
"shop.clear": "Clear search",
|
|
418
|
+
"shop.noResults": "No product matches “{q}”. Try another word.",
|
|
419
|
+
"souk.see": "View product",
|
|
420
|
+
"checkout.payPaytech": "Wave, Orange Money, Free Money or card",
|
|
421
|
+
"checkout.payPaydunya": "Wave, Orange Money or card",
|
|
422
|
+
"checkout.payNaboopay": "Wave or Orange Money",
|
|
423
|
+
"checkout.payRedirect": "Pay now",
|
|
424
|
+
"checkout.payRedirectHint": "You will be taken to the secure payment page, then brought back here automatically.",
|
|
425
|
+
"checkout.payChecking": "We are confirming your payment…",
|
|
426
|
+
"checkout.payCancelled": "Payment cancelled. You can try again or choose another payment method.",
|
|
427
|
+
"checkout.payRetry": "Check again",
|
|
428
|
+
"checkout.orderLabel": "Online order",
|
|
429
|
+
"checkout.payInitError": "This payment method is temporarily unavailable. Please try again shortly or choose another one.",
|
|
430
|
+
"cookies.title": "Cookies",
|
|
431
|
+
"cookies.text": "This site only uses cookies needed for it to work (cart, sign-in). No advertising tracking.",
|
|
432
|
+
"cookies.textOptional": "We use cookies needed for the site to work and, with your consent, audience measurement cookies.",
|
|
433
|
+
"cookies.more": "Learn more",
|
|
434
|
+
"cookies.ok": "Got it",
|
|
435
|
+
"cookies.accept": "Accept",
|
|
436
|
+
"cookies.refuse": "Decline",
|
|
437
|
+
"legal.privacy.1.title": "Who we are",
|
|
438
|
+
"legal.privacy.1.body": "{storeName} is responsible for the personal data collected on this site. Any question: {email}.",
|
|
439
|
+
"legal.privacy.2.title": "What we collect",
|
|
440
|
+
"legal.privacy.2.body": "Only what your order needs: name, shipping and billing address, e-mail, phone, items ordered and your order history. If you create an account: your e-mail and password (stored encrypted, never readable, even by us). If you leave a review: your first name, rating and comment.",
|
|
441
|
+
"legal.privacy.3.title": "Why",
|
|
442
|
+
"legal.privacy.3.body": "To prepare, ship and track your order; send you order e-mails (confirmation, shipping, delivery, refund); answer your messages; meet our accounting obligations. We never sell or rent your data, and we do not send you advertising without your consent.",
|
|
443
|
+
"legal.privacy.4.title": "Who receives it",
|
|
444
|
+
"legal.privacy.4.body": "Only the providers we need, and only what they need: the carrier (name, address, phone), our payment partner (card, Wave, Orange Money…), our e-mail service and our hosting provider. No other third party.",
|
|
445
|
+
"legal.privacy.5.title": "Payment",
|
|
446
|
+
"legal.privacy.5.body": "Payment happens on our payment partner's secure page. We never see, receive or store your card number or your Wave or Orange Money codes. The amount charged is always calculated by our server, never by your browser.",
|
|
447
|
+
"legal.privacy.6.title": "Security",
|
|
448
|
+
"legal.privacy.6.body": "The site is encrypted (HTTPS): information exchanged cannot be read in transit. Passwords are stored encrypted. Access to the store's administration is protected by login and password and reserved for the {storeName} team. Data is backed up regularly.",
|
|
449
|
+
"legal.privacy.7.title": "How long",
|
|
450
|
+
"legal.privacy.7.body": "Order data is kept as long as needed to handle the order, then for the period required by law for invoices (usually 10 years). A customer account with no order for 3 years may be deleted. You can ask us to delete your account at any time.",
|
|
451
|
+
"legal.privacy.8.title": "Cookies",
|
|
452
|
+
"legal.privacy.8.body": "We only use cookies needed for the site to work: your cart, your sign-in and the store of your cart. No advertising cookies, no cross-site tracking, no resale.",
|
|
453
|
+
"legal.privacy.9.title": "Your rights",
|
|
454
|
+
"legal.privacy.9.body": "You can access, correct, delete or export your data, and object to its use, at any time. Write to {email}: we reply within 30 days. If you are not satisfied with our answer, you can contact the data protection authority of your country.",
|
|
455
|
+
"legal.terms.1.title": "Purpose",
|
|
456
|
+
"legal.terms.1.body": "These terms apply to any order placed on the {storeName} site. Placing an order means you accept them.",
|
|
457
|
+
"legal.terms.2.title": "Prices",
|
|
458
|
+
"legal.terms.2.body": "Prices are shown in the store's currency, including discounts at the time of ordering. The amount charged is the one shown at the payment step, shipping included. In case of an obvious pricing error, {storeName} may cancel the order: you are then fully refunded.",
|
|
459
|
+
"legal.terms.3.title": "Orders",
|
|
460
|
+
"legal.terms.3.body": "Your order is confirmed by a summary e-mail. {storeName} may refuse an order in case of a payment dispute or if an item is out of stock; you are then informed and refunded.",
|
|
461
|
+
"legal.terms.4.title": "Payment",
|
|
462
|
+
"legal.terms.4.body": "By card, Wave, Orange Money or any other method shown, on our payment partner's secure page. The order is prepared as soon as payment is confirmed.",
|
|
463
|
+
"legal.terms.5.title": "Shipping",
|
|
464
|
+
"legal.terms.5.body": "Methods, prices and times are shown before payment. An e-mail lets you know when the order ships, with the tracking number when there is one. See the Shipping page.",
|
|
465
|
+
"legal.terms.6.title": "Returns and refunds",
|
|
466
|
+
"legal.terms.6.body": "You have 30 days after delivery to return an unused item in its original packaging. Refunds go back to the original payment method. See the Returns page.",
|
|
467
|
+
"legal.terms.7.title": "Warranty",
|
|
468
|
+
"legal.terms.7.body": "Products are covered by the legal conformity warranty. An item damaged or not as described on arrival? Write to {email} with a photo: we replace or refund it.",
|
|
469
|
+
"legal.terms.8.title": "Complaints",
|
|
470
|
+
"legal.terms.8.body": "For any complaint, contact us first at {email}: we always look for an amicable solution. Failing that, the dispute falls under the competent courts.",
|
|
471
|
+
"legal.shipping.1.title": "Preparation",
|
|
472
|
+
"legal.shipping.1.body": "Orders are prepared within 1 to 2 business days after payment is confirmed.",
|
|
473
|
+
"legal.shipping.2.title": "Methods and prices",
|
|
474
|
+
"legal.shipping.2.body": "The shipping methods available for your address, their prices and estimated times are shown before payment. Shipping is included in the total you pay: no hidden fees on delivery.",
|
|
475
|
+
"legal.shipping.3.title": "Tracking",
|
|
476
|
+
"legal.shipping.3.body": "An e-mail lets you know when your parcel ships, with the tracking number and link when the carrier provides one, and another on delivery. You can also track your order from the « Order tracking » page.",
|
|
477
|
+
"legal.shipping.4.title": "Damaged or late parcel",
|
|
478
|
+
"legal.shipping.4.body": "Parcel damaged on arrival or seriously late? Write to {email} with your order number: we will take care of it.",
|
|
479
|
+
"legal.returns.1.title": "Time limit",
|
|
480
|
+
"legal.returns.1.body": "You can return an item within 30 days after delivery.",
|
|
481
|
+
"legal.returns.2.title": "Conditions",
|
|
482
|
+
"legal.returns.2.body": "The item must be unused, complete and in its original packaging. For hygiene reasons, some items cannot be taken back once opened (cosmetics, underwear, food).",
|
|
483
|
+
"legal.returns.3.title": "How to",
|
|
484
|
+
"legal.returns.3.body": "Write to {email} with your order number and the item concerned: we will tell you how to send it back.",
|
|
485
|
+
"legal.returns.4.title": "Refund",
|
|
486
|
+
"legal.returns.4.body": "Once the item is received and checked, we refund you on the original payment method (card, Wave, Orange Money…) and you receive a confirmation e-mail. An item received damaged or not as described is fully refunded, return costs included.",
|
|
487
|
+
"legal.updated": "Last updated: {date}",
|
|
488
|
+
"legal.emailFallback": "the Contact page",
|
|
489
|
+
"reviews.outOf": "Rating: {value} out of 5",
|
|
490
|
+
"reviews.title": "Customer reviews",
|
|
491
|
+
"reviews.none": "No reviews for this product yet. Every buyer gets a link to rate it after delivery.",
|
|
492
|
+
"reviews.countOne": "{count} review",
|
|
493
|
+
"reviews.countMany": "{count} reviews",
|
|
494
|
+
"reviews.how": "Verified buyer reviews: only customers who ordered this product can rate it, and every review is checked before it goes live.",
|
|
495
|
+
"reviews.verified": "Verified purchase",
|
|
496
|
+
"reviews.homeKicker": "They ordered",
|
|
497
|
+
"reviews.homeTitle": "What our customers say",
|
|
498
|
+
"reviews.pageTitle": "Leave a review",
|
|
499
|
+
"reviews.pageLead": "Thank you for order #{number}! Rate your items: your review helps other customers.",
|
|
500
|
+
"reviews.invalidLink": "This link is no longer valid. Review links are sent by e-mail on delivery and stay valid for 6 months.",
|
|
501
|
+
"reviews.backHome": "Back to the store",
|
|
502
|
+
"reviews.already": "Thank you, you have already rated this product.",
|
|
503
|
+
"reviews.yourRating": "Your rating",
|
|
504
|
+
"reviews.rating1": "Disappointing",
|
|
505
|
+
"reviews.rating2": "Average",
|
|
506
|
+
"reviews.rating3": "Good",
|
|
507
|
+
"reviews.rating4": "Very good",
|
|
508
|
+
"reviews.rating5": "Excellent",
|
|
509
|
+
"reviews.name": "Your first name (shown with the review)",
|
|
510
|
+
"reviews.titleField": "Title",
|
|
511
|
+
"reviews.optional": "(optional)",
|
|
512
|
+
"reviews.comment": "Your review",
|
|
513
|
+
"reviews.commentHint": "Quality, size, delivery… anything that will help the next customers (10 characters minimum).",
|
|
514
|
+
"reviews.send": "Post my review",
|
|
515
|
+
"reviews.sending": "Sending…",
|
|
516
|
+
"reviews.thanks": "Thank you! Your review will show after a quick check.",
|
|
517
|
+
"reviews.error.invalid": "Pick a rating and write at least 10 characters (no < or >).",
|
|
518
|
+
"reviews.error.duplicate": "You have already rated this product for this order.",
|
|
519
|
+
"reviews.error.expired": "This link is no longer valid.",
|
|
520
|
+
"reviews.error.tooMany": "Too many attempts. Please try again later.",
|
|
521
|
+
"reviews.error.failed": "Sending failed. Please try again shortly."
|
|
335
522
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"hero.trust.shipping": "Livraison offerte",
|
|
14
14
|
"hero.trust.shippingSub": "Sur les commandes éligibles",
|
|
15
15
|
"hero.trust.secure": "Paiement sécurisé",
|
|
16
|
-
"hero.trust.secureSub": "
|
|
16
|
+
"hero.trust.secureSub": "Paiement chiffré",
|
|
17
17
|
"hero.trust.returns": "Retours faciles",
|
|
18
18
|
"hero.trust.returnsSub": "Sans justification",
|
|
19
19
|
"countdown.label": "L'offre se termine dans",
|
|
@@ -52,12 +52,12 @@
|
|
|
52
52
|
"pdp.trust.warranty": "Garantie 2 ans",
|
|
53
53
|
"pdp.faq": "Questions fréquentes",
|
|
54
54
|
"pdp.faq.q1": "Quels moyens de paiement acceptez-vous ?",
|
|
55
|
-
"pdp.faq.a1": "Carte
|
|
55
|
+
"pdp.faq.a1": "Carte, Wave, Orange Money et les autres moyens affichés au paiement, traités par nos partenaires de paiement sécurisés.",
|
|
56
56
|
"pdp.faq.q2": "Quel est le délai de livraison ?",
|
|
57
57
|
"pdp.faq.a2": "Les modes et délais de livraison sont affichés au moment de la commande.",
|
|
58
58
|
"pdp.faq.q3": "Puis-je retourner ma commande ?",
|
|
59
59
|
"pdp.faq.a3": "Oui, vous disposez de 30 jours pour retourner un article dans son état d'origine.",
|
|
60
|
-
"footer.tagline": "Des produits choisis, expédiés avec soin. Paiement
|
|
60
|
+
"footer.tagline": "Des produits choisis, expédiés avec soin. Paiement 100 % sécurisé.",
|
|
61
61
|
"footer.shop": "Boutique",
|
|
62
62
|
"footer.help": "Aide",
|
|
63
63
|
"footer.company": "Informations",
|
|
@@ -72,14 +72,10 @@
|
|
|
72
72
|
"legal.contact": "Contact",
|
|
73
73
|
"legal.shipping.body": "Les commandes sont préparées sous 1 à 2 jours ouvrés. Les modes de livraison, leurs tarifs et les délais estimés sont affichés avant le paiement.",
|
|
74
74
|
"legal.returns.body": "Vous pouvez retourner un article sous 30 jours après réception, non utilisé et dans son emballage d'origine. Contactez-nous pour lancer un retour ; le remboursement se fait sur le moyen de paiement d'origine.",
|
|
75
|
-
"legal.privacy.body": "{storeName} ne collecte que les données nécessaires à votre commande (nom, adresse, e-mail, téléphone). Les
|
|
75
|
+
"legal.privacy.body": "{storeName} ne collecte que les données nécessaires à votre commande (nom, adresse, e-mail, téléphone). Les paiements sont traités par nos partenaires de paiement sécurisés (carte, Wave, Orange Money…) : nous ne voyons ni ne conservons jamais vos données de paiement. Cookies : uniquement ceux nécessaires au site (panier, connexion) ; aucun cookie publicitaire ni de suivi. Contactez-nous pour consulter ou supprimer vos données.",
|
|
76
76
|
"legal.terms.body": "Les prix incluent les remises affichées au moment de la commande. Le montant débité est celui affiché au paiement. {storeName} peut annuler une commande en cas d'erreur de prix manifeste ; vous êtes alors intégralement remboursé.",
|
|
77
77
|
"legal.contact.body": "Une question sur une commande ? Écrivez-nous, nous vous répondrons au plus vite.",
|
|
78
78
|
"legal.contact.email": "E-mail : {email}",
|
|
79
|
-
"ended.title": "Cette vente est terminée",
|
|
80
|
-
"ended.text": "Merci d'avoir fait vos achats chez {storeName}. Notre prochaine vente vous attend déjà.",
|
|
81
|
-
"ended.cta": "Voir la prochaine vente",
|
|
82
|
-
"ended.soon": "Notre prochaine vente arrive bientôt.",
|
|
83
79
|
"upcoming.title": "Bientôt disponible",
|
|
84
80
|
"upcoming.text": "Cette vente commence le {date}.",
|
|
85
81
|
"notFound.title": "Page introuvable",
|
|
@@ -89,7 +85,7 @@
|
|
|
89
85
|
"track.text": "Connectez-vous à votre compte pour suivre vos commandes, ou consultez l'e-mail de confirmation que nous vous avons envoyé.",
|
|
90
86
|
"track.cta": "Accéder à mon compte",
|
|
91
87
|
"checkout.back": "Retour au panier",
|
|
92
|
-
"checkout.secure": "Les paiements sont chiffrés et traités par
|
|
88
|
+
"checkout.secure": "Les paiements sont chiffrés et traités par nos partenaires de paiement sécurisés.",
|
|
93
89
|
"form.select": "Choisir…",
|
|
94
90
|
"form.firstName": "Prénom",
|
|
95
91
|
"form.lastName": "Nom",
|
|
@@ -292,7 +288,7 @@
|
|
|
292
288
|
"contact.faq.q2": "Comment retourner un article ?",
|
|
293
289
|
"contact.faq.a2": "Écrivez-nous dans les 30 jours avec votre numéro de commande : nous vous envoyons les instructions de retour. Le remboursement est fait dès réception.",
|
|
294
290
|
"contact.faq.q3": "Le paiement est-il sécurisé ?",
|
|
295
|
-
"contact.faq.a3": "Oui. Les paiements sont traités par
|
|
291
|
+
"contact.faq.a3": "Oui. Les paiements sont traités par des partenaires de paiement sécurisés (carte, Wave, Orange Money…) : {storeName} ne voit ni ne stocke jamais vos données de paiement.",
|
|
296
292
|
"contact.faq.q4": "Puis-je modifier ou annuler ma commande ?",
|
|
297
293
|
"contact.faq.a4": "Tant qu'elle n'est pas expédiée, oui : contactez-nous au plus vite avec votre numéro de commande.",
|
|
298
294
|
"section.fold": "Les offres phares",
|
|
@@ -331,5 +327,196 @@
|
|
|
331
327
|
"grimoire.draw": "Tirez une carte",
|
|
332
328
|
"grimoire.drawSub": "Trois cartes, trois offres ensorcelées. Survolez une carte pour la retourner.",
|
|
333
329
|
"grimoire.reveal": "Retourner",
|
|
334
|
-
"grimoire.shelf": "L'étagère de l'apothicaire"
|
|
330
|
+
"grimoire.shelf": "L'étagère de l'apothicaire",
|
|
331
|
+
"closed.title": "Boutique fermée pour le moment",
|
|
332
|
+
"closed.text": "Merci de votre visite chez {storeName}. La boutique rouvrira bientôt.",
|
|
333
|
+
"closed.cta": "Voir notre autre boutique",
|
|
334
|
+
"closed.track": "Suivre ma commande",
|
|
335
|
+
"riviera.looksKicker": "Le lookbook",
|
|
336
|
+
"riviera.look": "Look N°{n}",
|
|
337
|
+
"riviera.coloursKicker": "Par couleur",
|
|
338
|
+
"riviera.colours": "Les couleurs de l'été",
|
|
339
|
+
"riviera.all": "Toute la collection",
|
|
340
|
+
"riviera.step1": "Choisissez",
|
|
341
|
+
"riviera.step1Sub": "Une pièce, une couleur, votre taille.",
|
|
342
|
+
"riviera.step2": "Recevez",
|
|
343
|
+
"riviera.step2Sub": "Expédiée soigneusement, suivie jusqu'à chez vous.",
|
|
344
|
+
"riviera.step3": "Profitez",
|
|
345
|
+
"riviera.step3Sub": "Retours gratuits sous 30 jours.",
|
|
346
|
+
"sunset.postcardsKicker": "Cartes postales",
|
|
347
|
+
"sunset.checklistKicker": "Avant de partir",
|
|
348
|
+
"sunset.checklist": "La liste de la plage",
|
|
349
|
+
"sunset.checklistSub": "Cochez ce qu'il vous manque, on additionne pour vous.",
|
|
350
|
+
"sunset.total": "Total",
|
|
351
|
+
"sunset.addAll": "Tout ajouter au panier",
|
|
352
|
+
"sunset.added": "Ajouté au panier",
|
|
353
|
+
"sunset.choose": "choisir la taille",
|
|
354
|
+
"sunset.empty": "Cochez au moins un article",
|
|
355
|
+
"locker.home": "Domicile",
|
|
356
|
+
"locker.away": "Extérieur",
|
|
357
|
+
"locker.clock": "Fin du match dans",
|
|
358
|
+
"locker.lineupKicker": "La composition",
|
|
359
|
+
"locker.lineupSub": "Onze titulaires, disposés en {formation}. Touchez un joueur pour voir la fiche.",
|
|
360
|
+
"locker.all": "Tout le vestiaire",
|
|
361
|
+
"locker.half": "Mi-temps",
|
|
362
|
+
"training.programKicker": "7 jours, 7 objectifs",
|
|
363
|
+
"training.program": "Le programme de la semaine",
|
|
364
|
+
"training.day1": "Lun",
|
|
365
|
+
"training.day2": "Mar",
|
|
366
|
+
"training.day3": "Mer",
|
|
367
|
+
"training.day4": "Jeu",
|
|
368
|
+
"training.day5": "Ven",
|
|
369
|
+
"training.day6": "Sam",
|
|
370
|
+
"training.day7": "Dim",
|
|
371
|
+
"training.focus1": "Force",
|
|
372
|
+
"training.focus2": "Cardio",
|
|
373
|
+
"training.focus3": "Mobilité",
|
|
374
|
+
"training.focus4": "Haut du corps",
|
|
375
|
+
"training.focus5": "Bas du corps",
|
|
376
|
+
"training.focus6": "Plein air",
|
|
377
|
+
"training.focus7": "Récup",
|
|
378
|
+
"training.pack": "Le pack de départ",
|
|
379
|
+
"training.total": "Les 3 ensemble",
|
|
380
|
+
"training.saving": "Vous économisez {amount}",
|
|
381
|
+
"training.promise1": "Retours sous 30 jours",
|
|
382
|
+
"training.promise1Sub": "Essayé, pas convaincu : remboursé",
|
|
383
|
+
"training.promise4": "Matériel testé",
|
|
384
|
+
"training.promise4Sub": "Sélectionné pour durer",
|
|
385
|
+
"arena.chrono": "Fin de l'épreuve",
|
|
386
|
+
"arena.podiumKicker": "Les plus fortes remises",
|
|
387
|
+
"arena.podium": "Le podium",
|
|
388
|
+
"arena.place1": "Or",
|
|
389
|
+
"arena.place2": "Argent",
|
|
390
|
+
"arena.place3": "Bronze",
|
|
391
|
+
"arena.all": "Toutes les épreuves",
|
|
392
|
+
"mosaic.left": "Il reste",
|
|
393
|
+
"mosaic.offers": "offres en jeu",
|
|
394
|
+
"mosaic.medalsKicker": "Le classement",
|
|
395
|
+
"mosaic.rank": "Rang",
|
|
396
|
+
"mosaic.product": "Produit",
|
|
397
|
+
"mosaic.saving": "Remise",
|
|
398
|
+
"mosaic.price": "Prix",
|
|
399
|
+
"mosaic.relay": "Le relais",
|
|
400
|
+
"mosaic.leg": "Relais {n}",
|
|
401
|
+
"lantern.until": "Jusqu'à la fin de l'offre",
|
|
402
|
+
"lantern.selectionKicker": "Sous la lanterne",
|
|
403
|
+
"lantern.giftsKicker": "Pour chacun",
|
|
404
|
+
"lantern.gifts": "Idées cadeaux par budget",
|
|
405
|
+
"lantern.tier1": "Petites attentions",
|
|
406
|
+
"lantern.tier2": "Beaux cadeaux",
|
|
407
|
+
"lantern.tier3": "Grands gestes",
|
|
408
|
+
"lantern.upTo": "Jusqu'à {amount}",
|
|
409
|
+
"lantern.from": "À partir de {amount}",
|
|
410
|
+
"lantern.between": "De {min} à {max}",
|
|
411
|
+
"souk.perk1": "Emballage cadeau offert",
|
|
412
|
+
"souk.perk2": "Livré avant la fête",
|
|
413
|
+
"souk.stallsKicker": "Au détour des étals",
|
|
414
|
+
"souk.sign": "Avec nos meilleurs vœux",
|
|
415
|
+
"souk.all": "Tout le souk",
|
|
416
|
+
"shop.results": "Résultats pour « {q} »",
|
|
417
|
+
"shop.clear": "Effacer la recherche",
|
|
418
|
+
"shop.noResults": "Aucun produit ne correspond à « {q} ». Essayez un autre mot.",
|
|
419
|
+
"souk.see": "Voir le produit",
|
|
420
|
+
"checkout.payPaytech": "Wave, Orange Money, Free Money ou carte",
|
|
421
|
+
"checkout.payPaydunya": "Wave, Orange Money ou carte",
|
|
422
|
+
"checkout.payNaboopay": "Wave ou Orange Money",
|
|
423
|
+
"checkout.payRedirect": "Payer maintenant",
|
|
424
|
+
"checkout.payRedirectHint": "Vous allez être redirigé vers la page de paiement sécurisée, puis revenir ici automatiquement.",
|
|
425
|
+
"checkout.payChecking": "Nous confirmons votre paiement…",
|
|
426
|
+
"checkout.payCancelled": "Paiement annulé. Vous pouvez réessayer ou choisir un autre moyen de paiement.",
|
|
427
|
+
"checkout.payRetry": "Vérifier à nouveau",
|
|
428
|
+
"checkout.orderLabel": "Commande en ligne",
|
|
429
|
+
"checkout.payInitError": "Ce moyen de paiement est momentanément indisponible. Réessayez dans un instant ou choisissez-en un autre.",
|
|
430
|
+
"cookies.title": "Cookies",
|
|
431
|
+
"cookies.text": "Ce site utilise uniquement des cookies nécessaires à son fonctionnement (panier, connexion). Aucun suivi publicitaire.",
|
|
432
|
+
"cookies.textOptional": "Nous utilisons des cookies nécessaires au fonctionnement du site et, avec votre accord, des cookies de mesure d’audience.",
|
|
433
|
+
"cookies.more": "En savoir plus",
|
|
434
|
+
"cookies.ok": "J’ai compris",
|
|
435
|
+
"cookies.accept": "Accepter",
|
|
436
|
+
"cookies.refuse": "Refuser",
|
|
437
|
+
"legal.privacy.1.title": "Qui sommes-nous",
|
|
438
|
+
"legal.privacy.1.body": "{storeName} est responsable des données personnelles collectées sur ce site. Pour toute question : {email}.",
|
|
439
|
+
"legal.privacy.2.title": "Les données que nous collectons",
|
|
440
|
+
"legal.privacy.2.body": "Uniquement ce qui est utile à votre commande : nom, adresse de livraison et de facturation, e-mail, téléphone, articles commandés et historique de vos commandes. Si vous créez un compte : votre e-mail et votre mot de passe (enregistré chiffré, jamais lisible, même par nous). Si vous laissez un avis : votre prénom, votre note et votre commentaire.",
|
|
441
|
+
"legal.privacy.3.title": "Pourquoi",
|
|
442
|
+
"legal.privacy.3.body": "Préparer, livrer et suivre votre commande ; vous envoyer les e-mails liés à la commande (confirmation, expédition, livraison, remboursement) ; répondre à vos messages ; respecter nos obligations comptables. Nous ne vendons ni ne louons jamais vos données, et nous ne vous envoyons pas de publicité sans votre accord.",
|
|
443
|
+
"legal.privacy.4.title": "Qui les reçoit",
|
|
444
|
+
"legal.privacy.4.body": "Seulement les prestataires nécessaires, et seulement ce dont ils ont besoin : le transporteur (nom, adresse, téléphone), notre partenaire de paiement (carte, Wave, Orange Money…), notre service d'envoi d'e-mails et notre hébergeur. Aucun autre tiers.",
|
|
445
|
+
"legal.privacy.5.title": "Paiement",
|
|
446
|
+
"legal.privacy.5.body": "Le paiement se fait sur la page sécurisée de notre partenaire de paiement. Nous ne voyons, ne recevons et ne conservons jamais votre numéro de carte ni vos codes Wave ou Orange Money. Le montant payé est toujours calculé par notre serveur, jamais par votre navigateur.",
|
|
447
|
+
"legal.privacy.6.title": "Sécurité",
|
|
448
|
+
"legal.privacy.6.body": "Le site est chiffré (HTTPS) : les informations échangées ne peuvent pas être lues en chemin. Les mots de passe sont enregistrés chiffrés. L'accès à l'administration de la boutique est protégé par identifiant et mot de passe, et réservé à l'équipe de {storeName}. Les données sont sauvegardées régulièrement.",
|
|
449
|
+
"legal.privacy.7.title": "Combien de temps",
|
|
450
|
+
"legal.privacy.7.body": "Les données de commande sont conservées le temps nécessaire à la gestion de la commande, puis le temps imposé par la loi pour les factures (en général 10 ans). Un compte client sans commande depuis 3 ans peut être supprimé. Vous pouvez demander la suppression de votre compte à tout moment.",
|
|
451
|
+
"legal.privacy.8.title": "Cookies",
|
|
452
|
+
"legal.privacy.8.body": "Nous utilisons uniquement les cookies nécessaires au fonctionnement du site : votre panier, votre connexion et la boutique de votre panier. Aucun cookie publicitaire, aucun suivi entre sites, aucune revente.",
|
|
453
|
+
"legal.privacy.9.title": "Vos droits",
|
|
454
|
+
"legal.privacy.9.body": "Vous pouvez à tout moment consulter, corriger, supprimer ou récupérer vos données, et vous opposer à leur utilisation. Écrivez-nous à {email} : nous répondons sous 30 jours. Si vous n'êtes pas satisfait de notre réponse, vous pouvez vous adresser à l'autorité de protection des données de votre pays (par exemple la CDP au Sénégal ou la CNIL en France).",
|
|
455
|
+
"legal.terms.1.title": "Objet",
|
|
456
|
+
"legal.terms.1.body": "Ces conditions s'appliquent à toute commande passée sur le site de {storeName}. Passer commande vaut acceptation de ces conditions.",
|
|
457
|
+
"legal.terms.2.title": "Prix",
|
|
458
|
+
"legal.terms.2.body": "Les prix sont indiqués dans la devise de la boutique, remises comprises au moment de la commande. Le montant débité est celui affiché à l'étape du paiement, frais de livraison inclus. En cas d'erreur de prix manifeste, {storeName} peut annuler la commande : vous êtes alors intégralement remboursé.",
|
|
459
|
+
"legal.terms.3.title": "Commande",
|
|
460
|
+
"legal.terms.3.body": "La commande est confirmée par un e-mail récapitulatif. {storeName} peut refuser une commande en cas de litige de paiement ou de stock épuisé ; vous êtes alors prévenu et remboursé.",
|
|
461
|
+
"legal.terms.4.title": "Paiement",
|
|
462
|
+
"legal.terms.4.body": "Par carte, Wave, Orange Money ou tout autre moyen affiché, sur la page sécurisée de notre partenaire de paiement. La commande est préparée dès que le paiement est confirmé.",
|
|
463
|
+
"legal.terms.5.title": "Livraison",
|
|
464
|
+
"legal.terms.5.body": "Les modes, tarifs et délais sont affichés avant le paiement. Un e-mail vous prévient à l'expédition, avec le numéro de suivi quand il existe. Voir la page Livraison.",
|
|
465
|
+
"legal.terms.6.title": "Retours et remboursements",
|
|
466
|
+
"legal.terms.6.body": "Vous disposez de 30 jours après réception pour retourner un article non utilisé, dans son emballage d'origine. Le remboursement se fait sur le moyen de paiement d'origine. Voir la page Retours.",
|
|
467
|
+
"legal.terms.7.title": "Garanties",
|
|
468
|
+
"legal.terms.7.body": "Les produits bénéficient des garanties légales de conformité. Un article abîmé ou non conforme à la réception ? Écrivez-nous à {email} avec une photo : nous le remplaçons ou le remboursons.",
|
|
469
|
+
"legal.terms.8.title": "Réclamations",
|
|
470
|
+
"legal.terms.8.body": "Pour toute réclamation, contactez-nous d'abord à {email} : nous cherchons toujours une solution à l'amiable. À défaut, le litige relève des tribunaux compétents.",
|
|
471
|
+
"legal.shipping.1.title": "Préparation",
|
|
472
|
+
"legal.shipping.1.body": "Les commandes sont préparées sous 1 à 2 jours ouvrés après confirmation du paiement.",
|
|
473
|
+
"legal.shipping.2.title": "Modes et tarifs",
|
|
474
|
+
"legal.shipping.2.body": "Les modes de livraison disponibles pour votre adresse, leurs tarifs et leurs délais estimés sont affichés avant le paiement. Le prix de la livraison est inclus dans le total payé : aucun frais caché à la livraison.",
|
|
475
|
+
"legal.shipping.3.title": "Suivi",
|
|
476
|
+
"legal.shipping.3.body": "Un e-mail vous prévient quand votre colis part, avec le numéro et le lien de suivi quand le transporteur en fournit un, puis un autre à la livraison. Vous pouvez aussi suivre votre commande depuis la page « Suivi de commande ».",
|
|
477
|
+
"legal.shipping.4.title": "Colis abîmé ou en retard",
|
|
478
|
+
"legal.shipping.4.body": "Un colis abîmé à la réception ou un retard important ? Écrivez-nous à {email} avec votre numéro de commande : nous nous en occupons.",
|
|
479
|
+
"legal.returns.1.title": "Délai",
|
|
480
|
+
"legal.returns.1.body": "Vous pouvez retourner un article sous 30 jours après réception.",
|
|
481
|
+
"legal.returns.2.title": "Conditions",
|
|
482
|
+
"legal.returns.2.body": "L'article doit être non utilisé, complet et dans son emballage d'origine. Pour des raisons d'hygiène, certains articles ne peuvent pas être repris une fois ouverts (cosmétiques, sous-vêtements, denrées alimentaires).",
|
|
483
|
+
"legal.returns.3.title": "Comment faire",
|
|
484
|
+
"legal.returns.3.body": "Écrivez-nous à {email} avec votre numéro de commande et l'article concerné : nous vous indiquons comment le renvoyer.",
|
|
485
|
+
"legal.returns.4.title": "Remboursement",
|
|
486
|
+
"legal.returns.4.body": "Dès réception et vérification de l'article, nous vous remboursons sur le moyen de paiement d'origine (carte, Wave, Orange Money…), et vous recevez un e-mail de confirmation. Un article reçu abîmé ou non conforme est remboursé en totalité, frais de retour compris.",
|
|
487
|
+
"legal.updated": "Dernière mise à jour : {date}",
|
|
488
|
+
"legal.emailFallback": "la page Contact",
|
|
489
|
+
"reviews.outOf": "Note : {value} sur 5",
|
|
490
|
+
"reviews.title": "Avis clients",
|
|
491
|
+
"reviews.none": "Pas encore d'avis sur ce produit. Chaque acheteur reçoit un lien pour le noter après la livraison.",
|
|
492
|
+
"reviews.countOne": "{count} avis",
|
|
493
|
+
"reviews.countMany": "{count} avis",
|
|
494
|
+
"reviews.how": "Avis d'acheteurs vérifiés : seuls les clients qui ont commandé ce produit peuvent le noter, et chaque avis est relu avant publication.",
|
|
495
|
+
"reviews.verified": "Achat vérifié",
|
|
496
|
+
"reviews.homeKicker": "Ils ont commandé",
|
|
497
|
+
"reviews.homeTitle": "Ce que nos clients en pensent",
|
|
498
|
+
"reviews.pageTitle": "Laisser un avis",
|
|
499
|
+
"reviews.pageLead": "Merci pour votre commande n° {number} ! Notez vos articles : votre avis aide les autres clients.",
|
|
500
|
+
"reviews.invalidLink": "Ce lien n'est plus valable. Les liens pour laisser un avis sont envoyés par e-mail à la livraison et restent valables 6 mois.",
|
|
501
|
+
"reviews.backHome": "Retour à la boutique",
|
|
502
|
+
"reviews.already": "Merci, vous avez déjà noté ce produit.",
|
|
503
|
+
"reviews.yourRating": "Votre note",
|
|
504
|
+
"reviews.rating1": "Décevant",
|
|
505
|
+
"reviews.rating2": "Moyen",
|
|
506
|
+
"reviews.rating3": "Bien",
|
|
507
|
+
"reviews.rating4": "Très bien",
|
|
508
|
+
"reviews.rating5": "Excellent",
|
|
509
|
+
"reviews.name": "Votre prénom (affiché avec l'avis)",
|
|
510
|
+
"reviews.titleField": "Titre",
|
|
511
|
+
"reviews.optional": "(facultatif)",
|
|
512
|
+
"reviews.comment": "Votre avis",
|
|
513
|
+
"reviews.commentHint": "Qualité, taille, livraison… ce qui aidera les prochains clients (10 caractères minimum).",
|
|
514
|
+
"reviews.send": "Publier mon avis",
|
|
515
|
+
"reviews.sending": "Envoi…",
|
|
516
|
+
"reviews.thanks": "Merci ! Votre avis sera visible après une rapide relecture.",
|
|
517
|
+
"reviews.error.invalid": "Choisissez une note et écrivez au moins 10 caractères (sans < ni >).",
|
|
518
|
+
"reviews.error.duplicate": "Vous avez déjà noté ce produit pour cette commande.",
|
|
519
|
+
"reviews.error.expired": "Ce lien n'est plus valable.",
|
|
520
|
+
"reviews.error.tooMany": "Trop de tentatives. Réessayez dans un moment.",
|
|
521
|
+
"reviews.error.failed": "L'envoi n'a pas abouti. Réessayez dans un instant."
|
|
335
522
|
}
|
|
@@ -5,7 +5,7 @@ import { Logo } from "@modules/ub/nav"
|
|
|
5
5
|
|
|
6
6
|
export default function CheckoutLayout({ children }: { children: React.ReactNode }) {
|
|
7
7
|
return (
|
|
8
|
-
<div className="w-full relative small:min-h-screen">
|
|
8
|
+
<div className="w-full relative small:min-h-screen ub-page" data-page="checkout">
|
|
9
9
|
<header className="ub-nav">
|
|
10
10
|
<div className="ub-wrap">
|
|
11
11
|
<Link href="/cart" className="ub-more" data-testid="back-to-cart-link">
|
|
@@ -9,6 +9,11 @@ import FreeShippingPriceNudge from "@modules/shipping/components/free-shipping-p
|
|
|
9
9
|
import Footer from "@modules/ub/footer"
|
|
10
10
|
import Nav from "@modules/ub/nav"
|
|
11
11
|
import TopBar from "@modules/ub/top-bar"
|
|
12
|
+
import BoutiqueClosed from "@modules/ub/campaign-ended"
|
|
13
|
+
import { headers } from "next/headers"
|
|
14
|
+
|
|
15
|
+
// Site fermé : restent ouverts le compte, le suivi de commande, le panier et les pages légales
|
|
16
|
+
const OPEN_WHEN_CLOSED = /^\/(account|order|cart|legal|review)(\/|$)/
|
|
12
17
|
|
|
13
18
|
async function CartNotices() {
|
|
14
19
|
const [customer, cart] = await Promise.all([retrieveCustomer(), retrieveCart()])
|
|
@@ -28,6 +33,8 @@ async function CartNotices() {
|
|
|
28
33
|
|
|
29
34
|
export default async function PageLayout(props: { children: React.ReactNode }) {
|
|
30
35
|
const campaign = await getCampaign()
|
|
36
|
+
const path = (await headers()).get("x-ub-path") ?? "/"
|
|
37
|
+
const closed = !campaign.online && !OPEN_WHEN_CLOSED.test(path)
|
|
31
38
|
|
|
32
39
|
return (
|
|
33
40
|
<>
|
|
@@ -36,7 +43,7 @@ export default async function PageLayout(props: { children: React.ReactNode }) {
|
|
|
36
43
|
<Suspense fallback={null}>
|
|
37
44
|
<CartNotices />
|
|
38
45
|
</Suspense>
|
|
39
|
-
{props.children}
|
|
46
|
+
{closed ? <BoutiqueClosed nextUrl={campaign.nextCampaignUrl} /> : props.children}
|
|
40
47
|
<Footer />
|
|
41
48
|
</>
|
|
42
49
|
)
|
|
@@ -9,6 +9,9 @@ type Page = (typeof PAGES)[number]
|
|
|
9
9
|
|
|
10
10
|
type Props = { params: Promise<{ page: string }> }
|
|
11
11
|
|
|
12
|
+
/** Date de la dernière modification des textes légaux (locales/*.json, clés legal.*) : à changer avec eux */
|
|
13
|
+
const LEGAL_UPDATED = "2026-09-30"
|
|
14
|
+
|
|
12
15
|
const isPage = (p: string): p is Page => (PAGES as readonly string[]).includes(p)
|
|
13
16
|
|
|
14
17
|
export async function generateMetadata(props: Props): Promise<Metadata> {
|
|
@@ -21,15 +24,47 @@ export default async function LegalPage(props: Props) {
|
|
|
21
24
|
if (!isPage(page)) notFound()
|
|
22
25
|
if (page === "contact") return <ContactPage />
|
|
23
26
|
|
|
24
|
-
const { storeName } = getBoutique()
|
|
27
|
+
const { storeName, merchantEmail, locale } = getBoutique()
|
|
28
|
+
const vars = { storeName, email: merchantEmail ?? t("legal.emailFallback") }
|
|
29
|
+
|
|
30
|
+
// Sections « legal.<page>.<n>.title / .body » (locales) ; à défaut, l'ancien paragraphe unique
|
|
31
|
+
const sections: { title: string; body: string }[] = []
|
|
32
|
+
for (let n = 1; n <= 20; n++) {
|
|
33
|
+
const key = `legal.${page}.${n}.title`
|
|
34
|
+
const title = t(key, vars)
|
|
35
|
+
if (title === key) break
|
|
36
|
+
sections.push({ title, body: t(`legal.${page}.${n}.body`, vars) })
|
|
37
|
+
}
|
|
38
|
+
const updated = new Intl.DateTimeFormat(locale, { dateStyle: "long" }).format(new Date(LEGAL_UPDATED))
|
|
25
39
|
|
|
26
40
|
return (
|
|
27
|
-
<section className="ub-section">
|
|
28
|
-
<div className="ub-wrap"
|
|
29
|
-
<h1 className="ub-head"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
<section className="ub-section ub-legal">
|
|
42
|
+
<div className="ub-wrap">
|
|
43
|
+
<h1 className="ub-head ub-legal__title">{t(`legal.${page}`)}</h1>
|
|
44
|
+
<p className="ub-legal__updated">{t("legal.updated", { date: updated })}</p>
|
|
45
|
+
{sections.length ? (
|
|
46
|
+
<>
|
|
47
|
+
{sections.length > 3 && (
|
|
48
|
+
<nav className="ub-legal__toc" aria-label={t(`legal.${page}`)}>
|
|
49
|
+
<ol>
|
|
50
|
+
{sections.map((s, i) => (
|
|
51
|
+
<li key={s.title}>
|
|
52
|
+
<a href={`#s${i + 1}`}>{s.title}</a>
|
|
53
|
+
</li>
|
|
54
|
+
))}
|
|
55
|
+
</ol>
|
|
56
|
+
</nav>
|
|
57
|
+
)}
|
|
58
|
+
{sections.map((s, i) => (
|
|
59
|
+
<section key={s.title} id={`s${i + 1}`} className="ub-legal__sec">
|
|
60
|
+
<h2>{s.title}</h2>
|
|
61
|
+
<p>{s.body}</p>
|
|
62
|
+
</section>
|
|
63
|
+
))}
|
|
64
|
+
</>
|
|
65
|
+
) : (
|
|
66
|
+
<p>{t(`legal.${page}.body`, vars)}</p>
|
|
67
|
+
)}
|
|
33
68
|
</div>
|
|
34
69
|
</section>
|
|
35
70
|
)
|