From 6c13fc54d65fba30f5ec275ef4b1f8a790bab78d Mon Sep 17 00:00:00 2001 From: Caihaohan Date: Tue, 27 Jan 2026 17:22:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20AI=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E8=B7=B3=E8=BD=AC=E5=90=8E=20async/await=20=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=BB=84=E4=BB=B6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 ProjectCard 和 SubmitProjectCard 从 async 组件重构为普通组件, 通过 props 接收翻译文本,解决在客户端组件中使用 async 组件导致的错误。 - 移除 ProjectCard 和 SubmitProjectCard 的 async 关键字 - 添加 translations prop 接收翻译文本 - 更新所有调用点传递翻译文本 Co-Authored-By: Claude (glm-4.7) --- .../[locale]/projects/ProjectsPageClient.tsx | 9 ++++- src/app/[locale]/projects/page.tsx | 10 ++++++ src/components/project/ProjectCard.tsx | 34 ++++++++++++++----- src/components/project/ProjectList.tsx | 22 +++++++++--- src/components/search/AISearchResults.tsx | 10 ++++-- 5 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/app/[locale]/projects/ProjectsPageClient.tsx b/src/app/[locale]/projects/ProjectsPageClient.tsx index 8376b76..71ae340 100644 --- a/src/app/[locale]/projects/ProjectsPageClient.tsx +++ b/src/app/[locale]/projects/ProjectsPageClient.tsx @@ -24,6 +24,12 @@ interface ProjectsPageClientProps { searching: string aiHint: string traditionalHint: string + translations: { + viewDetails: string + submitProjectTitle: string + submitProjectDescription: string + submitNow: string + } } export function ProjectsPageClient({ @@ -38,6 +44,7 @@ export function ProjectsPageClient({ searching, aiHint, traditionalHint, + translations, }: ProjectsPageClientProps) { const searchParams = useSearchParams() const [aiResults, setAiResults] = useState([]) @@ -150,7 +157,7 @@ export function ProjectsPageClient({

{error}

)} - + ) : ( children diff --git a/src/app/[locale]/projects/page.tsx b/src/app/[locale]/projects/page.tsx index 0b45ce0..5932944 100644 --- a/src/app/[locale]/projects/page.tsx +++ b/src/app/[locale]/projects/page.tsx @@ -16,6 +16,7 @@ export default async function ProjectsPage({ }: ProjectsPageProps) { const t = await getTranslations('home') const tCommon = await getTranslations('common') + const tProject = await getTranslations('project') const [resolvedParams, resolvedSearchParams] = await Promise.all([params, searchParams]) const { locale } = resolvedParams @@ -29,6 +30,14 @@ export default async function ProjectsPage({ getAllTags(), // 获取所有标签(用于展开) ]) + // 准备翻译文本传递给客户端组件 + const translations = { + viewDetails: tCommon('viewDetails'), + submitProjectTitle: tProject('submitProjectTitle'), + submitProjectDescription: tProject('submitProjectDescription'), + submitNow: tProject('submitNow'), + } + return (
{/* Search and Filter Section */} @@ -45,6 +54,7 @@ export default async function ProjectsPage({ searching={tCommon('searching')} aiHint={tCommon('aiHint')} traditionalHint={tCommon('traditionalHint')} + translations={translations} > {/* Tag Cloud - rendered inside client component for non-AI mode */}
diff --git a/src/components/project/ProjectCard.tsx b/src/components/project/ProjectCard.tsx index c046d37..513bdc8 100644 --- a/src/components/project/ProjectCard.tsx +++ b/src/components/project/ProjectCard.tsx @@ -1,6 +1,5 @@ import Link from 'next/link' import Image from 'next/image' -import { getTranslations } from 'next-intl/server' import { GitHubStatsCompact } from './GitHubBadges' import { getGitHubBadgesFromLinks } from '@/lib/github/badges' @@ -27,6 +26,10 @@ interface ProjectCardProps { } locale: string featured?: boolean + // 新增:通过 props 接收翻译文本,支持客户端组件使用 + translations?: { + viewDetails: string + } } // Icon mapping for projects based on tags @@ -42,8 +45,9 @@ function getProjectIcon(tags: Array<{ name: string | null }>): string { return '✨' } -export async function ProjectCard({ project, locale, featured = false }: ProjectCardProps) { - const t = await getTranslations('common') +export function ProjectCard({ project, locale, featured = false, translations }: ProjectCardProps) { + // 使用传入的翻译文本,如果没有提供则使用默认值 + const viewDetailsText = translations?.viewDetails || 'View Details' const icon = getProjectIcon(project.tags) const displayName = locale === 'en' && project.nameEn ? project.nameEn : project.name const displayDescription = locale === 'en' && project.descriptionEn ? project.descriptionEn : project.description @@ -94,7 +98,7 @@ export async function ProjectCard({ project, locale, featured = false }: Project href={`/${locale}/projects/${project.slug}`} className="inline-flex items-center font-display font-bold text-sm uppercase hover:text-secondary dark:hover:text-primary group" > - {t('viewDetails')}{' '} + {viewDetailsText}{' '} @@ -121,22 +125,34 @@ export async function ProjectCard({ project, locale, featured = false }: Project } // Special card for "Submit Your Project" CTA -export async function SubmitProjectCard({ locale }: { locale: string }) { - const t = await getTranslations('project') +interface SubmitProjectCardProps { + locale: string + translations?: { + submitProjectTitle: string + submitProjectDescription: string + submitNow: string + } +} + +export function SubmitProjectCard({ locale, translations }: SubmitProjectCardProps) { + const submitProjectTitle = translations?.submitProjectTitle || 'Submit Your Project' + const submitProjectDescription = translations?.submitProjectDescription || 'Help us grow the AI ecosystem' + const submitNow = translations?.submitNow || 'Submit Now' + return (
+
-

{t('submitProjectTitle')}

+

{submitProjectTitle}

- {t('submitProjectDescription')} + {submitProjectDescription}

- {t('submitNow')} + {submitNow}
) diff --git a/src/components/project/ProjectList.tsx b/src/components/project/ProjectList.tsx index 50ca0e6..3c63061 100644 --- a/src/components/project/ProjectList.tsx +++ b/src/components/project/ProjectList.tsx @@ -21,12 +21,13 @@ interface ProjectListProps { } export async function ProjectList({ projects, locale, featured = false }: ProjectListProps) { - const t = await getTranslations('common') + const tCommon = await getTranslations('common') + const tProject = await getTranslations('project') if (projects.length === 0) { return (
-

{t('noProjects')}

+

{tCommon('noProjects')}

) } @@ -34,12 +35,25 @@ export async function ProjectList({ projects, locale, featured = false }: Projec return (
{projects.map((project) => ( - + ))} {/* Add "Submit Your Project" CTA card for featured section */} {featured && ( - + )}
) diff --git a/src/components/search/AISearchResults.tsx b/src/components/search/AISearchResults.tsx index 08de47d..d8c39a3 100644 --- a/src/components/search/AISearchResults.tsx +++ b/src/components/search/AISearchResults.tsx @@ -12,9 +12,15 @@ interface AISearchResult { interface AISearchResultsProps { results: AISearchResult[] locale: string + translations: { + viewDetails: string + submitProjectTitle: string + submitProjectDescription: string + submitNow: string + } } -export function AISearchResults({ results, locale }: AISearchResultsProps) { +export function AISearchResults({ results, locale, translations }: AISearchResultsProps) { if (results.length === 0) { return (
@@ -51,7 +57,7 @@ export function AISearchResults({ results, locale }: AISearchResultsProps) { {/* 项目卡片 */}
- + {/* AI 匹配信息 */}