--- /** * Site.astro — 官网整页布局(构建期单显一种语言)。 * 两条路由复用:/ → lang="zh",/en/ → lang="en"(铁律 6 单显不并排)。 * * 样式来源顺序(全部自托管,无第三方 CDN): * @fontsource/* → 自托管字体 @font-face(替代原型的 Google Fonts CDN) * tokens.gen.css → 由 design/colors_and_type.css 生成(唯一令牌真相源) * website.css → 逐字迁自 ui_kits/website * site-extra.css → 仅承载「原型内联 style= → class」的等价工具类 */ import '@fontsource/sora/500.css'; import '@fontsource/sora/600.css'; import '@fontsource/sora/700.css'; import '@fontsource/manrope/400.css'; import '@fontsource/manrope/500.css'; import '@fontsource/manrope/600.css'; import '@fontsource/manrope/700.css'; import '@fontsource/noto-sans-sc/400.css'; import '@fontsource/noto-sans-sc/500.css'; import '@fontsource/noto-sans-sc/700.css'; import '@fontsource/jetbrains-mono/400.css'; import '@fontsource/jetbrains-mono/500.css'; import '../styles/tokens.gen.css'; import '../styles/website.css'; import '../styles/site-extra.css'; import { createT, type Lang } from '../i18n/strings'; import Header from '../components/Header.jsx'; import AnnouncementBar from '../components/AnnouncementBar.jsx'; import Hero from '../components/Hero.astro'; import Features from '../components/Features.astro'; import WhySignup from '../components/WhySignup.astro'; import Pricing from '../components/Pricing.astro'; import Download from '../components/Download.astro'; import Docs from '../components/Docs.astro'; // Blog 区暂隐藏(占位内容未就绪);有真实文章后恢复 import + + 导航/页脚链接。 import CtaBand from '../components/CtaBand.astro'; import Footer from '../components/Footer.astro'; interface Props { lang: Lang } const { lang } = Astro.props; const t = createT(lang); // 语言 → / og:locale / 路由前缀(默认 en = /,其余 //)。 const HTML_LANG: Record = { zh: 'zh-CN', en: 'en', ja: 'ja', ko: 'ko', ru: 'ru', es: 'es' }; const OG_LOCALE: Record = { zh: 'zh_CN', en: 'en_US', ja: 'ja_JP', ko: 'ko_KR', ru: 'ru_RU', es: 'es_ES' }; const ALL_LANGS: Lang[] = ['en', 'zh', 'ja', 'ko', 'ru', 'es']; const langPath = (l: Lang) => (l === 'en' ? '/' : `/${l}/`); const headerT = { product: t('nav.product'), pricing: t('nav.pricing'), download: t('nav.download'), docs: t('nav.docs'), blog: t('nav.blog'), login: t('nav.login'), get: t('nav.get'), suBtn: t('su.btn'), }; --- {t('meta.title')} {ALL_LANGS.map((l) => ( ))}