feat: implement internationalization (i18n) support

This commit is contained in:
radishzzz 2025-01-18 00:01:25 +00:00
parent 32ffec8480
commit d6c98880d3
17 changed files with 247 additions and 18 deletions

View file

@ -0,0 +1,7 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout>
about me
</Layout>

View file

@ -0,0 +1,47 @@
---
import Layout from '@/layouts/Layout.astro'
import { getPinnedPosts, getPosts } from '@/utils/content.config'
export function getStaticPaths() {
return [
{ params: { lang: 'zh' } },
{ params: { lang: 'en' } },
]
}
const { lang } = Astro.params
const pinnedPosts = await getPinnedPosts()
const posts = await getPosts()
---
<Layout>
<main>
{pinnedPosts.length > 0 && (
<section>
<ul>
{pinnedPosts.map(post => (
<li>
<a href={`/${lang}/posts/${post.slug}/`}>
{post.data.title}
<time>({post.data.published.toISOString().split('T')[0]})</time>
</a>
</li>
))}
</ul>
</section>
)}
<section>
<ul>
{posts.map(post => (
<li>
<a href={`/${lang}/posts/${post.slug}/`}>
{post.data.title}
<time>({post.data.published.toISOString().split('T')[0]})</time>
</a>
</li>
))}
</ul>
</section>
</main>
</Layout>

View file

@ -0,0 +1,23 @@
---
import Layout from '@/layouts/Layout.astro'
import { getCollection } from 'astro:content'
export async function getStaticPaths() {
const posts = await getCollection('posts')
return posts.map(post => ({
params: { slug: post.slug },
props: { post },
}))
}
const { post } = Astro.props
const { Content } = await post.render()
---
<Layout>
<article>
<h1>{post.data.title}</h1>
<time>{post.data.published.toISOString().split('T')[0]}</time>
<Content />
</article>
</Layout>

View file

@ -0,0 +1,36 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags, getPostsByTag } from '@/utils/content.config'
export async function getStaticPaths() {
const tags = await getAllTags()
return tags.map(tag => ({
params: { tags: tag },
props: { tags: tag },
}))
}
const { tags } = Astro.props
const posts = await getPostsByTag(tags)
const allTags = await getAllTags()
---
<Layout>
<div>
{allTags.map(tag => (
<a href={`/tags/${tag}/`}>
{tag}
</a>
))}
</div>
<div>
<ul>
{posts.map(post => (
<li>
<a href={`/posts/${post.slug}/`}>{post.data.title}</a>
</li>
))}
</ul>
</div>
</Layout>

View file

@ -0,0 +1,15 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags } from '@/utils/content.config'
const allTags = await getAllTags()
---
<Layout>
<div>
{allTags.map(tag => (
<a href={`/tags/${tag}/`}>
{tag}
</a>
))}
</div>

7
src/pages/about.astro Normal file
View file

@ -0,0 +1,7 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout>
about me
</Layout>

View file

@ -10,7 +10,6 @@ const pinnedPosts = await getPinnedPosts()
<main>
{pinnedPosts.length > 0 && (
<section>
<h2>置顶文章</h2>
<ul>
{pinnedPosts.map(post => (
<li>
@ -25,7 +24,6 @@ const pinnedPosts = await getPinnedPosts()
)}
<section>
<h2>所有文章</h2>
<ul>
{posts.map(post => (
<li>

View file

@ -8,7 +8,7 @@ import sanitizeHtml from 'sanitize-html'
const parser = new MarkdownIt()
const { title, description, url } = themeConfig.site
const { language } = themeConfig.global
const { locale } = themeConfig.global
const followConfig = themeConfig.seo?.follow
// Extract first 100 chars from content as description
@ -49,7 +49,7 @@ export async function GET(_context: APIContext) {
),
})),
customData: `
<language>${language}</language>
<language>${locale}</language>
${followConfig?.feedID && followConfig?.userID
? `<follow_challenge>
<feedId>${followConfig.feedID}</feedId>

View file

@ -0,0 +1,36 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags, getPostsByTag } from '@/utils/content.config'
export async function getStaticPaths() {
const tags = await getAllTags()
return tags.map(tag => ({
params: { tags: tag },
props: { tags: tag },
}))
}
const { tags } = Astro.props
const posts = await getPostsByTag(tags)
const allTags = await getAllTags()
---
<Layout>
<div>
{allTags.map(tag => (
<a href={`/tags/${tag}/`}>
{tag}
</a>
))}
</div>
<div>
<ul>
{posts.map(post => (
<li>
<a href={`/posts/${post.slug}/`}>{post.data.title}</a>
</li>
))}
</ul>
</div>
</Layout>

View file

@ -0,0 +1,15 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags } from '@/utils/content.config'
const allTags = await getAllTags()
---
<Layout>
<div>
{allTags.map(tag => (
<a href={`/tags/${tag}/`}>
{tag}
</a>
))}
</div>