diff --git a/package.json b/package.json index 9a7cd97..2581fc6 100755 --- a/package.json +++ b/package.json @@ -15,47 +15,47 @@ "remove-multilang": "node scripts/removeMultilang.js && yarn format" }, "dependencies": { - "@astrojs/mdx": "^2.3.0", - "@astrojs/react": "^3.3.0", - "@astrojs/rss": "^4.0.5", - "@astrojs/sitemap": "^3.1.2", + "@astrojs/mdx": "^3.1.3", + "@astrojs/react": "^3.6.1", + "@astrojs/rss": "^4.0.7", + "@astrojs/sitemap": "^3.1.6", "@astrojs/tailwind": "^5.1.0", - "astro": "^4.6.1", + "astro": "^4.12.3", "astro-auto-import": "^0.4.2", - "astro-font": "^0.0.80", + "astro-font": "^0.0.81", "date-fns": "^3.6.0", "disqus-react": "^1.1.5", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", - "marked": "^12.0.1", - "prettier-plugin-astro": "^0.13.0", - "prettier-plugin-tailwindcss": "^0.5.13", + "marked": "^13.0.3", + "prettier-plugin-astro": "^0.14.1", + "prettier-plugin-tailwindcss": "^0.6.5", "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^5.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", "react-lite-youtube-embed": "^2.4.0", "remark-collapse": "^0.1.2", "remark-toc": "^9.0.0", - "swiper": "^11.1.1" + "swiper": "^11.1.8" }, "devDependencies": { "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.12", + "@tailwindcss/typography": "^0.5.13", "@types/marked": "^5.0.2", - "@types/node": "20.12.7", - "@types/react": "18.2.78", - "@types/react-dom": "18.2.25", + "@types/node": "22.0.0", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", "autoprefixer": "^10.4.19", - "eslint": "^9.0.0", - "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-astro": "^0.13.0", - "prettier-plugin-tailwindcss": "^0.5.13", - "sass": "^1.75.0", - "sharp": "0.33.1", + "eslint": "^9.8.0", + "postcss": "^8.4.40", + "prettier": "^3.3.3", + "prettier-plugin-astro": "^0.14.1", + "prettier-plugin-tailwindcss": "^0.6.5", + "sass": "^1.77.8", + "sharp": "0.33.4", "tailwind-bootstrap-grid": "^5.1.0", - "tailwindcss": "^3.4.3", - "typescript": "5.4.5" + "tailwindcss": "^3.4.7", + "typescript": "5.5.4" } } diff --git a/readme.md b/readme.md index d098e30..ab5c00c 100755 --- a/readme.md +++ b/readme.md @@ -26,6 +26,7 @@ ## 📌 Key Features - đŸ‘„ Multi-Authors +- 🌐 Multilingual - 🎯 Similar Posts Suggestion - 🔍 Search Functionality - 🌑 Dark Mode @@ -65,10 +66,10 @@ ### 📩 Dependencies -- astro 4.0+ +- astro v4.12+ - node v20.10+ - npm v10.2+ -- tailwind v3.3+ +- tailwind v3.4+ ### 👉 Install Dependencies @@ -109,12 +110,14 @@ docker run -it --rm astroplate ash ``` + ## 🐞 Reporting Issues We use GitHub Issues as the official bug tracker for this Template. Please Search [existing issues](https://github.com/zeon-studio/astroplate/issues). It’s possible someone has already reported the same problem. If your problem or idea has not been addressed yet, feel free to [open a new issue](https://github.com/zeon-studio/astroplate/issues). + ## 📝 License Copyright (c) 2023 - Present, Designed & Developed by [Zeon Studio](https://zeon.studio/) diff --git a/scripts/jsonGenerator.js b/scripts/jsonGenerator.js index f63091a..5881da2 100644 --- a/scripts/jsonGenerator.js +++ b/scripts/jsonGenerator.js @@ -9,11 +9,11 @@ const CONTENT_DEPTH = 3; const BLOG_FOLDER = "blog"; // get data from markdown -const getData = (folder, groupDepth) => { - // get paths +const getData = (folder, groupDepth, langIndex = 0) => { const getPaths = languages - .map((lang) => { - const dir = path.join(CONTENT_ROOT, lang.contentDir, folder); + .map((lang, index) => { + const langFolder = lang.contentDir ? lang.contentDir : lang.languageCode; + const dir = path.join(CONTENT_ROOT, folder, langFolder); return fs .readdirSync(dir) .filter( @@ -21,29 +21,37 @@ const getData = (folder, groupDepth) => { !filename.startsWith("-") && (filename.endsWith(".md") || filename.endsWith(".mdx")), ) - .map((filename) => { + .flatMap((filename) => { const filepath = path.join(dir, filename); const stats = fs.statSync(filepath); const isFolder = stats.isDirectory(); if (isFolder) { - return getData(filepath, groupDepth); + return getData(filepath, groupDepth, index); } else { const file = fs.readFileSync(filepath, "utf-8"); const { data, content } = matter(file); const pathParts = filepath.split(path.sep); - const slug = - data.slug || - pathParts + + let slug; + if (data.slug) { + const slugParts = data.slug.split("/"); + slugParts[0] = BLOG_FOLDER; + slug = slugParts.join("/"); + } else { + slug = pathParts .slice(CONTENT_DEPTH) .join("/") .replace(/\.[^/.]+$/, ""); - const group = pathParts[groupDepth]; + slug = `${BLOG_FOLDER}/${slug.split("/").slice(1).join("/")}`; + } + data.slug = slug; + const group = "blog"; return { - lang: lang.languageCode, + lang: languages[index].languageCode, // Set the correct language code dynamically group: group, - slug: slug, + slug: data.slug, frontmatter: data, content: content, }; @@ -52,9 +60,7 @@ const getData = (folder, groupDepth) => { }) .flat(); - const publishedPages = getPaths.filter( - (page) => !page.frontmatter?.draft && page, - ); + const publishedPages = getPaths.filter((page) => !page.frontmatter?.draft); return publishedPages; }; @@ -70,7 +76,7 @@ try { JSON.stringify(getData(BLOG_FOLDER, 3)), ); - // merger json files for search + // merge json files for search const posts = require(`../${JSON_FOLDER}/posts.json`); const search = [...posts]; fs.writeFileSync(`${JSON_FOLDER}/search.json`, JSON.stringify(search)); diff --git a/scripts/removeDarkmode.js b/scripts/removeDarkmode.js index 7f781ee..b04b2e7 100644 --- a/scripts/removeDarkmode.js +++ b/scripts/removeDarkmode.js @@ -1,66 +1,96 @@ const fs = require("fs"); const path = require("path"); -const rootDirs = ["src/pages", "src/hooks", "src/layouts", "src/styles"]; +(function () { + const rootDirs = ["src/pages", "src/hooks", "src/layouts", "src/styles"]; -const configFiles = [ - { - filePath: "tailwind.config.js", - patterns: ["darkmode:\\s*{[^}]*},", 'darkMode:\\s*"class",'], - }, - { filePath: "src/config/theme.json", patterns: ["colors.darkmode"] }, -]; + const deleteAssetList = [ + "public/images/logo-darkmode.png", + "src/layouts/components/ThemeSwitcher.astro", + ]; -rootDirs.forEach(removeDarkModeFromPages); -configFiles.forEach(removeDarkMode); + const configFiles = [ + { + filePath: "tailwind.config.js", + patterns: ["darkmode:\\s*{[^}]*},", 'darkMode:\\s*"class",'], + }, + { filePath: "src/config/theme.json", patterns: ["colors.darkmode"] }, + ]; -function removeDarkModeFromFiles(filePath, regexPatterns) { - const fileContent = fs.readFileSync(filePath, "utf8"); - let updatedContent = fileContent; - regexPatterns.forEach((pattern) => { - const regex = new RegExp(pattern, "g"); - updatedContent = updatedContent.replace(regex, ""); - }); - fs.writeFileSync(filePath, updatedContent, "utf8"); -} + const filePaths = [ + { + filePath: "src/layouts/partials/Header.astro", + patterns: [ + "]+)?\\s*(?:\\/\\>|>([\\s\\S]*?)<\\/ThemeSwitchers*>)", + ], + }, + ]; -function removeDarkModeFromPages(directoryPath) { - const files = fs.readdirSync(directoryPath); - - files.forEach((file) => { - const filePath = path.join(directoryPath, file); - const stats = fs.statSync(filePath); - if (stats.isDirectory()) { - removeDarkModeFromPages(filePath); - } else if (stats.isFile()) { - removeDarkModeFromFiles(filePath, [ - '(?:(?!["])\\S)*dark:(?:(?![,;"])\\S)*', - ]); - } - }); -} - -function removeDarkMode(configFile) { - const { filePath, patterns } = configFile; - if (filePath === "tailwind.config.js") { + filePaths.forEach(({ filePath, patterns }) => { removeDarkModeFromFiles(filePath, patterns); - } else { - const contentFile = JSON.parse(fs.readFileSync(filePath, "utf8")); - patterns.forEach((pattern) => deleteNestedProperty(contentFile, pattern)); - fs.writeFileSync(filePath, JSON.stringify(contentFile)); - } -} + }); -function deleteNestedProperty(obj, propertyPath) { - const properties = propertyPath.split("."); - let currentObj = obj; - for (let i = 0; i < properties.length - 1; i++) { - const property = properties[i]; - if (currentObj.hasOwnProperty(property)) { - currentObj = currentObj[property]; - } else { - return; // Property not found, no need to continue + deleteAssetList.forEach(deleteAsset); + function deleteAsset(asset) { + try { + fs.unlinkSync(asset); + console.log(`${path.basename(asset)} deleted successfully!`); + } catch (error) { + console.error(`${asset} not found`); } } - delete currentObj[properties[properties.length - 1]]; -} + + rootDirs.forEach(removeDarkModeFromPages); + configFiles.forEach(removeDarkMode); + + function removeDarkModeFromFiles(filePath, regexPatterns) { + const fileContent = fs.readFileSync(filePath, "utf8"); + let updatedContent = fileContent; + regexPatterns.forEach((pattern) => { + const regex = new RegExp(pattern, "g"); + updatedContent = updatedContent.replace(regex, ""); + }); + fs.writeFileSync(filePath, updatedContent, "utf8"); + } + + function removeDarkModeFromPages(directoryPath) { + const files = fs.readdirSync(directoryPath); + + files.forEach((file) => { + const filePath = path.join(directoryPath, file); + const stats = fs.statSync(filePath); + if (stats.isDirectory()) { + removeDarkModeFromPages(filePath); + } else if (stats.isFile()) { + removeDarkModeFromFiles(filePath, [ + '(?:(?!["])\\S)*dark:(?:(?![,;"])\\S)*', + ]); + } + }); + } + + function removeDarkMode(configFile) { + const { filePath, patterns } = configFile; + if (filePath === "tailwind.config.js") { + removeDarkModeFromFiles(filePath, patterns); + } else { + const contentFile = JSON.parse(fs.readFileSync(filePath, "utf8")); + patterns.forEach((pattern) => deleteNestedProperty(contentFile, pattern)); + fs.writeFileSync(filePath, JSON.stringify(contentFile)); + } + } + + function deleteNestedProperty(obj, propertyPath) { + const properties = propertyPath.split("."); + let currentObj = obj; + for (let i = 0; i < properties.length - 1; i++) { + const property = properties[i]; + if (currentObj.hasOwnProperty(property)) { + currentObj = currentObj[property]; + } else { + return; // Property not found, no need to continue + } + } + delete currentObj[properties[properties.length - 1]]; + } +})(); diff --git a/src/config/config.json b/src/config/config.json index 83920f1..3b3d910 100755 --- a/src/config/config.json +++ b/src/config/config.json @@ -22,7 +22,7 @@ "blog_folder": "blog", "default_language": "en", "disable_languages": [], - "default_language_in_path": false + "default_language_in_subdir": false }, "params": { diff --git a/src/content/english/about/-index.md b/src/content/about/english/-index.md similarity index 100% rename from src/content/english/about/-index.md rename to src/content/about/english/-index.md diff --git a/src/content/french/about/-index.md b/src/content/about/french/-index.md similarity index 92% rename from src/content/french/about/-index.md rename to src/content/about/french/-index.md index a4ac128..041c6ad 100644 --- a/src/content/french/about/-index.md +++ b/src/content/about/french/-index.md @@ -6,4 +6,4 @@ image: "/images/avatar.png" draft: false --- -L'entreprise elle-mĂȘme est une entreprise trĂšs prospĂšre. Ils ne connaissent pas les bienfaits du corps, ou sauf qu'ils le recevront Ă  d'autres moments, le tout, les temps de travail, qu'il dĂ©teste Ă  partir de ce moment mais. Il fuit les plaisirs perçus pour ĂȘtre supposĂ©s n'ĂȘtre rien, tout ou, et la douleur est ce qui est la plus grande option, car cela lui est facile, et avec ce que cela s'ensuit, ils lui procurent de la douleur et ainsi de suite ! Car ledit expĂ©dient de la vĂ©ritĂ© repousse le plaisir et empĂȘche la douleur, ils fournissent comme si \ No newline at end of file +L'entreprise elle-mĂȘme est une entreprise trĂšs prospĂšre. Ils ne connaissent pas les bienfaits du corps, ou sauf qu'ils le recevront Ă  d'autres moments, le tout, les temps de travail, qu'il dĂ©teste Ă  partir de ce moment mais. Il fuit les plaisirs perçus pour ĂȘtre supposĂ©s n'ĂȘtre rien, tout ou, et la douleur est ce qui est la plus grande option, car cela lui est facile, et avec ce que cela s'ensuit, ils lui procurent de la douleur et ainsi de suite ! Car ledit expĂ©dient de la vĂ©ritĂ© repousse le plaisir et empĂȘche la douleur, ils fournissent comme si diff --git a/src/content/english/authors/-index.md b/src/content/authors/english/-index.md similarity index 100% rename from src/content/english/authors/-index.md rename to src/content/authors/english/-index.md diff --git a/src/content/english/authors/john-doe.md b/src/content/authors/english/john-doe.md similarity index 100% rename from src/content/english/authors/john-doe.md rename to src/content/authors/english/john-doe.md diff --git a/src/content/english/authors/sam-wilson.md b/src/content/authors/english/sam-wilson.md similarity index 100% rename from src/content/english/authors/sam-wilson.md rename to src/content/authors/english/sam-wilson.md diff --git a/src/content/english/authors/william-jacob.md b/src/content/authors/english/william-jacob.md similarity index 100% rename from src/content/english/authors/william-jacob.md rename to src/content/authors/english/william-jacob.md diff --git a/src/content/french/authors/-index.md b/src/content/authors/french/-index.md similarity index 100% rename from src/content/french/authors/-index.md rename to src/content/authors/french/-index.md diff --git a/src/content/french/authors/john-doe.md b/src/content/authors/french/john-doe.md similarity index 100% rename from src/content/french/authors/john-doe.md rename to src/content/authors/french/john-doe.md diff --git a/src/content/french/authors/sam-wilson.md b/src/content/authors/french/sam-wilson.md similarity index 100% rename from src/content/french/authors/sam-wilson.md rename to src/content/authors/french/sam-wilson.md diff --git a/src/content/french/authors/william-jacob.md b/src/content/authors/french/william-jacob.md similarity index 100% rename from src/content/french/authors/william-jacob.md rename to src/content/authors/french/william-jacob.md diff --git a/src/content/english/blog/-index.md b/src/content/blog/english/-index.md similarity index 100% rename from src/content/english/blog/-index.md rename to src/content/blog/english/-index.md diff --git a/src/content/english/blog/post-1.md b/src/content/blog/english/post-1.md similarity index 100% rename from src/content/english/blog/post-1.md rename to src/content/blog/english/post-1.md diff --git a/src/content/english/blog/post-2.md b/src/content/blog/english/post-2.md similarity index 100% rename from src/content/english/blog/post-2.md rename to src/content/blog/english/post-2.md diff --git a/src/content/english/blog/post-3.md b/src/content/blog/english/post-3.md similarity index 100% rename from src/content/english/blog/post-3.md rename to src/content/blog/english/post-3.md diff --git a/src/content/english/blog/post-4.md b/src/content/blog/english/post-4.md similarity index 100% rename from src/content/english/blog/post-4.md rename to src/content/blog/english/post-4.md diff --git a/src/content/french/blog/-index.md b/src/content/blog/french/-index.md similarity index 100% rename from src/content/french/blog/-index.md rename to src/content/blog/french/-index.md diff --git a/src/content/french/blog/post-1.md b/src/content/blog/french/post-1.md similarity index 100% rename from src/content/french/blog/post-1.md rename to src/content/blog/french/post-1.md diff --git a/src/content/french/blog/post-2.md b/src/content/blog/french/post-2.md similarity index 100% rename from src/content/french/blog/post-2.md rename to src/content/blog/french/post-2.md diff --git a/src/content/french/blog/post-3.md b/src/content/blog/french/post-3.md similarity index 100% rename from src/content/french/blog/post-3.md rename to src/content/blog/french/post-3.md diff --git a/src/content/french/blog/post-4.md b/src/content/blog/french/post-4.md similarity index 100% rename from src/content/french/blog/post-4.md rename to src/content/blog/french/post-4.md diff --git a/src/content/config.ts b/src/content/config.ts index 6b926a5..c690a41 100755 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -1,6 +1,6 @@ import { defineCollection, z } from "astro:content"; -// Post collection schema +// Blog collection schema const blogCollection = defineCollection({ schema: z.object({ title: z.string(), @@ -49,9 +49,96 @@ const pagesCollection = defineCollection({ }), }); +// Contact collection schema +const contactCollection = defineCollection({ + schema: z.object({ + title: z.string(), + meta_title: z.string().optional(), + description: z.string(), + image: z.string().optional(), + draft: z.boolean().optional(), + }), +}); + +// About collection schema +const aboutCollection = defineCollection({ + schema: z.object({ + title: z.string(), + meta_title: z.string().optional(), + description: z.string().optional(), + image: z.string(), + draft: z.boolean().optional(), + }), +}); + +// Banner schema +const bannerSchema = z.object({ + title: z.string(), + content: z.string(), + image: z.string(), + button: z.object({ + enable: z.boolean(), + label: z.string(), + link: z.string(), + }), +}); + +// Features schema +const featureSchema = z.object({ + title: z.string(), + image: z.string(), + content: z.string(), + bulletpoints: z.array(z.string()), + button: z.object({ + enable: z.boolean(), + label: z.string().optional(), + link: z.string().optional(), + }), +}); + +// Content schema (for the main content structure with banner and features) +const contentSchema = z.object({ + banner: bannerSchema, + features: z.array(featureSchema), +}); + +// Content collection schema +const contentCollection = defineCollection({ + schema: contentSchema, +}); + +// Testimonial schema +const testimonialSchema = z.object({ + name: z.string(), + designation: z.string(), + avatar: z.string(), + content: z.string(), +}); + +// Testimonials schema +const testimonialsSchema = z.array(testimonialSchema); + +// Call to Action schema +const callToActionSchema = z.object({ + enable: z.boolean(), + title: z.string(), + image: z.string(), + description: z.string(), + button: z.object({ + enable: z.boolean(), + label: z.string(), + link: z.string().url(), + }), +}); + // Export collections export const collections = { blog: blogCollection, authors: authorsCollection, pages: pagesCollection, + contact: contactCollection, + about: aboutCollection, + content: contentCollection, + testimonials: testimonialsSchema, + callToAction: callToActionSchema, }; diff --git a/src/content/english/contact/-index.md b/src/content/contact/english/-index.md similarity index 100% rename from src/content/english/contact/-index.md rename to src/content/contact/english/-index.md diff --git a/src/content/french/contact/-index.md b/src/content/contact/french/-index.md similarity index 100% rename from src/content/french/contact/-index.md rename to src/content/contact/french/-index.md diff --git a/src/content/english/homepage/-index.md b/src/content/homepage/english/-index.md similarity index 100% rename from src/content/english/homepage/-index.md rename to src/content/homepage/english/-index.md diff --git a/src/content/french/homepage/-index.md b/src/content/homepage/french/-index.md similarity index 99% rename from src/content/french/homepage/-index.md rename to src/content/homepage/french/-index.md index d02c12b..be96b3f 100755 --- a/src/content/french/homepage/-index.md +++ b/src/content/homepage/french/-index.md @@ -50,4 +50,4 @@ features: enable: false label: "" link: "" ---- \ No newline at end of file +--- diff --git a/src/content/english/pages/elements.mdx b/src/content/pages/english/elements.mdx similarity index 100% rename from src/content/english/pages/elements.mdx rename to src/content/pages/english/elements.mdx diff --git a/src/content/english/pages/privacy-policy.md b/src/content/pages/english/privacy-policy.md similarity index 100% rename from src/content/english/pages/privacy-policy.md rename to src/content/pages/english/privacy-policy.md diff --git a/src/content/french/pages/elements.mdx b/src/content/pages/french/elements.mdx similarity index 100% rename from src/content/french/pages/elements.mdx rename to src/content/pages/french/elements.mdx diff --git a/src/content/french/pages/privacy-policy.md b/src/content/pages/french/privacy-policy.md similarity index 100% rename from src/content/french/pages/privacy-policy.md rename to src/content/pages/french/privacy-policy.md diff --git a/src/content/english/sections/call-to-action.md b/src/content/sections/english/call-to-action.md similarity index 100% rename from src/content/english/sections/call-to-action.md rename to src/content/sections/english/call-to-action.md diff --git a/src/content/english/sections/testimonial.md b/src/content/sections/english/testimonial.md similarity index 100% rename from src/content/english/sections/testimonial.md rename to src/content/sections/english/testimonial.md diff --git a/src/content/french/sections/call-to-action.md b/src/content/sections/french/call-to-action.md similarity index 100% rename from src/content/french/sections/call-to-action.md rename to src/content/sections/french/call-to-action.md diff --git a/src/content/french/sections/testimonial.md b/src/content/sections/french/testimonial.md similarity index 100% rename from src/content/french/sections/testimonial.md rename to src/content/sections/french/testimonial.md diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index 9c5a34b..e539626 100755 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -9,6 +9,7 @@ import "@/styles/main.scss"; import { AstroFont } from "astro-font"; import { ViewTransitions } from "astro:transitions"; import SearchModal from "./helpers/SearchModal"; +import { getLangFromUrl } from "@/lib/utils/languageParser"; // font families const pf = theme.fonts.font_family.primary; @@ -40,6 +41,8 @@ export interface Props { // distructure frontmatters const { title, meta_title, description, image, noindex, canonical, lang } = Astro.props; + +const language = lang || getLangFromUrl(Astro.url); --- @@ -108,7 +111,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } = @@ -121,7 +124,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } = @@ -129,7 +132,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } = @@ -142,7 +145,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } = @@ -150,7 +153,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } = @@ -174,7 +177,7 @@ const { title, meta_title, description, image, noindex, canonical, lang } =
- +
diff --git a/src/layouts/components/BlogCard.astro b/src/layouts/components/BlogCard.astro index d2a8a89..eb15361 100644 --- a/src/layouts/components/BlogCard.astro +++ b/src/layouts/components/BlogCard.astro @@ -18,6 +18,11 @@ const { title, image, date, author, categories } = data.data; const lang = getLangFromUrl(Astro.url); const { read_more } = await getTranslations(lang as keyof ContentEntryMap); + +const slugParts = data.slug.split("/"); +slugParts[0] = "blog"; +const modifiedSlug = slugParts.join("/"); +data.slug = modifiedSlug; ---
diff --git a/src/layouts/components/Breadcrumbs.astro b/src/layouts/components/Breadcrumbs.astro index 077cdef..29e0448 100644 --- a/src/layouts/components/Breadcrumbs.astro +++ b/src/layouts/components/Breadcrumbs.astro @@ -11,19 +11,20 @@ if (supportedLang.includes(paths[0])) { lang = paths.shift()!; } +let baseHref = lang ? `/${lang}` : "/"; let parts = [ { label: "Home", - href: `/${lang}`, + href: baseHref, "aria-label": - Astro.url.pathname === `/${lang}` || Astro.url.pathname === `/${lang}/` + Astro.url.pathname === baseHref || Astro.url.pathname === `${baseHref}/` ? "page" : undefined, }, ]; paths.forEach((label: string, i: number) => { - const href = `/${lang}/${paths.slice(0, i + 1).join("/")}`; + const href = `${baseHref}${paths.slice(0, i + 1).join("/")}`; label !== "page" && parts.push({ label: humanize(label.replace(".html", "").replace(/[-_]/g, " ")) || "", diff --git a/src/layouts/helpers/LanguageSwitcher.tsx b/src/layouts/helpers/LanguageSwitcher.tsx index feb601b..e268ab9 100644 --- a/src/layouts/helpers/LanguageSwitcher.tsx +++ b/src/layouts/helpers/LanguageSwitcher.tsx @@ -9,7 +9,7 @@ const LanguageSwitcher = ({ lang: string; pathname: string; }) => { - const { default_language } = config.settings; + const { default_language, default_language_in_subdir } = config.settings; // Function to remove trailing slash if necessary const removeTrailingSlash = (path: string) => { @@ -21,22 +21,29 @@ const LanguageSwitcher = ({ // Sort languages by weight and filter out disabled languages const sortedLanguages = languages + // @ts-ignore .filter(language => !config.settings.disable_languages.includes(language.languageCode)) .sort((a, b) => a.weight - b.weight); return ( -
+
1 ? "block" : "hidden"}`}>