first commit
2
hero.mjs
Normal file
@@ -0,0 +1,2 @@
|
||||
import { heroui } from "@heroui/react";
|
||||
export default heroui();
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -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
|
After Width: | Height: | Size: 18 KiB |
@@ -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 |
@@ -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
|
After Width: | Height: | Size: 53 KiB |
@@ -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 |
@@ -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 |
@@ -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 |
25
src/app/[locale]/about/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
57
src/app/[locale]/layout.tsx
Normal 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
@@ -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>
|
||||
);
|
||||
}
|
||||
79
src/app/[locale]/solutions/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
25
src/app/[locale]/tech/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
|
Before Width: | Height: | Size: 25 KiB |
1969
src/app/globals.css
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
83
src/components/AICapabilitiesSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
60
src/components/AboutHeroSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
50
src/components/ArchitectureSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
22
src/components/CTASection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
68
src/components/FlywheelSection.tsx
Normal 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
@@ -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
@@ -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>
|
||||
);
|
||||
}
|
||||
31
src/components/HeroSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
57
src/components/LanguageSwitcher.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
30
src/components/MarketSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
49
src/components/MilestonesSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
64
src/components/ParentCompanySection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
7
src/components/Providers.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
"use client";
|
||||
|
||||
import { HeroUIProvider } from "@heroui/react";
|
||||
|
||||
export default function Providers({ children }: { children: React.ReactNode }) {
|
||||
return <HeroUIProvider>{children}</HeroUIProvider>;
|
||||
}
|
||||
46
src/components/RecruitSection.tsx
Normal 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">→</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>
|
||||
);
|
||||
}
|
||||
121
src/components/ScenarioSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
18
src/components/SolutionsCTASection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
56
src/components/SolutionsHeroSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
55
src/components/TeamSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
20
src/components/TechCTASection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
18
src/components/TechHeroSection.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
44
src/components/Web3CapabilitiesSection.tsx
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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": "麥考瑞大學應用金融、CFA,13年市場技術面研究經驗"
|
||||
},
|
||||
"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
@@ -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": "麦考瑞大学应用金融、CFA,13年市场技术面研究经验"
|
||||
},
|
||||
"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
@@ -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|.*\\..*).*)"],
|
||||
};
|
||||