@crm-market/template-shared 1.0.3 → 1.0.5

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 (70) hide show
  1. package/components/AddAddress/index.vue +10 -12
  2. package/components/Cart/index.vue +15 -17
  3. package/components/ChangePassword/index.vue +11 -13
  4. package/components/Checkout/index.vue +35 -37
  5. package/components/Common/DashboardNavigation.vue +11 -13
  6. package/components/Common/PageBanner.vue +4 -6
  7. package/components/Common/ProductCard.vue +38 -52
  8. package/components/Common/Services.vue +10 -12
  9. package/components/Contact/ContactForm.vue +13 -18
  10. package/components/Dashboard/index.vue +8 -10
  11. package/components/EditAddress/index.vue +14 -16
  12. package/components/EditProfile/index.vue +10 -12
  13. package/components/ForgotPassword/index.vue +7 -9
  14. package/components/Layout/Copyright.vue +3 -5
  15. package/components/Layout/Footer.vue +36 -51
  16. package/components/Layout/FooterTwo.vue +34 -40
  17. package/components/Layout/MiddleHeader.vue +12 -11
  18. package/components/Layout/MiddleHeaderThree.vue +8 -7
  19. package/components/Layout/MiddleHeaderTwo.vue +10 -9
  20. package/components/Layout/Navbar.vue +10 -8
  21. package/components/Layout/NavbarStyleThree.vue +10 -8
  22. package/components/Layout/NavbarStyleTwo.vue +8 -6
  23. package/components/Layout/ResponsiveNavbar.vue +40 -38
  24. package/components/Layout/TopHeader.vue +30 -63
  25. package/components/Login/index.vue +14 -19
  26. package/components/MyAccount/index.vue +31 -31
  27. package/components/OrderDetails/index.vue +16 -18
  28. package/components/OrderHistory/index.vue +13 -15
  29. package/components/ProductDetails/index.vue +17 -15
  30. package/components/Products/RecentlyViewed.vue +12 -14
  31. package/components/Products/index.vue +20 -18
  32. package/components/Register/index.vue +14 -19
  33. package/components/Wishlist/index.vue +12 -14
  34. package/composables/useCategories.ts +2 -1
  35. package/composables/useCheckout.ts +2 -2
  36. package/composables/useI18n.ts +114 -0
  37. package/composables/useProducts.ts +4 -3
  38. package/composables/useSiteConfig.ts +2 -1
  39. package/locales/ar.json +234 -0
  40. package/locales/en.json +234 -0
  41. package/locales/ru.json +234 -0
  42. package/locales/uk.json +234 -0
  43. package/nuxt.config.ts +3 -0
  44. package/package.json +6 -4
  45. package/pages/about-us.vue +2 -1
  46. package/pages/address.vue +2 -1
  47. package/pages/cart.vue +2 -1
  48. package/pages/categories.vue +2 -1
  49. package/pages/change-password.vue +2 -1
  50. package/pages/checkout.vue +2 -1
  51. package/pages/contact.vue +2 -1
  52. package/pages/dashboard.vue +2 -1
  53. package/pages/edit-address.vue +2 -1
  54. package/pages/edit-profile.vue +2 -1
  55. package/pages/faq.vue +2 -1
  56. package/pages/forgot-password.vue +2 -1
  57. package/pages/login.vue +2 -1
  58. package/pages/my-account.vue +2 -1
  59. package/pages/order-details.vue +2 -1
  60. package/pages/order-history.vue +2 -1
  61. package/pages/privacy-policy.vue +2 -1
  62. package/pages/product-details.vue +2 -1
  63. package/pages/products.vue +2 -1
  64. package/pages/register.vue +2 -1
  65. package/pages/terms-conditions.vue +2 -1
  66. package/pages/wishlist.vue +2 -1
  67. package/plugins/i18n.ts +7 -0
  68. package/plugins/vuetify.ts +0 -1
  69. package/utils/api.ts +17 -0
  70. package/utils/image.ts +2 -2
@@ -15,32 +15,29 @@
15
15
  <div class="col-lg-7">
16
16
  <div class="authentication-form">
17
17
  <v-tabs v-model="tab" bg-color="white" class="login-tabs">
18
- <v-tab value="login">Login</v-tab>
19
- <v-tab value="register">Register</v-tab>
18
+ <v-tab value="login">{{ t('auth.login') }}</v-tab>
19
+ <v-tab value="register">{{ t('auth.register') }}</v-tab>
20
20
  </v-tabs>
21
21
 
22
22
  <v-card-text>
23
23
  <v-tabs-window v-model="tab">
24
24
  <v-tabs-window-item value="login">
25
- <p>
26
- If you have an account, sign in with your username or
27
- email address.
28
- </p>
25
+ <p>{{ t('auth.loginDescription') }}</p>
29
26
  <form>
30
27
  <div class="form-group mb-4">
31
- <label class="label">Username or Email Address *</label>
28
+ <label class="label">{{ t('auth.usernameOrEmail') }} *</label>
32
29
  <input
33
30
  type="text"
34
31
  class="form-control"
35
- placeholder="Enter your user name"
32
+ :placeholder="t('auth.usernameOrEmail')"
36
33
  />
37
34
  </div>
38
35
  <div class="form-group mb-4">
39
- <label class="label">Your Password *</label>
36
+ <label class="label">{{ t('auth.yourPassword') }} *</label>
40
37
  <input
41
38
  type="password"
42
39
  class="form-control"
43
- placeholder="Enter your password"
40
+ :placeholder="t('auth.yourPassword')"
44
41
  />
45
42
  </div>
46
43
  <div class="d-flex justify-content-between mb-4">
@@ -55,11 +52,11 @@
55
52
  class="form-check-label"
56
53
  for="flexCheckDefault"
57
54
  >
58
- Remember
55
+ {{ t('auth.remember') }}
59
56
  </label>
60
57
  </div>
61
58
  <NuxtLink to="/forgot-password" class="text-primary">
62
- Lost your password?
59
+ {{ t('auth.lostPassword') }}
63
60
  </NuxtLink>
64
61
  </div>
65
62
  <div class="form-group mb-4">
@@ -67,50 +64,47 @@
67
64
  type="submit"
68
65
  class="btn btn-warning btn-pill text-white w-100 d-block"
69
66
  >
70
- Login
67
+ {{ t('auth.login') }}
71
68
  </button>
72
69
  </div>
73
70
  <div class="form-group mb-0">
74
71
  <p class="text-secondary ms-1 text-primary">
75
- Don’t have an account?
72
+ {{ t('auth.noAccount') }}
76
73
  <NuxtLink
77
74
  to="/register"
78
75
  class="text-decoration-none text-primary"
79
76
  >
80
- Register
77
+ {{ t('auth.register') }}
81
78
  </NuxtLink>
82
79
  </p>
83
80
  </div>
84
81
  </form>
85
82
  </v-tabs-window-item>
86
83
  <v-tabs-window-item value="register">
87
- <p>
88
- If you have an account, sign in with your username or
89
- email address.
90
- </p>
84
+ <p>{{ t('auth.loginDescription') }}</p>
91
85
  <form>
92
86
  <div class="form-group mb-4">
93
- <label class="label">Username *</label>
87
+ <label class="label">{{ t('auth.username') }} *</label>
94
88
  <input
95
89
  type="text"
96
90
  class="form-control"
97
- placeholder="Enter your user name"
91
+ :placeholder="t('auth.username')"
98
92
  />
99
93
  </div>
100
94
  <div class="form-group mb-4">
101
- <label class="label">Email Address *</label>
95
+ <label class="label">{{ t('auth.email') }} *</label>
102
96
  <input
103
97
  type="email"
104
98
  class="form-control"
105
- placeholder="Enter your email address"
99
+ :placeholder="t('auth.email')"
106
100
  />
107
101
  </div>
108
102
  <div class="form-group mb-4">
109
- <label class="label">Password *</label>
103
+ <label class="label">{{ t('auth.password') }} *</label>
110
104
  <input
111
105
  type="password"
112
106
  class="form-control"
113
- placeholder="Enter password"
107
+ :placeholder="t('auth.password')"
114
108
  />
115
109
  </div>
116
110
  <div class="form-group mb-4">
@@ -118,17 +112,17 @@
118
112
  type="submit"
119
113
  class="btn btn-warning btn-pill text-white w-100 d-block"
120
114
  >
121
- Register
115
+ {{ t('auth.register') }}
122
116
  </button>
123
117
  </div>
124
118
  <div class="form-group mb-0">
125
119
  <p class="text-secondary ms-1 text-primary">
126
- Already have an account?
120
+ {{ t('auth.haveAccount') }}
127
121
  <NuxtLink
128
122
  to="/login"
129
123
  class="text-decoration-none text-primary"
130
124
  >
131
- Login
125
+ {{ t('auth.login') }}
132
126
  </NuxtLink>
133
127
  </p>
134
128
  </div>
@@ -144,11 +138,17 @@
144
138
  </div>
145
139
  </template>
146
140
 
147
- <script>
148
- export default {
141
+ <script lang="ts">
142
+ import { defineComponent } from "vue";
143
+
144
+ export default defineComponent({
149
145
  name: "MyAccount",
150
146
  data: () => ({
151
147
  tab: null,
152
148
  }),
153
- };
149
+ setup() {
150
+ const { t } = useI18n();
151
+ return { t };
152
+ },
153
+ });
154
154
  </script>
@@ -9,21 +9,21 @@
9
9
  <div class="col-lg-8">
10
10
  <div class="row">
11
11
  <div class="col-lg-6 col-md-6">
12
- <h3 class="order-details-title">Order Details</h3>
12
+ <h3 class="order-details-title">{{ t('account.orderDetails') }}</h3>
13
13
  <div class="order-details-area">
14
14
  <div class="cart-totals">
15
- <h3>Order number: #001</h3>
16
- <p>Order created at: 30 August, 2021</p>
15
+ <h3>{{ t('order.orderNumber') }}: #001</h3>
16
+ <p>{{ t('order.orderCreatedAt') }}: 30 August, 2021</p>
17
17
  <NuxtLink to="/order-history" class="read-more">
18
- Back History
18
+ {{ t('order.backHistory') }}
19
19
  </NuxtLink>
20
20
  <ul>
21
- <li>Subtotal <span>$240.00</span></li>
22
- <li>Shipping <span>$240.00</span></li>
23
- <li>Coupon <span>$00.00</span></li>
24
- <li>Total <span>$240.00</span></li>
21
+ <li>{{ t('cart.subtotal') }} <span>$240.00</span></li>
22
+ <li>{{ t('cart.shipping') }} <span>$240.00</span></li>
23
+ <li>{{ t('cart.coupon') }} <span>$00.00</span></li>
24
+ <li>{{ t('cart.total') }} <span>$240.00</span></li>
25
25
  <li>
26
- <b>Total</b> <span><b>$240.00</b></span>
26
+ <b>{{ t('cart.total') }}</b> <span><b>$240.00</b></span>
27
27
  </li>
28
28
  </ul>
29
29
  </div>
@@ -32,23 +32,23 @@
32
32
 
33
33
  <div class="col-lg-6 col-md-6">
34
34
  <div class="billing-address-bar orders-details mb-0">
35
- <h3>Billing Address</h3>
35
+ <h3>{{ t('account.billingAddress') }}</h3>
36
36
 
37
37
  <ul>
38
38
  <li class="p-0">Amanda McCarter</li>
39
39
  <li>
40
- <span>Address:</span>
40
+ <span>{{ t('account.address') }}:</span>
41
41
  4 Shady Pines Drive Bowling Green
42
42
  </li>
43
43
  </ul>
44
44
 
45
45
  <ul>
46
46
  <li>
47
- <span>Phone:</span>
47
+ <span>{{ t('account.phone') }}:</span>
48
48
  <a href="tel:270-957-9995">270-957-9995</a>
49
49
  </li>
50
50
  <li>
51
- <span>Email:</span>
51
+ <span>{{ t('account.email') }}:</span>
52
52
  <a href="mailto:contact@tuan.com">contact@tuan.com</a>
53
53
  </li>
54
54
  </ul>
@@ -58,7 +58,7 @@
58
58
  to="/edit-address"
59
59
  class="btn btn-warning text-white"
60
60
  >
61
- Edit Address
61
+ {{ t('account.editAddress') }}
62
62
  </NuxtLink>
63
63
  </div>
64
64
  </div>
@@ -70,8 +70,6 @@
70
70
  </section>
71
71
  </template>
72
72
 
73
- <script>
74
- export default {
75
- name: "OrderDetails",
76
- };
73
+ <script setup lang="ts">
74
+ const { t } = useI18n();
77
75
  </script>
@@ -8,19 +8,19 @@
8
8
 
9
9
  <div class="col-lg-8">
10
10
  <div class="cart-area recent-order">
11
- <h3 class="mb-3">Order History</h3>
11
+ <h3 class="mb-3">{{ t('account.orderHistory') }}</h3>
12
12
  <form class="cart-controller mb-0">
13
13
  <div class="cart-table table-responsive">
14
14
  <table class="table table-bordered align-middle">
15
15
  <thead>
16
16
  <tr>
17
- <th scope="col">Trash</th>
18
- <th scope="col">Product</th>
17
+ <th scope="col">{{ t('order.trash') }}</th>
18
+ <th scope="col">{{ t('product.product') }}</th>
19
19
  <th scope="col"></th>
20
- <th scope="col">Order</th>
21
- <th scope="col">Quantity</th>
22
- <th scope="col">Status</th>
23
- <th scope="col">Total</th>
20
+ <th scope="col">{{ t('order.order') }}</th>
21
+ <th scope="col">{{ t('product.quantity') }}</th>
22
+ <th scope="col">{{ t('order.status') }}</th>
23
+ <th scope="col">{{ t('cart.total') }}</th>
24
24
  </tr>
25
25
  </thead>
26
26
 
@@ -55,7 +55,7 @@
55
55
  </td>
56
56
 
57
57
  <td class="product-subtotal">
58
- <span class="subtotal-amount">Paid</span>
58
+ <span class="subtotal-amount">{{ t('order.paid') }}</span>
59
59
  </td>
60
60
 
61
61
  <td class="product-subtotal">
@@ -94,7 +94,7 @@
94
94
  </td>
95
95
 
96
96
  <td class="product-subtotal">
97
- <span class="subtotal-amount">Pending</span>
97
+ <span class="subtotal-amount">{{ t('order.pending') }}</span>
98
98
  </td>
99
99
 
100
100
  <td class="product-subtotal">
@@ -133,7 +133,7 @@
133
133
  </td>
134
134
 
135
135
  <td class="product-subtotal">
136
- <span class="subtotal-amount">Failed</span>
136
+ <span class="subtotal-amount">{{ t('order.failed') }}</span>
137
137
  </td>
138
138
 
139
139
  <td class="product-subtotal">
@@ -172,7 +172,7 @@
172
172
  </td>
173
173
 
174
174
  <td class="product-subtotal">
175
- <span class="subtotal-amount">Paid</span>
175
+ <span class="subtotal-amount">{{ t('order.paid') }}</span>
176
176
  </td>
177
177
 
178
178
  <td class="product-subtotal">
@@ -190,8 +190,6 @@
190
190
  </section>
191
191
  </template>
192
192
 
193
- <script>
194
- export default {
195
- name: "OrderHistory",
196
- };
193
+ <script setup lang="ts">
194
+ const { t } = useI18n();
197
195
  </script>
@@ -44,7 +44,7 @@
44
44
  <div class="product-details-content">
45
45
  <span class="stock">
46
46
  <i class="ri-check-line"></i>
47
- In Stock
47
+ {{ t('product.inStock') }}
48
48
  </span>
49
49
  <h3>
50
50
  Apple MacBook Pro 16.2" with Liquid Retina XDR Display, M2 Max
@@ -56,11 +56,11 @@
56
56
  <i class="flaticon-star"></i>
57
57
  <i class="flaticon-star"></i>
58
58
  <i class="flaticon-star"></i>
59
- <span>(5 Reviews)</span>
59
+ <span>(5 {{ t('product.reviews') }})</span>
60
60
  </div>
61
61
  <h2 class="price">$399 <del>$450</del></h2>
62
62
  <div class="d-flex style-select">
63
- <span>Style:</span>
63
+ <span>{{ t('product.style') }}:</span>
64
64
  <h5>{{ typeText }}</h5>
65
65
  </div>
66
66
  <div class="select-style mb-4">
@@ -82,7 +82,7 @@
82
82
  </label>
83
83
  </div>
84
84
  <div class="d-flex style-select">
85
- <span>Capacity:</span>
85
+ <span>{{ t('product.capacity') }}:</span>
86
86
  <h5>{{ capacityText }}</h5>
87
87
  </div>
88
88
  <div class="select-style mb-4">
@@ -105,7 +105,7 @@
105
105
  </label>
106
106
  </div>
107
107
  <div class="d-flex style-select">
108
- <span>Color:</span>
108
+ <span>{{ t('product.color') }}:</span>
109
109
  <h5>{{ colorText }}</h5>
110
110
  </div>
111
111
  <ul class="d-flex ps-0 mb-0 list-unstyled select-color gap-2 mb-4">
@@ -124,42 +124,42 @@
124
124
  <ProductDetailsProductQuantity />
125
125
  <button class="btn btn-success text-white rounded-pill">
126
126
  <i class="ri-shopping-cart-line"></i>
127
- <span>Add To Cart</span>
127
+ <span>{{ t('product.addToCart') }}</span>
128
128
  </button>
129
129
  </div>
130
130
  <button class="d-flex align-items-center gap-3 wishlist mb-3">
131
131
  <i class="ri-heart-line"></i>
132
- <span>Add to wishlist</span>
132
+ <span>{{ t('product.addToWishlist') }}</span>
133
133
  </button>
134
134
  <button class="d-flex align-items-center gap-3 wishlist">
135
135
  <i class="ri-eye-line"></i>
136
- <span><span>565 people</span> are viewing the products</span>
136
+ <span><span>565</span> {{ t('product.viewingProduct') }}</span>
137
137
  </button>
138
138
  <ul class="services-list ps-0 mb-0 list-unstyled">
139
139
  <li class="d-flex align-items-center">
140
140
  <i class="ri-check-line"></i>
141
- <span>Free delivery today</span>
141
+ <span>{{ t('product.freeDelivery') }}</span>
142
142
  </li>
143
143
  <li class="d-flex align-items-center">
144
144
  <i class="ri-check-line"></i>
145
- <span>100% money back Guarantee</span>
145
+ <span>{{ t('product.moneyBack') }}</span>
146
146
  </li>
147
147
  <li class="d-flex align-items-center">
148
148
  <i class="ri-check-line"></i>
149
- <span>7 days product return policy</span>
149
+ <span>{{ t('product.returnPolicy') }}</span>
150
150
  </li>
151
151
  </ul>
152
152
  <ul class="sku-list ps-0 mb-0 list-unstyled">
153
153
  <li class="d-flex align-items-center">
154
- <span class="title">SKU:</span>
154
+ <span class="title">{{ t('product.sku') }}:</span>
155
155
  <span class="title2">SMTGS6T45</span>
156
156
  </li>
157
157
  <li class="d-flex align-items-center">
158
- <span class="title">Category:</span>
158
+ <span class="title">{{ t('product.category') }}:</span>
159
159
  <span class="title2">Computer</span>
160
160
  </li>
161
161
  <li class="d-flex align-items-center">
162
- <span class="title">Tags:</span>
162
+ <span class="title">{{ t('nav.tags') }}:</span>
163
163
  <span class="title2">laptop, macbook, PC</span>
164
164
  </li>
165
165
  </ul>
@@ -167,7 +167,7 @@
167
167
  class="social-link ps-0 mb-0 list-unstyled d-flex gap-2 flex-wrap"
168
168
  >
169
169
  <li class="d-flex align-items-center me-2">
170
- <span>Share:</span>
170
+ <span>{{ t('product.share') }}:</span>
171
171
  </li>
172
172
  <li class="d-flex align-items-center gap-2">
173
173
  <a href="https://facebook.com/" target="_blank">
@@ -210,6 +210,7 @@ export default defineComponent({
210
210
  tab: null,
211
211
  }),
212
212
  setup() {
213
+ const { t } = useI18n();
213
214
  const typeText = ref("Apple M1 Max Chip");
214
215
  const typeActiveButton = ref("first");
215
216
 
@@ -250,6 +251,7 @@ export default defineComponent({
250
251
  };
251
252
 
252
253
  return {
254
+ t,
253
255
  typeText,
254
256
  typeActiveButton,
255
257
  setTypeTextToFirst,
@@ -56,12 +56,12 @@
56
56
  >
57
57
  <span class="delivery">
58
58
  <i class="ri-truck-line"></i>
59
- Free Delivery
59
+ {{ t('product.freeDelivery') }}
60
60
  </span>
61
61
  <button class="cart-btn">
62
62
  <i class="ri-shopping-cart-line"></i>
63
63
  <v-tooltip activator="parent" location="top">
64
- Add To Cart
64
+ {{ t('product.addToCart') }}
65
65
  </v-tooltip>
66
66
  </button>
67
67
  </div>
@@ -112,12 +112,12 @@
112
112
  >
113
113
  <span class="delivery">
114
114
  <i class="ri-truck-line"></i>
115
- Free Delivery
115
+ {{ t('product.freeDelivery') }}
116
116
  </span>
117
117
  <button class="cart-btn">
118
118
  <i class="ri-shopping-cart-line"></i>
119
119
  <v-tooltip activator="parent" location="top">
120
- Add To Cart
120
+ {{ t('product.addToCart') }}
121
121
  </v-tooltip>
122
122
  </button>
123
123
  </div>
@@ -168,12 +168,12 @@
168
168
  >
169
169
  <span class="delivery">
170
170
  <i class="ri-truck-line"></i>
171
- Free Delivery
171
+ {{ t('product.freeDelivery') }}
172
172
  </span>
173
173
  <button class="cart-btn">
174
174
  <i class="ri-shopping-cart-line"></i>
175
175
  <v-tooltip activator="parent" location="top">
176
- Add To Cart
176
+ {{ t('product.addToCart') }}
177
177
  </v-tooltip>
178
178
  </button>
179
179
  </div>
@@ -224,12 +224,12 @@
224
224
  >
225
225
  <span class="delivery">
226
226
  <i class="ri-truck-line"></i>
227
- Free Delivery
227
+ {{ t('product.freeDelivery') }}
228
228
  </span>
229
229
  <button class="cart-btn">
230
230
  <i class="ri-shopping-cart-line"></i>
231
231
  <v-tooltip activator="parent" location="top">
232
- Add To Cart
232
+ {{ t('product.addToCart') }}
233
233
  </v-tooltip>
234
234
  </button>
235
235
  </div>
@@ -280,12 +280,12 @@
280
280
  >
281
281
  <span class="delivery">
282
282
  <i class="ri-truck-line"></i>
283
- Free Delivery
283
+ {{ t('product.freeDelivery') }}
284
284
  </span>
285
285
  <button class="cart-btn">
286
286
  <i class="ri-shopping-cart-line"></i>
287
287
  <v-tooltip activator="parent" location="top">
288
- Add To Cart
288
+ {{ t('product.addToCart') }}
289
289
  </v-tooltip>
290
290
  </button>
291
291
  </div>
@@ -297,8 +297,6 @@
297
297
  </div>
298
298
  </template>
299
299
 
300
- <script>
301
- export default {
302
- name: "RecentlyViewed",
303
- };
300
+ <script setup lang="ts">
301
+ const { t } = useI18n();
304
302
  </script>
@@ -13,7 +13,7 @@
13
13
  <div class="sidebar product-sidebar">
14
14
  <!-- Categories filter -->
15
15
  <div class="single-sidebar-widget">
16
- <h3>Filter By Categories</h3>
16
+ <h3>{{ t('product.filterByCategories') }}</h3>
17
17
  <ul class="ps-0 mb-0 list-unstyled filter-selecet">
18
18
  <li v-for="category in topLevelCategories" :key="category.id">
19
19
  <div class="form-check">
@@ -32,7 +32,7 @@
32
32
  </li>
33
33
  <li v-if="selectedCategoryId">
34
34
  <a href="javascript:void(0)" class="text-primary fs-13" @click="selectedCategoryId = ''">
35
- Clear filter
35
+ {{ t('product.clearFilter') }}
36
36
  </a>
37
37
  </li>
38
38
  </ul>
@@ -40,12 +40,12 @@
40
40
 
41
41
  <!-- Price filter -->
42
42
  <div class="single-sidebar-widget">
43
- <h3>Price Range</h3>
43
+ <h3>{{ t('product.priceRange') }}</h3>
44
44
  <div class="d-flex gap-2 align-items-center">
45
45
  <input
46
46
  type="number"
47
47
  class="form-control form-control-sm"
48
- placeholder="Min"
48
+ :placeholder="t('product.min')"
49
49
  v-model.number="minPrice"
50
50
  min="0"
51
51
  />
@@ -53,7 +53,7 @@
53
53
  <input
54
54
  type="number"
55
55
  class="form-control form-control-sm"
56
- placeholder="Max"
56
+ :placeholder="t('product.max')"
57
57
  v-model.number="maxPrice"
58
58
  min="0"
59
59
  />
@@ -62,18 +62,18 @@
62
62
  class="btn btn-sm btn-outline-primary mt-2 w-100"
63
63
  @click="applyFilters"
64
64
  >
65
- Apply
65
+ {{ t('product.apply') }}
66
66
  </button>
67
67
  </div>
68
68
 
69
69
  <!-- Sort -->
70
70
  <div class="single-sidebar-widget">
71
- <h3>Sort By</h3>
71
+ <h3>{{ t('product.sortBy') }}</h3>
72
72
  <select class="form-select form-select-sm" v-model="sortBy">
73
- <option value="newest">Newest</option>
74
- <option value="price-asc">Price: Low to High</option>
75
- <option value="price-desc">Price: High to Low</option>
76
- <option value="name">Name A-Z</option>
73
+ <option value="newest">{{ t('product.newest') }}</option>
74
+ <option value="price-asc">{{ t('product.priceLowHigh') }}</option>
75
+ <option value="price-desc">{{ t('product.priceHighLow') }}</option>
76
+ <option value="name">{{ t('product.nameAZ') }}</option>
77
77
  </select>
78
78
  </div>
79
79
  </div>
@@ -84,24 +84,24 @@
84
84
  <!-- Search info -->
85
85
  <div class="d-flex align-items-center justify-content-between mb-3" v-if="searchQuery || selectedCategoryId">
86
86
  <p class="mb-0 text-muted">
87
- <span v-if="searchQuery">Search: "{{ searchQuery }}"</span>
88
- <span v-if="selectedCategoryName"> | Category: {{ selectedCategoryName }}</span>
89
- <span v-if="totalProducts"> | {{ totalProducts }} products found</span>
87
+ <span v-if="searchQuery">{{ t('nav.search') }}: "{{ searchQuery }}"</span>
88
+ <span v-if="selectedCategoryName"> | {{ t('product.category') }}: {{ selectedCategoryName }}</span>
89
+ <span v-if="totalProducts"> | {{ totalProducts }} {{ t('product.productsFound') }}</span>
90
90
  </p>
91
91
  <button class="btn btn-sm btn-outline-secondary" @click="clearAllFilters">
92
- Clear all
92
+ {{ t('product.clearAll') }}
93
93
  </button>
94
94
  </div>
95
95
 
96
96
  <!-- Products count and total -->
97
97
  <div class="d-flex align-items-center justify-content-between mb-3" v-else>
98
- <p class="mb-0 text-muted">{{ totalProducts }} products</p>
98
+ <p class="mb-0 text-muted">{{ totalProducts }} {{ t('product.productsFound') }}</p>
99
99
  </div>
100
100
 
101
101
  <!-- Loading -->
102
102
  <div v-if="loading" class="text-center py-5">
103
103
  <div class="spinner-border text-primary" role="status">
104
- <span class="visually-hidden">Loading...</span>
104
+ <span class="visually-hidden">{{ t('product.loading') }}</span>
105
105
  </div>
106
106
  </div>
107
107
 
@@ -119,7 +119,7 @@
119
119
  <!-- No products -->
120
120
  <div v-else class="text-center py-5">
121
121
  <i class="ri-shopping-bag-line fs-1 text-muted"></i>
122
- <p class="mt-3 text-muted">No products found</p>
122
+ <p class="mt-3 text-muted">{{ t('product.noProducts') }}</p>
123
123
  </div>
124
124
 
125
125
  <!-- Pagination -->
@@ -161,6 +161,7 @@ import { defineComponent, ref, computed, watch, onMounted } from "vue";
161
161
  export default defineComponent({
162
162
  name: "ProductsIndex",
163
163
  setup() {
164
+ const { t } = useI18n();
164
165
  const route = useRoute();
165
166
  const router = useRouter();
166
167
  const { fetchProducts, products, loading } = useProducts();
@@ -270,6 +271,7 @@ export default defineComponent({
270
271
  });
271
272
 
272
273
  return {
274
+ t,
273
275
  products,
274
276
  loading,
275
277
  topLevelCategories,