first commit

This commit is contained in:
sofio
2026-02-03 15:47:03 +08:00
parent 94b39b2099
commit e87c9006a8
52 changed files with 5762 additions and 119 deletions

BIN
LOGO.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
PNG.zip Normal file

Binary file not shown.

1357
bun.lock Normal file

File diff suppressed because it is too large Load Diff

2
hero.mjs Normal file
View File

@@ -0,0 +1,2 @@
import { heroui } from "@heroui/react";
export default heroui();

View File

@@ -1,7 +1,10 @@
import type { NextConfig } from "next";
import createNextIntlPlugin from "next-intl/plugin";
const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts");
const nextConfig: NextConfig = {
/* config options here */
};
export default nextConfig;
export default withNextIntl(nextConfig);

10
package-lock.json generated
View File

@@ -8,6 +8,7 @@
"name": "singularity-website",
"version": "0.1.0",
"dependencies": {
"lucide-react": "^0.563.0",
"next": "16.1.6",
"react": "19.2.3",
"react-dom": "19.2.3"
@@ -4833,6 +4834,15 @@
"yallist": "^3.0.2"
}
},
"node_modules/lucide-react": {
"version": "0.563.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz",
"integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==",
"license": "ISC",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",

View File

@@ -9,7 +9,11 @@
"lint": "eslint"
},
"dependencies": {
"@heroui/react": "^2.8.8",
"framer-motion": "^12.30.0",
"lucide-react": "^0.563.0",
"next": "16.1.6",
"next-intl": "^4.8.2",
"react": "19.2.3",
"react-dom": "19.2.3"
},

BIN
public/LOGO_header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1 +0,0 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 391 B

View File

@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 128 B

View File

@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>

Before

Width:  |  Height:  |  Size: 385 B

View File

@@ -0,0 +1,25 @@
import { setRequestLocale } from "next-intl/server";
import AboutHeroSection from "@/components/AboutHeroSection";
import ParentCompanySection from "@/components/ParentCompanySection";
import TeamSection from "@/components/TeamSection";
import MilestonesSection from "@/components/MilestonesSection";
import RecruitSection from "@/components/RecruitSection";
export default async function AboutPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
return (
<main>
<AboutHeroSection />
<ParentCompanySection />
<TeamSection />
<MilestonesSection />
<RecruitSection />
</main>
);
}

View File

@@ -0,0 +1,57 @@
import type { Metadata } from "next";
import { NextIntlClientProvider, useMessages } from "next-intl";
import { getTranslations, setRequestLocale } from "next-intl/server";
import { notFound } from "next/navigation";
import { routing } from "@/i18n/routing";
import { Locale } from "@/i18n/config";
import "../globals.css";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Providers from "@/components/Providers";
type Props = {
children: React.ReactNode;
params: Promise<{ locale: string }>;
};
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}
export async function generateMetadata({
params,
}: {
params: Promise<{ locale: string }>;
}): Promise<Metadata> {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: "metadata" });
return {
title: t("title"),
description: t("description"),
icons: { icon: "/LOGO_header.png" },
};
}
export default async function LocaleLayout({ children, params }: Props) {
const { locale } = await params;
if (!routing.locales.includes(locale as Locale)) {
notFound();
}
setRequestLocale(locale);
return (
<html lang={locale}>
<body>
<NextIntlClientProvider locale={locale}>
<Providers>
<Header />
{children}
<Footer />
</Providers>
</NextIntlClientProvider>
</body>
</html>
);
}

23
src/app/[locale]/page.tsx Normal file
View File

@@ -0,0 +1,23 @@
import { setRequestLocale } from "next-intl/server";
import HeroSection from "@/components/HeroSection";
import FlywheelSection from "@/components/FlywheelSection";
import MarketSection from "@/components/MarketSection";
import CTASection from "@/components/CTASection";
export default async function Home({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
return (
<main>
<HeroSection />
<FlywheelSection />
<MarketSection />
<CTASection />
</main>
);
}

View File

@@ -0,0 +1,79 @@
import { setRequestLocale, getTranslations } from "next-intl/server";
import SolutionsHeroSection from "@/components/SolutionsHeroSection";
import ScenarioSection from "@/components/ScenarioSection";
import SolutionsCTASection from "@/components/SolutionsCTASection";
export default async function SolutionsPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
const tDeSpace = await getTranslations("deSpace");
const tRwa = await getTranslations("rwa");
const tQuant = await getTranslations("quant");
const deSpaceData = {
variant: "dark" as const,
label: tDeSpace("label"),
tag: tDeSpace("tag"),
titles: [tDeSpace("title1"), tDeSpace("title2")] as [string, string],
ai: {
desc: tDeSpace("aiDesc"),
benefit: tDeSpace("aiBenefit"),
metrics: [
{ label: tDeSpace("aiMetric1Label"), value: tDeSpace("aiMetric1Value") },
{ label: tDeSpace("aiMetric2Label"), value: tDeSpace("aiMetric2Value") },
],
},
web3: {
desc: tDeSpace("web3Desc"),
benefit: tDeSpace("web3Benefit"),
},
steps: [tDeSpace("step1"), tDeSpace("step2"), tDeSpace("step3"), tDeSpace("step4")],
};
const rwaData = {
variant: "light" as const,
label: tRwa("label"),
tag: tRwa("tag"),
titles: [tRwa("title1"), tRwa("title2")] as [string, string],
ai: {
desc: tRwa("aiDesc"),
benefit: tRwa("aiBenefit"),
},
web3: {
desc: tRwa("web3Desc"),
benefit: tRwa("web3Benefit"),
},
steps: [tRwa("step1"), tRwa("step2"), tRwa("step3"), tRwa("step4"), tRwa("step5")],
};
const quantData = {
variant: "dark" as const,
label: tQuant("label"),
tag: tQuant("tag"),
titles: [tQuant("title1"), tQuant("title2")] as [string, string],
ai: {
desc: tQuant("aiDesc"),
benefit: tQuant("aiBenefit"),
},
web3: {
desc: tQuant("web3Desc"),
benefit: tQuant("web3Benefit"),
},
steps: [tQuant("step1"), tQuant("step2"), tQuant("step3"), tQuant("step4")],
};
return (
<main>
<SolutionsHeroSection />
<ScenarioSection data={deSpaceData} />
<ScenarioSection data={rwaData} />
<ScenarioSection data={quantData} />
<SolutionsCTASection />
</main>
);
}

View File

@@ -0,0 +1,25 @@
import { setRequestLocale } from "next-intl/server";
import TechHeroSection from "@/components/TechHeroSection";
import ArchitectureSection from "@/components/ArchitectureSection";
import AICapabilitiesSection from "@/components/AICapabilitiesSection";
import Web3CapabilitiesSection from "@/components/Web3CapabilitiesSection";
import TechCTASection from "@/components/TechCTASection";
export default async function TechPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
return (
<main>
<TechHeroSection />
<ArchitectureSection />
<AICapabilitiesSection />
<Web3CapabilitiesSection />
<TechCTASection />
</main>
);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +0,0 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
</body>
</html>
);
}

View File

@@ -1,65 +0,0 @@
import Image from "next/image";
export default function Home() {
return (
<div className="flex min-h-screen items-center justify-center bg-zinc-50 font-sans dark:bg-black">
<main className="flex min-h-screen w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
<Image
className="dark:invert"
src="/next.svg"
alt="Next.js logo"
width={100}
height={20}
priority
/>
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
To get started, edit the page.tsx file.
</h1>
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
Looking for a starting point or more instructions? Head over to{" "}
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Templates
</a>{" "}
or the{" "}
<a
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Learning
</a>{" "}
center.
</p>
</div>
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
<a
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className="dark:invert"
src="/vercel.svg"
alt="Vercel logomark"
width={16}
height={16}
/>
Deploy Now
</a>
<a
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Documentation
</a>
</div>
</main>
</div>
);
}

View File

@@ -0,0 +1,83 @@
import { getTranslations } from "next-intl/server";
export default async function AICapabilitiesSection() {
const t = await getTranslations("aiCap");
const aiCards = [
{
num: t("card1Num"),
title: t("card1Title"),
desc: t("card1Desc"),
metrics: [
{ label: t("card1Metric1Label"), value: t("card1Metric1Value") },
{ label: t("card1Metric2Label"), value: t("card1Metric2Value") },
],
},
{
num: t("card2Num"),
title: t("card2Title"),
desc: t("card2Desc"),
metrics: [
{ label: t("card2Metric1Label"), value: t("card2Metric1Value") },
{ label: t("card2Metric2Label"), value: t("card2Metric2Value") },
],
},
{
num: t("card3Num"),
title: t("card3Title"),
desc: t("card3Desc"),
metrics: [
{ label: t("card3Metric1Label"), value: t("card3Metric1Value") },
{ label: t("card3Metric2Label"), value: t("card3Metric2Value") },
],
},
{
num: t("card4Num"),
title: t("card4Title"),
desc: t("card4Desc"),
metrics: [
{ label: t("card4Metric1Label"), value: t("card4Metric1Value") },
{ label: t("card4Metric2Label"), value: t("card4Metric2Value") },
],
},
];
return (
<section className="section section--light">
<div className="cap-header">
<div className="cap-header-left">
<div className="cap-divider">
<span className="cap-divider-line" />
<span className="cap-divider-label">{t("label")}</span>
</div>
<h2 className="cap-title">{t("title")}</h2>
<p className="cap-subtitle">{t("subtitle")}</p>
</div>
<div className="cap-header-right">
<span className="cap-big-number">{t("moduleCount")}</span>
<span className="cap-metric-label">{t("moduleLabel")}</span>
</div>
</div>
<div className="cap-grid">
{aiCards.map((card) => (
<div key={card.num} className="cap-card cap-card--light">
<div className="cap-card-header">
<span className="cap-card-num">{card.num}</span>
<h3 className="cap-card-title">{card.title}</h3>
</div>
<p className="cap-card-desc">{card.desc}</p>
<div className="cap-card-metrics">
{card.metrics.map((m) => (
<div key={m.label} className="cap-card-metric">
<span className="cap-card-metric-label">{m.label}</span>
<span className="cap-card-metric-value">{m.value}</span>
</div>
))}
</div>
</div>
))}
</div>
</section>
);
}

View File

@@ -0,0 +1,60 @@
import { getTranslations } from "next-intl/server";
export default async function AboutHeroSection() {
const t = await getTranslations("aboutHero");
const capabilities = [
{ icon: t("cap1Icon"), label: t("cap1Label") },
{ icon: t("cap2Icon"), label: t("cap2Label") },
{ icon: t("cap3Icon"), label: t("cap3Label") },
{ icon: t("cap4Icon"), label: t("cap4Label") },
];
const strategies = [
{ tag: t("strat1Tag"), title: t("strat1Title"), desc: t("strat1Desc") },
{ tag: t("strat2Tag"), title: t("strat2Title"), desc: t("strat2Desc") },
];
return (
<section className="about-hero-section">
<div className="about-hero-content">
<span className="about-hero-label">{t("label")}</span>
<h1 className="about-hero-title">{t("title")}</h1>
<p className="about-hero-subtitle">{t("subtitle")}</p>
<div className="about-hero-vision">
<span className="about-hero-vision-label">{t("visionLabel")}</span>
<span className="about-hero-vision-text">{t("visionText")}</span>
</div>
</div>
<div className="about-sub-block">
<div className="about-divider-label">
<span className="about-divider-label-text">{t("capLabel")}</span>
</div>
<div className="about-cap-grid">
{capabilities.map((cap) => (
<div key={cap.icon} className="about-cap-card">
<span className="about-cap-icon">{cap.icon}</span>
<span className="about-cap-text">{cap.label}</span>
</div>
))}
</div>
</div>
<div className="about-sub-block">
<div className="about-divider-label">
<span className="about-divider-label-text">{t("stratLabel")}</span>
</div>
<div className="about-strat-grid">
{strategies.map((s) => (
<div key={s.tag} className="about-strat-card">
<span className="about-strat-tag">{s.tag}</span>
<h3 className="about-strat-title">{s.title}</h3>
<span className="about-strat-desc">{s.desc}</span>
</div>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,50 @@
import { getTranslations } from "next-intl/server";
export default async function ArchitectureSection() {
const t = await getTranslations("architecture");
return (
<section className="section section--dark">
<div className="section-header">
<div className="decorated-tag">
<span className="decorated-tag-line decorated-tag-line--dark" />
<span className="decorated-tag-text">{t("tag")}</span>
<span className="decorated-tag-line decorated-tag-line--dark" />
</div>
<h2 className="heading-section">{t("title")}</h2>
</div>
<div className="arch-diagram">
<div className="arch-top">
<span className="arch-top-label">{t("topLabel")}</span>
<span className="arch-top-desc">{t("topDesc")}</span>
</div>
<div className="arch-connector">
<div className="arch-vert-line" />
<span className="arch-connector-icon"></span>
</div>
<div className="arch-engines">
<div className="arch-engine arch-engine--light">
<span className="arch-engine-label">{t("engine1Label")}</span>
<h3 className="arch-engine-title arch-engine-title--dark">{t("engine1Title")}</h3>
<span className="arch-engine-desc">{t("engine1Desc")}</span>
</div>
<div className="arch-middle">
<span className="arch-arrow"></span>
<span className="arch-middle-label">{t("middleLabel")}</span>
<span className="arch-arrow"></span>
</div>
<div className="arch-engine arch-engine--dark">
<span className="arch-engine-label arch-engine-label--dim">{t("engine2Label")}</span>
<h3 className="arch-engine-title">{t("engine2Title")}</h3>
<span className="arch-engine-desc arch-engine-desc--muted">{t("engine2Desc")}</span>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,22 @@
import { getTranslations } from "next-intl/server";
import { Link } from "@/i18n/navigation";
import { ArrowRight } from "lucide-react";
export default async function CTASection() {
const t = await getTranslations("cta");
return (
<section className="section section--light cta">
<h2 className="heading-cta heading-cta--light">{t("title")}</h2>
<div className="cta-buttons">
<Link href="/solutions" className="btn btn--dark">
<span>{t("services")}</span>
<ArrowRight size={16} />
</Link>
<Link href="/contact" className="btn btn--outline-dark">
{t("contact")}
</Link>
</div>
</section>
);
}

View File

@@ -0,0 +1,68 @@
import { getTranslations } from "next-intl/server";
export default async function FlywheelSection() {
const t = await getTranslations("flywheel");
const cards = [
{
tag: t("card1Tag"),
title: t("card1Title"),
subtitle: t("card1Subtitle"),
desc: t("card1Desc"),
features: [t("card1Feature1"), t("card1Feature2")],
},
{
tag: t("card2Tag"),
title: t("card2Title"),
subtitle: t("card2Subtitle"),
desc: t("card2Desc"),
features: [t("card2Feature1"), t("card2Feature2"), t("card2Feature3")],
},
{
tag: t("card3Tag"),
title: t("card3Title"),
subtitle: t("card3Subtitle"),
desc: t("card3Desc"),
features: [t("card3Feature1"), t("card3Feature2"), t("card3Feature3")],
},
];
const summarySteps = [t("summary1"), t("summary2"), t("summary3")];
return (
<section className="section section--dark">
<div className="section-header">
<span className="label-text">{t("label")}</span>
<h2 className="heading-section">{t("title")}</h2>
<p className="body-text">{t("subtitle")}</p>
</div>
<div className="flywheel-cards">
{cards.map((card) => (
<div key={card.title} className="flywheel-card">
<span className="label-text">{card.tag}</span>
<h3 className="flywheel-card-title">{card.title}</h3>
<span className="body-text">{card.subtitle}</span>
<p className="body-text body-text--muted">{card.desc}</p>
<ul className="flywheel-features">
{card.features.map((f) => (
<li key={f} className="body-text body-text--sm body-text--muted">
{f}
</li>
))}
</ul>
</div>
))}
</div>
<div className="flywheel-summary">
{summarySteps.map((step, i) => (
<span key={step} className="flywheel-summary-item">
{i > 0 && <span className="flywheel-arrow"></span>}
<span className="body-text body-text--muted">{step}</span>
</span>
))}
</div>
</section>
);
}

117
src/components/Footer.tsx Normal file
View File

@@ -0,0 +1,117 @@
import { Link } from "@/i18n/navigation";
import { getTranslations } from "next-intl/server";
function WeChatIcon({ size = 16 }: { size?: number }) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor">
<path d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05a6.329 6.329 0 0 1-.235-1.69c0-3.542 3.276-6.426 7.315-6.426.348 0 .688.029 1.023.074C16.088 4.68 12.727 2.189 8.691 2.189zM5.785 5.991a1.09 1.09 0 0 1 1.083 1.09 1.09 1.09 0 0 1-1.083 1.09A1.09 1.09 0 0 1 4.7 7.08a1.09 1.09 0 0 1 1.085-1.09zm5.88 0a1.09 1.09 0 0 1 1.083 1.09 1.09 1.09 0 0 1-1.083 1.09 1.09 1.09 0 0 1-1.085-1.09 1.09 1.09 0 0 1 1.085-1.09zm2.927 3.525c-3.508 0-6.36 2.51-6.36 5.596 0 3.088 2.852 5.596 6.36 5.596a7.5 7.5 0 0 0 2.36-.382.636.636 0 0 1 .527.074l1.402.822a.244.244 0 0 0 .122.04.214.214 0 0 0 .213-.217c0-.053-.02-.105-.035-.156l-.286-1.09a.432.432 0 0 1 .156-.488c1.352-.998 2.22-2.465 2.22-4.1 0-3.087-2.853-5.596-6.36-5.596h-.319zm-1.834 2.89a.905.905 0 0 1 .9.907.905.905 0 0 1-.9.906.905.905 0 0 1-.902-.906.905.905 0 0 1 .902-.906zm3.99 0a.905.905 0 0 1 .9.907.905.905 0 0 1-.9.906.905.905 0 0 1-.902-.906.905.905 0 0 1 .901-.906z" />
</svg>
);
}
function LinkedInIcon({ size = 16 }: { size?: number }) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
</svg>
);
}
function XIcon({ size = 16 }: { size?: number }) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor">
<path d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z" />
</svg>
);
}
function MailIcon({ size = 16 }: { size?: number }) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round">
<rect x="2" y="4" width="20" height="16" rx="2" />
<path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" />
</svg>
);
}
const socialIcons = [
{ icon: WeChatIcon, label: "WeChat" },
{ icon: LinkedInIcon, label: "LinkedIn" },
{ icon: XIcon, label: "X" },
{ icon: MailIcon, label: "Email" },
];
export default async function Footer() {
const t = await getTranslations("footer");
const th = await getTranslations("header");
const pageLinks = [
{ label: th("home"), href: "/" as const },
{ label: th("tech"), href: "/tech" as const },
{ label: th("solutions"), href: "/solutions" as const },
{ label: th("about"), href: "/about" as const },
];
const businessLinks = [
{ label: t("bizDeSpace"), href: "#" as const },
{ label: t("bizRWA"), href: "#" as const },
{ label: t("bizQuant"), href: "#" as const },
];
return (
<footer className="footer">
<div className="footer-main">
<div className="footer-brand">
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src="/logo.png"
alt="DESUN SINGULARITY"
width={160}
height={46}
className="footer-logo-img"
/>
<p className="footer-tagline">{t("tagline")}</p>
<div className="footer-contact">
<span className="footer-contact-label">{t("contactLabel")}</span>
<div className="footer-social">
{socialIcons.map((item) => (
<a
key={item.label}
href="#"
className="footer-social-icon"
aria-label={item.label}
>
<item.icon size={16} />
</a>
))}
</div>
</div>
</div>
<div className="footer-links">
<div className="footer-col">
<span className="footer-col-title">{t("pagesTitle")}</span>
{pageLinks.map((link) => (
<Link key={link.href} href={link.href} className="footer-link">
{link.label}
</Link>
))}
</div>
<div className="footer-col">
<span className="footer-col-title">{t("businessTitle")}</span>
{businessLinks.map((link) => (
<a key={link.label} href={link.href} className="footer-link">
{link.label}
</a>
))}
</div>
</div>
</div>
<div className="footer-divider" />
<div className="footer-bottom">
<span className="footer-copyright">{t("copyright")}</span>
</div>
</footer>
);
}

91
src/components/Header.tsx Normal file
View File

@@ -0,0 +1,91 @@
"use client";
import Image from "next/image";
import { Link, usePathname } from "@/i18n/navigation";
import { useTranslations } from "next-intl";
import { useState } from "react";
import { Menu, X } from "lucide-react";
import LanguageSwitcher from "./LanguageSwitcher";
export default function Header() {
const pathname = usePathname();
const t = useTranslations("header");
const [mobileOpen, setMobileOpen] = useState(false);
const navItems = [
{ label: t("home"), href: "/" as const },
{ label: t("tech"), href: "/tech" as const },
{ label: t("solutions"), href: "/solutions" as const },
{ label: t("about"), href: "/about" as const },
];
return (
<header className="header">
<Link href="/" className="logo">
<Image
src="/logo.png"
alt="DESUN SINGULARITY"
width={140}
height={40}
priority
/>
</Link>
<nav className="nav">
{navItems.map((item) => (
<Link
key={item.href}
href={item.href}
className={`nav-item ${pathname === item.href ? "nav-item-active" : ""}`}
>
{item.label}
</Link>
))}
</nav>
<div className="header-right">
<LanguageSwitcher />
<Link href="/contact" className="contact-btn">
{t("contact")}
</Link>
</div>
{/* Mobile hamburger */}
<button
className="mobile-menu-btn"
onClick={() => setMobileOpen(!mobileOpen)}
aria-label="Toggle menu"
>
{mobileOpen ? <X size={22} /> : <Menu size={22} />}
</button>
{/* Mobile overlay */}
{mobileOpen && (
<div className="mobile-overlay" onClick={() => setMobileOpen(false)}>
<nav className="mobile-nav" onClick={(e) => e.stopPropagation()}>
{navItems.map((item) => (
<Link
key={item.href}
href={item.href}
className={`mobile-nav-item ${pathname === item.href ? "mobile-nav-item--active" : ""}`}
onClick={() => setMobileOpen(false)}
>
{item.label}
</Link>
))}
<div className="mobile-nav-footer">
<LanguageSwitcher />
<Link
href="/contact"
className="contact-btn"
onClick={() => setMobileOpen(false)}
>
{t("contact")}
</Link>
</div>
</nav>
</div>
)}
</header>
);
}

View File

@@ -0,0 +1,31 @@
import { getTranslations } from "next-intl/server";
export default async function HeroSection() {
const t = await getTranslations("hero");
const metrics = [
{ label: t("metric1Label"), value: t("metric1Value"), desc: t("metric1Desc") },
{ label: t("metric2Label"), value: t("metric2Value"), desc: t("metric2Desc") },
{ label: t("metric3Label"), value: t("metric3Value"), desc: t("metric3Desc") },
{ label: t("metric4Label"), value: t("metric4Value"), desc: t("metric4Desc") },
];
return (
<section className="section section--light hero">
<div className="hero-content">
<span className="label-text">{t("label")}</span>
<h1 className="heading-display">{t("title")}</h1>
<p className="body-text body-text--lg">{t("subtitle")}</p>
</div>
<div className="metric-grid">
{metrics.map((m) => (
<div key={m.label} className="metric-card">
<span className="label-text">{m.label}</span>
<span className="metric-value">{m.value}</span>
<span className="body-text body-text--sm">{m.desc}</span>
</div>
))}
</div>
</section>
);
}

View File

@@ -0,0 +1,57 @@
"use client";
import { usePathname, useRouter } from "@/i18n/navigation";
import { useLocale } from "next-intl";
import { locales, localeNames, type Locale } from "@/i18n/config";
import {
Dropdown,
DropdownTrigger,
DropdownMenu,
DropdownItem,
Button,
} from "@heroui/react";
import type { Selection } from "@heroui/react";
import { ChevronDown } from "lucide-react";
export default function LanguageSwitcher() {
const locale = useLocale() as Locale;
const router = useRouter();
const pathname = usePathname();
function handleSelectionChange(keys: Selection) {
const next = Array.from(keys)[0] as Locale;
if (next && next !== locale) {
document.cookie = `NEXT_LOCALE=${next};path=/;max-age=31536000`;
router.replace(pathname, { locale: next });
}
}
return (
<Dropdown>
<DropdownTrigger>
<Button
variant="bordered"
size="sm"
className="lang-switcher-trigger"
endContent={<ChevronDown size={12} />}
>
{localeNames[locale]}
</Button>
</DropdownTrigger>
<DropdownMenu
aria-label="Language"
selectionMode="single"
selectedKeys={new Set([locale])}
disallowEmptySelection
onSelectionChange={handleSelectionChange}
className="lang-switcher-menu"
>
{locales.map((l) => (
<DropdownItem key={l} className="lang-switcher-item">
{localeNames[l]}
</DropdownItem>
))}
</DropdownMenu>
</Dropdown>
);
}

View File

@@ -0,0 +1,30 @@
import { getTranslations } from "next-intl/server";
export default async function MarketSection() {
const t = await getTranslations("market");
const marketData = [
{ label: t("metric1Label"), value: t("metric1Value"), desc: t("metric1Desc") },
{ label: t("metric2Label"), value: t("metric2Value"), desc: t("metric2Desc") },
{ label: t("metric3Label"), value: t("metric3Value"), desc: t("metric3Desc") },
];
return (
<section className="section section--light">
<div className="section-header">
<span className="label-text">{t("label")}</span>
<h2 className="heading-section heading-section--dark">{t("title")}</h2>
<p className="body-text">{t("subtitle")}</p>
</div>
<div className="metric-grid metric-grid--3">
{marketData.map((m) => (
<div key={m.label} className="metric-card metric-card--tall">
<span className="label-text">{m.label}</span>
<span className="metric-value">{m.value}</span>
<span className="body-text body-text--sm">{m.desc}</span>
</div>
))}
</div>
</section>
);
}

View File

@@ -0,0 +1,49 @@
import { getTranslations } from "next-intl/server";
export default async function MilestonesSection() {
const t = await getTranslations("milestones");
const milestones = [
{ date: t("ms1Date"), title: t("ms1Title"), desc: t("ms1Desc") },
{ date: t("ms2Date"), title: t("ms2Title"), desc: t("ms2Desc") },
{ date: t("ms3Date"), title: t("ms3Title"), desc: t("ms3Desc") },
{ date: t("ms4Date"), title: t("ms4Title"), desc: t("ms4Desc") },
];
return (
<section className="about-section about-section--dark">
<div className="about-sub-block">
<div className="about-divider-label about-divider-label--dark">
<div className="about-divider-label-row">
<span className="about-divider-label-text about-divider-label-text--muted">
{t("label")}
</span>
<span className="about-mono-tag">{t("tag")}</span>
</div>
</div>
<h2 className="about-section-title about-section-title--light">
{t("title")}
</h2>
</div>
<div className="timeline">
{milestones.map((ms) => (
<div key={ms.title} className="timeline-item">
<span className="timeline-date">{ms.date}</span>
<div className="timeline-content">
<span className="timeline-title">{ms.title}</span>
<span className="timeline-desc">{ms.desc}</span>
</div>
</div>
))}
<div className="timeline-item timeline-item--last">
<span className="timeline-date timeline-date--dim">{t("continueDate")}</span>
<div className="timeline-content">
<span className="timeline-title timeline-title--dim">{t("continueTitle")}</span>
<span className="timeline-desc timeline-desc--dim">{t("continueDesc")}</span>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,64 @@
import { getTranslations } from "next-intl/server";
export default async function ParentCompanySection() {
const t = await getTranslations("parentCompany");
const metrics = [
{ value: t("metric1Value"), label: t("metric1Label") },
{ value: t("metric2Value"), label: t("metric2Label") },
{ value: t("metric3Value"), label: t("metric3Label") },
{ value: t("metric4Value"), label: t("metric4Label") },
{ value: t("metric5Value"), label: t("metric5Label") },
];
const bizTypes = [
{ title: t("biz1Title"), stats: t("biz1Stats") },
{ title: t("biz2Title"), stats: t("biz2Stats") },
{ title: t("biz3Title"), stats: t("biz3Stats") },
{ title: t("biz4Title"), stats: t("biz4Stats") },
];
return (
<section className="about-section about-section--dark">
<div className="about-sub-block">
<div className="about-divider-label about-divider-label--dark">
<div className="about-divider-label-row">
<span className="about-divider-label-text about-divider-label-text--muted">
{t("bgLabel")}
</span>
<span className="about-mono-tag">{t("stockCode")}</span>
</div>
</div>
<h2 className="about-section-title about-section-title--light">
{t("title")}
</h2>
<p className="about-body-lg">{t("subtitle")}</p>
</div>
<div className="parent-metric-grid">
{metrics.map((m) => (
<div key={m.label} className="parent-metric-card">
<span className="parent-metric-value">{m.value}</span>
<span className="parent-metric-label">{m.label}</span>
</div>
))}
</div>
<div className="about-sub-block">
<div className="about-divider-label about-divider-label--dark">
<span className="about-divider-label-text about-divider-label-text--dim">
{t("bizLabel")}
</span>
</div>
<div className="parent-biz-grid">
{bizTypes.map((b) => (
<div key={b.title} className="parent-biz-card">
<span className="parent-biz-title">{b.title}</span>
<span className="parent-biz-stats">{b.stats}</span>
</div>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,7 @@
"use client";
import { HeroUIProvider } from "@heroui/react";
export default function Providers({ children }: { children: React.ReactNode }) {
return <HeroUIProvider>{children}</HeroUIProvider>;
}

View File

@@ -0,0 +1,46 @@
import { getTranslations } from "next-intl/server";
export default async function RecruitSection() {
const t = await getTranslations("recruit");
const positions = [t("pos1"), t("pos2"), t("pos3"), t("pos4")];
return (
<section className="about-section about-section--light">
<div className="about-sub-block">
<div className="about-divider-label">
<div className="about-divider-label-row">
<span className="about-divider-label-text">{t("label")}</span>
<span className="about-mono-tag about-mono-tag--muted">{t("tag")}</span>
</div>
</div>
<h2 className="recruit-title">{t("title")}</h2>
</div>
<div className="recruit-content">
<div className="recruit-left">
<span className="recruit-col-label">{t("positionsLabel")}</span>
<div className="recruit-positions">
{positions.map((pos, i) => (
<div
key={pos}
className={`recruit-pos${i < positions.length - 1 ? " recruit-pos--border" : ""}`}
>
<span className="recruit-pos-title">{pos}</span>
<span className="recruit-pos-arrow">&rarr;</span>
</div>
))}
</div>
</div>
<div className="recruit-right">
<span className="recruit-col-label">{t("newsLabel")}</span>
<div className="recruit-news-placeholder">
<span style={{ fontSize: 32 }}>📰</span>
<span className="recruit-news-text">{t("newsPlaceholder")}</span>
<span className="recruit-news-desc">{t("newsDesc")}</span>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,121 @@
import { getTranslations } from "next-intl/server";
interface ScenarioData {
variant: "dark" | "light";
label: string;
tag: string;
titles: [string, string];
ai: {
desc: string;
benefit: string;
metrics?: { label: string; value: string }[];
};
web3: {
desc: string;
benefit: string;
};
steps: string[];
}
export default async function ScenarioSection({ data }: { data: ScenarioData }) {
const t = await getTranslations("scenario");
const isDark = data.variant === "dark";
return (
<section className={`section ${isDark ? "section--dark" : "section--light"}`}>
{/* Header */}
<div className="scenario-header">
<div className={`scenario-divider-row ${isDark ? "scenario-divider-row--dark" : ""}`}>
<span className={`scenario-label ${isDark ? "scenario-label--muted" : ""}`}>
{data.label}
</span>
<span className="scenario-tag">{data.tag}</span>
</div>
<h2 className={`scenario-title ${isDark ? "scenario-title--light" : ""}`}>
{data.titles[0]}
</h2>
<h2 className={`scenario-title ${isDark ? "scenario-title--light" : ""}`}>
{data.titles[1]}
</h2>
</div>
{/* Content */}
<div className="scenario-content">
{/* Left: AI + Web3 blocks */}
<div className="scenario-left">
{/* AI Block */}
<div className={`scenario-block ${isDark ? "scenario-block--dark" : ""}`}>
<div className="scenario-block-header">
<div className={`scenario-icon ${isDark ? "scenario-icon--light" : "scenario-icon--dark"}`}>
<span className={`scenario-icon-text ${isDark ? "scenario-icon-text--dark" : "scenario-icon-text--light"}`}>
AI
</span>
</div>
<span className={`scenario-block-label ${isDark ? "scenario-block-label--light" : ""}`}>
{t("aiLabel")}
</span>
</div>
<p className="scenario-block-desc">{data.ai.desc}</p>
{data.ai.metrics && (
<div className="scenario-metrics">
{data.ai.metrics.map((m) => (
<div key={m.label} className="scenario-metric">
<span className={`scenario-metric-value ${isDark ? "scenario-metric-value--light" : ""}`}>
{m.value}
</span>
<span className="scenario-metric-label">{m.label}</span>
</div>
))}
</div>
)}
{!data.ai.metrics && (
<span className={`scenario-benefit ${isDark ? "scenario-benefit--light" : ""}`}>
{data.ai.benefit}
</span>
)}
</div>
{/* Web3 Block */}
<div className={`scenario-block ${isDark ? "scenario-block--dark" : ""}`}>
<div className="scenario-block-header">
<div className={`scenario-icon scenario-icon--outline ${isDark ? "scenario-icon--outline-light" : "scenario-icon--outline-dark"}`}>
<span className={`scenario-icon-text ${isDark ? "scenario-icon-text--light" : ""}`}>
W3
</span>
</div>
<span className={`scenario-block-label ${isDark ? "scenario-block-label--light" : ""}`}>
{t("web3Label")}
</span>
</div>
<p className="scenario-block-desc">{data.web3.desc}</p>
<span className={`scenario-benefit ${isDark ? "scenario-benefit--light" : ""}`}>
{data.web3.benefit}
</span>
</div>
</div>
{/* Right: Process steps */}
<div className="scenario-right">
<span className={`scenario-process-label ${isDark ? "scenario-process-label--dim" : ""}`}>
{t("processLabel")}
</span>
<div className="scenario-steps">
{data.steps.map((step, i) => (
<div
key={step}
className={`scenario-step ${i < data.steps.length - 1 ? (isDark ? "scenario-step--border-dark" : "scenario-step--border") : ""}`}
>
<span className={`scenario-step-num ${isDark ? "scenario-step-num--dim" : ""}`}>
{String(i + 1).padStart(2, "0")}
</span>
<span className={`scenario-step-text ${isDark ? "scenario-step-text--light" : ""}`}>
{step}
</span>
</div>
))}
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,18 @@
import { getTranslations } from "next-intl/server";
import { Link } from "@/i18n/navigation";
export default async function SolutionsCTASection() {
const t = await getTranslations("solCta");
return (
<section className="section section--light" style={{ gap: 32 }}>
<div className="sol-cta-divider" />
<h2 className="heading-section heading-section--dark">{t("title")}</h2>
<p className="body-text body-text--lg sol-cta-desc">{t("desc")}</p>
<Link href="/contact" className="btn btn--dark" style={{ gap: 8 }}>
<span>{t("contact")}</span>
<span></span>
</Link>
</section>
);
}

View File

@@ -0,0 +1,56 @@
import { getTranslations } from "next-intl/server";
export default async function SolutionsHeroSection() {
const t = await getTranslations("solHero");
const flowCards = [
{
num: t("flow1Num"),
title: t("flow1Title"),
sub: t("flow1Sub"),
ai: t("flow1AI"),
web3: t("flow1Web3"),
},
{
num: t("flow2Num"),
title: t("flow2Title"),
sub: t("flow2Sub"),
ai: t("flow2AI"),
web3: t("flow2Web3"),
},
{
num: t("flow3Num"),
title: t("flow3Title"),
sub: t("flow3Sub"),
ai: t("flow3AI"),
web3: t("flow3Web3"),
},
];
return (
<section className="section section--light">
<div className="section-header" style={{ gap: 24 }}>
<span className="label-text">{t("label")}</span>
<h1 className="sol-hero-title">{t("title")}</h1>
<h2 className="sol-hero-subtitle">{t("subtitle")}</h2>
<p className="body-text body-text--lg sol-hero-desc">{t("desc")}</p>
</div>
<div className="flow-diagram">
{flowCards.map((card, i) => (
<div key={card.num} className="flow-item">
{i > 0 && <span className="flow-arrow"></span>}
<div className="flow-card">
<span className="flow-card-num">{card.num}</span>
<h3 className="flow-card-title">{card.title}</h3>
<span className="flow-card-sub">{card.sub}</span>
<div className="flow-card-divider" />
<span className="flow-card-tag">{card.ai}</span>
<span className="flow-card-tag">{card.web3}</span>
</div>
</div>
))}
</div>
</section>
);
}

View File

@@ -0,0 +1,55 @@
import { getTranslations } from "next-intl/server";
function MemberCard({ role, name, bio }: { role: string; name: string; bio: string }) {
return (
<div className="team-card">
<span className="team-card-role">{role}</span>
<h3 className="team-card-name">{name}</h3>
<p className="team-card-bio">{bio}</p>
</div>
);
}
export default async function TeamSection() {
const t = await getTranslations("team");
const teamRow1 = [
{ role: t("ceo"), name: t("ceoName"), bio: t("ceoBio") },
{ role: t("coo"), name: t("cooName"), bio: t("cooBio") },
{ role: t("cmo"), name: t("cmoName"), bio: t("cmoBio") },
{ role: t("cto"), name: t("ctoName"), bio: t("ctoBio") },
];
const teamRow2 = [
{ role: t("cio"), name: t("cioName"), bio: t("cioBio") },
{ role: t("strategist"), name: t("strategistName"), bio: t("strategistBio") },
{ role: t("analyst"), name: t("analystName"), bio: t("analystBio") },
];
return (
<section className="about-section about-section--light">
<div className="about-sub-block">
<div className="about-divider-label">
<div className="about-divider-label-row">
<span className="about-divider-label-text">{t("label")}</span>
<span className="about-count-tag">{t("count")}</span>
</div>
</div>
<h2 className="team-title">{t("title")}</h2>
</div>
<div className="team-grid">
<div className="team-row team-row--4">
{teamRow1.map((m) => (
<MemberCard key={m.name} {...m} />
))}
</div>
<div className="team-row team-row--3">
{teamRow2.map((m) => (
<MemberCard key={m.name} {...m} />
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,20 @@
import { getTranslations } from "next-intl/server";
import { Link } from "@/i18n/navigation";
export default async function TechCTASection() {
const t = await getTranslations("techCta");
return (
<section className="section section--light cta">
<h2 className="heading-section heading-section--dark">{t("title")}</h2>
<div className="cta-buttons">
<Link href="/solutions" className="btn btn--dark">
{t("solutions")}
</Link>
<Link href="/contact" className="btn btn--outline-dark">
{t("contact")}
</Link>
</div>
</section>
);
}

View File

@@ -0,0 +1,18 @@
import { getTranslations } from "next-intl/server";
export default async function TechHeroSection() {
const t = await getTranslations("techHero");
return (
<section className="section section--light tech-hero">
<div className="decorated-tag">
<span className="decorated-tag-line" />
<span className="decorated-tag-text">{t("tag")}</span>
<span className="decorated-tag-line" />
</div>
<h1 className="heading-display">{t("title1")}</h1>
<h1 className="heading-display">{t("title2")}</h1>
<p className="body-text body-text--lg tech-hero-subtitle">{t("subtitle")}</p>
</section>
);
}

View File

@@ -0,0 +1,44 @@
import { getTranslations } from "next-intl/server";
export default async function Web3CapabilitiesSection() {
const t = await getTranslations("web3Cap");
const web3Cards = [
{ num: t("card1Num"), title: t("card1Title"), desc: t("card1Desc"), value: t("card1Value") },
{ num: t("card2Num"), title: t("card2Title"), desc: t("card2Desc"), value: t("card2Value") },
{ num: t("card3Num"), title: t("card3Title"), desc: t("card3Desc"), value: t("card3Value") },
{ num: t("card4Num"), title: t("card4Title"), desc: t("card4Desc"), value: t("card4Value") },
];
return (
<section className="section section--dark">
<div className="cap-header">
<div className="cap-header-left">
<div className="cap-divider cap-divider--dark">
<span className="cap-divider-line cap-divider-line--dark" />
<span className="cap-divider-label">{t("label")}</span>
</div>
<h2 className="cap-title cap-title--light">{t("title")}</h2>
<p className="cap-subtitle cap-subtitle--muted">{t("subtitle")}</p>
</div>
<div className="cap-header-right">
<span className="cap-big-number cap-big-number--light">{t("moduleCount")}</span>
<span className="cap-metric-label">{t("moduleLabel")}</span>
</div>
</div>
<div className="cap-grid cap-grid--dark">
{web3Cards.map((card) => (
<div key={card.num} className="cap-card cap-card--dark">
<div className="cap-card-header">
<span className="cap-card-num cap-card-num--dim">{card.num}</span>
<h3 className="cap-card-title cap-card-title--light">{card.title}</h3>
</div>
<p className="cap-card-desc cap-card-desc--muted">{card.desc}</p>
<span className="cap-card-value">{card.value}</span>
</div>
))}
</div>
</section>
);
}

9
src/i18n/config.ts Normal file
View File

@@ -0,0 +1,9 @@
export const locales = ["zh", "zh-Hant", "en"] as const;
export type Locale = (typeof locales)[number];
export const defaultLocale: Locale = "zh";
export const localeNames: Record<Locale, string> = {
zh: "简",
"zh-Hant": "繁",
en: "EN",
};

5
src/i18n/navigation.ts Normal file
View File

@@ -0,0 +1,5 @@
import { createNavigation } from "next-intl/navigation";
import { routing } from "./routing";
export const { Link, redirect, usePathname, useRouter } =
createNavigation(routing);

16
src/i18n/request.ts Normal file
View File

@@ -0,0 +1,16 @@
import { getRequestConfig } from "next-intl/server";
import { routing } from "./routing";
import { Locale } from "./config";
export default getRequestConfig(async ({ requestLocale }) => {
let locale = await requestLocale;
if (!locale || !routing.locales.includes(locale as Locale)) {
locale = routing.defaultLocale;
}
return {
locale,
messages: (await import(`../messages/${locale}.json`)).default,
};
});

8
src/i18n/routing.ts Normal file
View File

@@ -0,0 +1,8 @@
import { defineRouting } from "next-intl/routing";
import { locales, defaultLocale } from "./config";
export const routing = defineRouting({
locales,
defaultLocale,
localePrefix: "as-needed",
});

356
src/messages/en.json Normal file
View File

@@ -0,0 +1,356 @@
{
"metadata": {
"title": "DESUN SINGULARITY",
"description": "AI + Web3 Powered Full-Chain Asset Technology Platform"
},
"header": {
"home": "Home",
"tech": "Technology",
"solutions": "Solutions",
"about": "About",
"contact": "Contact Us"
},
"hero": {
"label": "Create · Discover · Amplify",
"title": "Reshaping Global Asset Value Networks",
"subtitle": "AI + Web3 Powered Full-Chain Asset Technology Platform",
"metric1Label": "AUM",
"metric1Value": "200B+ CNY",
"metric1Desc": "Group assets under management",
"metric2Label": "Operating Area",
"metric2Value": "14M+ m²",
"metric2Desc": "Covering residential, commercial & industrial parks",
"metric3Label": "Strategy APY",
"metric3Value": "18%+",
"metric3Desc": "Market-neutral strategy performance",
"metric4Label": "Licenses",
"metric4Value": "Type 1/2/4/5/9",
"metric4Desc": "Hong Kong SFC licenses"
},
"flywheel": {
"label": "Value Loop",
"title": "Three Business Flywheels",
"subtitle": "Powered by AI + Web3 as core capabilities, driving three value scenarios",
"card1Tag": "Value Creation",
"card1Title": "DeSpace",
"card1Subtitle": "Smart Space Management",
"card1Desc": "AI + Web3 empowering physical spaces to create quantifiable, tradable digital value",
"card1Feature1": "AI-driven operational decisions",
"card1Feature2": "Web3 incentive systems",
"card2Tag": "Value Discovery",
"card2Title": "RWA Services",
"card2Subtitle": "Real-World Asset Tokenization",
"card2Desc": "AI identifies quality assets, connecting global capital for cross-border asset value circulation",
"card2Feature1": "AI-powered asset valuation",
"card2Feature2": "Compliant token issuance",
"card2Feature3": "Global capital access",
"card3Tag": "Value Amplification",
"card3Title": "Quant Management",
"card3Subtitle": "AI-Assisted Decisions",
"card3Desc": "AI-powered quantitative strategies, deep in crypto markets, continuously amplifying asset returns",
"card3Feature1": "Market-neutral strategies",
"card3Feature2": "AI risk management",
"card3Feature3": "Multi-market arbitrage",
"summary1": "Create value in physical spaces",
"summary2": "Discover quality assets and connect global capital",
"summary3": "Amplify returns with quantitative strategies"
},
"market": {
"label": "Market Opportunity",
"title": "A Historic Window for Value Restructuring",
"subtitle": "Trillion-level physical assets × Trillion-level digital capital",
"metric1Label": "Physical Asset Stock",
"metric1Value": "500T+ CNY",
"metric1Desc": "China real estate market",
"metric2Label": "RWA Market Size",
"metric2Value": "$16 Trillion",
"metric2Desc": "2030 forecast (BCG)",
"metric3Label": "Crypto Market Cap",
"metric3Value": "$3 Trillion",
"metric3Desc": "Annual growth rate 30%+"
},
"cta": {
"title": "Start Your Asset Digitization Journey",
"services": "Explore Our Services",
"contact": "Contact Us"
},
"aboutHero": {
"label": "ABOUT US",
"title": "DESUN Singularity Technology",
"subtitle": "Technology-Driven Alternative Asset Management Platform",
"visionLabel": "Vision:",
"visionText": "Become the \"Blackstone\" of the Crypto Industry",
"capLabel": "Core Competencies",
"cap1Icon": "AI",
"cap1Label": "Artificial Intelligence",
"cap2Icon": "Web3",
"cap2Label": "Blockchain Technology",
"cap3Icon": "Finance",
"cap3Label": "Asset Management",
"cap4Icon": "Real Estate",
"cap4Label": "Physical Operations",
"stratLabel": "Strategic Logic",
"strat1Tag": "WEB2 Operational Capability",
"strat1Title": "Deep in China Alternative Assets",
"strat1Desc": "Creating Value",
"strat2Tag": "WEB3 Capital Connection",
"strat2Title": "Connecting Global Digital Capital",
"strat2Desc": "Realizing Value"
},
"parentCompany": {
"bgLabel": "Parent Company",
"stockCode": "HK.02270",
"title": "Deshang REIT",
"subtitle": "100% Owned · HKEX Listed Company",
"metric1Value": "200B+ CNY",
"metric1Label": "Assets Under Management",
"metric2Value": "3,000+",
"metric2Label": "Team Size",
"metric3Value": "14M+ m²",
"metric3Label": "Operating Area",
"metric4Value": "60,000+",
"metric4Label": "Families Served",
"metric5Value": "4,000+",
"metric5Label": "Enterprises Served",
"bizLabel": "Business Types",
"biz1Title": "Commercial Complexes",
"biz1Stats": "3 sites · ~1.2M m²",
"biz2Title": "Digital Economy Parks",
"biz2Stats": "30 sites · ~0.9M m²",
"biz3Title": "Commercial Districts",
"biz3Stats": "15 sites · ~0.68M m²",
"biz4Title": "Residential Properties",
"biz4Stats": "103 sites · ~11.31M m²"
},
"team": {
"label": "Core Team",
"count": "7 Core Members",
"title": "Full Web3 Industry Experience + Traditional Finance Background + Product & Tech Capabilities",
"ceo": "CEO",
"ceoName": "Finkel Chang",
"ceoBio": "10 years Web3 full-chain experience (mining/CEX/L1), founder of Web3.Pro",
"coo": "COO",
"cooName": "Lily Duan",
"cooBio": "6 years Web3 experience, former VP of Canadian listed company, Chief Business Officer at global TOP5 exchange",
"cmo": "CMO",
"cmoName": "Joy Zhou",
"cmoBio": "8 years Web3 experience, co-founded Hong Kong's largest Web3 media in 2023",
"cto": "CTO",
"ctoName": "Mark Deng",
"ctoBio": "8 years Web3 experience, former Chief Product Officer at top global exchange, products serving 2M+ users",
"cio": "CIO",
"cioName": "Herman Lin",
"cioBio": "Macquarie University Applied Finance, 10 years financial investment experience, founder of Jundao Quant Fund",
"strategist": "Chief Strategist",
"strategistName": "Gibson Zhu",
"strategistBio": "NTU Singapore, 10 years quantitative trading experience, dual expertise in traditional finance and crypto",
"analyst": "Chief Analyst",
"analystName": "Vicky Gu",
"analystBio": "Macquarie University Applied Finance, CFA, 13 years market technical analysis experience"
},
"milestones": {
"label": "Milestones",
"tag": "MILESTONES",
"title": "Our Journey",
"ms1Date": "2025 Q2",
"ms1Title": "DESUN Singularity Founded",
"ms1Desc": "Quantitative business launched",
"ms2Date": "2025 Q4",
"ms2Title": "Strategic Investment in Gaoying Securities",
"ms2Desc": "Securing license pathway",
"ms3Date": "2026 Q1",
"ms3Title": "DeSpace Pilot Community Launch",
"ms3Desc": "First AI + Web3 space operations project deployed",
"ms4Date": "2026 Q1",
"ms4Title": "RWA Services Officially Launched",
"ms4Desc": "Asset tokenization issuance service goes live",
"continueDate": "Ongoing...",
"continueTitle": "More Milestones",
"continueDesc": "Stay Tuned"
},
"recruit": {
"label": "Join Us",
"tag": "CAREERS",
"title": "We're Looking for Talented People",
"positionsLabel": "Open Positions",
"pos1": "Quantitative Strategy Researcher",
"pos2": "Web3 Developer",
"pos3": "Product Manager",
"pos4": "Business Development",
"newsLabel": "News",
"newsPlaceholder": "News Module",
"newsDesc": "Company news, industry events, media coverage"
},
"solHero": {
"label": "SOLUTIONS",
"title": "AI + Web3 Dual Engine",
"subtitle": "Three Value Scenarios",
"desc": "From value creation to value discovery and value amplification, we build a complete asset value chain loop",
"flow1Num": "01",
"flow1Title": "Value Creation",
"flow1Sub": "DeSpace Smart Spaces",
"flow1AI": "AI: Efficiency Boost",
"flow1Web3": "Web3: Trust Ledger",
"flow2Num": "02",
"flow2Title": "Value Discovery",
"flow2Sub": "RWA Issuance",
"flow2AI": "AI: Asset Screening",
"flow2Web3": "Web3: Global Circulation",
"flow3Num": "03",
"flow3Title": "Value Amplification",
"flow3Sub": "Quant Management",
"flow3AI": "AI: Analytics & Decisions",
"flow3Web3": "Web3: Crypto Markets"
},
"scenario": {
"aiLabel": "AI Empowerment",
"web3Label": "Web3 Empowerment",
"processLabel": "Core Process"
},
"deSpace": {
"label": "01 — DESPACE Smart Spaces",
"tag": "Value Creation",
"title1": "Transform Existing Spaces into",
"title2": "Premium Assets with AI + Web3",
"aiDesc": "Smart customer service, inspection robots, intelligent scheduling",
"aiBenefit": "",
"aiMetric1Label": "Efficiency Boost",
"aiMetric1Value": "+40%",
"aiMetric2Label": "Cost Reduction",
"aiMetric2Value": "-33%",
"web3Desc": "Trust ledger on-chain, smart contracts for automatic profit sharing",
"web3Benefit": "Eliminating trust gaps",
"step1": "Resource Integration",
"step2": "AI Cost Reduction",
"step3": "Diversified Monetization",
"step4": "On-chain Profit Sharing"
},
"rwa": {
"label": "02 — RWA Issuance Services",
"tag": "Value Discovery",
"title1": "Identify Quality Assets, Complete Compliant Issuance",
"title2": "Connect Global Capital",
"aiDesc": "Asset screening, valuation, risk identification",
"aiBenefit": "Precisely discover quality targets",
"web3Desc": "Tokenized issuance, on-chain rights confirmation, global circulation",
"web3Benefit": "Connect global capital",
"step1": "Identify",
"step2": "Optimize",
"step3": "Digitize",
"step4": "Issue",
"step5": "Circulate"
},
"quant": {
"label": "03 — Quant Management",
"tag": "Value Amplification",
"title1": "Deep in Crypto Markets",
"title2": "Amplifying Capital Efficiency",
"aiDesc": "Market analysis, strategy formulation, risk alerts",
"aiBenefit": "Decision support, millisecond execution",
"web3Desc": "Native crypto market operations",
"web3Benefit": "Navigating high volatility, capturing arbitrage",
"step1": "Data Collection",
"step2": "AI Analysis",
"step3": "Strategy Execution",
"step4": "Risk Monitoring"
},
"solCta": {
"title": "Explore Our Scenario Solutions",
"desc": "Whether it's space operations, asset issuance, or quantitative investment, we provide professional AI + Web3 solutions for you",
"contact": "Contact Us"
},
"techHero": {
"tag": "TECHNOLOGY",
"title1": "With AI and Web3",
"title2": "Profoundly Changing the World",
"subtitle": "We believe technology should serve people, not the other way around. By enhancing efficiency with AI and rebuilding trust with Web3, we are building the next generation of asset management infrastructure."
},
"architecture": {
"tag": "Dual Engine Architecture",
"title": "Dual Engine Architecture",
"topLabel": "Business Scenario Implementation",
"topDesc": "DeSpace · RWA · Quant Management",
"engine1Label": "ENGINE 01",
"engine1Title": "AI Engine",
"engine1Desc": "Efficiency Leap",
"middleLabel": "Dual Drive",
"engine2Label": "ENGINE 02",
"engine2Title": "Web3 Engine",
"engine2Desc": "Trust Restructuring"
},
"aiCap": {
"label": "AI Capabilities",
"title": "Intelligent Technology, Efficiency Leap",
"subtitle": "Through large language models, intelligent robots, smart scheduling, and quantitative models, we deeply integrate AI capabilities into every business scenario, achieving exponential efficiency gains.",
"moduleCount": "4",
"moduleLabel": "Core AI Capability Modules",
"card1Num": "01",
"card1Title": "Large Language Models",
"card1Desc": "Natural language understanding and generation for smart customer service, document processing, and intent recognition",
"card1Metric1Label": "Intent Recognition",
"card1Metric1Value": "95%+",
"card1Metric2Label": "Response Time",
"card1Metric2Value": "<500ms",
"card2Num": "02",
"card2Title": "Intelligent Robots",
"card2Desc": "Autonomous inspection, environmental monitoring, anomaly alerts, 24/7 asset security",
"card2Metric1Label": "Inspection Coverage",
"card2Metric1Value": "98%",
"card2Metric2Label": "Anomaly Detection",
"card2Metric2Value": "92%",
"card3Num": "03",
"card3Title": "Smart Scheduling",
"card3Desc": "Resource optimization, intelligent task allocation, maximizing operational efficiency while minimizing costs",
"card3Metric1Label": "Efficiency Boost",
"card3Metric1Value": "40%",
"card3Metric2Label": "Cost Reduction",
"card3Metric2Value": "33%",
"card4Num": "04",
"card4Title": "Quantitative Models",
"card4Desc": "Multi-factor analysis, trend prediction, risk assessment, providing data support for investment decisions",
"card4Metric1Label": "Prediction Rate",
"card4Metric1Value": "78%",
"card4Metric2Label": "Data Processing",
"card4Metric2Value": "100K/sec"
},
"web3Cap": {
"label": "Web3 Capabilities",
"title": "Decentralized, Trust Restructured",
"subtitle": "Through blockchain technology, we establish transparent, traceable, and immutable trust infrastructure, making value flow more efficient and secure.",
"moduleCount": "4",
"moduleLabel": "Core Web3 Capability Modules",
"card1Num": "01",
"card1Title": "Transparent Ledger",
"card1Desc": "Real-time on-chain fund flow and business flow, eliminating trust gaps",
"card1Value": "Real-time Traceable",
"card2Num": "02",
"card2Title": "Smart Contracts",
"card2Desc": "Automatic settlement, rigid execution, no manual intervention",
"card2Value": "Auto Execution",
"card3Num": "03",
"card3Title": "Asset Issuance",
"card3Desc": "RWA tokenization, connecting global capital",
"card3Value": "Global Circulation",
"card4Num": "04",
"card4Title": "Compliance Channel",
"card4Desc": "Hong Kong SFC framework, full license coverage",
"card4Value": "Type 1/2/4/5/9 Licenses"
},
"techCta": {
"title": "Explore How Our Technology Empowers Your Business",
"solutions": "View Business Scenarios",
"contact": "Contact Us"
},
"footer": {
"tagline": "AI + Web3 Powered Full-Chain Asset Technology Platform",
"contactLabel": "Contact Us",
"pagesTitle": "Pages",
"businessTitle": "Business",
"bizDeSpace": "DeSpace Smart Spaces",
"bizRWA": "RWA Issuance Services",
"bizQuant": "Quant Management",
"copyright": "© 2026 DESUN Singularity Technology (HK) Limited. All rights reserved.",
"privacy": "Privacy Policy",
"terms": "Terms of Service"
}
}

356
src/messages/zh-Hant.json Normal file
View File

@@ -0,0 +1,356 @@
{
"metadata": {
"title": "DESUN SINGULARITY",
"description": "AI + Web3 驅動的全鏈路資產科技平台"
},
"header": {
"home": "首頁",
"tech": "技術",
"solutions": "場景",
"about": "關於我們",
"contact": "聯繫我們"
},
"hero": {
"label": "Create · Discover · Amplify",
"title": "重構全球資產價值網絡",
"subtitle": "AI + Web3 驅動的全鏈路資產科技平台",
"metric1Label": "管理資產",
"metric1Value": "2000億+",
"metric1Desc": "集團在管資產規模",
"metric2Label": "運營面積",
"metric2Value": "1400萬+ m²",
"metric2Desc": "覆蓋住宅、商業、產業園",
"metric3Label": "策略年化",
"metric3Value": "18%+",
"metric3Desc": "市場中性策略表現",
"metric4Label": "合規牌照",
"metric4Value": "1/2/4/5/9 類",
"metric4Desc": "香港證監會牌照"
},
"flywheel": {
"label": "價值閉環",
"title": "三大業務飛輪",
"subtitle": "以 AI + Web3 為核心能力基座,驅動三大價值場景",
"card1Tag": "價值創造",
"card1Title": "DeSpace",
"card1Subtitle": "德數空間",
"card1Desc": "AI+Web3 賦能實體空間,創造可量化、可交易的數字價值",
"card1Feature1": "AI 驅動運營決策",
"card1Feature2": "Web3 激勵體系",
"card2Tag": "價值發現",
"card2Title": "RWA 服務",
"card2Subtitle": "實物資產代幣化",
"card2Desc": "AI 識別優質資產,連接全球資本,實現資產價值跨境流通",
"card2Feature1": "資產智能估值",
"card2Feature2": "合規代幣發行",
"card2Feature3": "全球資本對接",
"card3Tag": "價值放大",
"card3Title": "量化資管",
"card3Subtitle": "AI 輔助決策",
"card3Desc": "AI 輔助量化策略,深耕加密市場,持續放大資產收益",
"card3Feature1": "市場中性策略",
"card3Feature2": "AI 風控系統",
"card3Feature3": "多市場套利",
"summary1": "在實體空間創造價值",
"summary2": "發現優質資產連接全球資本",
"summary3": "以量化策略放大收益"
},
"market": {
"label": "市場機會",
"title": "歷史性的價值重構窗口",
"subtitle": "萬億級實體資產 × 萬億級數字資本",
"metric1Label": "實體資產存量",
"metric1Value": "500 萬億+",
"metric1Desc": "中國房地產市場",
"metric2Label": "RWA 市場規模",
"metric2Value": "16 萬億美元",
"metric2Desc": "2030 年預測BCG",
"metric3Label": "加密市場總市值",
"metric3Value": "3 萬億美元",
"metric3Desc": "年增長率 30%+"
},
"cta": {
"title": "開啟您的資產數字化之旅",
"services": "了解我們的服務",
"contact": "聯繫我們"
},
"aboutHero": {
"label": "ABOUT US",
"title": "香港德商奇點科技",
"subtitle": "科技驅動的另類資產管理平台",
"visionLabel": "願景:",
"visionText": "成為加密行業的\"黑石\"Blackstone",
"capLabel": "核心能力組合",
"cap1Icon": "AI",
"cap1Label": "人工智能",
"cap2Icon": "Web3",
"cap2Label": "區塊鏈技術",
"cap3Icon": "金融",
"cap3Label": "資產管理",
"cap4Icon": "地產",
"cap4Label": "實體運營",
"stratLabel": "戰略邏輯",
"strat1Tag": "WEB2 運營能力",
"strat1Title": "深耕中國另類資產",
"strat1Desc": "創造價值",
"strat2Tag": "WEB3 資本連接",
"strat2Title": "對接全球數字資本",
"strat2Desc": "實現價值"
},
"parentCompany": {
"bgLabel": "母公司背景",
"stockCode": "HK.02270",
"title": "德商產投",
"subtitle": "100% 控股 · 港股上市公司",
"metric1Value": "2000億+",
"metric1Label": "管理資產規模",
"metric2Value": "3000+",
"metric2Label": "團隊規模",
"metric3Value": "1400萬+ m²",
"metric3Label": "運營面積",
"metric4Value": "60,000+",
"metric4Label": "服務家庭",
"metric5Value": "4,000+",
"metric5Label": "服務企業",
"bizLabel": "運營業態",
"biz1Title": "產商綜合體",
"biz1Stats": "3 個 · 約 120 萬 m²",
"biz2Title": "數字經濟產業園",
"biz2Stats": "30 個 · 約 90 萬 m²",
"biz3Title": "商業街區",
"biz3Stats": "15 個 · 約 68 萬 m²",
"biz4Title": "住宅物業",
"biz4Stats": "103 個 · 約 1131 萬 m²"
},
"team": {
"label": "核心團隊",
"count": "7 位核心成員",
"title": "Web3 全產業鏈經驗 + 傳統金融背景 + 產品技術能力",
"ceo": "CEO",
"ceoName": "Finkel Chang",
"ceoBio": "10年 Web3 全產業鏈經驗(礦業/CEX/公鏈Web3.Pro 創始人",
"coo": "COO",
"cooName": "Lily Duan",
"cooBio": "6年 Web3 經驗,曾任加拿大上市公司副總裁,全球 TOP5 交易所首席商務官",
"cmo": "CMO",
"cmoName": "Joy Zhou",
"cmoBio": "8年 Web3 從業經歷23年聯合創立香港最大 Web3 媒體",
"cto": "CTO",
"ctoName": "Mark Deng",
"ctoBio": "8年 Web3 經驗,曾任全球頭部交易所首席產品官,產品累計服務 200 萬用戶",
"cio": "CIO",
"cioName": "Herman Lin",
"cioBio": "麥考瑞大學應用金融10年金融投資經驗君道量化基金創始人",
"strategist": "首席策略師",
"strategistName": "Gibson Zhu",
"strategistBio": "新加坡南洋理工10年量化交易經驗傳統金融與加密雙棲",
"analyst": "首席分析師",
"analystName": "Vicky Gu",
"analystBio": "麥考瑞大學應用金融、CFA13年市場技術面研究經驗"
},
"milestones": {
"label": "里程碑",
"tag": "MILESTONES",
"title": "發展歷程",
"ms1Date": "2025 Q2",
"ms1Title": "德商奇點科技成立",
"ms1Desc": "量化業務啟動",
"ms2Date": "2025 Q4",
"ms2Title": "戰略入股高盈證券",
"ms2Desc": "獲取牌照通路",
"ms3Date": "2026 Q1",
"ms3Title": "DeSpace 樣板小區落地",
"ms3Desc": "AI + Web3 空間運營首個落地項目",
"ms4Date": "2026 Q1",
"ms4Title": "RWA 服務正式推出",
"ms4Desc": "資產代幣化發行服務上線",
"continueDate": "持續更新...",
"continueTitle": "更多里程碑",
"continueDesc": "敬請期待"
},
"recruit": {
"label": "加入我們",
"tag": "CAREERS",
"title": "我們在尋找優秀的你",
"positionsLabel": "開放職位",
"pos1": "量化策略研究員",
"pos2": "Web3 開發工程師",
"pos3": "產品經理",
"pos4": "商務拓展",
"newsLabel": "新聞動態",
"newsPlaceholder": "新聞動態模組",
"newsDesc": "公司新聞、行業活動、媒體報導"
},
"solHero": {
"label": "SOLUTIONS",
"title": "AI + Web3 雙引擎驅動",
"subtitle": "三大價值場景",
"desc": "從價值創造到價值發現,再到價值放大,我們構建完整的資產價值鏈閉環",
"flow1Num": "01",
"flow1Title": "價值創造",
"flow1Sub": "DeSpace 德數空間",
"flow1AI": "AI: 效率提升",
"flow1Web3": "Web3: 互信賬本",
"flow2Num": "02",
"flow2Title": "價值發現",
"flow2Sub": "RWA 發行服務",
"flow2AI": "AI: 資產篩選",
"flow2Web3": "Web3: 全球流通",
"flow3Num": "03",
"flow3Title": "價值放大",
"flow3Sub": "量化資管",
"flow3AI": "AI: 分析決策",
"flow3Web3": "Web3: 加密市場"
},
"scenario": {
"aiLabel": "AI 賦能",
"web3Label": "Web3 賦能",
"processLabel": "核心流程"
},
"deSpace": {
"label": "01 — DESPACE 德數空間",
"tag": "價值創造",
"title1": "以 AI + Web3 將存量空間",
"title2": "轉化為優質資產",
"aiDesc": "智能客服、巡檢機器人、智能調度",
"aiBenefit": "",
"aiMetric1Label": "效率提升",
"aiMetric1Value": "+40%",
"aiMetric2Label": "成本降低",
"aiMetric2Value": "-33%",
"web3Desc": "互信賬本上鏈,智能合約自動分潤",
"web3Benefit": "消除信任黑洞",
"step1": "資源整合",
"step2": "AI 降本",
"step3": "多元變現",
"step4": "鏈上分潤"
},
"rwa": {
"label": "02 — RWA 發行服務",
"tag": "價值發現",
"title1": "識別優質資產,完成合規發行",
"title2": "連接全球資本",
"aiDesc": "資產篩選、價值評估、風險識別",
"aiBenefit": "精準發現優質標的",
"web3Desc": "代幣化發行、鏈上確權、全球流通",
"web3Benefit": "連接全球資本",
"step1": "識別",
"step2": "優化",
"step3": "數字化",
"step4": "發行",
"step5": "流通"
},
"quant": {
"label": "03 — 量化資管",
"tag": "價值放大",
"title1": "深耕加密市場",
"title2": "放大資本效率",
"aiDesc": "市場分析、策略制定、風險預警",
"aiBenefit": "輔助決策,毫秒級執行",
"web3Desc": "原生加密市場操作",
"web3Benefit": "應對高波動,捕捉套利機會",
"step1": "數據採集",
"step2": "AI 分析",
"step3": "策略執行",
"step4": "風控監控"
},
"solCta": {
"title": "探索我們的場景解決方案",
"desc": "無論是空間運營、資產發行還是量化投資,我們都能為您提供專業的 AI + Web3 解決方案",
"contact": "聯繫我們"
},
"techHero": {
"tag": "TECHNOLOGY",
"title1": "用AI和WEB3",
"title2": "深刻細緻的改變世界",
"subtitle": "我們相信技術應該服務於人,而非讓人服務於技術。通過 AI 提升效率,通過 Web3 重建信任,我們正在構建下一代資產管理基礎設施。"
},
"architecture": {
"tag": "雙引擎架構",
"title": "Dual Engine Architecture",
"topLabel": "業務場景落地",
"topDesc": "DeSpace · RWA · 量化資管",
"engine1Label": "ENGINE 01",
"engine1Title": "AI 引擎",
"engine1Desc": "效率躍升",
"middleLabel": "雙輪驅動",
"engine2Label": "ENGINE 02",
"engine2Title": "Web3 引擎",
"engine2Desc": "信任重構"
},
"aiCap": {
"label": "AI 能力",
"title": "智能技術,效率躍升",
"subtitle": "通過大模型、智能機器人、智能調度和量化模型,我們將 AI 能力深度整合到每一個業務場景中,實現效率的指數級提升。",
"moduleCount": "4",
"moduleLabel": "核心 AI 能力模組",
"card1Num": "01",
"card1Title": "大模型",
"card1Desc": "自然語言理解與生成,實現智能客服、文檔處理、意圖識別等場景應用",
"card1Metric1Label": "意圖識別準確率",
"card1Metric1Value": "95%+",
"card1Metric2Label": "響應時間",
"card1Metric2Value": "<500ms",
"card2Num": "02",
"card2Title": "智能機器人",
"card2Desc": "自主巡檢、環境監測、異常預警7×24小時不間斷守護資產安全",
"card2Metric1Label": "巡檢覆蓋率",
"card2Metric1Value": "98%",
"card2Metric2Label": "異常識別率",
"card2Metric2Value": "92%",
"card3Num": "03",
"card3Title": "智能調度",
"card3Desc": "資源優化配置、任務智能分配,最大化運營效率,最小化運營成本",
"card3Metric1Label": "效率提升",
"card3Metric1Value": "40%",
"card3Metric2Label": "成本降低",
"card3Metric2Value": "33%",
"card4Num": "04",
"card4Title": "量化模型",
"card4Desc": "多因子分析、趨勢預測、風險評估,為投資決策提供數據支撐",
"card4Metric1Label": "預測交易率",
"card4Metric1Value": "78%",
"card4Metric2Label": "數據處理",
"card4Metric2Value": "10萬條/秒"
},
"web3Cap": {
"label": "Web3 能力",
"title": "去中心化,信任重構",
"subtitle": "通過區塊鏈技術,我們建立透明、可追溯、不可篡改的信任基礎設施,讓價值流轉更加高效、安全。",
"moduleCount": "4",
"moduleLabel": "核心 Web3 能力模組",
"card1Num": "01",
"card1Title": "透明賬本",
"card1Desc": "資金流、業務流實時上鏈,消除信任黑洞",
"card1Value": "實時可追溯",
"card2Num": "02",
"card2Title": "智能合約",
"card2Desc": "自動分賬,剛性兌付,無需人工干預",
"card2Value": "自動執行",
"card3Num": "03",
"card3Title": "資產發行",
"card3Desc": "RWA 代幣化,連接全球資本",
"card3Value": "全球流通",
"card4Num": "04",
"card4Title": "合規通道",
"card4Desc": "香港 SFC 框架,全牌照覆蓋",
"card4Value": "1/2/4/5/9 類牌照"
},
"techCta": {
"title": "探索我們的技術如何賦能您的業務",
"solutions": "查看業務場景",
"contact": "聯繫我們"
},
"footer": {
"tagline": "AI + Web3 驅動的全鏈路資產科技平台",
"contactLabel": "聯繫我們",
"pagesTitle": "頁面",
"businessTitle": "業務",
"bizDeSpace": "DeSpace 德數空間",
"bizRWA": "RWA 發行服務",
"bizQuant": "量化資管",
"copyright": "© 2026 香港德商奇點科技有限公司. All rights reserved.",
"privacy": "隱私政策",
"terms": "服務條款"
}
}

356
src/messages/zh.json Normal file
View File

@@ -0,0 +1,356 @@
{
"metadata": {
"title": "DESUN SINGULARITY",
"description": "AI + Web3 驱动的全链路资产科技平台"
},
"header": {
"home": "首页",
"tech": "技术",
"solutions": "场景",
"about": "关于我们",
"contact": "联系我们"
},
"hero": {
"label": "Create · Discover · Amplify",
"title": "重构全球资产价值网络",
"subtitle": "AI + Web3 驱动的全链路资产科技平台",
"metric1Label": "管理资产",
"metric1Value": "2000亿+",
"metric1Desc": "集团在管资产规模",
"metric2Label": "运营面积",
"metric2Value": "1400万+ m²",
"metric2Desc": "覆盖住宅、商业、产业园",
"metric3Label": "策略年化",
"metric3Value": "18%+",
"metric3Desc": "市场中性策略表现",
"metric4Label": "合规牌照",
"metric4Value": "1/2/4/5/9 类",
"metric4Desc": "香港证监会牌照"
},
"flywheel": {
"label": "价值闭环",
"title": "三大业务飞轮",
"subtitle": "以 AI + Web3 为核心能力基座,驱动三大价值场景",
"card1Tag": "价值创造",
"card1Title": "DeSpace",
"card1Subtitle": "德数空间",
"card1Desc": "AI+Web3 赋能实体空间,创造可量化、可交易的数字价值",
"card1Feature1": "AI 驱动运营决策",
"card1Feature2": "Web3 激励体系",
"card2Tag": "价值发现",
"card2Title": "RWA 服务",
"card2Subtitle": "实物资产代币化",
"card2Desc": "AI 识别优质资产,连接全球资本,实现资产价值跨境流通",
"card2Feature1": "资产智能估值",
"card2Feature2": "合规代币发行",
"card2Feature3": "全球资本对接",
"card3Tag": "价值放大",
"card3Title": "量化资管",
"card3Subtitle": "AI 辅助决策",
"card3Desc": "AI 辅助量化策略,深耕加密市场,持续放大资产收益",
"card3Feature1": "市场中性策略",
"card3Feature2": "AI 风控系统",
"card3Feature3": "多市场套利",
"summary1": "在实体空间创造价值",
"summary2": "发现优质资产连接全球资本",
"summary3": "以量化策略放大收益"
},
"market": {
"label": "市场机会",
"title": "历史性的价值重构窗口",
"subtitle": "万亿级实体资产 × 万亿级数字资本",
"metric1Label": "实体资产存量",
"metric1Value": "500 万亿+",
"metric1Desc": "中国房地产市场",
"metric2Label": "RWA 市场规模",
"metric2Value": "16 万亿美元",
"metric2Desc": "2030 年预测BCG",
"metric3Label": "加密市场总市值",
"metric3Value": "3 万亿美元",
"metric3Desc": "年增长率 30%+"
},
"cta": {
"title": "开启您的资产数字化之旅",
"services": "了解我们的服务",
"contact": "联系我们"
},
"aboutHero": {
"label": "ABOUT US",
"title": "香港德商奇点科技",
"subtitle": "科技驱动的另类资产管理平台",
"visionLabel": "愿景:",
"visionText": "成为加密行业的\"黑石\"Blackstone",
"capLabel": "核心能力组合",
"cap1Icon": "AI",
"cap1Label": "人工智能",
"cap2Icon": "Web3",
"cap2Label": "区块链技术",
"cap3Icon": "金融",
"cap3Label": "资产管理",
"cap4Icon": "地产",
"cap4Label": "实体运营",
"stratLabel": "战略逻辑",
"strat1Tag": "WEB2 运营能力",
"strat1Title": "深耕中国另类资产",
"strat1Desc": "创造价值",
"strat2Tag": "WEB3 资本连接",
"strat2Title": "对接全球数字资本",
"strat2Desc": "实现价值"
},
"parentCompany": {
"bgLabel": "母公司背景",
"stockCode": "HK.02270",
"title": "德商产投",
"subtitle": "100% 控股 · 港股上市公司",
"metric1Value": "2000亿+",
"metric1Label": "管理资产规模",
"metric2Value": "3000+",
"metric2Label": "团队规模",
"metric3Value": "1400万+ m²",
"metric3Label": "运营面积",
"metric4Value": "60,000+",
"metric4Label": "服务家庭",
"metric5Value": "4,000+",
"metric5Label": "服务企业",
"bizLabel": "运营业态",
"biz1Title": "产商综合体",
"biz1Stats": "3 个 · 约 120 万 m²",
"biz2Title": "数字经济产业园",
"biz2Stats": "30 个 · 约 90 万 m²",
"biz3Title": "商业街区",
"biz3Stats": "15 个 · 约 68 万 m²",
"biz4Title": "住宅物业",
"biz4Stats": "103 个 · 约 1131 万 m²"
},
"team": {
"label": "核心团队",
"count": "7 位核心成员",
"title": "Web3 全产业链经验 + 传统金融背景 + 产品技术能力",
"ceo": "CEO",
"ceoName": "Finkel Chang",
"ceoBio": "10年 Web3 全产业链经验(矿业/CEX/公链Web3.Pro 创始人",
"coo": "COO",
"cooName": "Lily Duan",
"cooBio": "6年 Web3 经验,曾任加拿大上市公司副总裁,全球 TOP5 交易所首席商务官",
"cmo": "CMO",
"cmoName": "Joy Zhou",
"cmoBio": "8年 Web3 从业经历23年联合创立香港最大 Web3 媒体",
"cto": "CTO",
"ctoName": "Mark Deng",
"ctoBio": "8年 Web3 经验,曾任全球头部交易所首席产品官,产品累计服务 200 万用户",
"cio": "CIO",
"cioName": "Herman Lin",
"cioBio": "麦考瑞大学应用金融10年金融投资经验君道量化基金创始人",
"strategist": "首席策略师",
"strategistName": "Gibson Zhu",
"strategistBio": "新加坡南洋理工10年量化交易经验传统金融与加密双栖",
"analyst": "首席分析师",
"analystName": "Vicky Gu",
"analystBio": "麦考瑞大学应用金融、CFA13年市场技术面研究经验"
},
"milestones": {
"label": "里程碑",
"tag": "MILESTONES",
"title": "发展历程",
"ms1Date": "2025 Q2",
"ms1Title": "德商奇点科技成立",
"ms1Desc": "量化业务启动",
"ms2Date": "2025 Q4",
"ms2Title": "战略入股高盈证券",
"ms2Desc": "获取牌照通路",
"ms3Date": "2026 Q1",
"ms3Title": "DeSpace 样板小区落地",
"ms3Desc": "AI + Web3 空间运营首个落地项目",
"ms4Date": "2026 Q1",
"ms4Title": "RWA 服务正式推出",
"ms4Desc": "资产代币化发行服务上线",
"continueDate": "持续更新...",
"continueTitle": "更多里程碑",
"continueDesc": "敬请期待"
},
"recruit": {
"label": "加入我们",
"tag": "CAREERS",
"title": "我们在寻找优秀的你",
"positionsLabel": "开放职位",
"pos1": "量化策略研究员",
"pos2": "Web3 开发工程师",
"pos3": "产品经理",
"pos4": "商务拓展",
"newsLabel": "新闻动态",
"newsPlaceholder": "新闻动态模块",
"newsDesc": "公司新闻、行业活动、媒体报道"
},
"solHero": {
"label": "SOLUTIONS",
"title": "AI + Web3 双引擎驱动",
"subtitle": "三大价值场景",
"desc": "从价值创造到价值发现,再到价值放大,我们构建完整的资产价值链闭环",
"flow1Num": "01",
"flow1Title": "价值创造",
"flow1Sub": "DeSpace 德数空间",
"flow1AI": "AI: 效率提升",
"flow1Web3": "Web3: 互信账本",
"flow2Num": "02",
"flow2Title": "价值发现",
"flow2Sub": "RWA 发行服务",
"flow2AI": "AI: 资产筛选",
"flow2Web3": "Web3: 全球流通",
"flow3Num": "03",
"flow3Title": "价值放大",
"flow3Sub": "量化资管",
"flow3AI": "AI: 分析决策",
"flow3Web3": "Web3: 加密市场"
},
"scenario": {
"aiLabel": "AI 赋能",
"web3Label": "Web3 赋能",
"processLabel": "核心流程"
},
"deSpace": {
"label": "01 — DESPACE 德数空间",
"tag": "价值创造",
"title1": "以 AI + Web3 将存量空间",
"title2": "转化为优质资产",
"aiDesc": "智能客服、巡检机器人、智能调度",
"aiBenefit": "",
"aiMetric1Label": "效率提升",
"aiMetric1Value": "+40%",
"aiMetric2Label": "成本降低",
"aiMetric2Value": "-33%",
"web3Desc": "互信账本上链,智能合约自动分润",
"web3Benefit": "消除信任黑洞",
"step1": "资源整合",
"step2": "AI 降本",
"step3": "多元变现",
"step4": "链上分润"
},
"rwa": {
"label": "02 — RWA 发行服务",
"tag": "价值发现",
"title1": "识别优质资产,完成合规发行",
"title2": "连接全球资本",
"aiDesc": "资产筛选、价值评估、风险识别",
"aiBenefit": "精准发现优质标的",
"web3Desc": "代币化发行、链上确权、全球流通",
"web3Benefit": "连接全球资本",
"step1": "识别",
"step2": "优化",
"step3": "数字化",
"step4": "发行",
"step5": "流通"
},
"quant": {
"label": "03 — 量化资管",
"tag": "价值放大",
"title1": "深耕加密市场",
"title2": "放大资本效率",
"aiDesc": "市场分析、策略制定、风险预警",
"aiBenefit": "辅助决策,毫秒级执行",
"web3Desc": "原生加密市场操作",
"web3Benefit": "应对高波动,捕捉套利机会",
"step1": "数据采集",
"step2": "AI 分析",
"step3": "策略执行",
"step4": "风控监控"
},
"solCta": {
"title": "探索我们的场景解决方案",
"desc": "无论是空间运营、资产发行还是量化投资,我们都能为您提供专业的 AI + Web3 解决方案",
"contact": "联系我们"
},
"techHero": {
"tag": "TECHNOLOGY",
"title1": "用AI和WEB3",
"title2": "深刻细致的改变世界",
"subtitle": "我们相信技术应该服务于人,而非让人服务于技术。通过 AI 提升效率,通过 Web3 重建信任,我们正在构建下一代资产管理基础设施。"
},
"architecture": {
"tag": "双引擎架构",
"title": "Dual Engine Architecture",
"topLabel": "业务场景落地",
"topDesc": "DeSpace · RWA · 量化资管",
"engine1Label": "ENGINE 01",
"engine1Title": "AI 引擎",
"engine1Desc": "效率跃升",
"middleLabel": "双轮驱动",
"engine2Label": "ENGINE 02",
"engine2Title": "Web3 引擎",
"engine2Desc": "信任重构"
},
"aiCap": {
"label": "AI 能力",
"title": "智能技术,效率跃升",
"subtitle": "通过大模型、智能机器人、智能调度和量化模型,我们将 AI 能力深度整合到每一个业务场景中,实现效率的指数级提升。",
"moduleCount": "4",
"moduleLabel": "核心 AI 能力模块",
"card1Num": "01",
"card1Title": "大模型",
"card1Desc": "自然语言理解与生成,实现智能客服、文档处理、意图识别等场景应用",
"card1Metric1Label": "意图识别准确率",
"card1Metric1Value": "95%+",
"card1Metric2Label": "响应时间",
"card1Metric2Value": "<500ms",
"card2Num": "02",
"card2Title": "智能机器人",
"card2Desc": "自主巡检、环境监测、异常预警7×24小时不间断守护资产安全",
"card2Metric1Label": "巡检覆盖率",
"card2Metric1Value": "98%",
"card2Metric2Label": "异常识别率",
"card2Metric2Value": "92%",
"card3Num": "03",
"card3Title": "智能调度",
"card3Desc": "资源优化配置、任务智能分配,最大化运营效率,最小化运营成本",
"card3Metric1Label": "效率提升",
"card3Metric1Value": "40%",
"card3Metric2Label": "成本降低",
"card3Metric2Value": "33%",
"card4Num": "04",
"card4Title": "量化模型",
"card4Desc": "多因子分析、趋势预测、风险评估,为投资决策提供数据支撑",
"card4Metric1Label": "预测交易率",
"card4Metric1Value": "78%",
"card4Metric2Label": "数据处理",
"card4Metric2Value": "10万条/秒"
},
"web3Cap": {
"label": "Web3 能力",
"title": "去中心化,信任重构",
"subtitle": "通过区块链技术,我们建立透明、可追溯、不可篡改的信任基础设施,让价值流转更加高效、安全。",
"moduleCount": "4",
"moduleLabel": "核心 Web3 能力模块",
"card1Num": "01",
"card1Title": "透明账本",
"card1Desc": "资金流、业务流实时上链,消除信任黑洞",
"card1Value": "实时可追溯",
"card2Num": "02",
"card2Title": "智能合约",
"card2Desc": "自动分账,刚性兑付,无需人工干预",
"card2Value": "自动执行",
"card3Num": "03",
"card3Title": "资产发行",
"card3Desc": "RWA 代币化,连接全球资本",
"card3Value": "全球流通",
"card4Num": "04",
"card4Title": "合规通道",
"card4Desc": "香港 SFC 框架,全牌照覆盖",
"card4Value": "1/2/4/5/9 类牌照"
},
"techCta": {
"title": "探索我们的技术如何赋能您的业务",
"solutions": "查看业务场景",
"contact": "联系我们"
},
"footer": {
"tagline": "AI + Web3 驱动的全链路资产科技平台",
"contactLabel": "联系我们",
"pagesTitle": "页面",
"businessTitle": "业务",
"bizDeSpace": "DeSpace 德数空间",
"bizRWA": "RWA 发行服务",
"bizQuant": "量化资管",
"copyright": "© 2026 香港德商奇点科技有限公司. All rights reserved.",
"privacy": "隐私政策",
"terms": "服务条款"
}
}

8
src/middleware.ts Normal file
View File

@@ -0,0 +1,8 @@
import createMiddleware from "next-intl/middleware";
import { routing } from "./i18n/routing";
export default createMiddleware(routing);
export const config = {
matcher: ["/((?!api|_next|_vercel|.*\\..*).*)"],
};