mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
feat: let not-found page work with locale
This commit is contained in:
parent
458ddc6e0a
commit
d3108ebf65
5
apps/website/app/[locale]/[...rest]/page.tsx
Normal file
5
apps/website/app/[locale]/[...rest]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
||||
import { notFound } from 'next/navigation'
|
||||
|
||||
export default function CatchAll() {
|
||||
notFound()
|
||||
}
|
101
apps/website/app/[locale]/layout.tsx
Normal file
101
apps/website/app/[locale]/layout.tsx
Normal file
@ -0,0 +1,101 @@
|
||||
import clsx from 'clsx'
|
||||
import { Inter, Lexend } from 'next/font/google'
|
||||
import '@/styles/tailwind.css'
|
||||
import GoogleAnalytics from '@/components/analitycs/google'
|
||||
|
||||
import { NextIntlClientProvider } from 'next-intl'
|
||||
import { getMessages } from 'next-intl/server'
|
||||
|
||||
import type { Metadata } from 'next'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: {
|
||||
default: 'Dokploy - Effortless Deployment Solutions',
|
||||
template: '%s | Simplify Your DevOps',
|
||||
},
|
||||
alternates: {
|
||||
canonical: 'https://dokploy.com',
|
||||
languages: {
|
||||
en: 'https://dokploy.com',
|
||||
},
|
||||
},
|
||||
description:
|
||||
'Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.',
|
||||
applicationName: 'Dokploy',
|
||||
keywords: [
|
||||
'Dokploy',
|
||||
'Docker',
|
||||
'Traefik',
|
||||
'deployment',
|
||||
'VPS',
|
||||
'application management',
|
||||
'database management',
|
||||
'DevOps',
|
||||
'cloud infrastructure',
|
||||
'UI Self hosted',
|
||||
],
|
||||
referrer: 'origin',
|
||||
robots: 'index, follow',
|
||||
openGraph: {
|
||||
type: 'website',
|
||||
url: 'https://dokploy.com',
|
||||
title: 'Dokploy - Effortless Deployment Solutions',
|
||||
description:
|
||||
'Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.',
|
||||
siteName: 'Dokploy',
|
||||
images: [
|
||||
{
|
||||
url: 'http://dokploy.com/og.png',
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
site: '@Dokploy',
|
||||
creator: '@Dokploy',
|
||||
title: 'Dokploy - Simplify Your DevOps',
|
||||
description:
|
||||
'Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.',
|
||||
images: 'https://dokploy.com/og.png',
|
||||
},
|
||||
}
|
||||
|
||||
const inter = Inter({
|
||||
subsets: ['latin'],
|
||||
display: 'swap',
|
||||
variable: '--font-inter',
|
||||
})
|
||||
|
||||
const lexend = Lexend({
|
||||
subsets: ['latin'],
|
||||
display: 'swap',
|
||||
variable: '--font-lexend',
|
||||
})
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
params,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
params: { locale: string }
|
||||
}) {
|
||||
const { locale } = params
|
||||
const messages = await getMessages()
|
||||
return (
|
||||
<html
|
||||
lang={locale}
|
||||
className={clsx(
|
||||
'h-full scroll-smooth',
|
||||
inter.variable,
|
||||
lexend.variable,
|
||||
)}
|
||||
>
|
||||
<GoogleAnalytics />
|
||||
<body className="flex h-full flex-col">
|
||||
<NextIntlClientProvider messages={messages}>
|
||||
{children}
|
||||
</NextIntlClientProvider>
|
||||
</body>
|
||||
</html>
|
||||
)
|
||||
}
|
27
apps/website/app/[locale]/not-found.tsx
Normal file
27
apps/website/app/[locale]/not-found.tsx
Normal file
@ -0,0 +1,27 @@
|
||||
import Link from 'next/link'
|
||||
|
||||
import { SlimLayout } from '../../components/SlimLayout'
|
||||
// import { Button } from "../components/Button";
|
||||
import { Logo } from '../../components/shared/Logo'
|
||||
|
||||
export default function NotFound() {
|
||||
return (
|
||||
<SlimLayout>
|
||||
<div className="flex">
|
||||
<Link href="/" aria-label="Home">
|
||||
<Logo className="h-10 w-auto" />
|
||||
</Link>
|
||||
</div>
|
||||
<p className="mt-20 text-sm font-medium text-gray-700">404</p>
|
||||
<h1 className="mt-3 text-lg font-semibold text-gray-900">
|
||||
Page not found
|
||||
</h1>
|
||||
<p className="mt-3 text-sm text-gray-700">
|
||||
Sorry, we couldn’t find the page you’re looking for.
|
||||
</p>
|
||||
{/* <Button href="/" className="mt-10">
|
||||
Go back home
|
||||
</Button> */}
|
||||
</SlimLayout>
|
||||
)
|
||||
}
|
@ -1,85 +1,11 @@
|
||||
import clsx from "clsx";
|
||||
import { Inter, Lexend } from "next/font/google";
|
||||
import "@/styles/tailwind.css";
|
||||
import GoogleAnalytics from "@/components/analitycs/google";
|
||||
import type { Metadata } from "next";
|
||||
import { ReactNode } from 'react'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: {
|
||||
default: "Dokploy - Effortless Deployment Solutions",
|
||||
template: "%s | Simplify Your DevOps",
|
||||
},
|
||||
alternates: {
|
||||
canonical: "https://dokploy.com",
|
||||
languages: {
|
||||
en: "https://dokploy.com",
|
||||
},
|
||||
},
|
||||
description:
|
||||
"Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.",
|
||||
applicationName: "Dokploy",
|
||||
keywords: [
|
||||
"Dokploy",
|
||||
"Docker",
|
||||
"Traefik",
|
||||
"deployment",
|
||||
"VPS",
|
||||
"application management",
|
||||
"database management",
|
||||
"DevOps",
|
||||
"cloud infrastructure",
|
||||
"UI Self hosted",
|
||||
],
|
||||
referrer: "origin",
|
||||
robots: "index, follow",
|
||||
openGraph: {
|
||||
type: "website",
|
||||
url: "https://dokploy.com",
|
||||
title: "Dokploy - Effortless Deployment Solutions",
|
||||
description:
|
||||
"Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.",
|
||||
siteName: "Dokploy",
|
||||
images: [
|
||||
{
|
||||
url: "http://dokploy.com/og.png",
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
site: "@Dokploy",
|
||||
creator: "@Dokploy",
|
||||
title: "Dokploy - Simplify Your DevOps",
|
||||
description:
|
||||
"Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.",
|
||||
images: "https://dokploy.com/og.png",
|
||||
},
|
||||
};
|
||||
|
||||
const inter = Inter({
|
||||
subsets: ["latin"],
|
||||
display: "swap",
|
||||
variable: "--font-inter",
|
||||
});
|
||||
|
||||
const lexend = Lexend({
|
||||
subsets: ["latin"],
|
||||
display: "swap",
|
||||
variable: "--font-lexend",
|
||||
});
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html
|
||||
lang="en"
|
||||
className={clsx("h-full scroll-smooth ", inter.variable, lexend.variable)}
|
||||
>
|
||||
<GoogleAnalytics />
|
||||
<body className="flex h-full flex-col">{children}</body>
|
||||
</html>
|
||||
);
|
||||
type Props = {
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
// Since we have a `not-found.tsx` page on the root, a layout file
|
||||
// is required, even if it's just passing children through.
|
||||
export default function RootLayout({ children }: Props) {
|
||||
return children
|
||||
}
|
||||
|
@ -1,27 +1,48 @@
|
||||
import Link from "next/link";
|
||||
'use client'
|
||||
|
||||
import { SlimLayout } from "../components/SlimLayout";
|
||||
// import { Button } from "../components/Button";
|
||||
import { Logo } from "../components/shared/Logo";
|
||||
import { Logo } from '@/components/shared/Logo'
|
||||
import { SlimLayout } from '@/components/SlimLayout'
|
||||
import Error from 'next/error'
|
||||
import Link from 'next/link'
|
||||
|
||||
// Render the default Next.js 404 page when a route
|
||||
// is requested that doesn't match the middleware and
|
||||
// therefore doesn't have a locale associated with it.
|
||||
|
||||
// export default function NotFound() {
|
||||
// return (
|
||||
// <html lang="en">
|
||||
// <body>
|
||||
// <SlimLayout>
|
||||
// <div className="flex">
|
||||
// <Link href="/" aria-label="Home">
|
||||
// <Logo className="h-10 w-auto" />
|
||||
// </Link>
|
||||
// </div>
|
||||
// <p className="mt-20 text-sm font-medium text-gray-700">
|
||||
// 404
|
||||
// </p>
|
||||
// <h1 className="mt-3 text-lg font-semibold text-gray-900">
|
||||
// Page not found
|
||||
// </h1>
|
||||
// <p className="mt-3 text-sm text-gray-700">
|
||||
// Sorry, we couldn’t find the page you’re looking for.
|
||||
// </p>
|
||||
// {/* <Button href="/" className="mt-10">
|
||||
// Go back home
|
||||
// </Button> */}
|
||||
// </SlimLayout>
|
||||
// </body>
|
||||
// </html>
|
||||
// )
|
||||
// }
|
||||
|
||||
export default function NotFound() {
|
||||
return (
|
||||
<SlimLayout>
|
||||
<div className="flex">
|
||||
<Link href="/" aria-label="Home">
|
||||
<Logo className="h-10 w-auto" />
|
||||
</Link>
|
||||
</div>
|
||||
<p className="mt-20 text-sm font-medium text-gray-700">404</p>
|
||||
<h1 className="mt-3 text-lg font-semibold text-gray-900">
|
||||
Page not found
|
||||
</h1>
|
||||
<p className="mt-3 text-sm text-gray-700">
|
||||
Sorry, we couldn’t find the page you’re looking for.
|
||||
</p>
|
||||
{/* <Button href="/" className="mt-10">
|
||||
Go back home
|
||||
</Button> */}
|
||||
</SlimLayout>
|
||||
);
|
||||
<html lang="en">
|
||||
<body>
|
||||
<Error statusCode={404} />
|
||||
</body>
|
||||
</html>
|
||||
)
|
||||
}
|
||||
|
@ -2,15 +2,15 @@ import { defineRouting } from 'next-intl/routing'
|
||||
import { createSharedPathnamesNavigation } from 'next-intl/navigation'
|
||||
|
||||
export const routing = defineRouting({
|
||||
// A list of all locales that are supported
|
||||
locales: ['en', 'zh-Hans'],
|
||||
// A list of all locales that are supported
|
||||
locales: ['en', 'zh-Hans'],
|
||||
|
||||
// Used when no locale matches
|
||||
defaultLocale: 'en',
|
||||
localePrefix: 'as-needed',
|
||||
// Used when no locale matches
|
||||
defaultLocale: 'en',
|
||||
localePrefix: 'as-needed',
|
||||
})
|
||||
|
||||
// Lightweight wrappers around Next.js' navigation APIs
|
||||
// that will consider the routing configuration
|
||||
export const { Link, redirect, usePathname, useRouter } =
|
||||
createSharedPathnamesNavigation(routing)
|
||||
createSharedPathnamesNavigation(routing)
|
||||
|
@ -1,9 +1,9 @@
|
||||
import createMiddleware from 'next-intl/middleware';
|
||||
import {routing} from './i18n/routing';
|
||||
|
||||
export default createMiddleware(routing);
|
||||
|
||||
import createMiddleware from 'next-intl/middleware'
|
||||
import { routing } from './i18n/routing'
|
||||
|
||||
export default createMiddleware(routing, { localeDetection: false })
|
||||
|
||||
export const config = {
|
||||
// Match only internationalized pathnames
|
||||
matcher: ['/', '/(zh-Hans|en)/:path*']
|
||||
};
|
||||
// Match only internationalized pathnames
|
||||
matcher: ['/((?!_next|.*\\..*).*)']
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user