--- import '@/styles/global.css' import LoadingOverlay from '@/components/LoadingOverlay.astro' import AuthModal from '@/components/AuthModal.astro' import { href, ROUTES } from '@/lib/routes' import { getI18n, LOCALE_NAMES, setApiLocale } from '@/lib/i18n' import { config } from '@/lib/config' import { i18n } from 'astro:config/client'; import { toCodes } from 'astro:i18n'; interface Props { title?: string description?: string keywords?: string } const { title, description, keywords } = Astro.props const { locale, t, getRelativeLocaleUrl } = getI18n(Astro) const SITE_NAME = config.siteName ?? "Xisoa" const siteTitle = title ? `${title} — ${SITE_NAME}` : SITE_NAME // 默认 TDK(按语言);各页面可经 Layout 的 description/keywords 覆盖。 const defaultDescription = locale === 'cn' ? `${SITE_NAME} 时尚档案收录全球时装周走秀造型与街头抓拍,可按品牌、季节、城市检索。` : `${SITE_NAME} is a fashion archive of runway looks and street style snaps — browse by brand, season and city.` const defaultKeywords = locale === 'cn' ? "时尚档案,走秀,街拍,时装周,品牌,季节" : "fashion archive,runway looks,street style,fashion week,brand,season" const metaDescription = description ?? defaultDescription const metaKeywords = keywords ?? defaultKeywords // 把当前语言注入 API 请求层:所有服务端(SSG/SSR)取数统一带上 ?locale=, // 后端据此选 *_en / *_cn 列。客户端 fetch 则自行按 URL path 推断,无需此处。 setApiLocale(locale) // 经 data-* 属性把已翻译字符串传入打包型 {/* Top Footer Grid */}
{/* Column 1: Brand & Manifesto */}
Portfolio Studio 2026 Edition

{t('Minimalist editorial portfolio documenting haute couture shows, backstage fittings, and street culture. Integrated with 2026 color forecast intelligence and AI palette generator.')}

{/* Location Badge */}
Paris • Milan • Tokyo • New York
{t('© 2026 PORTFOLIO STUDIO. ALL RIGHTS RESERVED.')}
{/* 全局登录门禁层(login-required 属性 + 统一登录浮层) */}