diff --git a/.circleci/config.yml b/.circleci/config.yml index f47a561a..c5e57a97 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -99,14 +99,14 @@ workflows: only: - main - canary - - pull/665 + - fix/build-i18n - build-arm64: filters: branches: only: - main - canary - - pull/665 + - fix/build-i18n - combine-manifests: requires: - build-amd64 @@ -116,4 +116,4 @@ workflows: only: - main - canary - - pull/665 + - fix/build-i18n diff --git a/Dockerfile b/Dockerfile index 74b70db0..838fbe4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,6 +35,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var COPY --from=build /prod/dokploy/.next ./.next COPY --from=build /prod/dokploy/dist ./dist COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs +COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs COPY --from=build /prod/dokploy/public ./public COPY --from=build /prod/dokploy/package.json ./package.json COPY --from=build /prod/dokploy/drizzle ./drizzle diff --git a/Dockerfile.cloud b/Dockerfile.cloud index 020ea3d6..0f8427d4 100644 --- a/Dockerfile.cloud +++ b/Dockerfile.cloud @@ -44,6 +44,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var COPY --from=build /prod/dokploy/.next ./.next COPY --from=build /prod/dokploy/dist ./dist COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs +COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs COPY --from=build /prod/dokploy/public ./public COPY --from=build /prod/dokploy/package.json ./package.json COPY --from=build /prod/dokploy/drizzle ./drizzle diff --git a/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx b/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx index 320471ba..8ce547a2 100644 --- a/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx @@ -61,7 +61,7 @@ const redirectPresets = [ redirect: { regex: "^https?://(?:www.)?(.+)", permanent: true, - replacement: "https://www.$${1}", + replacement: "https://www.${1}", }, }, { @@ -70,7 +70,7 @@ const redirectPresets = [ redirect: { regex: "^https?://www.(.+)", permanent: true, - replacement: "https://$${1}", + replacement: "https://${1}", }, }, ]; diff --git a/apps/dokploy/next-i18next.config.js b/apps/dokploy/next-i18next.config.cjs similarity index 100% rename from apps/dokploy/next-i18next.config.js rename to apps/dokploy/next-i18next.config.cjs diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 8bba5e4a..fc695598 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -11,7 +11,7 @@ "build-next": "next build", "setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run", "reset-password": "node -r dotenv/config dist/reset-password.mjs", - "dev": "tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ", + "dev": "TURBOPACK=1 tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ", "studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts", "migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts", "migration:run": "tsx -r dotenv/config migration.ts", diff --git a/apps/dokploy/pages/dashboard/settings/appearance.tsx b/apps/dokploy/pages/dashboard/settings/appearance.tsx index f074f289..209d938c 100644 --- a/apps/dokploy/pages/dashboard/settings/appearance.tsx +++ b/apps/dokploy/pages/dashboard/settings/appearance.tsx @@ -2,13 +2,13 @@ import { AppearanceForm } from "@/components/dashboard/settings/appearance-form" import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; +import nextI18NextConfig from "../../../next-i18next.config.cjs"; const Page = () => { return ( diff --git a/apps/dokploy/pages/dashboard/settings/profile.tsx b/apps/dokploy/pages/dashboard/settings/profile.tsx index 9303354f..a645a4af 100644 --- a/apps/dokploy/pages/dashboard/settings/profile.tsx +++ b/apps/dokploy/pages/dashboard/settings/profile.tsx @@ -4,11 +4,10 @@ import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx index c714acd8..c1d3d548 100644 --- a/apps/dokploy/pages/dashboard/settings/server.tsx +++ b/apps/dokploy/pages/dashboard/settings/server.tsx @@ -3,11 +3,10 @@ import { WebServer } from "@/components/dashboard/settings/web-server"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD, validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; diff --git a/apps/dokploy/server/server.ts b/apps/dokploy/server/server.ts index bf111233..b65446f8 100644 --- a/apps/dokploy/server/server.ts +++ b/apps/dokploy/server/server.ts @@ -24,7 +24,7 @@ import { setupTerminalWebSocketServer } from "./wss/terminal"; config({ path: ".env" }); const PORT = Number.parseInt(process.env.PORT || "3000", 10); const dev = process.env.NODE_ENV !== "production"; -const app = next({ dev }); +const app = next({ dev, turbopack: dev }); const handle = app.getRequestHandler(); void app.prepare().then(async () => { try { diff --git a/apps/dokploy/tsconfig.json b/apps/dokploy/tsconfig.json index e132180e..d2e6532c 100644 --- a/apps/dokploy/tsconfig.json +++ b/apps/dokploy/tsconfig.json @@ -39,7 +39,8 @@ "**/*.js", ".next/types/**/*.ts", "env.js", - "next.config.mjs" + "next.config.mjs", + "next-i18next.config.mjs" ], "exclude": [ "node_modules", diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts index 0c165c4e..4790f1a7 100644 --- a/apps/dokploy/utils/i18n.ts +++ b/apps/dokploy/utils/i18n.ts @@ -4,3 +4,12 @@ export function getLocale(cookies: NextApiRequestCookies) { const locale = cookies.DOKPLOY_LOCALE ?? "en"; return locale; } + +// libs/i18n.js +import { serverSideTranslations as originalServerSideTranslations } from "next-i18next/serverSideTranslations"; +import nextI18NextConfig from "../next-i18next.config.cjs"; + +export const serverSideTranslations = ( + locale: string, + namespaces = ["common"], +) => originalServerSideTranslations(locale, namespaces, nextI18NextConfig); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9dd089aa..8e6ae050 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,7 +249,7 @@ importers: version: 0.5.1(drizzle-orm@0.30.10(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8) i18next: specifier: ^23.16.4 - version: 23.16.4 + version: 23.16.5 input-otp: specifier: ^1.2.4 version: 1.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -276,7 +276,7 @@ importers: version: 15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-i18next: specifier: ^15.3.1 - version: 15.3.1(i18next@23.16.4)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 15.3.1(i18next@23.16.5)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) next-themes: specifier: ^0.2.1 version: 0.2.1(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -306,7 +306,7 @@ importers: version: 7.52.1(react@18.2.0) react-i18next: specifier: ^15.1.0 - version: 15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recharts: specifier: ^2.12.7 version: 2.12.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4734,8 +4734,8 @@ packages: i18next-fs-backend@2.3.2: resolution: {integrity: sha512-LIwUlkqDZnUI8lnUxBnEj8K/FrHQTT/Sc+1rvDm9E8YvvY5YxzoEAASNx+W5M9DfD5s77lI5vSAFWeTp26B/3Q==} - i18next@23.16.4: - resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + i18next@23.16.5: + resolution: {integrity: sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -5771,8 +5771,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@15.1.0: - resolution: {integrity: sha512-zj3nJynMnZsy2gPZiOTC7XctCY5eQGqT3tcKMmfJWC9FMvgd+960w/adq61j8iPzpwmsXejqID9qC3Mqu1Xu2Q==} + react-i18next@15.1.1: + resolution: {integrity: sha512-R/Vg9wIli2P3FfeI8o1eNJUJue5LWpFsQePCHdQDmX0Co3zkr6kdT8gAseb/yGeWbNz1Txc4bKDQuZYsC0kQfw==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -10946,7 +10946,7 @@ snapshots: i18next-fs-backend@2.3.2: {} - i18next@23.16.4: + i18next@23.16.5: dependencies: '@babel/runtime': 7.25.0 @@ -11450,17 +11450,17 @@ snapshots: neotraverse@0.6.18: {} - next-i18next@15.3.1(i18next@23.16.4)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-i18next@15.3.1(i18next@23.16.5)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.25.0 '@types/hoist-non-react-statics': 3.3.5 core-js: 3.39.0 hoist-non-react-statics: 3.3.2 - i18next: 23.16.4 + i18next: 23.16.5 i18next-fs-backend: 2.3.2 next: 15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 - react-i18next: 15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-i18next: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-themes@0.2.1(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -11951,11 +11951,11 @@ snapshots: dependencies: react: 18.2.0 - react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.25.0 html-parse-stringify: 3.0.1 - i18next: 23.16.4 + i18next: 23.16.5 react: 18.2.0 optionalDependencies: react-dom: 18.2.0(react@18.2.0)