@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
@@ -5,14 +5,13 @@
5
5
  <v-row class="justify-content-center">
6
6
  <v-col cols="12" lg="3" sm="6">
7
7
  <div class="single-footer-widget">
8
- <h3>About The Shop</h3>
8
+ <h3>{{ t('footer.aboutTheShop') }}</h3>
9
9
  <p>
10
- We're not just an online store; we're your gateway to a world of
11
- cutting-edge electronics and telemobile devices
10
+ {{ t('footer.storeDescription') }}
12
11
  </p>
13
12
 
14
13
  <div class="call-info">
15
- <span class="title">Got Question? Call us 24/7</span>
14
+ <span class="title">{{ t('footer.gotQuestion') }}</span>
16
15
  <div class="d-flex align-items-center">
17
16
  <i class="flaticon-headphones-1"></i>
18
17
  <a href="tel:(808)-555-0111">(808) 555-0111</a>
@@ -22,78 +21,68 @@
22
21
  </v-col>
23
22
  <v-col cols="12" lg="3" sm="6">
24
23
  <div class="single-footer-widget">
25
- <h3>Popular Categories</h3>
24
+ <h3>{{ t('footer.popularCategories') }}</h3>
26
25
 
27
26
  <ul class="ps-0 mb-0 list-unstyled import-link">
28
- <li>
29
- <NuxtLink to="/products">Smartphone & Tablets</NuxtLink>
30
- </li>
31
- <li>
32
- <NuxtLink to="/products">Laptop & Desktop</NuxtLink>
33
- </li>
34
- <li>
35
- <NuxtLink to="/products">Headphones</NuxtLink>
36
- </li>
37
- <li>
38
- <NuxtLink to="/products">Smart Watches</NuxtLink>
39
- </li>
40
- <li>
41
- <NuxtLink to="/products">Drone & Camera</NuxtLink>
27
+ <li v-for="category in footerCategories" :key="category.id">
28
+ <NuxtLink :to="`/products?categoryId=${category.id}`">
29
+ {{ category.name }}
30
+ </NuxtLink>
42
31
  </li>
43
- <li>
44
- <NuxtLink to="/products">Home Electronics</NuxtLink>
32
+ <li v-if="footerCategories.length === 0">
33
+ <NuxtLink to="/products">{{ t('nav.allProducts') }}</NuxtLink>
45
34
  </li>
46
35
  </ul>
47
36
  </div>
48
37
  </v-col>
49
38
  <v-col cols="12" lg="3" sm="6">
50
39
  <div class="single-footer-widget">
51
- <h3>Let Us Help You</h3>
40
+ <h3>{{ t('footer.letUsHelp') }}</h3>
52
41
 
53
42
  <ul class="ps-0 mb-0 list-unstyled import-link">
54
43
  <li>
55
- <NuxtLink to="/dashboard">Your Account</NuxtLink>
44
+ <NuxtLink to="/dashboard">{{ t('account.yourAccount') }}</NuxtLink>
56
45
  </li>
57
46
  <li>
58
- <NuxtLink to="/order-history">Your Order</NuxtLink>
47
+ <NuxtLink to="/order-history">{{ t('account.yourOrders') }}</NuxtLink>
59
48
  </li>
60
49
  <li>
61
- <NuxtLink to="/privacy-policy">Return Policy</NuxtLink>
50
+ <NuxtLink to="/privacy-policy">{{ t('footer.returnPolicy') }}</NuxtLink>
62
51
  </li>
63
52
  <li>
64
- <NuxtLink to="/faq">Help Center</NuxtLink>
53
+ <NuxtLink to="/faq">{{ t('common.helpCenter') }}</NuxtLink>
65
54
  </li>
66
55
  <li>
67
- <NuxtLink to="/products">Product Replacement</NuxtLink>
56
+ <NuxtLink to="/products">{{ t('footer.productReplacement') }}</NuxtLink>
68
57
  </li>
69
58
  <li>
70
- <NuxtLink to="/dashboard">Shop With Points</NuxtLink>
59
+ <NuxtLink to="/dashboard">{{ t('footer.shopWithPoints') }}</NuxtLink>
71
60
  </li>
72
61
  </ul>
73
62
  </div>
74
63
  </v-col>
75
64
  <v-col cols="12" lg="3" sm="6">
76
65
  <div class="single-footer-widget">
77
- <h3>Get to Know Us</h3>
66
+ <h3>{{ t('footer.getToKnowUs') }}</h3>
78
67
 
79
68
  <ul class="ps-0 mb-0 list-unstyled import-link">
80
69
  <li>
81
- <NuxtLink to="/about-us">About Us</NuxtLink>
70
+ <NuxtLink to="/about-us">{{ t('nav.aboutUs') }}</NuxtLink>
82
71
  </li>
83
72
  <li>
84
- <NuxtLink to="/about-us">Careers</NuxtLink>
73
+ <NuxtLink to="/about-us">{{ t('footer.careers') }}</NuxtLink>
85
74
  </li>
86
75
  <li>
87
- <NuxtLink to="/contact">Store Location</NuxtLink>
76
+ <NuxtLink to="/contact">{{ t('footer.storeLocation') }}</NuxtLink>
88
77
  </li>
89
78
  <li>
90
- <NuxtLink to="/our-blog">News Center</NuxtLink>
79
+ <NuxtLink to="/our-blog">{{ t('footer.newsCenter') }}</NuxtLink>
91
80
  </li>
92
81
  <li>
93
82
  <NuxtLink to="/about-us">Investor Relations</NuxtLink>
94
83
  </li>
95
84
  <li>
96
- <NuxtLink to="/contact">Contact Us</NuxtLink>
85
+ <NuxtLink to="/contact">{{ t('nav.contact') }}</NuxtLink>
97
86
  </li>
98
87
  </ul>
99
88
  </div>
@@ -107,7 +96,7 @@
107
96
  class="ps-0 mb-0 list-unstyled d-flex align-items-center social-link ms-0 justify-content-md-start justify-content-center"
108
97
  >
109
98
  <li>
110
- <span class="titles">Follow Us:</span>
99
+ <span class="titles">{{ t('footer.followUs') }}:</span>
111
100
  </li>
112
101
  <li>
113
102
  <a href="https://www.facebook.com/" target="_blank">
@@ -138,7 +127,7 @@
138
127
  class="ps-0 mb-0 list-unstyled d-flex align-items-center justify-content-center justify-content-lg-end app-link"
139
128
  >
140
129
  <li>
141
- <span class="titles">Download App:</span>
130
+ <span class="titles">{{ t('footer.downloadApp') }}:</span>
142
131
  </li>
143
132
  <li>
144
133
  <a href="https://www.apple.com/store" target="_blank">
@@ -158,8 +147,13 @@
158
147
  </div>
159
148
  </template>
160
149
 
161
- <script>
162
- export default {
163
- name: "FooterTwo",
164
- };
150
+ <script setup lang="ts">
151
+ import { computed } from "vue";
152
+
153
+ const { t } = useI18n();
154
+ const { topLevelCategories } = useCategories();
155
+
156
+ const footerCategories = computed(() =>
157
+ topLevelCategories.value.slice(0, 6)
158
+ );
165
159
  </script>
@@ -16,7 +16,7 @@
16
16
  :aria-pressed="show ? 'true' : 'false'"
17
17
  :class="{ show: buttonShowState }"
18
18
  >
19
- All Categories
19
+ {{ t('nav.allCategories') }}
20
20
  </button>
21
21
  <ul class="dropdown-menu" :class="{ toggler: show }">
22
22
  <li v-for="category in topLevelCategories" :key="category.id">
@@ -28,7 +28,7 @@
28
28
  </NuxtLink>
29
29
  </li>
30
30
  <li v-if="topLevelCategories.length === 0">
31
- <span class="dropdown-item text-muted">No categories</span>
31
+ <span class="dropdown-item text-muted">{{ t('nav.noCategories') }}</span>
32
32
  </li>
33
33
  </ul>
34
34
  </div>
@@ -36,7 +36,7 @@
36
36
  <input
37
37
  type="text"
38
38
  class="form-control border-2"
39
- placeholder="Search for products..."
39
+ :placeholder="t('nav.searchProducts')"
40
40
  v-model="searchQuery"
41
41
  @keyup.enter="handleSearch"
42
42
  />
@@ -46,7 +46,7 @@
46
46
  @click="handleSearch"
47
47
  >
48
48
  <i class="ri-search-line"></i>
49
- <span class="d-none d-sm-inline-block">Search</span>
49
+ <span class="d-none d-sm-inline-block">{{ t('nav.search') }}</span>
50
50
  </button>
51
51
  </div>
52
52
  </div>
@@ -62,8 +62,8 @@
62
62
  <i class="ri-user-line"></i>
63
63
  </div>
64
64
  <div class="flex-grow-1 ms-10">
65
- <span>Login Your</span>
66
- <h3>Account</h3>
65
+ <span>{{ t('auth.login') }}</span>
66
+ <h3>{{ t('account.yourAccount') }}</h3>
67
67
  </div>
68
68
  </div>
69
69
  </NuxtLink>
@@ -93,7 +93,7 @@
93
93
  </div>
94
94
  </div>
95
95
  <div class="flex-grow-1 ms-1">
96
- <span>Your Cart</span>
96
+ <span>{{ t('account.yourCart') }}</span>
97
97
  <h3>${{ subtotal.toFixed(2) }}</h3>
98
98
  </div>
99
99
  </div>
@@ -142,13 +142,13 @@
142
142
  class="d-flex justify-content-between align-items-center cart-item"
143
143
  >
144
144
  <NuxtLink to="/cart" class="btn btn-primary fs-14 text-white">
145
- View Cart
145
+ {{ t('account.viewCart') }}
146
146
  </NuxtLink>
147
147
  <NuxtLink
148
148
  to="/checkout"
149
149
  class="btn btn-warning fs-14 text-white"
150
150
  >
151
- Checkout
151
+ {{ t('account.checkout') }}
152
152
  </NuxtLink>
153
153
  </li>
154
154
  </template>
@@ -177,6 +177,7 @@ export default defineComponent({
177
177
  const defaultLogo = defaultLogoImg;
178
178
  const router = useRouter();
179
179
 
180
+ const { t } = useI18n();
180
181
  const { topLevelCategories } = useCategories();
181
182
  const { logoUrl } = useSiteConfig();
182
183
  const { cart, itemCount, subtotal, isEmpty, removeFromCart } = useCart();
@@ -184,8 +185,7 @@ export default defineComponent({
184
185
  const resolveImageUrl = (url: string) => {
185
186
  if (!url) return '';
186
187
  if (url.startsWith('http')) return url;
187
- const config = useRuntimeConfig();
188
- const apiBase = config.public.apiBase || 'http://localhost:3001/api';
188
+ const apiBase = getApiBaseUrl();
189
189
  const baseUrl = apiBase.replace('/api', '');
190
190
  return `${baseUrl}${url}`;
191
191
  };
@@ -223,6 +223,7 @@ export default defineComponent({
223
223
  isEmpty,
224
224
  removeFromCart,
225
225
  resolveImageUrl,
226
+ t,
226
227
  };
227
228
  },
228
229
  });
@@ -12,7 +12,7 @@
12
12
  <input
13
13
  type="text"
14
14
  class="form-control border-2"
15
- placeholder="Search for products..."
15
+ :placeholder="t('nav.searchProducts')"
16
16
  v-model="searchQuery"
17
17
  @keyup.enter="handleSearch"
18
18
  />
@@ -22,7 +22,7 @@
22
22
  @click="handleSearch"
23
23
  >
24
24
  <i class="ri-search-line"></i>
25
- <span class="d-none d-sm-inline-block">Search</span>
25
+ <span class="d-none d-sm-inline-block">{{ t('nav.search') }}</span>
26
26
  </button>
27
27
  </div>
28
28
  </div>
@@ -37,7 +37,7 @@
37
37
  <i class="ri-phone-line bg-danger-10"></i>
38
38
  </div>
39
39
  <div class="flex-grow-1 ms-10">
40
- <span>Hotline</span>
40
+ <span>{{ t('nav.hotline') }}</span>
41
41
  <h3>{{ phone }}</h3>
42
42
  </div>
43
43
  </div>
@@ -125,13 +125,13 @@
125
125
  class="d-flex justify-content-between align-items-center cart-item"
126
126
  >
127
127
  <NuxtLink to="/cart" class="btn btn-primary fs-14 text-white">
128
- View Cart
128
+ {{ t('account.viewCart') }}
129
129
  </NuxtLink>
130
130
  <NuxtLink
131
131
  to="/checkout"
132
132
  class="btn btn-warning fs-14 text-white"
133
133
  >
134
- Checkout
134
+ {{ t('account.checkout') }}
135
135
  </NuxtLink>
136
136
  </li>
137
137
  </template>
@@ -158,6 +158,7 @@ export default defineComponent({
158
158
  const defaultLogo = defaultLogoImg;
159
159
  const router = useRouter();
160
160
 
161
+ const { t } = useI18n();
161
162
  const { logoUrl, contactInfo } = useSiteConfig();
162
163
  const { cart, itemCount, subtotal, isEmpty, removeFromCart } = useCart();
163
164
 
@@ -166,8 +167,7 @@ export default defineComponent({
166
167
  const resolveImageUrl = (url: string) => {
167
168
  if (!url) return '';
168
169
  if (url.startsWith('http')) return url;
169
- const config = useRuntimeConfig();
170
- const apiBase = config.public.apiBase || 'http://localhost:3001/api';
170
+ const apiBase = getApiBaseUrl();
171
171
  const baseUrl = apiBase.replace('/api', '');
172
172
  return `${baseUrl}${url}`;
173
173
  };
@@ -198,6 +198,7 @@ export default defineComponent({
198
198
  isEmpty,
199
199
  removeFromCart,
200
200
  resolveImageUrl,
201
+ t,
201
202
  };
202
203
  },
203
204
  });
@@ -16,7 +16,7 @@
16
16
  :aria-pressed="show ? 'true' : 'false'"
17
17
  :class="{ show: buttonShowState }"
18
18
  >
19
- All Categories
19
+ {{ t('nav.allCategories') }}
20
20
  </button>
21
21
  <ul class="dropdown-menu" :class="{ toggler: show }">
22
22
  <li v-for="category in topLevelCategories" :key="category.id">
@@ -28,7 +28,7 @@
28
28
  </NuxtLink>
29
29
  </li>
30
30
  <li v-if="topLevelCategories.length === 0">
31
- <span class="dropdown-item text-muted">No categories</span>
31
+ <span class="dropdown-item text-muted">{{ t('nav.noCategories') }}</span>
32
32
  </li>
33
33
  </ul>
34
34
  </div>
@@ -36,7 +36,7 @@
36
36
  <input
37
37
  type="text"
38
38
  class="form-control border-2"
39
- placeholder="Search for products..."
39
+ :placeholder="t('nav.searchProducts')"
40
40
  v-model="searchQuery"
41
41
  @keyup.enter="handleSearch"
42
42
  />
@@ -46,7 +46,7 @@
46
46
  @click="handleSearch"
47
47
  >
48
48
  <i class="ri-search-line"></i>
49
- <span class="d-none d-sm-inline-block">Search</span>
49
+ <span class="d-none d-sm-inline-block">{{ t('nav.search') }}</span>
50
50
  </button>
51
51
  </div>
52
52
  </div>
@@ -62,7 +62,7 @@
62
62
  <i class="ri-phone-line bg-danger-10"></i>
63
63
  </div>
64
64
  <div class="flex-grow-1 ms-10">
65
- <span>Hotline</span>
65
+ <span>{{ t('nav.hotline') }}</span>
66
66
  <h3>{{ phone }}</h3>
67
67
  </div>
68
68
  </div>
@@ -150,13 +150,13 @@
150
150
  class="d-flex justify-content-between align-items-center cart-item"
151
151
  >
152
152
  <NuxtLink to="/cart" class="btn btn-primary fs-14 text-white">
153
- View Cart
153
+ {{ t('account.viewCart') }}
154
154
  </NuxtLink>
155
155
  <NuxtLink
156
156
  to="/checkout"
157
157
  class="btn btn-warning fs-14 text-white"
158
158
  >
159
- Checkout
159
+ {{ t('account.checkout') }}
160
160
  </NuxtLink>
161
161
  </li>
162
162
  </template>
@@ -185,6 +185,7 @@ export default defineComponent({
185
185
  const defaultLogo = defaultLogoImg;
186
186
  const router = useRouter();
187
187
 
188
+ const { t } = useI18n();
188
189
  const { topLevelCategories } = useCategories();
189
190
  const { logoUrl, contactInfo } = useSiteConfig();
190
191
  const { cart, itemCount, subtotal, isEmpty, removeFromCart } = useCart();
@@ -194,8 +195,7 @@ export default defineComponent({
194
195
  const resolveImageUrl = (url: string) => {
195
196
  if (!url) return '';
196
197
  if (url.startsWith('http')) return url;
197
- const config = useRuntimeConfig();
198
- const apiBase = config.public.apiBase || 'http://localhost:3001/api';
198
+ const apiBase = getApiBaseUrl();
199
199
  const baseUrl = apiBase.replace('/api', '');
200
200
  return `${baseUrl}${url}`;
201
201
  };
@@ -234,6 +234,7 @@ export default defineComponent({
234
234
  isEmpty,
235
235
  removeFromCart,
236
236
  resolveImageUrl,
237
+ t,
237
238
  };
238
239
  },
239
240
  });
@@ -29,7 +29,7 @@
29
29
  :class="{ show: buttonShowState }"
30
30
  >
31
31
  <i class="ri-menu-2-line"></i>
32
- <span>Browse Categories</span>
32
+ <span>{{ t('nav.browseCategories') }}</span>
33
33
  </div>
34
34
 
35
35
  <ul class="dropdown-menu" :class="{ show: show }">
@@ -68,7 +68,7 @@
68
68
  </template>
69
69
  </li>
70
70
  <li v-if="topLevelCategories.length === 0">
71
- <span class="dropdown-item text-muted">No categories</span>
71
+ <span class="dropdown-item text-muted">{{ t('nav.noCategories') }}</span>
72
72
  </li>
73
73
  </ul>
74
74
  </li>
@@ -77,23 +77,23 @@
77
77
  <div class="collapse navbar-collapse">
78
78
  <ul class="navbar-nav me-auto ms-68">
79
79
  <li class="nav-item">
80
- <NuxtLink class="nav-link" to="/"> Home </NuxtLink>
80
+ <NuxtLink class="nav-link" to="/"> {{ t('nav.home') }} </NuxtLink>
81
81
  </li>
82
82
 
83
83
  <li class="nav-item">
84
- <NuxtLink class="nav-link" to="/products"> Products </NuxtLink>
84
+ <NuxtLink class="nav-link" to="/products"> {{ t('nav.products') }} </NuxtLink>
85
85
  </li>
86
86
 
87
87
  <li class="nav-item">
88
- <NuxtLink class="nav-link" to="/categories"> Categories </NuxtLink>
88
+ <NuxtLink class="nav-link" to="/categories"> {{ t('nav.categories') }} </NuxtLink>
89
89
  </li>
90
90
 
91
91
  <li class="nav-item">
92
- <NuxtLink class="nav-link" to="/about-us"> About </NuxtLink>
92
+ <NuxtLink class="nav-link" to="/about-us"> {{ t('nav.about') }} </NuxtLink>
93
93
  </li>
94
94
 
95
95
  <li class="nav-item">
96
- <NuxtLink class="nav-link" to="/contact"> Contact </NuxtLink>
96
+ <NuxtLink class="nav-link" to="/contact"> {{ t('nav.contact') }} </NuxtLink>
97
97
  </li>
98
98
  </ul>
99
99
  </div>
@@ -108,7 +108,7 @@
108
108
  <i class="ri-phone-line bg-danger-10"></i>
109
109
  </div>
110
110
  <div class="flex-grow-1 ms-10">
111
- <span>Hotline</span>
111
+ <span>{{ t('nav.hotline') }}</span>
112
112
  <h3>{{ phone }}</h3>
113
113
  </div>
114
114
  </div>
@@ -135,6 +135,7 @@ export default defineComponent({
135
135
  const stateStoreInstance = stateStore;
136
136
  const defaultLogo = defaultLogoImg;
137
137
 
138
+ const { t } = useI18n();
138
139
  const { topLevelCategories, getSubcategories } = useCategories();
139
140
  const { logoUrl, contactInfo } = useSiteConfig();
140
141
 
@@ -179,6 +180,7 @@ export default defineComponent({
179
180
  getSubcategories,
180
181
  logoUrl,
181
182
  phone,
183
+ t,
182
184
  };
183
185
  },
184
186
  });
@@ -29,7 +29,7 @@
29
29
  :class="{ show: buttonShowState }"
30
30
  >
31
31
  <i class="ri-menu-2-line"></i>
32
- <span>Browse Categories</span>
32
+ <span>{{ t('nav.browseCategories') }}</span>
33
33
  </div>
34
34
 
35
35
  <ul class="dropdown-menu" :class="{ show: show }">
@@ -68,7 +68,7 @@
68
68
  </template>
69
69
  </li>
70
70
  <li v-if="topLevelCategories.length === 0">
71
- <span class="dropdown-item text-muted">No categories</span>
71
+ <span class="dropdown-item text-muted">{{ t('nav.noCategories') }}</span>
72
72
  </li>
73
73
  </ul>
74
74
  </li>
@@ -77,23 +77,23 @@
77
77
  <div class="collapse navbar-collapse">
78
78
  <ul class="navbar-nav me-auto ms-68">
79
79
  <li class="nav-item">
80
- <NuxtLink class="nav-link" to="/"> Home </NuxtLink>
80
+ <NuxtLink class="nav-link" to="/"> {{ t('nav.home') }} </NuxtLink>
81
81
  </li>
82
82
 
83
83
  <li class="nav-item">
84
- <NuxtLink class="nav-link" to="/products"> Products </NuxtLink>
84
+ <NuxtLink class="nav-link" to="/products"> {{ t('nav.products') }} </NuxtLink>
85
85
  </li>
86
86
 
87
87
  <li class="nav-item">
88
- <NuxtLink class="nav-link" to="/categories"> Categories </NuxtLink>
88
+ <NuxtLink class="nav-link" to="/categories"> {{ t('nav.categories') }} </NuxtLink>
89
89
  </li>
90
90
 
91
91
  <li class="nav-item">
92
- <NuxtLink class="nav-link" to="/about-us"> About </NuxtLink>
92
+ <NuxtLink class="nav-link" to="/about-us"> {{ t('nav.about') }} </NuxtLink>
93
93
  </li>
94
94
 
95
95
  <li class="nav-item">
96
- <NuxtLink class="nav-link" to="/contact"> Contact </NuxtLink>
96
+ <NuxtLink class="nav-link" to="/contact"> {{ t('nav.contact') }} </NuxtLink>
97
97
  </li>
98
98
  </ul>
99
99
  </div>
@@ -111,7 +111,7 @@
111
111
  <i class="ri-phone-line"></i>
112
112
  </div>
113
113
  <div class="flex-grow-1 ms-10">
114
- <span>Hotline</span>
114
+ <span>{{ t('nav.hotline') }}</span>
115
115
  <h3>{{ phone }}</h3>
116
116
  </div>
117
117
  </div>
@@ -138,6 +138,7 @@ export default defineComponent({
138
138
  const stateStoreInstance = stateStore;
139
139
  const defaultLogo = defaultLogoImg;
140
140
 
141
+ const { t } = useI18n();
141
142
  const { topLevelCategories, getSubcategories } = useCategories();
142
143
  const { logoUrl, contactInfo } = useSiteConfig();
143
144
 
@@ -182,6 +183,7 @@ export default defineComponent({
182
183
  getSubcategories,
183
184
  logoUrl,
184
185
  phone,
186
+ t,
185
187
  };
186
188
  },
187
189
  });
@@ -25,23 +25,23 @@
25
25
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
26
26
  <ul class="navbar-nav me-auto">
27
27
  <li class="nav-item">
28
- <NuxtLink class="nav-link" to="/"> Home </NuxtLink>
28
+ <NuxtLink class="nav-link" to="/"> {{ t('nav.home') }} </NuxtLink>
29
29
  </li>
30
30
 
31
31
  <li class="nav-item">
32
- <NuxtLink class="nav-link" to="/products"> Products </NuxtLink>
32
+ <NuxtLink class="nav-link" to="/products"> {{ t('nav.products') }} </NuxtLink>
33
33
  </li>
34
34
 
35
35
  <li class="nav-item">
36
- <NuxtLink class="nav-link" to="/categories"> Categories </NuxtLink>
36
+ <NuxtLink class="nav-link" to="/categories"> {{ t('nav.categories') }} </NuxtLink>
37
37
  </li>
38
38
 
39
39
  <li class="nav-item">
40
- <NuxtLink class="nav-link" to="/about-us"> About </NuxtLink>
40
+ <NuxtLink class="nav-link" to="/about-us"> {{ t('nav.about') }} </NuxtLink>
41
41
  </li>
42
42
 
43
43
  <li class="nav-item">
44
- <NuxtLink class="nav-link" to="/contact"> Contact </NuxtLink>
44
+ <NuxtLink class="nav-link" to="/contact"> {{ t('nav.contact') }} </NuxtLink>
45
45
  </li>
46
46
  </ul>
47
47
  </div>
@@ -59,7 +59,7 @@
59
59
  <i class="ri-phone-line"></i>
60
60
  </div>
61
61
  <div class="flex-grow-1 ms-10">
62
- <span>Hotline</span>
62
+ <span>{{ t('nav.hotline') }}</span>
63
63
  <h3>{{ phone }}</h3>
64
64
  </div>
65
65
  </div>
@@ -83,6 +83,7 @@ export default defineComponent({
83
83
  const stateStoreInstance = stateStore;
84
84
  const defaultLogo = defaultLogoImg;
85
85
 
86
+ const { t } = useI18n();
86
87
  const { logoUrl, contactInfo } = useSiteConfig();
87
88
 
88
89
  const phone = computed(() => contactInfo.value?.phone);
@@ -102,6 +103,7 @@ export default defineComponent({
102
103
  defaultLogo,
103
104
  logoUrl,
104
105
  phone,
106
+ t,
105
107
  };
106
108
  },
107
109
  });