bestraw 1.0.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 (66) hide show
  1. package/index.mjs +436 -0
  2. package/package.json +17 -0
  3. package/templates/.env.example +51 -0
  4. package/templates/Caddyfile +21 -0
  5. package/templates/docker-compose.yml +80 -0
  6. package/templates/web/Dockerfile +19 -0
  7. package/templates/web/next-env.d.ts +6 -0
  8. package/templates/web/next.config.ts +10 -0
  9. package/templates/web/node_modules/.bin/next +17 -0
  10. package/templates/web/node_modules/.bin/tsc +17 -0
  11. package/templates/web/node_modules/.bin/tsserver +17 -0
  12. package/templates/web/package.json +28 -0
  13. package/templates/web/postcss.config.mjs +8 -0
  14. package/templates/web/public/images/.gitkeep +0 -0
  15. package/templates/web/src/app/[locale]/auth/page.tsx +222 -0
  16. package/templates/web/src/app/[locale]/blog/[slug]/page.tsx +104 -0
  17. package/templates/web/src/app/[locale]/blog/page.tsx +90 -0
  18. package/templates/web/src/app/[locale]/error.tsx +41 -0
  19. package/templates/web/src/app/[locale]/info/page.tsx +186 -0
  20. package/templates/web/src/app/[locale]/layout.tsx +86 -0
  21. package/templates/web/src/app/[locale]/loyalty/page.tsx +135 -0
  22. package/templates/web/src/app/[locale]/menu/page.tsx +69 -0
  23. package/templates/web/src/app/[locale]/order/cart/page.tsx +199 -0
  24. package/templates/web/src/app/[locale]/order/checkout/page.tsx +489 -0
  25. package/templates/web/src/app/[locale]/order/confirmation/[id]/page.tsx +159 -0
  26. package/templates/web/src/app/[locale]/order/page.tsx +207 -0
  27. package/templates/web/src/app/[locale]/page.tsx +119 -0
  28. package/templates/web/src/app/globals.css +11 -0
  29. package/templates/web/src/app/robots.ts +14 -0
  30. package/templates/web/src/app/sitemap.ts +56 -0
  31. package/templates/web/src/bestraw.config.ts +9 -0
  32. package/templates/web/src/components/auth/OtpForm.tsx +98 -0
  33. package/templates/web/src/components/blog/ArticleCard.tsx +67 -0
  34. package/templates/web/src/components/blog/ArticleContent.tsx +14 -0
  35. package/templates/web/src/components/cart/CartDrawer.tsx +152 -0
  36. package/templates/web/src/components/cart/CartItem.tsx +111 -0
  37. package/templates/web/src/components/checkout/StripePaymentForm.tsx +54 -0
  38. package/templates/web/src/components/layout/Footer.tsx +40 -0
  39. package/templates/web/src/components/layout/Header.tsx +240 -0
  40. package/templates/web/src/components/layout/LocaleSwitcher.tsx +34 -0
  41. package/templates/web/src/components/loyalty/PointsBalance.tsx +96 -0
  42. package/templates/web/src/components/loyalty/RewardCard.tsx +73 -0
  43. package/templates/web/src/components/loyalty/TransactionHistory.tsx +108 -0
  44. package/templates/web/src/components/menu/CategorySection.tsx +42 -0
  45. package/templates/web/src/components/menu/MealCard.tsx +55 -0
  46. package/templates/web/src/components/menu/MealDetailModal.tsx +355 -0
  47. package/templates/web/src/components/menu/MenuContent.tsx +216 -0
  48. package/templates/web/src/components/order/MealOrderCard.tsx +220 -0
  49. package/templates/web/src/components/order/OrderStatusTracker.tsx +138 -0
  50. package/templates/web/src/components/order/PaymentStatus.tsx +62 -0
  51. package/templates/web/src/components/ui/Button.tsx +40 -0
  52. package/templates/web/src/components/ui/ErrorAlert.tsx +15 -0
  53. package/templates/web/src/i18n/config.ts +3 -0
  54. package/templates/web/src/i18n/request.ts +13 -0
  55. package/templates/web/src/i18n/routing.ts +10 -0
  56. package/templates/web/src/lib/client.ts +5 -0
  57. package/templates/web/src/lib/errors.ts +31 -0
  58. package/templates/web/src/lib/features.ts +10 -0
  59. package/templates/web/src/lib/hooks/useCustomerClient.ts +28 -0
  60. package/templates/web/src/lib/hooks/useMenu.ts +46 -0
  61. package/templates/web/src/messages/en.json +283 -0
  62. package/templates/web/src/messages/fr.json +283 -0
  63. package/templates/web/src/middleware.ts +8 -0
  64. package/templates/web/src/providers/CartProvider.tsx +162 -0
  65. package/templates/web/src/providers/StripeProvider.tsx +21 -0
  66. package/templates/web/tsconfig.json +27 -0
@@ -0,0 +1,283 @@
1
+ {
2
+ "metadata": {
3
+ "title": "My Restaurant",
4
+ "description": "Welcome to our restaurant"
5
+ },
6
+ "nav": {
7
+ "menu": "Menu",
8
+ "info": "Info",
9
+ "order": "Orders",
10
+ "loyalty": "Loyalty",
11
+ "blog": "Blog",
12
+ "login": "Sign in",
13
+ "logout": "Sign out"
14
+ },
15
+ "home": {
16
+ "defaultDescription": "Welcome to our restaurant. Discover our menu and let yourself be tempted by our dishes prepared with passion.",
17
+ "viewMenu": "View menu",
18
+ "ourInfo": "Our info",
19
+ "ourCuisine": "Our cuisine",
20
+ "cuisineDescription": "Fresh ingredients, homemade cooking and warm service. Come discover our specialties in a friendly atmosphere.",
21
+ "latestArticles": "Featured",
22
+ "viewAllArticles": "View all articles"
23
+ },
24
+ "menu": {
25
+ "title": "Our menu",
26
+ "empty": "The menu is being prepared.",
27
+ "viewCart": "View cart",
28
+ "searchPlaceholder": "Search for a dish...",
29
+ "noResults": "No dishes match your search.",
30
+ "closed": "The restaurant is currently closed. Online ordering is unavailable.",
31
+ "closedReason": "Closed today: {reason}"
32
+ },
33
+ "info": {
34
+ "title": "Information",
35
+ "unavailable": "Information is not available at the moment.",
36
+ "contact": "Contact",
37
+ "findUs": "Find us",
38
+ "openingHours": "Opening hours",
39
+ "hoursUnavailable": "Opening hours have not been set yet.",
40
+ "specialClosures": "Special closures",
41
+ "closedToday": "Closed today",
42
+ "closedNow": "Currently closed",
43
+ "opensAt": "Opens at {time}",
44
+ "openNow": "Open now",
45
+ "days": {
46
+ "0": "Sunday",
47
+ "1": "Monday",
48
+ "2": "Tuesday",
49
+ "3": "Wednesday",
50
+ "4": "Thursday",
51
+ "5": "Friday",
52
+ "6": "Saturday"
53
+ }
54
+ },
55
+ "footer": {
56
+ "rights": "All rights reserved."
57
+ },
58
+ "order": {
59
+ "title": "Orders",
60
+ "myOrders": "My orders",
61
+ "noOrders": "You don't have any orders yet.",
62
+ "activeOrders": "Active orders",
63
+ "pastOrders": "History",
64
+ "orderAgain": "Order now",
65
+ "viewDetails": "View details",
66
+ "disabled": "Online ordering is not available at the moment.",
67
+ "empty": "The menu is being prepared.",
68
+ "viewCart": "View cart",
69
+ "addToCart": "Add to cart",
70
+ "showOptions": "Show options",
71
+ "hideOptions": "Hide options",
72
+ "sauces": "Sauces",
73
+ "sides": "Sides",
74
+ "specialInstructions": "Special instructions...",
75
+ "decreaseQuantity": "Decrease quantity",
76
+ "increaseQuantity": "Increase quantity",
77
+ "cart": "Cart",
78
+ "emptyCart": "Your cart is empty",
79
+ "close": "Close",
80
+ "subtotal": "Subtotal",
81
+ "total": "Total",
82
+ "checkout": "Proceed to checkout",
83
+ "orderSummary": "Order summary",
84
+ "quantity": "Quantity",
85
+ "orderConfirmed": "Order confirmed!",
86
+ "orderNumber": "Order number",
87
+ "estimatedReady": "Ready in approximately",
88
+ "minutes": "minutes",
89
+ "trackOrder": "Track my order",
90
+ "orderDisabled": "Online ordering is not available at the moment.",
91
+ "status": {
92
+ "pending": "Pending",
93
+ "confirmed": "Confirmed",
94
+ "preparing": "Preparing",
95
+ "ready": "Ready",
96
+ "completed": "Completed",
97
+ "cancelled": "Cancelled"
98
+ },
99
+ "remove": "Remove",
100
+ "continueShopping": "Continue shopping",
101
+ "loginRequired": "Sign in to place an order",
102
+ "placeOrder": "Place order",
103
+ "payment": "Payment"
104
+ },
105
+ "cart": {
106
+ "title": "Your cart",
107
+ "empty": "Your cart is empty.",
108
+ "continueShopping": "Back to menu",
109
+ "clearCart": "Clear cart",
110
+ "sauces": "Sauces",
111
+ "sides": "Sides",
112
+ "remove": "Remove",
113
+ "total": "Total",
114
+ "checkout": "Proceed to payment",
115
+ "loginToOrder": "Log in to order",
116
+ "orderingDisabled": "Online ordering is temporarily unavailable."
117
+ },
118
+ "checkout": {
119
+ "title": "Checkout",
120
+ "emptyCart": "Your cart is empty.",
121
+ "orderType": "Order type",
122
+ "takeaway": "Takeaway",
123
+ "dineIn": "Dine in",
124
+ "tableNumber": "Table number",
125
+ "notes": "Notes",
126
+ "notesPlaceholder": "Additional information for your order...",
127
+ "stripeCheckoutPlaceholder": "Card payment will be available soon.",
128
+ "placeOrder": "Place order",
129
+ "processing": "Processing...",
130
+ "summary": "Summary",
131
+ "total": "Total",
132
+ "notAuthenticated": "Please log in to place an order.",
133
+ "orderFailed": "Failed to create order.",
134
+ "paymentFailed": "Failed to create payment.",
135
+ "genericError": "An error occurred.",
136
+ "payNow": "Pay now",
137
+ "paymentError": "Payment failed. Please try again.",
138
+ "payment": "Payment",
139
+ "applyReward": "Apply a reward",
140
+ "noReward": "No reward",
141
+ "discount": "Discount",
142
+ "subtotal": "Subtotal",
143
+ "orderingDisabled": "Online ordering is temporarily unavailable.",
144
+ "estimatedPrep": "Estimated preparation time: ~{minutes} min",
145
+ "restaurantClosed": "The restaurant is currently closed.",
146
+ "restaurantClosedReason": "Closed today: {reason}"
147
+ },
148
+ "confirmation": {
149
+ "title": "Confirmation",
150
+ "thankYou": "Thank you for your order!",
151
+ "orderReceived": "Your order has been received.",
152
+ "notFound": "Order not found.",
153
+ "orderNumber": "Order number",
154
+ "estimatedReady": "Estimated ready at",
155
+ "orderDetails": "Order details",
156
+ "subtotal": "Subtotal",
157
+ "tax": "Tax",
158
+ "total": "Total",
159
+ "discount": "Discount",
160
+ "paymentFailed": "Payment failed.",
161
+ "paymentFailedHint": "Your card was not charged. Please try again or use a different payment method.",
162
+ "paymentProcessing": "Your payment is being processed..."
163
+ },
164
+ "orderStatus": {
165
+ "pending": "Pending",
166
+ "confirmed": "Confirmed",
167
+ "preparing": "Preparing",
168
+ "ready": "Ready",
169
+ "completed": "Completed",
170
+ "cancelled": "This order has been cancelled."
171
+ },
172
+ "auth": {
173
+ "title": "Sign in",
174
+ "phone": "Phone number",
175
+ "phonePlaceholder": "+33 6 12 34 56 78",
176
+ "sendCode": "Send code",
177
+ "otpSent": "A code has been sent to your number",
178
+ "enterCode": "Enter the code received by SMS",
179
+ "enterCodeEmail": "Enter the code received by email",
180
+ "verify": "Verify",
181
+ "invalidPhone": "Invalid phone number",
182
+ "invalidCode": "Invalid code",
183
+ "back": "Back",
184
+ "email": "Email address",
185
+ "emailPlaceholder": "your@email.com",
186
+ "invalidEmail": "Invalid email address",
187
+ "otpSentEmail": "A code has been sent to your email address",
188
+ "usePhone": "Phone",
189
+ "useEmail": "Email"
190
+ },
191
+ "loyalty": {
192
+ "title": "Loyalty",
193
+ "points": "points",
194
+ "yourPoints": "Your points",
195
+ "tier": "Tier",
196
+ "bronze": "Bronze",
197
+ "silver": "Silver",
198
+ "gold": "Gold",
199
+ "rewards": "Rewards",
200
+ "redeem": "Redeem",
201
+ "useAtCheckout": "Use at checkout",
202
+ "notEnoughPoints": "Not enough points",
203
+ "history": "History",
204
+ "earn": "Earned",
205
+ "redeemed": "Redeemed",
206
+ "adjusted": "Adjusted",
207
+ "expired": "Expired",
208
+ "totalEarned": "Total earned",
209
+ "totalRedeemed": "Total redeemed",
210
+ "nextTier": "Next tier in",
211
+ "loginRequired": "Sign in to access your loyalty program",
212
+ "pointsCost": "{cost} pts",
213
+ "freeItem": "Free item",
214
+ "discountPercent": "-{value}%",
215
+ "discountFixed": "-{value}\u20ac"
216
+ },
217
+ "mealDetail": {
218
+ "allergens": "Allergens",
219
+ "unavailable": "This dish is currently unavailable.",
220
+ "allergen": {
221
+ "gluten": "Gluten",
222
+ "crustaceans": "Crustaceans",
223
+ "eggs": "Eggs",
224
+ "fish": "Fish",
225
+ "peanuts": "Peanuts",
226
+ "soy": "Soy",
227
+ "dairy": "Dairy",
228
+ "nuts": "Tree nuts",
229
+ "celery": "Celery",
230
+ "mustard": "Mustard",
231
+ "sesame": "Sesame",
232
+ "sulphites": "Sulphites",
233
+ "lupin": "Lupin",
234
+ "molluscs": "Molluscs"
235
+ }
236
+ },
237
+ "blog": {
238
+ "title": "Blog",
239
+ "allCategories": "All categories",
240
+ "readingTime": "{minutes} min read",
241
+ "by": "By",
242
+ "noArticles": "No articles yet.",
243
+ "backToBlog": "Back to blog",
244
+ "featured": "Featured",
245
+ "publishedOn": "Published on"
246
+ },
247
+ "errors": {
248
+ "unknown": "Something went wrong. Please try again.",
249
+ "NETWORK_ERROR": "Unable to reach the server. Please check your connection.",
250
+ "AUTH_REQUIRED": "Please sign in to continue.",
251
+ "INVALID_PHONE": "Invalid phone number.",
252
+ "INVALID_EMAIL": "Invalid email address.",
253
+ "NO_ACTIVE_SESSION": "Session expired. Please start over.",
254
+ "OTP_EXPIRED": "The code has expired. Please request a new one.",
255
+ "OTP_TOO_MANY_ATTEMPTS": "Too many attempts. Please request a new code.",
256
+ "OTP_INVALID": "Incorrect code. Please try again.",
257
+ "INVALID_TOKEN": "Invalid session. Please sign in again.",
258
+ "ORDER_DISABLED": "Online ordering is currently unavailable.",
259
+ "TAKEAWAY_DISABLED": "Takeaway ordering is currently unavailable.",
260
+ "DINEIN_DISABLED": "Dine-in ordering is currently unavailable.",
261
+ "MAX_ORDERS_REACHED": "Too many active orders. Please try again in a few minutes.",
262
+ "EMPTY_ORDER": "Your cart is empty.",
263
+ "MEAL_NOT_FOUND": "An item in your cart is no longer available. Please clear your cart and try again.",
264
+ "MEAL_UNAVAILABLE": "An item in your cart is temporarily unavailable.",
265
+ "ORDER_NOT_FOUND": "Order not found.",
266
+ "INVALID_STATUS_TRANSITION": "This action is not possible for the current order status.",
267
+ "CANNOT_CANCEL_ORDER": "This order can no longer be cancelled.",
268
+ "PAYMENT_ORDER_NOT_FOUND": "Order not found for payment.",
269
+ "PAYMENT_INVALID_ORDER_STATUS": "Payment is not possible for this order.",
270
+ "PAYMENT_NOT_FOUND": "Payment not found.",
271
+ "PAYMENT_CANNOT_REFUND": "This payment cannot be refunded.",
272
+ "PAYMENT_FAILED": "Payment failed. Please try again.",
273
+ "PAYMENTS_DISABLED": "Online payments are temporarily unavailable.",
274
+ "LOYALTY_ACCOUNT_NOT_FOUND": "Loyalty account not found.",
275
+ "REWARD_NOT_FOUND": "This reward no longer exists.",
276
+ "REWARD_INACTIVE": "This reward is no longer active.",
277
+ "NOT_ENOUGH_POINTS": "You don't have enough points for this reward.",
278
+ "REWARD_MEAL_NOT_IN_ORDER": "The free item reward requires the corresponding dish in your cart.",
279
+ "RESTAURANT_CLOSED": "The restaurant is currently closed. Orders are not accepted.",
280
+ "LOYALTY_NOT_AVAILABLE": "The loyalty program is not available.",
281
+ "retry": "Try again"
282
+ }
283
+ }
@@ -0,0 +1,283 @@
1
+ {
2
+ "metadata": {
3
+ "title": "Mon Restaurant",
4
+ "description": "Bienvenue dans notre restaurant"
5
+ },
6
+ "nav": {
7
+ "menu": "Menu",
8
+ "info": "Infos",
9
+ "order": "Commandes",
10
+ "loyalty": "Fidelite",
11
+ "blog": "Blog",
12
+ "login": "Connexion",
13
+ "logout": "Deconnexion"
14
+ },
15
+ "home": {
16
+ "defaultDescription": "Bienvenue dans notre restaurant. Decouvrez notre carte et laissez-vous tenter par nos plats prepares avec passion.",
17
+ "viewMenu": "Voir le menu",
18
+ "ourInfo": "Nos infos",
19
+ "ourCuisine": "Notre cuisine",
20
+ "cuisineDescription": "Des produits frais, une cuisine faite maison et un service chaleureux. Venez decouvrir nos specialites dans une ambiance conviviale.",
21
+ "latestArticles": "A la une",
22
+ "viewAllArticles": "Voir tous les articles"
23
+ },
24
+ "menu": {
25
+ "title": "Notre menu",
26
+ "empty": "Le menu est en cours de preparation.",
27
+ "viewCart": "Voir le panier",
28
+ "searchPlaceholder": "Rechercher un plat...",
29
+ "noResults": "Aucun plat ne correspond a votre recherche.",
30
+ "closed": "Le restaurant est actuellement ferme. La commande en ligne n'est pas disponible.",
31
+ "closedReason": "Ferme aujourd'hui : {reason}"
32
+ },
33
+ "info": {
34
+ "title": "Informations",
35
+ "unavailable": "Les informations ne sont pas disponibles pour le moment.",
36
+ "contact": "Contact",
37
+ "findUs": "Retrouvez-nous",
38
+ "openingHours": "Horaires d'ouverture",
39
+ "hoursUnavailable": "Les horaires ne sont pas encore renseignes.",
40
+ "specialClosures": "Fermetures exceptionnelles",
41
+ "closedToday": "Ferme aujourd'hui",
42
+ "closedNow": "Actuellement ferme",
43
+ "opensAt": "Ouvre a {time}",
44
+ "openNow": "Ouvert",
45
+ "days": {
46
+ "0": "Dimanche",
47
+ "1": "Lundi",
48
+ "2": "Mardi",
49
+ "3": "Mercredi",
50
+ "4": "Jeudi",
51
+ "5": "Vendredi",
52
+ "6": "Samedi"
53
+ }
54
+ },
55
+ "footer": {
56
+ "rights": "Tous droits reserves."
57
+ },
58
+ "order": {
59
+ "title": "Commandes",
60
+ "myOrders": "Mes commandes",
61
+ "noOrders": "Vous n'avez pas encore de commandes.",
62
+ "activeOrders": "Commandes en cours",
63
+ "pastOrders": "Historique",
64
+ "orderAgain": "Commander",
65
+ "viewDetails": "Voir les details",
66
+ "disabled": "La commande en ligne n'est pas disponible pour le moment.",
67
+ "empty": "Le menu est en cours de preparation.",
68
+ "viewCart": "Voir le panier",
69
+ "addToCart": "Ajouter au panier",
70
+ "showOptions": "Voir les options",
71
+ "hideOptions": "Masquer les options",
72
+ "sauces": "Sauces",
73
+ "sides": "Accompagnements",
74
+ "specialInstructions": "Instructions speciales...",
75
+ "decreaseQuantity": "Diminuer la quantite",
76
+ "increaseQuantity": "Augmenter la quantite",
77
+ "cart": "Panier",
78
+ "emptyCart": "Votre panier est vide",
79
+ "close": "Fermer",
80
+ "subtotal": "Sous-total",
81
+ "total": "Total",
82
+ "checkout": "Passer au paiement",
83
+ "orderSummary": "Recapitulatif",
84
+ "quantity": "Quantite",
85
+ "orderConfirmed": "Commande confirmee !",
86
+ "orderNumber": "Numero de commande",
87
+ "estimatedReady": "Pret dans environ",
88
+ "minutes": "minutes",
89
+ "trackOrder": "Suivre ma commande",
90
+ "orderDisabled": "La commande en ligne n'est pas disponible pour le moment.",
91
+ "status": {
92
+ "pending": "En attente",
93
+ "confirmed": "Confirmee",
94
+ "preparing": "En preparation",
95
+ "ready": "Prete",
96
+ "completed": "Terminee",
97
+ "cancelled": "Annulee"
98
+ },
99
+ "remove": "Retirer",
100
+ "continueShopping": "Continuer mes achats",
101
+ "loginRequired": "Connectez-vous pour commander",
102
+ "placeOrder": "Valider la commande",
103
+ "payment": "Paiement"
104
+ },
105
+ "cart": {
106
+ "title": "Votre panier",
107
+ "empty": "Votre panier est vide.",
108
+ "continueShopping": "Retour au menu",
109
+ "clearCart": "Vider le panier",
110
+ "sauces": "Sauces",
111
+ "sides": "Accompagnements",
112
+ "remove": "Supprimer",
113
+ "total": "Total",
114
+ "checkout": "Passer au paiement",
115
+ "loginToOrder": "Se connecter pour commander",
116
+ "orderingDisabled": "Les commandes sont temporairement desactivees."
117
+ },
118
+ "checkout": {
119
+ "title": "Paiement",
120
+ "emptyCart": "Votre panier est vide.",
121
+ "orderType": "Type de commande",
122
+ "takeaway": "A emporter",
123
+ "dineIn": "Sur place",
124
+ "tableNumber": "Numero de table",
125
+ "notes": "Notes",
126
+ "notesPlaceholder": "Informations supplementaires pour votre commande...",
127
+ "stripeCheckoutPlaceholder": "Le paiement par carte sera disponible prochainement.",
128
+ "placeOrder": "Passer la commande",
129
+ "processing": "Traitement en cours...",
130
+ "summary": "Recapitulatif",
131
+ "total": "Total",
132
+ "notAuthenticated": "Veuillez vous connecter pour passer commande.",
133
+ "orderFailed": "Erreur lors de la creation de la commande.",
134
+ "paymentFailed": "Erreur lors de la creation du paiement.",
135
+ "genericError": "Une erreur est survenue.",
136
+ "payNow": "Payer maintenant",
137
+ "paymentError": "Le paiement a echoue. Veuillez reessayer.",
138
+ "payment": "Paiement",
139
+ "applyReward": "Utiliser une recompense",
140
+ "noReward": "Aucune recompense",
141
+ "discount": "Remise",
142
+ "subtotal": "Sous-total",
143
+ "orderingDisabled": "Les commandes sont temporairement desactivees.",
144
+ "estimatedPrep": "Temps de preparation estime : ~{minutes} min",
145
+ "restaurantClosed": "Le restaurant est actuellement ferme.",
146
+ "restaurantClosedReason": "Ferme aujourd'hui : {reason}"
147
+ },
148
+ "confirmation": {
149
+ "title": "Confirmation",
150
+ "thankYou": "Merci pour votre commande !",
151
+ "orderReceived": "Votre commande a bien ete recue.",
152
+ "notFound": "Commande introuvable.",
153
+ "orderNumber": "Numero de commande",
154
+ "estimatedReady": "Pret vers",
155
+ "orderDetails": "Details de la commande",
156
+ "subtotal": "Sous-total",
157
+ "tax": "Taxes",
158
+ "total": "Total",
159
+ "discount": "Remise",
160
+ "paymentFailed": "Le paiement a echoue.",
161
+ "paymentFailedHint": "Votre carte n'a pas ete debitee. Veuillez reessayer ou utiliser un autre moyen de paiement.",
162
+ "paymentProcessing": "Votre paiement est en cours de traitement..."
163
+ },
164
+ "orderStatus": {
165
+ "pending": "En attente",
166
+ "confirmed": "Confirmee",
167
+ "preparing": "En preparation",
168
+ "ready": "Prete",
169
+ "completed": "Terminee",
170
+ "cancelled": "Cette commande a ete annulee."
171
+ },
172
+ "auth": {
173
+ "title": "Connexion",
174
+ "phone": "Numero de telephone",
175
+ "phonePlaceholder": "+33 6 12 34 56 78",
176
+ "sendCode": "Envoyer le code",
177
+ "otpSent": "Un code a ete envoye a votre numero",
178
+ "enterCode": "Entrez le code recu par SMS",
179
+ "enterCodeEmail": "Entrez le code recu par email",
180
+ "verify": "Verifier",
181
+ "invalidPhone": "Numero de telephone invalide",
182
+ "invalidCode": "Code invalide",
183
+ "back": "Retour",
184
+ "email": "Adresse email",
185
+ "emailPlaceholder": "votre@email.com",
186
+ "invalidEmail": "Adresse email invalide",
187
+ "otpSentEmail": "Un code a ete envoye a votre adresse email",
188
+ "usePhone": "Telephone",
189
+ "useEmail": "Email"
190
+ },
191
+ "loyalty": {
192
+ "title": "Fidelite",
193
+ "points": "points",
194
+ "yourPoints": "Vos points",
195
+ "tier": "Niveau",
196
+ "bronze": "Bronze",
197
+ "silver": "Argent",
198
+ "gold": "Or",
199
+ "rewards": "Recompenses",
200
+ "redeem": "Echanger",
201
+ "useAtCheckout": "Utiliser au paiement",
202
+ "notEnoughPoints": "Points insuffisants",
203
+ "history": "Historique",
204
+ "earn": "Gagne",
205
+ "redeemed": "Utilise",
206
+ "adjusted": "Ajuste",
207
+ "expired": "Expire",
208
+ "totalEarned": "Total gagne",
209
+ "totalRedeemed": "Total utilise",
210
+ "nextTier": "Prochain niveau dans",
211
+ "loginRequired": "Connectez-vous pour acceder a votre programme de fidelite",
212
+ "pointsCost": "{cost} pts",
213
+ "freeItem": "Article offert",
214
+ "discountPercent": "-{value}%",
215
+ "discountFixed": "-{value}\u20ac"
216
+ },
217
+ "mealDetail": {
218
+ "allergens": "Allergenes",
219
+ "unavailable": "Ce plat n'est pas disponible actuellement.",
220
+ "allergen": {
221
+ "gluten": "Gluten",
222
+ "crustaceans": "Crustaces",
223
+ "eggs": "Oeufs",
224
+ "fish": "Poisson",
225
+ "peanuts": "Arachides",
226
+ "soy": "Soja",
227
+ "dairy": "Lait",
228
+ "nuts": "Fruits a coque",
229
+ "celery": "Celeri",
230
+ "mustard": "Moutarde",
231
+ "sesame": "Sesame",
232
+ "sulphites": "Sulfites",
233
+ "lupin": "Lupin",
234
+ "molluscs": "Mollusques"
235
+ }
236
+ },
237
+ "blog": {
238
+ "title": "Blog",
239
+ "allCategories": "Toutes les categories",
240
+ "readingTime": "{minutes} min de lecture",
241
+ "by": "Par",
242
+ "noArticles": "Aucun article pour le moment.",
243
+ "backToBlog": "Retour au blog",
244
+ "featured": "A la une",
245
+ "publishedOn": "Publie le"
246
+ },
247
+ "errors": {
248
+ "unknown": "Une erreur est survenue. Veuillez reessayer.",
249
+ "NETWORK_ERROR": "Impossible de contacter le serveur. Verifiez votre connexion.",
250
+ "AUTH_REQUIRED": "Veuillez vous connecter pour continuer.",
251
+ "INVALID_PHONE": "Numero de telephone invalide.",
252
+ "INVALID_EMAIL": "Adresse email invalide.",
253
+ "NO_ACTIVE_SESSION": "Session expiree. Veuillez recommencer.",
254
+ "OTP_EXPIRED": "Le code a expire. Veuillez en demander un nouveau.",
255
+ "OTP_TOO_MANY_ATTEMPTS": "Trop de tentatives. Veuillez demander un nouveau code.",
256
+ "OTP_INVALID": "Code incorrect. Veuillez reessayer.",
257
+ "INVALID_TOKEN": "Session invalide. Veuillez vous reconnecter.",
258
+ "ORDER_DISABLED": "Les commandes en ligne sont momentanement desactivees.",
259
+ "TAKEAWAY_DISABLED": "La commande a emporter est momentanement desactivee.",
260
+ "DINEIN_DISABLED": "La commande sur place est momentanement desactivee.",
261
+ "MAX_ORDERS_REACHED": "Trop de commandes en cours. Veuillez reessayer dans quelques minutes.",
262
+ "EMPTY_ORDER": "Votre panier est vide.",
263
+ "MEAL_NOT_FOUND": "Un plat de votre panier n'est plus disponible. Veuillez vider votre panier et recommencer.",
264
+ "MEAL_UNAVAILABLE": "Un plat de votre panier est temporairement indisponible.",
265
+ "ORDER_NOT_FOUND": "Commande introuvable.",
266
+ "INVALID_STATUS_TRANSITION": "Cette action n'est pas possible pour le statut actuel de la commande.",
267
+ "CANNOT_CANCEL_ORDER": "Cette commande ne peut plus etre annulee.",
268
+ "PAYMENT_ORDER_NOT_FOUND": "Commande introuvable pour le paiement.",
269
+ "PAYMENT_INVALID_ORDER_STATUS": "Le paiement n'est pas possible pour cette commande.",
270
+ "PAYMENT_NOT_FOUND": "Paiement introuvable.",
271
+ "PAYMENT_CANNOT_REFUND": "Ce paiement ne peut pas etre rembourse.",
272
+ "PAYMENT_FAILED": "Le paiement a echoue. Veuillez reessayer.",
273
+ "PAYMENTS_DISABLED": "Le paiement en ligne est momentanement desactive.",
274
+ "LOYALTY_ACCOUNT_NOT_FOUND": "Compte fidelite introuvable.",
275
+ "REWARD_NOT_FOUND": "Cette recompense n'existe plus.",
276
+ "REWARD_INACTIVE": "Cette recompense n'est plus active.",
277
+ "NOT_ENOUGH_POINTS": "Vous n'avez pas assez de points pour cette recompense.",
278
+ "REWARD_MEAL_NOT_IN_ORDER": "La recompense article offert necessite le plat correspondant dans votre panier.",
279
+ "RESTAURANT_CLOSED": "Le restaurant est actuellement ferme. Les commandes ne sont pas acceptees.",
280
+ "LOYALTY_NOT_AVAILABLE": "Le programme de fidelite n'est pas disponible.",
281
+ "retry": "Reessayer"
282
+ }
283
+ }
@@ -0,0 +1,8 @@
1
+ import createMiddleware from 'next-intl/middleware';
2
+ import { routing } from './i18n/routing';
3
+
4
+ export default createMiddleware(routing);
5
+
6
+ export const config = {
7
+ matcher: ['/((?!api|_next|.*\\..*).*)'],
8
+ };