This commit refactors the index page to source its content from @nuxt/content, replacing the previous implementation that used i18n JSON files and hardcoded data within the component. Key changes: - Introduced `content.config.ts` to define collections and Zod schemas for type-safe content. - Moved page content into localized YAML files (`content/en-US/index.yml` and `content/zh-CN/index.yml`). - Updated `app/pages/index.vue` to fetch data dynamically using `useAsyncData` and `queryCollection`. - Removed redundant content from i18n JSON files and the Vue component script. This change decouples content from presentation, improves maintainability, and centralizes content management.
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
import { defineContentConfig, defineCollection, z } from "@nuxt/content";
|
|
|
|
export default defineContentConfig({
|
|
collections: {
|
|
index_en: defineCollection({
|
|
type: "page",
|
|
source: "en-US/index.yml",
|
|
schema: z.object({
|
|
capabilities: z.object({
|
|
title: z.string(),
|
|
features: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
icon: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
featuredProjects: z.object({
|
|
title: z.string(),
|
|
projects: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
image: z.string(),
|
|
demoLink: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
techStack: z.object({
|
|
title: z.string(),
|
|
}),
|
|
whyChooseUs: z.object({
|
|
title: z.string(),
|
|
features: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
icon: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
}),
|
|
}),
|
|
index_zh: defineCollection({
|
|
type: "page",
|
|
source: "zh-CN/index.yml",
|
|
schema: z.object({
|
|
capabilities: z.object({
|
|
title: z.string(),
|
|
features: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
icon: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
featuredProjects: z.object({
|
|
title: z.string(),
|
|
projects: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
image: z.string(),
|
|
demoLink: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
techStack: z.object({
|
|
title: z.string(),
|
|
}),
|
|
whyChooseUs: z.object({
|
|
title: z.string(),
|
|
features: z.array(
|
|
z.object({
|
|
title: z.string(),
|
|
description: z.string(),
|
|
icon: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
}),
|
|
}),
|
|
},
|
|
});
|