Browse Source

feat : Internationalization added to site

main
sina_sajjadi 4 weeks ago
parent
commit
2bbf2d8ee5
  1. 8
      next-i18next.config.js
  2. 9
      next.config.js
  3. 16
      package-lock.json
  4. 4
      package.json
  5. 25
      public/locales/en/FAQ.json
  6. 118
      public/locales/en/common.json
  7. 67
      public/locales/fr/common.json
  8. 0
      src/app/[locale]/(account-pages)/(components)/Nav.tsx
  9. 0
      src/app/[locale]/(account-pages)/account/page.tsx
  10. 0
      src/app/[locale]/(account-pages)/bills/BillCard.tsx
  11. 0
      src/app/[locale]/(account-pages)/bills/[slug]/page.tsx
  12. 0
      src/app/[locale]/(account-pages)/bills/page.tsx
  13. 0
      src/app/[locale]/(account-pages)/layout.tsx
  14. 0
      src/app/[locale]/(account-pages)/my-trips/page.tsx
  15. 0
      src/app/[locale]/(account-pages)/passengers-list/PassengerTable.tsx
  16. 2
      src/app/[locale]/(account-pages)/passengers-list/[id]/page.tsx
  17. 0
      src/app/[locale]/(account-pages)/passengers-list/page.tsx
  18. 0
      src/app/[locale]/(client-components)/(Header)/AvatarDropdown.tsx
  19. 0
      src/app/[locale]/(client-components)/(Header)/CurrencyDropdown.tsx
  20. 0
      src/app/[locale]/(client-components)/(Header)/DropdownTravelers.tsx
  21. 0
      src/app/[locale]/(client-components)/(Header)/Header.tsx
  22. 0
      src/app/[locale]/(client-components)/(Header)/Header3.tsx
  23. 81
      src/app/[locale]/(client-components)/(Header)/LangDropdown.tsx
  24. 0
      src/app/[locale]/(client-components)/(Header)/LangDropdownSingle.tsx
  25. 0
      src/app/[locale]/(client-components)/(Header)/MainNav1.tsx
  26. 0
      src/app/[locale]/(client-components)/(Header)/MainNav2.tsx
  27. 0
      src/app/[locale]/(client-components)/(Header)/NotifyDropdown.tsx
  28. 0
      src/app/[locale]/(client-components)/(Header)/SearchDropdown.tsx
  29. 0
      src/app/[locale]/(client-components)/(Header)/SiteHeader.tsx
  30. 0
      src/app/[locale]/(client-components)/(Header)/TemplatesDropdown.tsx
  31. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/(stay-search-form)/StayDatesRangeInput.tsx
  32. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/(stay-search-form)/StaySearchForm.tsx
  33. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/ButtonSubmit.tsx
  34. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/ClearDataButton.tsx
  35. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/GuestsInput.tsx
  36. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/HeroSearchForm.tsx
  37. 0
      src/app/[locale]/(client-components)/(HeroSearchForm)/LocationInput.tsx
  38. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(car-search-form)/CarsSearchForm.tsx
  39. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(flight-search-form)/FlightSearchForm.tsx
  40. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PriceRangeInput.tsx
  41. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PropertyTypeSelect.tsx
  42. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/RealestateSearchForm.tsx
  43. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(stay-search-form)/StaySearchForm.tsx
  44. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/ButtonSubmit.tsx
  45. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/DatesRangeInput.tsx
  46. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/GuestsInput.tsx
  47. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2Mobile.tsx
  48. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2MobileFactory.tsx
  49. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2RealEstateMobile.tsx
  50. 0
      src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/LocationInput.tsx
  51. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StayDatesRangeInput.tsx
  52. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StaySearchForm.tsx
  53. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/ButtonSubmit.tsx
  54. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/ClearDataButton.tsx
  55. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/GuestsInput.tsx
  56. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/HeroSearchFormSmall.tsx
  57. 0
      src/app/[locale]/(client-components)/(HeroSearchFormSmall)/LocationInput.tsx
  58. 0
      src/app/[locale]/(client-components)/type.ts
  59. 0
      src/app/[locale]/(home)/SectionDowloadApp.tsx
  60. 0
      src/app/[locale]/(home)/SectionGridFeatureProperty.tsx
  61. 0
      src/app/[locale]/(real-estate-listings)/SectionGridFilterCard.tsx
  62. 0
      src/app/[locale]/(real-estate-listings)/SectionGridHasMap.tsx
  63. 0
      src/app/[locale]/(real-estate-listings)/TabFilters.tsx
  64. 0
      src/app/[locale]/(real-estate-listings)/layout.tsx
  65. 0
      src/app/[locale]/(real-estate-listings)/listing-real-estate-map/page.tsx
  66. 0
      src/app/[locale]/(real-estate-listings)/listing-real-estate/page.tsx
  67. 13
      src/app/[locale]/(server-components)/SectionHero.tsx
  68. 0
      src/app/[locale]/(server-components)/SectionHero2.tsx
  69. 0
      src/app/[locale]/(server-components)/SectionHero3.tsx
  70. 0
      src/app/[locale]/(server-components)/SectionHeroArchivePage.tsx
  71. 0
      src/app/[locale]/(stay-listings)/SectionGridFilterCard.tsx
  72. 0
      src/app/[locale]/(stay-listings)/SectionGridHasMap.tsx
  73. 0
      src/app/[locale]/(stay-listings)/TabFilters.tsx
  74. 0
      src/app/[locale]/(stay-listings)/layout.tsx
  75. 0
      src/app/[locale]/(stay-listings)/listing-stay-map/page.tsx
  76. 0
      src/app/[locale]/(stay-listings)/listing-stay/page.tsx
  77. 0
      src/app/[locale]/about/SectionFounder.tsx
  78. 0
      src/app/[locale]/about/SectionHero.tsx
  79. 12
      src/app/[locale]/about/SectionStatistic.tsx
  80. 12
      src/app/[locale]/about/page.tsx
  81. 0
      src/app/[locale]/add-listing/FormItem.tsx
  82. 2
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing1.tsx
  83. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing10.tsx
  84. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing2.tsx
  85. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing3.tsx
  86. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing4.tsx
  87. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing5.tsx
  88. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing6.tsx
  89. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing7.tsx
  90. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing8.tsx
  91. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing9.tsx
  92. 0
      src/app/[locale]/add-listing/[[...stepIndex]]/page.tsx
  93. 0
      src/app/[locale]/add-new-passenger/page.tsx
  94. 0
      src/app/[locale]/author/page.tsx
  95. 0
      src/app/[locale]/blog/Card12.tsx
  96. 0
      src/app/[locale]/blog/Card13.tsx
  97. 0
      src/app/[locale]/blog/Card3.tsx
  98. 0
      src/app/[locale]/blog/Card3Small.tsx
  99. 0
      src/app/[locale]/blog/SectionAds.tsx
  100. 0
      src/app/[locale]/blog/SectionLatestPosts.tsx

8
next-i18next.config.js

@ -2,9 +2,7 @@ const path = require("path");
module.exports = {
i18n: {
locales: ["en", "de", "es", "ar", "he", "zh", "fa"],
defaultLocale: "en",
localeDetection: false,
locales: ['en', 'vi', 'fr'], // List all supported locales
defaultLocale: 'en', // Set the default locale
},
localePath: path.resolve("./public/locales"),
};
};

9
next.config.js

@ -5,17 +5,10 @@ const { i18n } = require("./next-i18next.config");
module.exports = {
typescript: {
// !! WARN !!
// Dangerously allow production builds to successfully complete even if
// your project has type errors.
// !! WARN !!
ignoreBuildErrors: true,
},
eslint: {
ignoreDuringBuilds: false,
},
i18n,
images: {
remotePatterns: [

16
package-lock.json

@ -25,7 +25,7 @@
"framer-motion": "^10.12.16",
"google-libphonenumber": "^3.2.38",
"google-map-react": "^2.2.1",
"i18next": "^23.15.1",
"i18next": "^23.16.4",
"libphonenumber-js": "^1.11.9",
"lodash": "^4.17.21",
"next": "^13.4.3",
@ -35,7 +35,7 @@
"react-datepicker": "^4.11.0",
"react-dom": "^18.2.0",
"react-hooks-global-state": "^2.1.0",
"react-i18next": "^15.0.2",
"react-i18next": "^15.1.0",
"react-icons": "^5.3.0",
"react-swipeable": "^7.0.0",
"react-toastify": "^10.0.5",
@ -2749,9 +2749,9 @@
"license": "BSD-3-Clause"
},
"node_modules/i18next": {
"version": "23.15.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.15.1.tgz",
"integrity": "sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==",
"version": "23.16.4",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.4.tgz",
"integrity": "sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==",
"funding": [
{
"type": "individual",
@ -4335,9 +4335,9 @@
}
},
"node_modules/react-i18next": {
"version": "15.0.2",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.2.tgz",
"integrity": "sha512-z0W3/RES9Idv3MmJUcf0mDNeeMOUXe+xoL0kPfQPbDoZHmni/XsIoq5zgT2MCFUiau283GuBUK578uD/mkAbLQ==",
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.1.0.tgz",
"integrity": "sha512-zj3nJynMnZsy2gPZiOTC7XctCY5eQGqT3tcKMmfJWC9FMvgd+960w/adq61j8iPzpwmsXejqID9qC3Mqu1Xu2Q==",
"dependencies": {
"@babel/runtime": "^7.25.0",
"html-parse-stringify": "^3.0.1"

4
package.json

@ -32,7 +32,7 @@
"framer-motion": "^10.12.16",
"google-libphonenumber": "^3.2.38",
"google-map-react": "^2.2.1",
"i18next": "^23.15.1",
"i18next": "^23.16.4",
"libphonenumber-js": "^1.11.9",
"lodash": "^4.17.21",
"next": "^13.4.3",
@ -42,7 +42,7 @@
"react-datepicker": "^4.11.0",
"react-dom": "^18.2.0",
"react-hooks-global-state": "^2.1.0",
"react-i18next": "^15.0.2",
"react-i18next": "^15.1.0",
"react-icons": "^5.3.0",
"react-swipeable": "^7.0.0",
"react-toastify": "^10.0.5",

25
public/locales/en/FAQ.json

@ -0,0 +1,25 @@
{
"faqTitle": "Frequently Asked Questions",
"faqSubtitle": "Have Questions? We are here to help you!",
"faqQuestion1": "How can I book a tour on your site?",
"faqAnswer1": "To book a tour, simply select your desired destination from the 'List of Tours', choose your dates, and follow the steps to complete the booking process.",
"faqQuestion2": "Can I customize my tour?",
"faqAnswer2": "Yes, our 'Customize Tour' feature allows you to tailor your journey based on your preferences. Click on 'Customize Tour' at the top of the page to start personalizing your experience.",
"faqQuestion3": "What payment methods do you accept?",
"faqAnswer3": "We accept all major credit cards, PayPal, and bank transfers. You can choose your preferred method during the checkout process.",
"faqQuestion4": "How do I know my booking is confirmed?",
"faqAnswer4": "Once you complete the payment process, you will receive a confirmation email with all the details of your booking. You can also view your booking details in your account dashboard.",
"faqQuestion5": "Can I cancel or modify my booking?",
"faqAnswer5": "Yes, you can cancel or modify your booking from your account. Please note that cancellations must be made at least 24 hours before the tour starts to be eligible for a refund.",
"faqQuestion6": "Are there any hidden fees?",
"faqAnswer6": "No, all fees are transparent and shown upfront before you complete your booking. We ensure there are no hidden fees.",
"faqQuestion7": "Do you offer group discounts?",
"faqAnswer7": "Yes, we offer group discounts for larger bookings. Please contact our support team for more information on group rates.",
"faqQuestion8": "Is travel insurance included in the booking?",
"faqAnswer8": "Yes, all our tour packages include basic travel insurance. You can choose to upgrade your insurance package during the checkout process.",
"faqQuestion9": "What happens if the tour is canceled by the provider?",
"faqAnswer9": "If the tour is canceled by the provider due to unforeseen circumstances, you will receive a full refund or the option to reschedule your tour.",
"faqQuestion10": "How can I contact customer support?",
"faqAnswer10": "You can contact customer support by clicking the 'Contact Us' button at the bottom of the page or by visiting our support section."
}

118
public/locales/en/common.json

@ -1,6 +1,114 @@
{
"hello": "Hello",
"welcome": "Welcome to our website",
"language": "Language"
}
"home": "Home",
"allTours": "All Tours",
"blogs": "Blogs",
"faq": "FAQ",
"aboutUs": "About Us",
"customTour": "Custom Tour",
"searchPlaceholder": "Where to?",
"searchDescription": "Anywhere • Any week • Add guests",
"beginAdventure": "Begin your spiritual adventure",
"planPilgrimage": "Plan your pilgrimage with ease. Find the best accommodations, transportation, and guided experiences to Shia shrines around the world",
"startJourney": "Start your journey",
"listOfTours": "List of Tours",
"exploreTours": "Explore tours and accommodations tailored for a spiritual and memorable journey",
"tourPeriod": "Tour period",
"tourPeriodDescription": "Start - End",
"guests": "Guests",
"addGuests": "Add guests",
"available": "Available",
"soldOut": "Sold Out",
"showMore": "Show me more",
"happeningCities": "Happening cities",
"costEffectiveAdvertising": "Cost-effective advertising",
"costEffectiveDescription": "With a free listing, you can advertise your rental with no upfront costs",
"reachMillions": "Reach millions with Chisfis",
"reachMillionsDescription": "Millions of people are searching for unique places to stay around the world",
"secureAndSimple": "Secure and simple",
"secureDescription": "A Holiday Lettings listing gives you a secure and easy way to take bookings and payments online",
"mobileApps": "Mobile Apps",
"mobileAppsDescription": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed dapibus porttitor nisl, sit amet finibus libero.",
"installation": "Installation",
"releaseNotes": "Release Notes",
"upgradeGuide": "Upgrade Guide",
"browserSupport": "Browser Support",
"editorSupport": "Editor Support",
"designFeatures": "Design features",
"prototyping": "Prototyping",
"designSystems": "Design systems",
"pricing": "Pricing",
"security": "Security",
"bestPractices": "Best practices",
"support": "Support",
"developers": "Developers",
"learnDesign": "Learn design",
"releases": "Releases",
"discussionForums": "Discussion Forums",
"codeOfConduct": "Code of Conduct",
"communityResources": "Community Resources",
"contributing": "Contributing",
"concurrentMode": "Concurrent Mode",
"goodNews": "Good news from far away",
"whatPeopleThink": "Let's see what people think of Chisfis",
"testimonial": "This place is exactly like the picture posted on Chisfis. Great service, we had a great stay!",
"clientName": "Tiana Abie",
"clientLocation": "Malaysia",
"myTrips": "My Trips",
"account": "Account",
"menu": "Menu",
"gettingStarted": "Getting started",
"explore": "Explore",
"resources": "Resources",
"community": "Community",
"placeType": "Type of place",
"noTours": "No tours available",
"itinerary": "Itinerary",
"itineraryTitle": "Itinerary",
"total": "Total",
"reserve": "Reserve",
"tourFeatures": "Tour Features",
"tourFeaturesTitle": "Tour Features",
"startRating": "Start Rating",
"listingDetails": "Details",
"imageAlt": "Image of the tour",
"loading": "Loading...",
"adults": "Adults",
"adultsDesc": "Ages 13 or above",
"children": "Children",
"childrenDesc": "Ages 2–12",
"infants": "Infants",
"infantsDesc": "Ages 0–2",
"traveler": "Traveler",
"responses": "Responses ({{count}})",
"submit": "Submit",
"cancel": "Cancel",
"relatedPosts": "Related Posts",
"aboutUsHeading": "👋 About Us.",
"aboutUsSubheading": "We are a passionate team dedicated to crafting unforgettable travel experiences for explorers and dreamers alike. From serene escapes on tropical beaches to adrenaline-fueled adventures in exotic locales, we curate journeys that are as unique as you are. Join us and let’s explore the world, one adventure at a time!",
"statisticTitle": "🚀 Fast Facts",
"statisticDescription": "We’re impartial and independent, and every day we create distinctive, world-class programmes and content.",
"statisticHeading1": "10 million",
"statisticSubHeading1": "Articles have been public around the world (as of Sept. 30, 2021)",
"statisticHeading2": "100,000",
"statisticSubHeading2": "Registered users account (as of Sept. 30, 2021)",
"statisticHeading3": "220+",
"statisticSubHeading3": "Countries and regions have our presence (as of Sept. 30, 2021)",
"customTrip": "Custom Trip",
"guide": "Guide",
"guideDescription": "First, write the origin of your departure, then choose the first destination of your trip, the number of nights of stay, and the means of travel, then choose your travel destinations if you wish.",
"beginYourTrip": "Begin your trip",
"startDate": "Start Date",
"numberOfPassengers": "Number Of Passengers",
"destination": "Destination",
"selectCity": "Select City",
"transportation": "Transportation",
"selectTransport": "Select Transport",
"hotel": "Hotel",
"selectHotel": "Select Hotel",
"duration": "Duration",
"finishDate": "Finish date",
"addDestination": "Add Destination",
"continue": "Continue",
"successMessage": "Successfully Registered",
"to": "to"
}

67
public/locales/fr/common.json

@ -0,0 +1,67 @@
{
"home": "Accueil",
"allTours": "Tous les Tours",
"blogs": "Blogs",
"faq": "FAQ",
"aboutUs": "À propos de nous",
"customTour": "Visite sur mesure",
"searchPlaceholder": "Où aller ?",
"searchDescription": "Partout • À toute semaine • Ajouter des invités",
"beginAdventure": "Commencez votre aventure spirituelle",
"planPilgrimage": "Planifiez votre pèlerinage avec facilité. Trouvez les meilleures accommodations, le transport et les expériences guidées vers les sanctuaires chiites à travers le monde",
"startJourney": "Commencer votre voyage",
"listOfTours": "Liste des Tours",
"exploreTours": "Explorez les visites et les hébergements adaptés pour un voyage spirituel et mémorable",
"tourPeriod": "Période de visite",
"tourPeriodDescription": "Début - Fin",
"guests": "Invités",
"addGuests": "Ajouter des invités",
"available": "Disponible",
"soldOut": "Épuisé",
"showMore": "Montrez-moi plus",
"happeningCities": "Villes en vogue",
"costEffectiveAdvertising": "Publicité rentable",
"costEffectiveDescription": "Avec une annonce gratuite, vous pouvez promouvoir votre location sans frais initiaux",
"reachMillions": "Atteignez des millions avec Chisfis",
"reachMillionsDescription": "Des millions de personnes recherchent des lieux uniques où séjourner à travers le monde",
"secureAndSimple": "Sécurisé et simple",
"secureDescription": "Une annonce de Holiday Lettings vous offre un moyen sécurisé et facile de prendre des réservations et des paiements en ligne",
"mobileApps": "Applications Mobiles",
"mobileAppsDescription": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed dapibus porttitor nisl, sit amet finibus libero.",
"installation": "Installation",
"releaseNotes": "Notes de version",
"upgradeGuide": "Guide de mise à niveau",
"browserSupport": "Support des navigateurs",
"editorSupport": "Support de l'éditeur",
"designFeatures": "Fonctionnalités de conception",
"prototyping": "Prototypage",
"designSystems": "Systèmes de design",
"pricing": "Tarification",
"security": "Sécurité",
"bestPractices": "Meilleures pratiques",
"support": "Support",
"developers": "Développeurs",
"learnDesign": "Apprendre la conception",
"releases": "Versions",
"discussionForums": "Forums de discussion",
"codeOfConduct": "Code de conduite",
"communityResources": "Ressources communautaires",
"contributing": "Contribuer",
"concurrentMode": "Mode concurrent",
"goodNews": "Bonne nouvelle de loin",
"whatPeopleThink": "Voyons ce que les gens pensent de Chisfis",
"testimonial": "Cet endroit est exactement comme la photo publiée sur Chisfis. Excellent service, nous avons passé un excellent séjour !",
"clientName": "Tiana Abie",
"clientLocation": "Malaisie",
"myTrips": "Mes Voyages",
"account": "Compte",
"menu": "Menu",
"gettingStarted": "Commencer",
"explore": "Explorer",
"resources": "Ressources",
"community": "Communauté",
"placeType": "Type de lieu",
"noTours": "Aucun tour disponible"
}

0
src/app/(account-pages)/(components)/Nav.tsx → src/app/[locale]/(account-pages)/(components)/Nav.tsx

0
src/app/(account-pages)/account/page.tsx → src/app/[locale]/(account-pages)/account/page.tsx

0
src/app/(account-pages)/bills/BillCard.tsx → src/app/[locale]/(account-pages)/bills/BillCard.tsx

0
src/app/(account-pages)/bills/[slug]/page.tsx → src/app/[locale]/(account-pages)/bills/[slug]/page.tsx

0
src/app/(account-pages)/bills/page.tsx → src/app/[locale]/(account-pages)/bills/page.tsx

0
src/app/(account-pages)/layout.tsx → src/app/[locale]/(account-pages)/layout.tsx

0
src/app/(account-pages)/my-trips/page.tsx → src/app/[locale]/(account-pages)/my-trips/page.tsx

0
src/app/(account-pages)/passengers-list/PassengerTable.tsx → src/app/[locale]/(account-pages)/passengers-list/PassengerTable.tsx

2
src/app/(account-pages)/passengers-list/[id]/page.tsx → src/app/[locale]/(account-pages)/passengers-list/[id]/page.tsx

@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react";
import { FC } from "react";
import ButtonPrimary from "@/shared/ButtonPrimary";
import Input from "@/shared/Input";
import FormItem from "@/app/add-listing/FormItem";
import FormItem from "@/app/[locale]/add-listing/FormItem";
import getImageURL from "@/components/api/getImageURL";
import axiosInstance from "@/components/api/axios";
import { useRouter } from "next/navigation";

0
src/app/(account-pages)/passengers-list/page.tsx → src/app/[locale]/(account-pages)/passengers-list/page.tsx

0
src/app/(client-components)/(Header)/AvatarDropdown.tsx → src/app/[locale]/(client-components)/(Header)/AvatarDropdown.tsx

0
src/app/(client-components)/(Header)/CurrencyDropdown.tsx → src/app/[locale]/(client-components)/(Header)/CurrencyDropdown.tsx

0
src/app/(client-components)/(Header)/DropdownTravelers.tsx → src/app/[locale]/(client-components)/(Header)/DropdownTravelers.tsx

0
src/app/(client-components)/(Header)/Header.tsx → src/app/[locale]/(client-components)/(Header)/Header.tsx

0
src/app/(client-components)/(Header)/Header3.tsx → src/app/[locale]/(client-components)/(Header)/Header3.tsx

81
src/app/(client-components)/(Header)/LangDropdown.tsx → src/app/[locale]/(client-components)/(Header)/LangDropdown.tsx

@ -1,15 +1,29 @@
import React, { Fragment, useState } from "react";
import React, { Fragment, useState, useEffect } from "react";
import { Popover, Tab, Transition } from "@headlessui/react";
import { useRouter, usePathname } from "next/navigation";
import { ChevronDownIcon } from "@heroicons/react/24/outline";
import { MdOutlineLanguage } from "react-icons/md";
import { useTranslation } from "next-i18next";
import { useRouter } from "next/navigation"; // Importing from next/navigation
// Language options
const languageOptions = [
{ id: "en", name: "English", description: "United States", icon: <MdOutlineLanguage /> },
{ id: "vi", name: "Vietnamese", description: "Vietnam", icon: <MdOutlineLanguage /> },
{ id: "fr", name: "French", description: "France", icon: <MdOutlineLanguage /> },
{
id: "en",
name: "English",
description: "United States",
icon: <MdOutlineLanguage />,
},
{
id: "vi",
name: "Vietnamese",
description: "Vietnam",
icon: <MdOutlineLanguage />,
},
{
id: "fr",
name: "French",
description: "France",
icon: <MdOutlineLanguage />,
},
];
interface LangDropdownProps {
@ -25,14 +39,35 @@ const LangDropdown: React.FC<LangDropdownProps> = ({
panelClassName = "top-full right-0 max-w-sm w-96",
className = "hidden md:flex",
}) => {
const { t } = useTranslation("common");
const router = useRouter();
const pathname = usePathname();
const [selectedItem, setSelectedItem] = useState(languageOptions[0]);
// Handle language selection and route change
const handleItemClick = (option: any) => {
setSelectedItem(option);
router.push(`/${option.id}`); // Change locale using next/navigation's router
// Update selectedItem based on the current locale in the URL
useEffect(() => {
const locales = ["en", "vi", "fr"];
const segments = pathname.split("/").filter(Boolean);
const currentLocale = locales.includes(segments[0]) ? segments[0] : "en";
const newSelectedItem =
languageOptions.find((item) => item.id === currentLocale) ||
languageOptions[0];
setSelectedItem(newSelectedItem);
}, [pathname]);
const handleLanguageChange = (locale: string) => {
const segments = pathname.split("/").filter(Boolean);
// Remove the current locale if present
const locales = ["en", "vi", "fr"];
if (locales.includes(segments[0])) {
segments.shift();
}
// Prepend the new locale
const newPathname = `/${locale}/${segments.join("/")}`;
// Navigate to the new locale path
router.push(newPathname);
};
return (
@ -83,22 +118,32 @@ const LangDropdown: React.FC<LangDropdownProps> = ({
</Tab.List>
<Tab.Panels className="mt-5">
<Tab.Panel className={classNames("rounded-xl p-3", "focus:outline-none focus:ring-0")}>
<Tab.Panel
className={classNames(
"rounded-xl p-3",
"focus:outline-none focus:ring-0"
)}
>
<div className="grid gap-8 lg:grid-cols-2">
{languageOptions.map((item) => (
<button
key={item.id}
onClick={() => {
handleItemClick(item);
close();
setSelectedItem(item);
handleLanguageChange(item.id);
close(); // Close the popover after selection
}}
className={`flex items-center p-2 -m-3 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus-visible:ring focus-visible:ring-orange-500 focus-visible:ring-opacity-50 ${
selectedItem.id === item.id ? "bg-gray-100 dark:bg-gray-700" : "opacity-80"
className={`flex items-center p-2 -m-3 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none ${
selectedItem.id === item.id
? "bg-gray-100 dark:bg-gray-700"
: "opacity-80"
}`}
>
<div className="">
<div>
<p className="text-sm font-medium">{item.name}</p>
<p className="text-xs text-gray-500 dark:text-gray-400">{item.description}</p>
<p className="text-xs text-gray-500 dark:text-gray-400">
{item.description}
</p>
</div>
</button>
))}

0
src/app/(client-components)/(Header)/LangDropdownSingle.tsx → src/app/[locale]/(client-components)/(Header)/LangDropdownSingle.tsx

0
src/app/(client-components)/(Header)/MainNav1.tsx → src/app/[locale]/(client-components)/(Header)/MainNav1.tsx

0
src/app/(client-components)/(Header)/MainNav2.tsx → src/app/[locale]/(client-components)/(Header)/MainNav2.tsx

0
src/app/(client-components)/(Header)/NotifyDropdown.tsx → src/app/[locale]/(client-components)/(Header)/NotifyDropdown.tsx

0
src/app/(client-components)/(Header)/SearchDropdown.tsx → src/app/[locale]/(client-components)/(Header)/SearchDropdown.tsx

0
src/app/(client-components)/(Header)/SiteHeader.tsx → src/app/[locale]/(client-components)/(Header)/SiteHeader.tsx

0
src/app/(client-components)/(Header)/TemplatesDropdown.tsx → src/app/[locale]/(client-components)/(Header)/TemplatesDropdown.tsx

0
src/app/(client-components)/(HeroSearchForm)/(stay-search-form)/StayDatesRangeInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/(stay-search-form)/StayDatesRangeInput.tsx

0
src/app/(client-components)/(HeroSearchForm)/(stay-search-form)/StaySearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/(stay-search-form)/StaySearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm)/ButtonSubmit.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/ButtonSubmit.tsx

0
src/app/(client-components)/(HeroSearchForm)/ClearDataButton.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/ClearDataButton.tsx

0
src/app/(client-components)/(HeroSearchForm)/GuestsInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/GuestsInput.tsx

0
src/app/(client-components)/(HeroSearchForm)/HeroSearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/HeroSearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm)/LocationInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm)/LocationInput.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(car-search-form)/CarsSearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(car-search-form)/CarsSearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(flight-search-form)/FlightSearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(flight-search-form)/FlightSearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PriceRangeInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PriceRangeInput.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PropertyTypeSelect.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/PropertyTypeSelect.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/RealestateSearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(real-estate-search-form)/RealestateSearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/(stay-search-form)/StaySearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/(stay-search-form)/StaySearchForm.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/ButtonSubmit.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/ButtonSubmit.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/DatesRangeInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/DatesRangeInput.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/GuestsInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/GuestsInput.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2Mobile.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2Mobile.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2MobileFactory.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2MobileFactory.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2RealEstateMobile.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/HeroSearchForm2RealEstateMobile.tsx

0
src/app/(client-components)/(HeroSearchForm2Mobile)/LocationInput.tsx → src/app/[locale]/(client-components)/(HeroSearchForm2Mobile)/LocationInput.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StayDatesRangeInput.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StayDatesRangeInput.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StaySearchForm.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/(stay-search-form)/StaySearchForm.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/ButtonSubmit.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/ButtonSubmit.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/ClearDataButton.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/ClearDataButton.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/GuestsInput.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/GuestsInput.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/HeroSearchFormSmall.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/HeroSearchFormSmall.tsx

0
src/app/(client-components)/(HeroSearchFormSmall)/LocationInput.tsx → src/app/[locale]/(client-components)/(HeroSearchFormSmall)/LocationInput.tsx

0
src/app/(client-components)/type.ts → src/app/[locale]/(client-components)/type.ts

0
src/app/(home)/SectionDowloadApp.tsx → src/app/[locale]/(home)/SectionDowloadApp.tsx

0
src/app/(home)/SectionGridFeatureProperty.tsx → src/app/[locale]/(home)/SectionGridFeatureProperty.tsx

0
src/app/(real-estate-listings)/SectionGridFilterCard.tsx → src/app/[locale]/(real-estate-listings)/SectionGridFilterCard.tsx

0
src/app/(real-estate-listings)/SectionGridHasMap.tsx → src/app/[locale]/(real-estate-listings)/SectionGridHasMap.tsx

0
src/app/(real-estate-listings)/TabFilters.tsx → src/app/[locale]/(real-estate-listings)/TabFilters.tsx

0
src/app/(real-estate-listings)/layout.tsx → src/app/[locale]/(real-estate-listings)/layout.tsx

0
src/app/(real-estate-listings)/listing-real-estate-map/page.tsx → src/app/[locale]/(real-estate-listings)/listing-real-estate-map/page.tsx

0
src/app/(real-estate-listings)/listing-real-estate/page.tsx → src/app/[locale]/(real-estate-listings)/listing-real-estate/page.tsx

13
src/app/(server-components)/SectionHero.tsx → src/app/[locale]/(server-components)/SectionHero.tsx

@ -1,14 +1,19 @@
"use client"
import React, { FC } from "react";
import imagePng from "@/images/hero-right.png";
import HeroSearchForm from "../(client-components)/(HeroSearchForm)/HeroSearchForm";
import Image from "next/image";
import ButtonPrimary from "@/shared/ButtonPrimary";
import { useTranslation } from "react-i18next"; // Import useTranslation
export interface SectionHeroProps {
className?: string;
}
const SectionHero: FC<SectionHeroProps> = ({ className = "" }) => {
const { t } = useTranslation("common"); // Initialize useTranslation
return (
<div
className={`nc-SectionHero flex flex-col-reverse lg:flex-col relative ${className}`}
@ -16,15 +21,13 @@ const SectionHero: FC<SectionHeroProps> = ({ className = "" }) => {
<div className="flex flex-col lg:flex-row lg:items-center">
<div className="flex-shrink-0 lg:w-1/2 flex flex-col items-start space-y-8 sm:space-y-10 pb-14 lg:pb-64 xl:pr-14 lg:mr-10 xl:mr-0">
<h2 className="font-medium text-4xl md:text-5xl xl:text-7xl !leading-[114%] ">
Begin your spiritual adventure
{t("beginAdventure")} {/* Translate the heading */}
</h2>
<span className="text-base md:text-lg text-neutral-500 dark:text-neutral-400">
Plan your pilgrimage with ease. Find the best accommodations,
transportation, and guided experiences to Shia shrines around the
world
{t("planPilgrimage")} {/* Translate the description */}
</span>
<ButtonPrimary href="/tours" sizeClass="px-5 py-4 sm:px-7">
Start your journey
{t("startJourney")} {/* Translate the button text */}
</ButtonPrimary>
</div>
<div className="flex-grow">

0
src/app/(server-components)/SectionHero2.tsx → src/app/[locale]/(server-components)/SectionHero2.tsx

0
src/app/(server-components)/SectionHero3.tsx → src/app/[locale]/(server-components)/SectionHero3.tsx

0
src/app/(server-components)/SectionHeroArchivePage.tsx → src/app/[locale]/(server-components)/SectionHeroArchivePage.tsx

0
src/app/(stay-listings)/SectionGridFilterCard.tsx → src/app/[locale]/(stay-listings)/SectionGridFilterCard.tsx

0
src/app/(stay-listings)/SectionGridHasMap.tsx → src/app/[locale]/(stay-listings)/SectionGridHasMap.tsx

0
src/app/(stay-listings)/TabFilters.tsx → src/app/[locale]/(stay-listings)/TabFilters.tsx

0
src/app/(stay-listings)/layout.tsx → src/app/[locale]/(stay-listings)/layout.tsx

0
src/app/(stay-listings)/listing-stay-map/page.tsx → src/app/[locale]/(stay-listings)/listing-stay-map/page.tsx

0
src/app/(stay-listings)/listing-stay/page.tsx → src/app/[locale]/(stay-listings)/listing-stay/page.tsx

0
src/app/about/SectionFounder.tsx → src/app/[locale]/about/SectionFounder.tsx

0
src/app/about/SectionHero.tsx → src/app/[locale]/about/SectionHero.tsx

12
src/app/about/SectionStatistic.tsx → src/app/[locale]/about/SectionStatistic.tsx

@ -1,5 +1,6 @@
import React, { FC } from "react";
import Heading from "@/shared/Heading";
import { useTranslation } from "react-i18next"; // Import useTranslation
export interface Statistic {
id: string;
@ -32,13 +33,14 @@ export interface SectionStatisticProps {
}
const SectionStatistic: FC<SectionStatisticProps> = ({ className = "" }) => {
const { t } = useTranslation("common"); // Initialize useTranslation with the "common" namespace
return (
<div className={`nc-SectionStatistic relative ${className}`}>
<Heading
desc=" Were impartial and independent, and every day we create distinctive,
world-class programmes and content"
desc={t("statisticDescription")} // Translate description
>
🚀 Fast Facts
{t("statisticTitle")} {/* Translate title */}
</Heading>
<div className="grid md:grid-cols-2 gap-6 lg:grid-cols-3 xl:gap-8">
{FOUNDER_DEMO.map((item) => (
@ -47,10 +49,10 @@ const SectionStatistic: FC<SectionStatisticProps> = ({ className = "" }) => {
className="p-6 bg-neutral-50 dark:bg-neutral-800 rounded-2xl dark:border-neutral-800"
>
<h3 className="text-2xl font-semibold leading-none text-neutral-900 md:text-3xl dark:text-neutral-200">
{item.heading}
{t(`statisticHeading${item.id}`)} {/* Translate each heading */}
</h3>
<span className="block text-sm text-neutral-500 mt-3 sm:text-base dark:text-neutral-400">
{item.subHeading}
{t(`statisticSubHeading${item.id}`)} {/* Translate each subheading */}
</span>
</div>
))}

12
src/app/about/page.tsx → src/app/[locale]/about/page.tsx

@ -1,3 +1,4 @@
"use client"
import rightImg from "@/images/about-hero-right.png";
import React, { FC } from "react";
import SectionFounder from "./SectionFounder";
@ -7,10 +8,13 @@ import BgGlassmorphism from "@/components/BgGlassmorphism";
import BackgroundSection from "@/components/BackgroundSection";
import SectionClientSay from "@/components/SectionClientSay";
import SectionSubscribe2 from "@/components/SectionSubscribe2";
import { useTranslation } from "react-i18next"; // Import useTranslation
export interface PageAboutProps {}
const PageAbout: FC<PageAboutProps> = ({}) => {
const PageAbout: FC<PageAboutProps> = () => {
const { t } = useTranslation("common"); // Initialize useTranslation with the "common" namespace
return (
<div className={`nc-PageAbout overflow-hidden relative`}>
{/* ======== BG GLASS ======== */}
@ -19,9 +23,9 @@ const PageAbout: FC<PageAboutProps> = ({}) => {
<div className="container py-16 lg:py-28 space-y-16 lg:space-y-28">
<SectionHero
rightImg={rightImg}
heading="👋 About Us."
btnText=""
subHeading="We are a passionate team dedicated to crafting unforgettable travel experiences for explorers and dreamers alike. From serene escapes on tropical beaches to adrenaline-fueled adventures in exotic locales, we curate journeys that are as unique as you are. Join us and let’s explore the world, one adventure at a time!"
heading={t("aboutUsHeading")} // Translate heading
btnText="" // Assuming this remains static; you can translate it if necessary
subHeading={t("aboutUsSubheading")} // Translate subheading
/>
{/* <SectionFounder /> */}

0
src/app/add-listing/FormItem.tsx → src/app/[locale]/add-listing/FormItem.tsx

2
src/app/add-listing/[[...stepIndex]]/PageAddListing1.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing1.tsx

@ -4,7 +4,7 @@ import Input from "@/shared/Input";
import FormItem from "../FormItem";
import { IoPersonAddOutline } from "react-icons/io5";
import getImageURL from "@/components/api/getImageURL";
import ConfirmModal from "../../../shared/popUp";
import ConfirmModal from "@/shared/popUp";
import axiosInstance from "@/components/api/axios";
import { useUserContext } from "@/components/contexts/userContext";
import { useRouter } from "next/navigation";

0
src/app/add-listing/[[...stepIndex]]/PageAddListing10.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing10.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing2.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing2.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing3.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing3.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing4.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing4.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing5.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing5.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing6.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing6.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing7.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing7.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing8.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing8.tsx

0
src/app/add-listing/[[...stepIndex]]/PageAddListing9.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/PageAddListing9.tsx

0
src/app/add-listing/[[...stepIndex]]/page.tsx → src/app/[locale]/add-listing/[[...stepIndex]]/page.tsx

0
src/app/add-new-passenger/page.tsx → src/app/[locale]/add-new-passenger/page.tsx

0
src/app/author/page.tsx → src/app/[locale]/author/page.tsx

0
src/app/blog/Card12.tsx → src/app/[locale]/blog/Card12.tsx

0
src/app/blog/Card13.tsx → src/app/[locale]/blog/Card13.tsx

0
src/app/blog/Card3.tsx → src/app/[locale]/blog/Card3.tsx

0
src/app/blog/Card3Small.tsx → src/app/[locale]/blog/Card3Small.tsx

0
src/app/blog/SectionAds.tsx → src/app/[locale]/blog/SectionAds.tsx

0
src/app/blog/SectionLatestPosts.tsx → src/app/[locale]/blog/SectionLatestPosts.tsx

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save