diff --git a/src/constants.ts b/src/constants.ts index ff31be5..8fd7820 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,6 +1,6 @@ import siteconfig from "../siteconfig.json"; -export const DEFAULT_LANGUAGE: LanguageKeys = "en"; +export const DEFAULT_LANGUAGE: LanguageKeys = "ru"; export const IS_SITE_UNDER_CONSTRUCTION = siteconfig.isSiteUnderConstruction; export const SUPPORTED_LANGUAGES: SupportedLanguages = ["ru", "en"]; export const URL_BLOG_PREFIX = "blog"; diff --git a/src/i18n/utils.ts b/src/i18n/utils.ts index c4299b9..b65fd44 100644 --- a/src/i18n/utils.ts +++ b/src/i18n/utils.ts @@ -8,9 +8,7 @@ export function useTranslation(Astro: Readonly): (key: UIDictionary } export function getLanguageKeys(): Array { - return Object.keys(languages).filter((lang) => - SUPPORTED_LANGUAGES.includes(lang as LanguageKeys) - ); + return Object.keys(languages).filter((lang) => SUPPORTED_LANGUAGES.includes(lang as LanguageKeys)); } export function getLanguageFromURL(pathname: string): LanguageKeys { @@ -32,9 +30,7 @@ function transformExports(modules: Record) { return translations; } -const translations = transformExports>( - import.meta.glob("./*/ui.ts", { eager: true }) -); +const translations = transformExports>(import.meta.glob("./*/ui.ts", { eager: true })); export function translate(key: UIDictionaryKeys, lang: LanguageKeys): string { const value = translations[lang]?.[key] || translations[DEFAULT_LANGUAGE][key]; diff --git a/src/pages/sitemap.xml.ts b/src/pages/sitemap.xml.ts index a4edb49..219b30e 100644 --- a/src/pages/sitemap.xml.ts +++ b/src/pages/sitemap.xml.ts @@ -1,46 +1,79 @@ import type { APIContext } from "astro"; +import { createRelativeArticleUrl } from "@root/utils"; import { getArticleList } from "../queries"; -// import { getCollection } from 'astro:content'; +import { DEFAULT_LANGUAGE, SUPPORTED_LANGUAGES } from "../constants"; + +type SitemapURL = { loc: string; changefreq?: string; priority?: number; langs?: { lang: string; href: string }[] }; export async function GET(context: APIContext) { const site = context.site?.origin || "https://yarkov.tech"; - const urls: Array<{ loc: string; changefreq?: string; priority?: number }> = []; const articles = await getArticleList(); - urls.push( - { loc: `${site}/`, changefreq: "weekly", priority: 1.0 }, - { loc: `${site}/articles/`, changefreq: "weekly", priority: 0.9 }, - { loc: `${site}/projects/`, changefreq: "monthly", priority: 0.8 }, - { loc: `${site}/about/`, changefreq: "monthly", priority: 0.7 } - ); + const baseUrls: Array = [ + { loc: `/`, changefreq: "weekly", priority: 1.0 }, + { loc: `/articles/`, changefreq: "weekly", priority: 0.9 }, + { loc: `/projects/`, changefreq: "monthly", priority: 0.8 }, + { loc: `/about/`, changefreq: "monthly", priority: 0.7 }, + ]; - // articles.forEach((a) => { - // if (a.translations) { - // a.translations.forEach((article) => { - // urls.push({ loc: `${site}` }); - // }); - // } - // }); + const articleUrls: Array = []; + + articles.forEach((a) => { + if (a.translations && a.translations.length >= 1) { + const articlePageUrlLoc = a.translations[0]; + + if (articlePageUrlLoc) { + const articleLang = articlePageUrlLoc.languages_code?.code.split("-")[0] || DEFAULT_LANGUAGE; + const loc = createRelativeArticleUrl({ + articleLang, + pubDate: articlePageUrlLoc.pub_date, + slug: articlePageUrlLoc.slug, + }); + + articleUrls.push({ + loc: `${site}${loc}`, + langs: a.translations + .filter((a) => !!a) + .map((a) => ({ + lang: a.languages_code?.code.split("-")[0] || "", + href: `${site}${createRelativeArticleUrl({ + articleLang: a.languages_code?.code.split("-")[0] || DEFAULT_LANGUAGE, + pubDate: a.pub_date, + slug: a.slug, + })}/`, + })), + }); + } + } + }); const sitemap = ` - ${urls - .map( - (url) => ` - ${url.loc}${ - url.changefreq - ? ` - ${url.changefreq}` - : "" - }${ - url.priority !== undefined - ? ` - ${url.priority}` - : "" - } - ` - ) - .join("\n")} + ${baseUrls + .map((url) => { + return ` + ${site}${url.loc} + ${url.changefreq && `${url.changefreq}`} + ${url.priority && `${url.priority}`} + ${SUPPORTED_LANGUAGES.map( + (lang) => + `` + ).join("")} + `; + }) + .join("")} + ${articleUrls + .map((url) => { + return ` + + ${url.loc} + ${url.langs?.map(({ lang, href }) => ``).join("")} + + `; + }) + .join("")} `; return new Response(sitemap, {