checkpoint: before i18n implementation

This commit is contained in:
Leon-in
2026-04-29 00:29:14 +08:00
parent ded6c67a36
commit 437dc976fb
41 changed files with 2167 additions and 1855 deletions
+4 -4
View File
@@ -2,11 +2,11 @@ import type { Metadata } from "next"
import { HeroSection, MissionSection, TeamSection, ValuesSection, CareersSection, SocialLinksSection } from "@/components/about"
export const metadata: Metadata = {
title: "About",
description: "Learn about DalCode's mission, team, and values. We're building the next generation of AI-powered developer tools.",
title: "产品定位",
description: "了解 DAL Code 的产品隐喻、核心能力、目标用户和平台方向。",
openGraph: {
title: "About DalCode",
description: "Learn about DalCode's mission, team, and values.",
title: "为什么是 DAL Code",
description: "了解 DAL Code 的产品隐喻、核心能力、目标用户和平台方向。",
},
}
+12 -10
View File
@@ -15,12 +15,12 @@ export async function generateStaticParams() {
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = await params
const post = BLOG_POSTS.find((p) => p.slug === slug)
if (!post) return { title: "Post Not Found" }
if (!post) return { title: "文章未找到" }
return {
title: post.title,
title: `${post.title} | DAL Code`,
description: post.excerpt,
openGraph: {
title: post.title,
title: `${post.title} | DAL Code`,
description: post.excerpt,
images: [{ url: post.image }],
},
@@ -73,12 +73,14 @@ export default async function BlogPostPage({ params }: Props) {
<div className="mg-top-regular">
<div className="inner-container _650px center">
<div className="blog-post-rich-text w-richtext">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.</p>
<h2>Key Insights</h2>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.</p>
<p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga.</p>
<h2>Looking Ahead</h2>
<p>Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
{post.sections.map((section) => (
<section key={section.title}>
<h2>{section.title}</h2>
{section.paragraphs.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
</section>
))}
</div>
</div>
</div>
@@ -86,7 +88,7 @@ export default async function BlogPostPage({ params }: Props) {
<div className="inner-container _650px center text-center">
<Link href="/blog" className="primary-button w-inline-block">
<div className="button-content">
<div>Back to all articles</div>
<div></div>
<div className="button-icon-wrapper primary">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 17 17" fill="none" className="squared-icon">
<path d="M6.25391 3.45312L10.7458 8.01563L6.25391 12.5781" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square" />
+4 -4
View File
@@ -2,11 +2,11 @@ import type { Metadata } from "next"
import { HeroSection, CtaSection, PostsGridSection } from "@/components/blog"
export const metadata: Metadata = {
title: "Blog",
description: "Insights on AI, machine learning, and the future of software development from the DalCode team.",
title: "产品洞察",
description: "围绕 Intent-to-Code、Mission Mode、多模型路由和 Skills 平台的产品文章。",
openGraph: {
title: "DalCode Blog",
description: "Insights on AI, machine learning, and the future of software development.",
title: "DAL Code 产品洞察",
description: "围绕 Intent-to-Code、Mission Mode、多模型路由和 Skills 平台的产品文章。",
},
}
+16 -25
View File
@@ -14,12 +14,12 @@ export async function generateStaticParams() {
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = await params
const career = CAREERS.find((c) => c.slug === slug)
if (!career) return { title: "Position Not Found" }
if (!career) return { title: "角色未找到" }
return {
title: career.title,
title: `${career.title} | DAL Code`,
description: career.description,
openGraph: {
title: `${career.title} - DalCode Careers`,
title: `${career.title} | DAL Code`,
description: career.description,
},
}
@@ -54,31 +54,22 @@ export default async function CareerDetailPage({ params }: Props) {
<div className="mg-top-regular">
<div className="inner-container _650px center">
<div className="blog-post-rich-text w-richtext">
<h2>About the role</h2>
<p>We are looking for a {career.title} to join our {career.department} team. In this role, you will work alongside world-class engineers and researchers to push the boundaries of what&apos;s possible with AI.</p>
<h2>Responsibilities</h2>
<h2></h2>
<p>{career.description}</p>
<h2></h2>
<ul role="list">
<li>Collaborate with cross-functional teams to design, develop, and deploy AI solutions</li>
<li>Contribute to research and development of novel AI architectures and algorithms</li>
<li>Write clean, maintainable, and well-tested code</li>
<li>Participate in code reviews and contribute to engineering best practices</li>
<li>Stay up-to-date with the latest developments in AI and machine learning</li>
{career.responsibilities.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
<h2>Requirements</h2>
<h2></h2>
<ul role="list">
<li>Strong background in computer science, mathematics, or a related field</li>
<li>Experience with modern AI/ML frameworks and tools</li>
<li>Excellent problem-solving and communication skills</li>
<li>Ability to work independently and as part of a team</li>
</ul>
<h2>What we offer</h2>
<ul role="list">
<li>Competitive salary and equity package</li>
<li>Comprehensive health, dental, and vision insurance</li>
<li>Flexible work arrangements</li>
<li>Learning and development budget</li>
<li>Regular team events and offsites</li>
{career.requirements.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
<h2></h2>
<p>{career.outcome}</p>
</div>
</div>
</div>
@@ -86,7 +77,7 @@ export default async function CareerDetailPage({ params }: Props) {
<div className="inner-container _650px center text-center">
<Link href="/careers" className="primary-button w-inline-block">
<div className="button-content">
<div>Back to all positions</div>
<div></div>
<div className="button-icon-wrapper primary">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 17 17" fill="none" className="squared-icon">
<path d="M6.25391 3.45312L10.7458 8.01563L6.25391 12.5781" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square" />
+6 -6
View File
@@ -3,11 +3,11 @@ import Link from "next/link"
import { CAREERS } from "@/lib/careers-data"
export const metadata: Metadata = {
title: "Careers",
description: "Join our team and help shape the future of AI. Explore open positions at DalCode.",
title: "建设中的角色",
description: "DAL Code 当前重点建设方向,面向 Agent Engine、Developer Experience、Routing 与 Intent UX。",
openGraph: {
title: "Careers at DalCode",
description: "Join our team and help shape the future of AI.",
title: "DAL Code 建设中的角色",
description: "DAL Code 当前重点建设方向,面向 Agent Engine、Developer Experience、Routing 与 Intent UX。",
},
}
@@ -20,10 +20,10 @@ export default function CareersPage() {
<div className="text-center">
<div className="subtitle">Careers</div>
<div className="mg-top-4x-extra-small">
<h1>Join our team</h1>
<h1></h1>
</div>
<div className="mg-top-4x-extra-small">
<p>We&apos;re looking for talented people to help us build the future of AI-powered development tools.</p>
<p> DAL Code 12 </p>
</div>
</div>
</div>
+17 -7
View File
@@ -2,8 +2,8 @@ import type { Metadata } from "next"
import Link from "next/link"
export const metadata: Metadata = {
title: "Coming Soon",
description: "This page is coming soon. Stay tuned for updates.",
title: "建设中 | DAL Code",
description: "DAL Code 官网这部分内容还在补齐,路线图和更多产品细节会逐步上线。",
}
export default function ComingSoonPage() {
@@ -11,17 +11,20 @@ export default function ComingSoonPage() {
<main className="section-small top overflow-hidden">
<div className="w-layout-blockcontainer container-default w-container">
<div className="text-center" style={{ padding: "120px 0" }}>
<div className="subtitle">Coming soon</div>
<div className="subtitle">Roadmap</div>
<div className="mg-top-4x-extra-small">
<h1>Under construction</h1>
<h1></h1>
</div>
<div className="mg-top-4x-extra-small">
<p>We&apos;re working on something exciting. Check back soon for updates.</p>
<p>DAL Code 线</p>
</div>
<div className="mg-top-4x-extra-small">
<p></p>
</div>
<div className="mg-top-24px">
<Link href="/" className="primary-button w-inline-block">
<Link href="/blog" className="primary-button w-inline-block">
<div className="button-content">
<div>Back to home</div>
<div></div>
<div className="button-icon-wrapper primary">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 17 17" fill="none" className="squared-icon">
<path d="M6.25391 3.45312L10.7458 8.01563L6.25391 12.5781" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square" />
@@ -32,6 +35,13 @@ export default function ComingSoonPage() {
</div>
</Link>
</div>
<div className="mg-top-4x-extra-small">
<Link href="/contact" className="tertiary-button w-inline-block">
<div className="button-content">
<div> DAL Code </div>
</div>
</Link>
</div>
</div>
</div>
</main>
+4 -4
View File
@@ -2,11 +2,11 @@ import type { Metadata } from "next"
import { HeroSection, FormSection, CardsSection } from "@/components/contact"
export const metadata: Metadata = {
title: "Contact",
description: "Get in touch with the DalCode team. We'd love to hear from you about partnerships, support, or general inquiries.",
title: "联系团队",
description: "和 DAL Code 团队聊聊产品试用、企业方案、生态合作和建设方向。",
openGraph: {
title: "Contact DalCode",
description: "Get in touch with the DalCode team.",
title: "联系 DAL Code",
description: "和 DAL Code 团队聊聊产品试用、企业方案、生态合作和建设方向。",
},
}
+10 -5
View File
@@ -6,6 +6,7 @@ import Footer from "@/components/Footer"
import GsapAnimations from "@/components/GsapAnimations"
import RevealObserver from "@/components/RevealObserver"
import PageTransition from "@/components/PageTransition"
import { SITE_BRAND, SITE_DESCRIPTION, SITE_NAME } from "@/lib/site-content"
import "./webflow.css"
import "./globals.css"
@@ -22,16 +23,20 @@ const interTight = Inter_Tight({
variable: "--font-inter-tight",
display: "swap",
})
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000"
export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: {
default: "DalCode - AI Code Intelligence",
template: "%s | DalCode",
default: SITE_BRAND,
template: `%s | ${SITE_NAME}`,
},
description: "DalCode - AI-powered code intelligence platform for innovation-driven teams.",
description: SITE_DESCRIPTION,
openGraph: {
type: "website",
siteName: "DalCode",
siteName: SITE_BRAND,
title: SITE_BRAND,
description: SITE_DESCRIPTION,
},
}
@@ -42,7 +47,7 @@ export default function RootLayout({
}>) {
return (
<html
lang="en"
lang="zh-CN"
className={`w-mod-js w-mod-ix3 ${inter.variable} ${interTight.variable}`}
suppressHydrationWarning
>
+20 -4
View File
@@ -7,14 +7,30 @@ export default function NotFound() {
<div className="text-center" style={{ padding: "120px 0" }}>
<div className="subtitle">404</div>
<div className="mg-top-4x-extra-small">
<h1>Page not found</h1>
<h1> DAL Code </h1>
</div>
<div className="mg-top-4x-extra-small">
<p>The page you&apos;re looking for doesn&apos;t exist or has been moved.</p>
<p></p>
</div>
<div className="mg-top-24px">
<Link href="/" className="form-button w-button">
Back to home
<Link href="/" className="primary-button w-inline-block">
<div className="button-content">
<div></div>
<div className="button-icon-wrapper primary">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 17 17" fill="none" className="squared-icon">
<path d="M6.25391 3.45312L10.7458 8.01563L6.25391 12.5781" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square" />
</svg>
<div className="button-icon-bg" />
<div className="button-icon-bg-inside" />
</div>
</div>
</Link>
</div>
<div className="mg-top-4x-extra-small">
<Link href="/about" className="tertiary-button w-inline-block">
<div className="button-content">
<div></div>
</div>
</Link>
</div>
</div>
+5 -4
View File
@@ -1,12 +1,13 @@
import type { Metadata } from "next"
import { HeroSection, IntegrationsSection, PrinciplesSection, CtaSection, BlogPreviewSection } from "@/components/home"
import { SITE_BRAND, SITE_DESCRIPTION } from "@/lib/site-content"
export const metadata: Metadata = {
title: "DalCode - AI Code Intelligence Platform",
description: "Transform your development workflow with AI-powered code intelligence. DalCode helps innovation-driven teams ship faster with smart automation and deep code understanding.",
title: SITE_BRAND,
description: SITE_DESCRIPTION,
openGraph: {
title: "DalCode - AI Code Intelligence Platform",
description: "Transform your development workflow with AI-powered code intelligence.",
title: SITE_BRAND,
description: SITE_DESCRIPTION,
},
}
+9 -34
View File
@@ -15,12 +15,12 @@ export async function generateStaticParams() {
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { id } = await params
const member = TEAM_MEMBERS.find((m) => m.slug === id)
if (!member) return { title: "Team Member Not Found" }
if (!member) return { title: "能力模块未找到" }
return {
title: member.name,
description: `${member.name} - ${member.role} at DalCode`,
title: `${member.name} | DAL Code`,
description: member.bio,
openGraph: {
title: `${member.name} - ${member.role}`,
title: `${member.name} | ${member.role}`,
description: member.bio,
images: [{ url: member.image }],
},
@@ -61,35 +61,10 @@ export default async function TeamMemberPage({ params }: Props) {
<div className="mg-top-regular">
<div className="inner-container _650px center">
<div className="blog-post-rich-text w-richtext">
<h2>About</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.</p>
<p>Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.</p>
</div>
</div>
</div>
<div className="mg-top-regular">
<div className="inner-container _650px center">
<div className="team-member-buttons-wrapper" style={{ justifyContent: "center" }}>
<div>
<a href="https://x.com" className="social-square-icon-link w-inline-block" target="_blank" rel="noopener noreferrer">
<div className="social-square-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 19 18" fill="none" className="social-media-icon">
<path fillRule="evenodd" clipRule="evenodd" d="M7.04543 9.42969L0.0390625 0.25H5.98663L10.1792 5.74312L14.8487 0.25H17.7333L11.5439 7.53115L18.9618 17.25H13.0143L8.41014 11.2177L3.28238 17.25H0.397729L7.04543 9.42969ZM13.8802 15.4998L3.57671 2.00024H5.12071L15.4242 15.4998H13.8802Z" fill="currentColor" />
</svg>
</div>
<div className="social-square-bg" />
</a>
</div>
<div>
<a href="https://linkedin.com" className="social-square-icon-link w-inline-block" target="_blank" rel="noopener noreferrer">
<div className="social-square-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 20 20" fill="none" className="social-media-icon">
<path d="M1 2.99134C1 2.41413 1.20271 1.93794 1.60811 1.56277C2.01351 1.18758 2.54055 1 3.18919 1C3.82626 1 4.34169 1.18469 4.73552 1.55411C5.14092 1.93506 5.34363 2.43145 5.34363 3.04329C5.34363 3.5974 5.14672 4.05915 4.7529 4.42857C4.3475 4.80952 3.81467 5 3.15444 5H3.13707C2.49999 5 1.98456 4.80952 1.59073 4.42857C1.19691 4.04762 1 3.56854 1 2.99134ZM1.22587 18.1429V6.57576H5.08301V18.1429H1.22587ZM7.22008 18.1429H11.0772V11.684C11.0772 11.2799 11.1236 10.9682 11.2162 10.7489C11.3784 10.3564 11.6245 10.0245 11.9546 9.75324C12.2847 9.48195 12.6988 9.34632 13.1969 9.34632C14.4942 9.34632 15.1429 10.2179 15.1429 11.961V18.1429H19V11.5108C19 9.8023 18.5946 8.50649 17.7838 7.62337C16.973 6.74026 15.9015 6.2987 14.5695 6.2987C13.0753 6.2987 11.9112 6.93939 11.0772 8.22078V8.25541H11.0598L11.0772 8.22078V6.57576H7.22008C7.24324 6.94516 7.25483 8.09378 7.25483 10.0216C7.25483 11.9495 7.24324 14.6565 7.22008 18.1429Z" fill="currentColor" />
</svg>
</div>
<div className="social-square-bg" />
</a>
</div>
<h2></h2>
{member.story.map((paragraph) => (
<p key={paragraph}>{paragraph}</p>
))}
</div>
</div>
</div>
@@ -97,7 +72,7 @@ export default async function TeamMemberPage({ params }: Props) {
<div className="inner-container _650px center text-center">
<Link href="/about" className="primary-button w-inline-block">
<div className="button-content">
<div>Back to team</div>
<div></div>
<div className="button-icon-wrapper primary">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 17 17" fill="none" className="squared-icon">
<path d="M6.25391 3.45312L10.7458 8.01563L6.25391 12.5781" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square" />