mirror of
https://github.com/sergeyyarkov/yarkov.tech.git
synced 2026-10-11 18:39:14 +03:00
fix: fixed alternate link language for article
This commit is contained in:
parent
c1fefc30ef
commit
113737d7fe
@ -7,12 +7,32 @@ import { getLanguageFromURL } from "@root/utils";
|
|||||||
|
|
||||||
export interface Props extends astroHTML.JSX.AnchorHTMLAttributes {
|
export interface Props extends astroHTML.JSX.AnchorHTMLAttributes {
|
||||||
lang: LanguageKeys;
|
lang: LanguageKeys;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom article slug for alternate language
|
||||||
|
*/
|
||||||
|
slug?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { pathname } = Astro.url;
|
let { pathname } = Astro.url;
|
||||||
const siteLang = getLanguageFromURL(pathname);
|
const siteLang = getLanguageFromURL(pathname);
|
||||||
const { lang, ...attrs } = Astro.props as Props;
|
const { lang, slug, ...attrs } = Astro.props as Props;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Articles have different slug for different languages, so I have to modify it according to user's language.
|
||||||
|
*/
|
||||||
|
const mofifyArticleSlug = (slug) =>
|
||||||
|
lang === DEFAULT_LANGUAGE
|
||||||
|
? pathname.replace(pathname.split("/").at(4), slug)
|
||||||
|
: pathname.replace(pathname.split("/").at(3), slug);
|
||||||
|
|
||||||
let href: string;
|
let href: string;
|
||||||
|
|
||||||
|
if (slug && pathname.includes("/blog/")) {
|
||||||
|
pathname = mofifyArticleSlug(slug);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Someday I'll refactor this */
|
||||||
if (lang === DEFAULT_LANGUAGE) {
|
if (lang === DEFAULT_LANGUAGE) {
|
||||||
href = `/${pathname.split("/").slice(2).join("/")}`;
|
href = `/${pathname.split("/").slice(2).join("/")}`;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
import type { MDXInstance } from "astro";
|
import type { MDXInstance } from "astro";
|
||||||
|
|
||||||
|
import { DEFAULT_LANGUAGE } from "@root/config";
|
||||||
import ArticleLayout from "@layouts/article.astro";
|
import ArticleLayout from "@layouts/article.astro";
|
||||||
import AlternateLangLink from "@components/AlternateLangLink";
|
import AlternateLangLink from "@components/AlternateLangLink";
|
||||||
import { getLanguageFromURL } from "@root/utils";
|
import { getLanguageFromURL } from "@root/utils";
|
||||||
import { DEFAULT_LANGUAGE } from "@root/config";
|
|
||||||
import { formatArticlesByLangs, useTranslation } from "@i18n/utils";
|
import { formatArticlesByLangs, useTranslation } from "@i18n/utils";
|
||||||
import languages from "@i18n/languages";
|
import languages from "@i18n/languages";
|
||||||
|
|
||||||
@ -14,9 +14,14 @@ const canonicalUrl = new URL(Astro.url.pathname, Astro.site);
|
|||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
article: MDXInstance<ArticleType>;
|
article: MDXInstance<ArticleType>;
|
||||||
alternateLangs: LanguageKeys[];
|
availableLangs: AvailableLang[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AvailableLang = {
|
||||||
|
lang: LanguageKeys;
|
||||||
|
slug: any;
|
||||||
|
};
|
||||||
|
|
||||||
export async function getStaticPaths() {
|
export async function getStaticPaths() {
|
||||||
const modules = import.meta.glob<MDXInstance<ArticleType>>("../../content/articles/**/*.mdx", { eager: true });
|
const modules = import.meta.glob<MDXInstance<ArticleType>>("../../content/articles/**/*.mdx", { eager: true });
|
||||||
const entries = Object.keys(modules).map((key) => [key, key.split("/").slice(6)[0]]);
|
const entries = Object.keys(modules).map((key) => [key, key.split("/").slice(6)[0]]);
|
||||||
@ -28,26 +33,34 @@ export async function getStaticPaths() {
|
|||||||
const dirName = key.split("/").at(-3);
|
const dirName = key.split("/").at(-3);
|
||||||
const published_at = new Date(article.frontmatter.published_at).toLocaleDateString("en-CA");
|
const published_at = new Date(article.frontmatter.published_at).toLocaleDateString("en-CA");
|
||||||
const slug = `${lang !== DEFAULT_LANGUAGE ? `${lang}/` : ""}blog/${published_at}/${article.frontmatter.slug}`;
|
const slug = `${lang !== DEFAULT_LANGUAGE ? `${lang}/` : ""}blog/${published_at}/${article.frontmatter.slug}`;
|
||||||
|
const availableLangs: AvailableLang[] = Object.keys(formatted[dirName]).map((lang: LanguageKeys) => ({
|
||||||
|
lang,
|
||||||
|
slug: formatted[dirName][lang].frontmatter.slug,
|
||||||
|
}));
|
||||||
|
|
||||||
return { params: { slug }, props: { article, alternateLangs: Object.keys(formatted[dirName]) } };
|
return { params: { slug }, props: { article, availableLangs } };
|
||||||
})
|
})
|
||||||
.filter(({ props: { article } }) => !article.frontmatter.draft);
|
.filter(({ props: { article } }) => !article.frontmatter.draft);
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
article: { Content, frontmatter },
|
article: { Content, frontmatter },
|
||||||
alternateLangs,
|
availableLangs,
|
||||||
} = Astro.props as Props;
|
} = Astro.props as Props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<ArticleLayout lang={siteLang} content={frontmatter} canonicalUrl={canonicalUrl.href}>
|
<ArticleLayout lang={siteLang} content={frontmatter} canonicalUrl={canonicalUrl.href}>
|
||||||
{
|
{
|
||||||
alternateLangs.length > 1 && (
|
availableLangs.length > 1 && (
|
||||||
<div class="languages-available">
|
<div class="languages-available">
|
||||||
{t("article.availableOn")}:
|
{t("article.availableOn")}:
|
||||||
{alternateLangs
|
{availableLangs
|
||||||
.filter((lang) => lang !== siteLang)
|
.filter((entry) => entry.lang !== siteLang)
|
||||||
.map((lang) => <AlternateLangLink lang={lang}>{languages[lang]}</AlternateLangLink>)
|
.map((entry) => (
|
||||||
|
<AlternateLangLink slug={entry.slug} lang={entry.lang}>
|
||||||
|
{languages[entry.lang]}
|
||||||
|
</AlternateLangLink>
|
||||||
|
))
|
||||||
.reduce((prev, curr) => [prev, ", ", curr])}
|
.reduce((prev, curr) => [prev, ", ", curr])}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user